Repository: armadaproject/armada

Issue:
Make service name configurable during job submission
We have a use case where we are submitting a gang of jobs for scheduling and it would be beneficial to have a deterministic and stable service name during submission time. More specifically we are submitting a Ray cluster with a head node and many worker nodes. The worker nodes use an init-container to block until the head node is reachable via a service. Given that we are using third-party containers it would be nice if we could define the jobs and init containers such that they referenced a predefined service name instead of implementing service discovery at runtime to learn of the service name based on the non-deterministic job ID. 



Hints from issue comments:

Solution patch:
diff --git a/internal/server/configuration/types.go b/internal/server/configuration/types.go
index 91c26f42..509c0ed3 100644
--- a/internal/server/configuration/types.go
+++ b/internal/server/configuration/types.go
@@ -95,6 +95,8 @@ type SubmissionConfig struct {
 	AssertInitContainersRequestFractionalCpu bool
 	// Controls whether we add the gang id annotation as a label.
 	AddGangIdLabel bool
+	// Controls whether custom service names are allowed
+	AllowCustomServiceNames bool
 }
 
 // TODO: we can probably just typedef this to map[string]string
diff --git a/internal/server/submit/conversion/conversions.go b/internal/server/submit/conversion/conversions.go
index 8368fb3c..a7944358 100644
--- a/internal/server/submit/conversion/conversions.go
+++ b/internal/server/submit/conversion/conversions.go
@@ -8,6 +8,7 @@ import (
 	networking "k8s.io/api/networking/v1"
 
 	"github.com/armadaproject/armada/internal/common"
+	log "github.com/armadaproject/armada/internal/common/logging"
 	armadaslices "github.com/armadaproject/armada/internal/common/slices"
 	"github.com/armadaproject/armada/internal/common/util"
 	"github.com/armadaproject/armada/internal/executor/domain"
@@ -26,7 +27,7 @@ func SubmitJobFromApiRequest(
 ) *armadaevents.SubmitJob {
 	jobId := idGen()
 	priority := PriorityAsInt32(jobReq.GetPriority())
-	ingressesAndServices := convertIngressesAndServices(jobReq, jobId, jobSetId, queue, owner)
+	ingressesAndServices := convertIngressesAndServices(config, jobReq, jobId, jobSetId, queue, owner)
 
 	msg := &armadaevents.SubmitJob{
 		JobId:           jobId,
@@ -61,6 +62,7 @@ func SubmitJobFromApiRequest(
 // Creates KubernetesObjects representing ingresses and services from the *api.JobSubmitRequestItem.
 // An ingress will have  a corresponding service created for it.
 func convertIngressesAndServices(
+	config configuration.SubmissionConfig,
 	jobReq *api.JobSubmitRequestItem,
 	jobId, jobsetId, queue, owner string,
 ) []*armadaevents.KubernetesObject {
@@ -87,7 +89,8 @@ func convertIngressesAndServices(
 	for _, ingressConfig := range jobReq.Ingress {
 		ports := filterServicePorts(availableServicePorts, ingressConfig.Ports)
 		if len(ports) > 0 {
-			serviceObject := createService(jobId, serviceIdx, ports, v1.ServiceTypeClusterIP, ingressConfig.UseClusterIP)
+			serviceName := fmt.Sprintf("%s-service-%d", common.PodName(jobId), serviceIdx)
+			serviceObject := createService(serviceName, jobId, ports, v1.ServiceTypeClusterIP, ingressConfig.UseClusterIP)
 			serviceIdx++
 			ingressObject := createIngressFromService(
 				serviceObject.GetService(),
@@ -111,8 +114,25 @@ func convertIngressesAndServices(
 				serviceType = v1.ServiceTypeNodePort
 				useClusterIp = true
 			}
-			serviceObject := createService(jobId, serviceIdx, ports, serviceType, useClusterIp)
-			serviceIdx++
+
+			serviceName := fmt.Sprintf("%s-service-%d", common.PodName(jobId), serviceIdx)
+			serviceNameCustomized := false
+
+			if len(serviceConfig.Name) > 0 {
+				if config.AllowCustomServiceNames {
+					serviceName = serviceConfig.Name
+					serviceNameCustomized = true
+				} else {
+					log.Warnf("Feature flag to allow customized service name %s is not enabled. "+
+						"Using generated service name %s", serviceConfig.Name, serviceName)
+				}
+			}
+
+			if !serviceNameCustomized {
+				serviceIdx++
+			}
+
+			serviceObject := createService(serviceName, jobId, ports, serviceType, useClusterIp)
 			objects = append(objects, serviceObject)
 		}
 	}
@@ -135,8 +155,8 @@ func convertIngressesAndServices(
 }
 
 func createService(
+	serviceName string,
 	jobId string,
-	serviceIdx int,
 	ports []v1.ServicePort,
 	serviceType v1.ServiceType,
 	useClusterIP bool,
@@ -150,7 +170,7 @@ func createService(
 
 	return &armadaevents.KubernetesObject{
 		ObjectMeta: &armadaevents.ObjectMeta{
-			Name:        fmt.Sprintf("%s-service-%d", common.PodName(jobId), serviceIdx),
+			Name:        serviceName,
 			Annotations: map[string]string{},
 			Labels:      map[string]string{},
 		},
diff --git a/pkg/api/api.swagger.go b/pkg/api/api.swagger.go
index 5d185170..a7d4573f 100644
--- a/pkg/api/api.swagger.go
+++ b/pkg/api/api.swagger.go
@@ -2101,6 +2101,9 @@ func SwaggerJsonTemplate() string {
 		"    \"apiServiceConfig\": {\n" +
 		"      \"type\": \"object\",\n" +
 		"      \"properties\": {\n" +
+		"        \"name\": {\n" +
+		"          \"type\": \"string\"\n" +
+		"        },\n" +
 		"        \"ports\": {\n" +
 		"          \"type\": \"array\",\n" +
 		"          \"items\": {\n" +
diff --git a/pkg/api/api.swagger.json b/pkg/api/api.swagger.json
index eb3c7504..d674be46 100644
--- a/pkg/api/api.swagger.json
+++ b/pkg/api/api.swagger.json
@@ -2090,6 +2090,9 @@
     "apiServiceConfig": {
       "type": "object",
       "properties": {
+        "name": {
+          "type": "string"
+        },
         "ports": {
           "type": "array",
           "items": {
diff --git a/pkg/api/submit.pb.go b/pkg/api/submit.pb.go
index bb1e7e82..649360e0 100644
--- a/pkg/api/submit.pb.go
+++ b/pkg/api/submit.pb.go
@@ -357,6 +357,7 @@ func (m *IngressConfig) GetUseClusterIP() bool {
 type ServiceConfig struct {
 	Type  ServiceType `protobuf:"varint,1,opt,name=type,proto3,enum=api.ServiceType" json:"type,omitempty"`
 	Ports []uint32    `protobuf:"varint,2,rep,packed,name=ports,proto3" json:"ports,omitempty"`
+	Name  string      `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
 }
 
 func (m *ServiceConfig) Reset()         { *m = ServiceConfig{} }
@@ -406,6 +407,13 @@ func (m *ServiceConfig) GetPorts() []uint32 {
 	return nil
 }
 
+func (m *ServiceConfig) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
 // swagger:model
 type JobSubmitRequest struct {
 	Queue           string                  `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"`
@@ -2402,207 +2410,207 @@ func init() {
 func init() { proto.RegisterFile("pkg/api/submit.proto", fileDescriptor_e998bacb27df16c1) }
 
 var fileDescriptor_e998bacb27df16c1 = []byte{
-	// 3186 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcf, 0x73, 0x1b, 0x49,
-	0xf5, 0xf7, 0xf8, 0xb7, 0x9e, 0x2c, 0x47, 0xee, 0xd8, 0xce, 0x58, 0xc9, 0x5a, 0xce, 0x64, 0x37,
-	0xeb, 0x64, 0xf3, 0x95, 0x37, 0xde, 0xef, 0x16, 0x49, 0x58, 0x08, 0x91, 0xac, 0x24, 0x76, 0x12,
-	0xc7, 0x6b, 0xc7, 0xfb, 0x83, 0xa2, 0x10, 0x23, 0x4d, 0x5b, 0x1e, 0x5b, 0x9a, 0xd1, 0xce, 0x8c,
-	0x92, 0x35, 0xd4, 0x5e, 0x28, 0x8a, 0x3d, 0x70, 0xd9, 0x82, 0x13, 0x05, 0x05, 0x1c, 0x38, 0x2d,
-	0x67, 0x2e, 0x14, 0x7f, 0x00, 0x05, 0x97, 0xa5, 0xb8, 0xc0, 0x45, 0x45, 0xed, 0xf2, 0xa3, 0x4a,
-	0x37, 0xee, 0x1c, 0xa8, 0x7e, 0xdd, 0x33, 0xd3, 0xa3, 0x5f, 0x96, 0x92, 0x78, 0x97, 0x03, 0x37,
-	0xf5, 0xa7, 0xdf, 0xcf, 0xee, 0xd7, 0xaf, 0xdf, 0xeb, 0x11, 0xcc, 0xd6, 0x0e, 0xcb, 0x2b, 0x7a,
-	0xcd, 0x5c, 0x71, 0xeb, 0xc5, 0xaa, 0xe9, 0x65, 0x6a, 0x8e, 0xed, 0xd9, 0x64, 0x44, 0xaf, 0x99,
-	0xa9, 0xb3, 0x65, 0xdb, 0x2e, 0x57, 0xe8, 0x0a, 0x42, 0xc5, 0xfa, 0xde, 0x0a, 0xad, 0xd6, 0xbc,
-	0x23, 0x4e, 0x91, 0x4a, 0xb7, 0x4e, 0x7a, 0x66, 0x95, 0xba, 0x9e, 0x5e, 0xad, 0x09, 0x02, 0xed,
-	0xf0, 0x9a, 0x9b, 0x31, 0x6d, 0x94, 0x5d, 0xb2, 0x1d, 0xba, 0xf2, 0xf8, 0xea, 0x4a, 0x99, 0x5a,
-	0xd4, 0xd1, 0x3d, 0x6a, 0x08, 0x9a, 0x65, 0x89, 0xc6, 0xa2, 0xde, 0x13, 0xdb, 0x39, 0x34, 0xad,
-	0x72, 0x27, 0xca, 0x73, 0x42, 0x1d, 0xa3, 0xd4, 0x2d, 0xcb, 0xf6, 0x74, 0xcf, 0xb4, 0x2d, 0x57,
-	0xcc, 0x06, 0x4e, 0xec, 0x53, 0xbd, 0xe2, 0xed, 0x73, 0x54, 0xfb, 0x29, 0xc0, 0xec, 0x86, 0x5d,
-	0xdc, 0x41, 0xc7, 0xb6, 0xe9, 0x7b, 0x75, 0xea, 0x7a, 0xeb, 0x1e, 0xad, 0x92, 0x55, 0x98, 0xac,
-	0x39, 0xa6, 0xed, 0x98, 0xde, 0x91, 0xaa, 0x2c, 0x29, 0xcb, 0x4a, 0x76, 0xbe, 0xd9, 0x48, 0x13,
-	0x1f, 0xbb, 0x62, 0x57, 0x4d, 0x0f, 0x7d, 0xdd, 0x0e, 0xe8, 0xc8, 0xeb, 0x10, 0xb3, 0xf4, 0x2a,
-	0x75, 0x6b, 0x7a, 0x89, 0xaa, 0x23, 0x4b, 0xca, 0x72, 0x2c, 0x7b, 0xa6, 0xd9, 0x48, 0x9f, 0x0e,
-	0x40, 0x89, 0x2b, 0xa4, 0x24, 0xaf, 0x41, 0xac, 0x54, 0x31, 0xa9, 0xe5, 0x15, 0x4c, 0x43, 0x9d,
-	0x44, 0x36, 0xd4, 0xc5, 0xc1, 0x75, 0x43, 0xd6, 0xe5, 0x63, 0x64, 0x07, 0xc6, 0x2b, 0x7a, 0x91,
-	0x56, 0x5c, 0x75, 0x74, 0x69, 0x64, 0x39, 0xbe, 0xfa, 0x52, 0x46, 0xaf, 0x99, 0x99, 0x4e, 0xae,
-	0x64, 0xee, 0x23, 0x5d, 0xde, 0xf2, 0x9c, 0xa3, 0xec, 0x6c, 0xb3, 0x91, 0x4e, 0x72, 0x46, 0x49,
-	0xac, 0x10, 0x45, 0xca, 0x10, 0x97, 0x16, 0x4e, 0x1d, 0x43, 0xc9, 0x97, 0xbb, 0x4b, 0xbe, 0x15,
-	0x12, 0x73, 0xf1, 0x0b, 0xcd, 0x46, 0x7a, 0x4e, 0x12, 0x21, 0xe9, 0x90, 0x25, 0x93, 0x0f, 0x15,
-	0x98, 0x75, 0xe8, 0x7b, 0x75, 0xd3, 0xa1, 0x46, 0xc1, 0xb2, 0x0d, 0x5a, 0x10, 0xce, 0x8c, 0xa3,
-	0xca, 0xab, 0xdd, 0x55, 0x6e, 0x0b, 0xae, 0x4d, 0xdb, 0xa0, 0xb2, 0x63, 0x5a, 0xb3, 0x91, 0x3e,
-	0xe7, 0xb4, 0x4d, 0x86, 0x06, 0xa8, 0xca, 0x36, 0x69, 0x9f, 0x27, 0x0f, 0x61, 0xb2, 0x66, 0x1b,
-	0x05, 0xb7, 0x46, 0x4b, 0xea, 0xf0, 0x92, 0xb2, 0x1c, 0x5f, 0x3d, 0x9b, 0xe1, 0x11, 0x87, 0x36,
-	0xb0, 0xa8, 0xcc, 0x3c, 0xbe, 0x9a, 0xd9, 0xb2, 0x8d, 0x9d, 0x1a, 0x2d, 0xe1, 0x7e, 0xce, 0xd4,
-	0xf8, 0x20, 0x22, 0x7b, 0x42, 0x80, 0x64, 0x0b, 0x62, 0xbe, 0x40, 0x57, 0x9d, 0x40, 0x77, 0x7a,
-	0x4a, 0xe4, 0x61, 0xc5, 0x07, 0x6e, 0x24, 0xac, 0x04, 0x46, 0x72, 0x30, 0x61, 0x5a, 0x65, 0x87,
-	0xba, 0xae, 0x1a, 0x43, 0x79, 0x04, 0x05, 0xad, 0x73, 0x2c, 0x67, 0x5b, 0x7b, 0x66, 0x39, 0x3b,
-	0xc7, 0x0c, 0x13, 0x64, 0x92, 0x14, 0x9f, 0x93, 0xdc, 0x86, 0x49, 0x97, 0x3a, 0x8f, 0xcd, 0x12,
-	0x75, 0x55, 0x90, 0xa4, 0xec, 0x70, 0x50, 0x48, 0x41, 0x63, 0x7c, 0x3a, 0xd9, 0x18, 0x1f, 0x63,
-	0x31, 0xee, 0x96, 0xf6, 0xa9, 0x51, 0xaf, 0x50, 0x47, 0x8d, 0x87, 0x31, 0x1e, 0x80, 0x72, 0x8c,
-	0x07, 0x20, 0xa9, 0xc3, 0x1c, 0x7d, 0xbf, 0x46, 0x1d, 0xb3, 0x4a, 0x2d, 0x4f, 0xaf, 0x6c, 0x39,
-	0x66, 0x89, 0xae, 0x5b, 0x7b, 0xb6, 0x9a, 0xc0, 0x35, 0x4f, 0xa1, 0x2d, 0xf9, 0x4e, 0x14, 0xd9,
-	0x0b, 0xcd, 0x46, 0x3a, 0xdd, 0x91, 0x59, 0x52, 0xd5, 0x59, 0x7a, 0x4a, 0x87, 0xb8, 0x14, 0x24,
-	0xe4, 0x02, 0x8c, 0x1c, 0x52, 0x7e, 0x9e, 0x63, 0xd9, 0x99, 0x66, 0x23, 0x9d, 0x38, 0xa4, 0xf2,
-	0x51, 0x66, 0xb3, 0xe4, 0x12, 0x8c, 0x3d, 0xd6, 0x2b, 0x75, 0x8a, 0xe1, 0x10, 0xcb, 0x9e, 0x6e,
-	0x36, 0xd2, 0xa7, 0x10, 0x90, 0x08, 0x39, 0xc5, 0x8d, 0xe1, 0x6b, 0x4a, 0x6a, 0x0f, 0x92, 0xad,
-	0xc7, 0xe0, 0x44, 0xf4, 0x54, 0xe1, 0x4c, 0x97, 0xd8, 0x3f, 0x09, 0x75, 0x1b, 0xa3, 0x93, 0x53,
-	0xc9, 0x84, 0xf6, 0xaf, 0x11, 0x48, 0x44, 0xe2, 0x8c, 0xdc, 0x80, 0x51, 0xef, 0xa8, 0x46, 0x51,
-	0xd9, 0xf4, 0x6a, 0x52, 0x8e, 0xc4, 0x47, 0x47, 0x35, 0x8a, 0x09, 0x66, 0x9a, 0x51, 0x44, 0x4e,
-	0x07, 0xf2, 0x30, 0x13, 0x6a, 0xb6, 0xe3, 0xb9, 0xea, 0xf0, 0xd2, 0xc8, 0x72, 0x82, 0x9b, 0x80,
-	0x80, 0x6c, 0x02, 0x02, 0xe4, 0x5b, 0xd1, 0x4c, 0x34, 0x82, 0x11, 0x7b, 0xa1, 0x3d, 0xee, 0x9f,
-	0x3e, 0x05, 0x5d, 0x87, 0xb8, 0x57, 0x71, 0x0b, 0xd4, 0xd2, 0x8b, 0x15, 0x6a, 0xa8, 0xa3, 0x4b,
-	0xca, 0xf2, 0x64, 0x56, 0x6d, 0x36, 0xd2, 0xb3, 0x1e, 0x5b, 0x57, 0x44, 0x25, 0x5e, 0x08, 0x51,
-	0x4c, 0xd8, 0xd4, 0xf1, 0x0a, 0x2c, 0x85, 0xab, 0x63, 0x52, 0xc2, 0xa6, 0x8e, 0xb7, 0xa9, 0x57,
-	0x69, 0x24, 0x61, 0x0b, 0x8c, 0xdc, 0x84, 0x44, 0xdd, 0xa5, 0x85, 0x52, 0xa5, 0xee, 0x7a, 0xd4,
-	0x59, 0xdf, 0x52, 0xc7, 0x51, 0x63, 0xaa, 0xd9, 0x48, 0xcf, 0xd7, 0x5d, 0x9a, 0xf3, 0x71, 0x89,
-	0x79, 0x4a, 0xc6, 0x3f, 0xaf, 0x40, 0xd3, 0x3c, 0x48, 0x44, 0x92, 0x02, 0xb9, 0xd6, 0x61, 0xcb,
-	0x05, 0x05, 0x6e, 0x39, 0x69, 0xdf, 0xf2, 0x81, 0x37, 0x5c, 0xfb, 0x8b, 0x02, 0xc9, 0xd6, 0x84,
-	0xcf, 0xf8, 0xdf, 0xab, 0xd3, 0x3a, 0x15, 0x0e, 0x22, 0x3f, 0x02, 0x32, 0x3f, 0x02, 0xe4, 0xff,
-	0x01, 0x0e, 0xec, 0x62, 0xc1, 0xa5, 0x78, 0x8b, 0x0e, 0x87, 0x9b, 0x72, 0x60, 0x17, 0x77, 0x68,
-	0xcb, 0x2d, 0xea, 0x63, 0xc4, 0x80, 0x19, 0xc6, 0xe5, 0x70, 0x7d, 0x05, 0x46, 0xe0, 0x07, 0xdb,
-	0x42, 0xd7, 0x3b, 0x28, 0xfb, 0x42, 0xb3, 0x91, 0x5e, 0x38, 0xb0, 0x8b, 0x12, 0x26, 0x7b, 0x74,
-	0xaa, 0x65, 0x4a, 0xfb, 0xa3, 0x02, 0x33, 0x1b, 0x76, 0x71, 0xcb, 0xa1, 0x8c, 0xe0, 0x73, 0x73,
-	0xee, 0xff, 0x60, 0x82, 0x71, 0x99, 0x06, 0x77, 0x29, 0xc6, 0x2f, 0xff, 0x03, 0xbb, 0xb8, 0x6e,
-	0x44, 0x2e, 0x7f, 0x8e, 0x90, 0x2b, 0x30, 0xee, 0x50, 0xdd, 0xb5, 0x2d, 0x3c, 0x0b, 0x82, 0x9a,
-	0x23, 0x32, 0x35, 0x47, 0xb4, 0x7f, 0xf3, 0xfd, 0xca, 0xe9, 0x56, 0x89, 0x56, 0x7c, 0x97, 0x2e,
-	0xc3, 0x38, 0xd7, 0x28, 0xfb, 0x84, 0xe2, 0x65, 0x9f, 0x10, 0x78, 0x4a, 0x9f, 0x82, 0x45, 0x1b,
-	0x39, 0x76, 0xd1, 0x24, 0xf7, 0x47, 0x07, 0x72, 0x7f, 0xac, 0x0f, 0xf7, 0xff, 0xae, 0xc0, 0xe9,
-	0x0d, 0x34, 0x2a, 0xba, 0x02, 0x51, 0xaf, 0x94, 0x41, 0xbd, 0x1a, 0x3e, 0xd6, 0xab, 0x9b, 0x30,
-	0xbe, 0x67, 0x56, 0x3c, 0xea, 0xe0, 0x0a, 0xc4, 0x57, 0x67, 0x82, 0x30, 0xa5, 0xde, 0x6d, 0x9c,
-	0xe0, 0x96, 0x73, 0x22, 0xd9, 0x72, 0x8e, 0x0c, 0xb8, 0xcd, 0xf7, 0x60, 0x4a, 0x96, 0x4d, 0xbe,
-	0x0c, 0xe3, 0xae, 0xa7, 0x7b, 0xd4, 0x55, 0x95, 0xa5, 0x91, 0xe5, 0xe9, 0xd5, 0x44, 0xa0, 0x9e,
-	0xa1, 0x5c, 0x18, 0x27, 0x90, 0x85, 0x71, 0x44, 0xfb, 0x71, 0x12, 0x46, 0x36, 0xec, 0x22, 0x59,
-	0x82, 0xe1, 0x60, 0x71, 0x92, 0xcd, 0x46, 0x7a, 0xca, 0x94, 0x97, 0x65, 0xd8, 0x34, 0xa2, 0x25,
-	0x71, 0xa2, 0xcf, 0x92, 0xf8, 0xc4, 0x23, 0x2a, 0x52, 0xdf, 0x4f, 0xf4, 0x5d, 0xdf, 0x67, 0x83,
-	0x52, 0x9d, 0x97, 0x6f, 0xb3, 0xfe, 0x9a, 0x0d, 0x50, 0x99, 0xbf, 0x15, 0xbd, 0x0f, 0x21, 0x9a,
-	0xa2, 0x9e, 0xfe, 0x16, 0x7c, 0xdc, 0xa5, 0x0e, 0x8f, 0xa3, 0x82, 0xa5, 0x40, 0xc1, 0xf3, 0x2e,
-	0xbb, 0x2f, 0xc1, 0x98, 0xfd, 0xc4, 0xa2, 0x8e, 0xe8, 0x77, 0x70, 0xd5, 0x11, 0x90, 0x57, 0x1d,
-	0x01, 0x42, 0xe1, 0x2c, 0x2e, 0x7f, 0x01, 0x87, 0xee, 0xbe, 0x59, 0x2b, 0xd4, 0x5d, 0xea, 0x14,
-	0xca, 0x8e, 0x5d, 0xaf, 0xb9, 0xea, 0x29, 0x3c, 0xdb, 0x17, 0x9b, 0x8d, 0xb4, 0x86, 0x64, 0x0f,
-	0x7d, 0xaa, 0x5d, 0x97, 0x3a, 0x77, 0x90, 0x46, 0x92, 0xa9, 0x76, 0xa3, 0x21, 0xdf, 0x53, 0xe0,
-	0x62, 0xc9, 0xae, 0xd6, 0x58, 0x6d, 0x41, 0x8d, 0x42, 0x2f, 0x95, 0xa7, 0x97, 0x94, 0xe5, 0xa9,
-	0xec, 0xab, 0xcd, 0x46, 0xfa, 0x4a, 0xc8, 0xf1, 0xe6, 0xf1, 0xca, 0xb5, 0xe3, 0xa9, 0x23, 0x7d,
-	0xe7, 0x68, 0x9f, 0x7d, 0xa7, 0xdc, 0xc3, 0x8c, 0x3d, 0xf7, 0x1e, 0x66, 0xea, 0x79, 0xf4, 0x30,
-	0xbf, 0x50, 0x60, 0x49, 0x74, 0x03, 0xa6, 0x55, 0x2e, 0x38, 0xd4, 0xb5, 0xeb, 0x4e, 0x89, 0x16,
-	0x44, 0x68, 0xb0, 0xba, 0xdd, 0x55, 0xe7, 0xd0, 0xf6, 0xe5, 0x4e, 0x9a, 0xb6, 0x05, 0xc3, 0xb6,
-	0x44, 0x9f, 0xbd, 0xd2, 0x6c, 0xa4, 0x97, 0x43, 0xa9, 0x9d, 0x68, 0x24, 0x63, 0x16, 0x7b, 0x53,
-	0x92, 0x7b, 0x30, 0x51, 0x72, 0xa8, 0xee, 0x51, 0x03, 0x4b, 0x33, 0xd6, 0x94, 0xf0, 0x07, 0x85,
-	0x8c, 0xff, 0x7e, 0x91, 0x79, 0xe4, 0xbf, 0x5f, 0xf0, 0x76, 0x4b, 0x90, 0xcb, 0xed, 0x96, 0x80,
-	0xe4, 0x9e, 0x6d, 0xfa, 0xb9, 0xf4, 0x6c, 0xc9, 0x67, 0xe8, 0xd9, 0xbe, 0x01, 0xf1, 0xc3, 0x6b,
-	0x6e, 0xc1, 0x37, 0x68, 0x06, 0x45, 0x9d, 0x97, 0x97, 0x39, 0x7c, 0x58, 0x61, 0x8b, 0x2d, 0xac,
-	0xe4, 0xd5, 0xf0, 0xe1, 0x35, 0x77, 0xbd, 0xcd, 0x44, 0x08, 0x51, 0x96, 0x9a, 0x98, 0x74, 0xa1,
-	0x4d, 0x25, 0xdd, 0xc3, 0x45, 0xd8, 0x1d, 0xc8, 0x15, 0xe3, 0x16, 0xb9, 0x02, 0x8d, 0x76, 0x9a,
-	0xb3, 0xcf, 0xde, 0x69, 0x2e, 0xfe, 0xaf, 0xd3, 0xfc, 0x2f, 0xed, 0x34, 0xe7, 0x93, 0x67, 0xb4,
-	0x7b, 0x30, 0xd7, 0x71, 0x53, 0x58, 0x42, 0x2c, 0x9a, 0x06, 0x8e, 0xe5, 0x87, 0x38, 0x1f, 0x93,
-	0x03, 0xde, 0xc7, 0xb4, 0x7f, 0x28, 0x30, 0xbf, 0xc1, 0x8a, 0x70, 0x91, 0x22, 0xcd, 0x6f, 0x53,
-	0xbf, 0x40, 0x93, 0xaa, 0x42, 0xa5, 0x8f, 0xaa, 0xf0, 0xc4, 0x6b, 0x8a, 0x37, 0x60, 0xca, 0xa2,
-	0x4f, 0x0a, 0x2d, 0x39, 0x1f, 0xaf, 0x6f, 0x8b, 0x3e, 0xd9, 0x6a, 0x4f, 0xfb, 0x71, 0x09, 0xd6,
-	0x7e, 0x35, 0x0c, 0x67, 0xda, 0x1c, 0x75, 0x6b, 0xb6, 0xe5, 0x52, 0xf2, 0x13, 0x05, 0x54, 0x27,
-	0x9c, 0xc0, 0xa8, 0x61, 0x89, 0xb7, 0x5e, 0xf1, 0xb8, 0xef, 0xf1, 0xd5, 0xeb, 0xfe, 0xfd, 0xde,
-	0x49, 0x40, 0x66, 0xbb, 0x85, 0x79, 0x9b, 0xf3, 0xf2, 0x8b, 0xff, 0xa5, 0x66, 0x23, 0x7d, 0xde,
-	0xe9, 0x4c, 0x21, 0x59, 0x7b, 0xa6, 0x0b, 0x49, 0xca, 0x81, 0x73, 0xbd, 0xe4, 0x9f, 0x48, 0x67,
-	0x6b, 0xc1, 0x9c, 0xd4, 0xcf, 0x71, 0x2f, 0xf1, 0xb1, 0x77, 0x90, 0xbe, 0xe5, 0x12, 0x8c, 0x51,
-	0xc7, 0xb1, 0x1d, 0x59, 0x27, 0x02, 0x32, 0x29, 0x02, 0xda, 0x07, 0xd8, 0xf6, 0x45, 0xf5, 0x91,
-	0x7d, 0x20, 0xbc, 0xe5, 0xe4, 0x63, 0xd1, 0x73, 0xf2, 0xfd, 0x48, 0xb5, 0xf6, 0x9c, 0xa1, 0x8d,
-	0xd9, 0xc5, 0x66, 0x23, 0x9d, 0xc2, 0xce, 0x32, 0x04, 0xe5, 0x95, 0x4e, 0xb6, 0xce, 0x69, 0x1f,
-	0xc6, 0x61, 0x0c, 0xeb, 0x0c, 0x72, 0x11, 0x46, 0xf1, 0xad, 0x82, 0x7b, 0x87, 0xfd, 0xba, 0x15,
-	0x7d, 0xa7, 0xc0, 0x79, 0x92, 0x87, 0x53, 0x7e, 0x20, 0x16, 0xf6, 0xf4, 0x92, 0x27, 0xbc, 0x54,
-	0xb2, 0xe7, 0x9a, 0x8d, 0xb4, 0xea, 0x4f, 0xdd, 0xc6, 0x19, 0x89, 0x79, 0x3a, 0x3a, 0x43, 0xae,
-	0x43, 0x1c, 0xcb, 0x25, 0x5e, 0x3d, 0x89, 0xe6, 0x13, 0x93, 0x3e, 0x83, 0x79, 0xd5, 0x23, 0x27,
-	0xfd, 0x10, 0x65, 0xc7, 0x01, 0x8b, 0x2c, 0x9f, 0x97, 0x77, 0x6e, 0x78, 0x1c, 0x10, 0x6f, 0x63,
-	0x8e, 0x4b, 0x30, 0x29, 0xc3, 0xa9, 0xa0, 0xb2, 0xa8, 0x98, 0x55, 0xd3, 0xf3, 0xdf, 0xb0, 0x17,
-	0x71, 0x61, 0x71, 0x31, 0x82, 0x52, 0xe2, 0x3e, 0x12, 0xf0, 0x68, 0x66, 0x8b, 0xab, 0x3a, 0x91,
-	0x89, 0x48, 0x65, 0x34, 0x1d, 0x9d, 0x23, 0xbf, 0x56, 0xe0, 0x62, 0x8b, 0xa6, 0x42, 0xf1, 0x28,
-	0x38, 0xc5, 0x85, 0x52, 0x45, 0x77, 0x5d, 0xfe, 0x3e, 0x34, 0x21, 0xbd, 0x68, 0x77, 0x32, 0x20,
-	0x7b, 0xe4, 0x9f, 0xe6, 0x1c, 0x63, 0xda, 0xd4, 0xab, 0x94, 0xdb, 0xb4, 0xd2, 0x6c, 0xa4, 0x5f,
-	0x71, 0x8e, 0xa3, 0x95, 0x96, 0xe2, 0xfc, 0xb1, 0xc4, 0x64, 0x07, 0xe2, 0x35, 0xea, 0x54, 0x4d,
-	0xd7, 0xc5, 0x36, 0x82, 0xbf, 0xb6, 0xcf, 0x4b, 0xb6, 0x6d, 0x85, 0xb3, 0x7c, 0xd5, 0x25, 0x72,
-	0x79, 0xd5, 0x25, 0x98, 0x65, 0xe8, 0x92, 0xed, 0x18, 0xb6, 0x45, 0xf9, 0xe7, 0x8b, 0x49, 0xd1,
-	0xab, 0x09, 0x2c, 0xd2, 0xab, 0x09, 0x8c, 0x3c, 0x80, 0x19, 0xde, 0x69, 0x14, 0x0c, 0x5a, 0x73,
-	0x68, 0x09, 0xcb, 0xae, 0x18, 0x6e, 0xf6, 0x12, 0x0b, 0x74, 0x3e, 0xb9, 0x16, 0xcc, 0x45, 0x76,
-	0x23, 0xd9, 0x3a, 0x4b, 0xd6, 0x82, 0x16, 0x0b, 0xda, 0x5c, 0xea, 0xbb, 0xc9, 0x4a, 0xfd, 0x53,
-	0x81, 0xb8, 0xb4, 0x00, 0x64, 0x1b, 0x26, 0xdd, 0x7a, 0xf1, 0x80, 0x96, 0x82, 0x84, 0xb9, 0xd8,
-	0x79, 0xa9, 0x32, 0x3b, 0x9c, 0x4c, 0xd4, 0x62, 0x82, 0x27, 0x52, 0x8b, 0x09, 0x0c, 0x53, 0x16,
-	0x75, 0x8a, 0xfc, 0x49, 0xcc, 0x4f, 0x59, 0x0c, 0x88, 0xa4, 0x2c, 0x06, 0xa4, 0xde, 0x85, 0x09,
-	0x21, 0x97, 0x1d, 0xe0, 0x43, 0xd3, 0x32, 0xe4, 0x03, 0xcc, 0xc6, 0xf2, 0x01, 0x66, 0xe3, 0xe0,
-	0xa0, 0x0f, 0xf7, 0x3e, 0xe8, 0x29, 0x13, 0x4e, 0x77, 0x38, 0x06, 0x4f, 0x91, 0x74, 0x95, 0x63,
-	0xab, 0x89, 0x9f, 0x29, 0x70, 0xb1, 0xbf, 0x88, 0xef, 0x4f, 0xfd, 0x3d, 0x59, 0xbd, 0xdf, 0xa2,
-	0x46, 0x04, 0xb6, 0x68, 0x3b, 0xce, 0xc0, 0x93, 0xaf, 0xdc, 0xb4, 0x1f, 0x8e, 0xc1, 0xd9, 0x1e,
-	0x26, 0xb2, 0xee, 0x68, 0xa1, 0xaa, 0xbf, 0x6f, 0x56, 0xeb, 0xd5, 0xb0, 0x35, 0xda, 0x73, 0xf4,
-	0x12, 0xbb, 0x16, 0x45, 0xe8, 0x7d, 0xe5, 0x38, 0x47, 0x33, 0x0f, 0xb8, 0x04, 0x1f, 0xbd, 0x2d,
-	0xf8, 0xa5, 0xfb, 0xba, 0xda, 0x99, 0x42, 0xbe, 0xaf, 0xbb, 0x90, 0x90, 0xdf, 0x28, 0x70, 0xbe,
-	0xab, 0x89, 0x98, 0xfb, 0x6c, 0xbb, 0x82, 0x41, 0x1d, 0x5f, 0xcd, 0x3d, 0xad, 0xa9, 0xd9, 0xa3,
-	0x2d, 0xdb, 0xae, 0x70, 0x83, 0x5f, 0x69, 0x36, 0xd2, 0x2f, 0x57, 0x7b, 0xd1, 0x49, 0x66, 0xbf,
-	0xd0, 0x93, 0x90, 0x15, 0x1b, 0xbd, 0x16, 0xe7, 0xa4, 0xe2, 0x5e, 0x3b, 0xde, 0xcd, 0xfe, 0x54,
-	0x3f, 0x8c, 0xc6, 0xfc, 0x8b, 0xed, 0xeb, 0xcb, 0x04, 0x0e, 0x16, 0xf7, 0xda, 0x6f, 0x87, 0x21,
-	0x7d, 0x8c, 0x0c, 0xf2, 0xcb, 0x3e, 0x02, 0xf3, 0x56, 0x3f, 0xd6, 0x9c, 0x68, 0x70, 0x7e, 0x11,
-	0xfb, 0xab, 0xe5, 0x21, 0x86, 0xf7, 0xc0, 0x7d, 0xd3, 0xf5, 0xc8, 0x35, 0x18, 0xc7, 0x72, 0xde,
-	0xbf, 0x27, 0x20, 0xbc, 0x27, 0xf8, 0x9d, 0xc3, 0x67, 0xe5, 0x3b, 0x87, 0x23, 0xda, 0x2e, 0x10,
-	0xfe, 0x82, 0x5c, 0x91, 0x6a, 0x60, 0x72, 0x13, 0x12, 0x25, 0x8e, 0x52, 0x43, 0xea, 0x55, 0xf0,
-	0x63, 0x51, 0x30, 0x11, 0xed, 0x58, 0xa6, 0x64, 0x5c, 0xbb, 0x0e, 0xa7, 0x50, 0xfb, 0x1d, 0x1a,
-	0x7c, 0x6f, 0xe8, 0xb3, 0x08, 0xd4, 0xde, 0x00, 0x82, 0xac, 0x39, 0xbc, 0xab, 0x07, 0xe5, 0xfe,
-	0x2a, 0xcc, 0x22, 0xf7, 0xae, 0x55, 0x7a, 0x2a, 0xfe, 0x9b, 0xa0, 0xee, 0x78, 0x0e, 0xd5, 0xab,
-	0xa6, 0x55, 0x6e, 0xf5, 0xe0, 0x02, 0x8c, 0x58, 0xf5, 0x2a, 0x8a, 0x48, 0xf0, 0x6d, 0xb4, 0xea,
-	0x55, 0x79, 0x1b, 0xad, 0x7a, 0x35, 0x30, 0x7f, 0x8d, 0x56, 0xa8, 0x47, 0x07, 0x55, 0xff, 0xb1,
-	0x02, 0xc0, 0x1f, 0xbc, 0xb1, 0xf9, 0xec, 0xb7, 0x70, 0xbe, 0x0e, 0x71, 0xdc, 0x4f, 0xa3, 0x70,
-	0x60, 0xe3, 0xdd, 0xae, 0x2c, 0x8f, 0xf1, 0x8a, 0x97, 0xc3, 0x1b, 0x76, 0xe4, 0x82, 0x87, 0x10,
-	0x65, 0xac, 0x15, 0xaa, 0xbb, 0x3e, 0xeb, 0x48, 0xc8, 0xca, 0xe1, 0x56, 0xd6, 0x10, 0xd5, 0x9e,
-	0xc0, 0x69, 0xbe, 0xd6, 0x35, 0x43, 0xf7, 0xc2, 0xc6, 0xef, 0x75, 0xf9, 0xc3, 0x52, 0x34, 0x16,
-	0x7b, 0x75, 0xa2, 0x03, 0x34, 0x36, 0x75, 0x50, 0xb3, 0xba, 0x57, 0xda, 0xef, 0xa4, 0xfd, 0x5d,
-	0x48, 0xec, 0xe9, 0x66, 0xc5, 0x7f, 0x42, 0xf5, 0x4f, 0x84, 0x1a, 0x5a, 0x11, 0x65, 0xe0, 0x41,
-	0xcd, 0x59, 0xde, 0x6c, 0x3d, 0x25, 0x53, 0x32, 0x1e, 0xf8, 0x9b, 0xc3, 0x47, 0xb6, 0x2f, 0xca,
-	0xdf, 0x16, 0xed, 0xc7, 0xfb, 0x1b, 0x65, 0x18, 0xc0, 0xdf, 0x38, 0xc4, 0xf2, 0x96, 0xf1, 0x40,
-	0x77, 0x0e, 0xa9, 0xa3, 0x7d, 0xa4, 0xc0, 0x5c, 0xf4, 0x64, 0x3c, 0xa0, 0xae, 0xab, 0x97, 0x29,
-	0xf9, 0xd2, 0x60, 0xfe, 0xdf, 0x1d, 0x0a, 0xbf, 0x67, 0x8c, 0x50, 0xcb, 0x10, 0x97, 0xca, 0x34,
-	0x7f, 0x18, 0xf3, 0xf5, 0xf1, 0xf3, 0x45, 0xe5, 0x1a, 0xf3, 0xee, 0xd0, 0x36, 0xa3, 0xcf, 0x4e,
-	0xc0, 0x18, 0x7d, 0x4c, 0x2d, 0x4f, 0xfb, 0xbe, 0x22, 0x36, 0xa4, 0xe5, 0xcb, 0x66, 0xbf, 0xa7,
-	0xe6, 0x4e, 0xd8, 0x6e, 0xe2, 0xb5, 0x41, 0xfd, 0xaa, 0x18, 0x3f, 0xb0, 0xb6, 0x4c, 0xc9, 0x1f,
-	0x58, 0x5b, 0xa6, 0xb4, 0x3f, 0x28, 0x7e, 0xce, 0x8a, 0x7c, 0x8c, 0xfb, 0xbc, 0xed, 0x20, 0x6b,
-	0x10, 0x3b, 0x10, 0x9f, 0xc2, 0x78, 0xdb, 0xdb, 0xf6, 0x81, 0x0c, 0x5f, 0x30, 0x03, 0x1a, 0xf9,
-	0x05, 0x33, 0x00, 0x2f, 0xa7, 0x20, 0x2e, 0xfd, 0xa3, 0x82, 0xc4, 0x61, 0x42, 0x0c, 0x93, 0x43,
-	0x97, 0x2f, 0x41, 0x5c, 0xfa, 0xf4, 0x4e, 0xa6, 0x60, 0x72, 0xd3, 0x36, 0xe8, 0x96, 0xed, 0x78,
-	0xc9, 0x21, 0x36, 0xba, 0x4b, 0x75, 0xa3, 0xc2, 0x48, 0x95, 0xcb, 0x3f, 0x57, 0x60, 0xd2, 0xd7,
-	0x4b, 0x00, 0xc6, 0xdf, 0xdc, 0xcd, 0xef, 0xe6, 0xd7, 0x92, 0x43, 0x4c, 0xe0, 0x56, 0x7e, 0x73,
-	0x6d, 0x7d, 0xf3, 0x4e, 0x52, 0x61, 0x83, 0xed, 0xdd, 0xcd, 0x4d, 0x36, 0x18, 0x26, 0x09, 0x88,
-	0xed, 0xec, 0xe6, 0x72, 0xf9, 0xfc, 0x5a, 0x7e, 0x2d, 0x39, 0xc2, 0x98, 0x6e, 0xdf, 0x5a, 0xbf,
-	0x9f, 0x5f, 0x4b, 0x8e, 0x32, 0xba, 0xdd, 0xcd, 0x7b, 0x9b, 0x0f, 0xdf, 0xde, 0x4c, 0x8e, 0x71,
-	0xba, 0xec, 0x83, 0xf5, 0x47, 0x8f, 0xf2, 0x6b, 0xc9, 0x71, 0x46, 0x77, 0x3f, 0x7f, 0x6b, 0x27,
-	0xbf, 0x96, 0x9c, 0x60, 0x53, 0x5b, 0xdb, 0xf9, 0xfc, 0x83, 0x2d, 0x36, 0x35, 0xc9, 0x86, 0xb9,
-	0x5b, 0x9b, 0xb9, 0xfc, 0x7d, 0x26, 0x25, 0xc6, 0x2c, 0xdc, 0xce, 0x6f, 0xe4, 0x73, 0x6c, 0x12,
-	0x56, 0x7f, 0x3f, 0x06, 0x53, 0xb8, 0x6d, 0xfe, 0x93, 0xef, 0x6b, 0x10, 0xe7, 0x87, 0x85, 0x3f,
-	0x5b, 0x48, 0x91, 0x9c, 0x9a, 0x6f, 0x7b, 0x8c, 0xcf, 0xb3, 0x75, 0xd3, 0x86, 0xc8, 0x4d, 0x98,
-	0x92, 0x98, 0x5c, 0x32, 0x1d, 0x72, 0xb1, 0xbb, 0x39, 0xf5, 0x02, 0x8e, 0xbb, 0x9d, 0x5f, 0x6d,
-	0x88, 0x69, 0xe5, 0x29, 0x69, 0x40, 0xad, 0x12, 0xd3, 0xf1, 0x5a, 0xa3, 0x49, 0x4f, 0x1b, 0x22,
-	0x5f, 0x83, 0x38, 0xbf, 0xa2, 0xb8, 0xd6, 0x33, 0x21, 0x7f, 0xe4, 0xe6, 0xea, 0x61, 0x42, 0x06,
-	0x26, 0xef, 0x50, 0x8f, 0xb3, 0xcf, 0x86, 0xec, 0xe1, 0x85, 0x99, 0x92, 0x5c, 0xd1, 0x86, 0xc8,
-	0x06, 0xc4, 0x7c, 0x7a, 0x97, 0x70, 0xfb, 0xba, 0x5d, 0xb5, 0xa9, 0x54, 0x87, 0x69, 0x91, 0x6f,
-	0xb4, 0xa1, 0x57, 0x15, 0x66, 0x3d, 0xaf, 0x0f, 0xda, 0xac, 0x8f, 0x94, 0x0d, 0x3d, 0xac, 0x5f,
-	0x83, 0x84, 0x5f, 0x23, 0x70, 0x19, 0x0b, 0xd2, 0x0d, 0x11, 0x2d, 0x1e, 0x7a, 0x4a, 0x99, 0x16,
-	0xc9, 0xe7, 0xa1, 0x10, 0x23, 0x25, 0xde, 0x68, 0x5a, 0xea, 0x21, 0x25, 0x0b, 0x09, 0x9e, 0x39,
-	0x1e, 0x76, 0xf0, 0x47, 0x4e, 0x29, 0xdd, 0x65, 0xac, 0xfe, 0x20, 0x06, 0xe3, 0xfc, 0xd9, 0x8e,
-	0xbc, 0x05, 0xc0, 0x7f, 0xe1, 0x05, 0x3f, 0xd7, 0xf1, 0x8f, 0x24, 0xa9, 0xf9, 0xce, 0x6f, 0x7d,
-	0xda, 0xc2, 0x77, 0xff, 0xf4, 0xb7, 0x1f, 0x0d, 0x9f, 0xd6, 0xa6, 0x57, 0x1e, 0x5f, 0x5d, 0x39,
-	0xb0, 0x8b, 0xe2, 0x4f, 0xb7, 0x37, 0x94, 0xcb, 0xe4, 0x6d, 0x00, 0x6e, 0x4d, 0x54, 0x6e, 0xd4,
-	0x42, 0x6e, 0x7a, 0x7b, 0x4d, 0xd9, 0x2e, 0x98, 0x17, 0x8c, 0x4c, 0xf0, 0x37, 0x61, 0x2a, 0x10,
-	0xbc, 0x43, 0x3d, 0xb1, 0x86, 0x1d, 0xfe, 0xdf, 0xd0, 0xd5, 0xff, 0x73, 0x28, 0x7c, 0x5e, 0x9b,
-	0x11, 0xc2, 0x5d, 0xea, 0x49, 0xf2, 0x2d, 0x48, 0xca, 0x2f, 0xcc, 0x68, 0xfe, 0xd9, 0xce, 0x6f,
-	0xcf, 0x5c, 0xcd, 0xb9, 0x5e, 0x0f, 0xd3, 0x5a, 0x1a, 0x95, 0x2d, 0x68, 0xb3, 0xbe, 0x27, 0xd2,
-	0x23, 0x33, 0x65, 0xfa, 0xde, 0x85, 0xb8, 0xd8, 0x7b, 0x54, 0x15, 0x2c, 0x75, 0x9f, 0x01, 0x91,
-	0x42, 0xf9, 0xb3, 0xda, 0x29, 0x5f, 0x7e, 0x8d, 0xf3, 0x31, 0xd1, 0x77, 0x06, 0x4f, 0x51, 0xb3,
-	0x28, 0x6e, 0x5a, 0x8b, 0x31, 0x71, 0x78, 0xf3, 0x32, 0x41, 0xa5, 0x67, 0x4b, 0x5b, 0x2f, 0xa2,
-	0xd0, 0x45, 0x6d, 0x81, 0x09, 0x2d, 0x32, 0x2a, 0x6a, 0xac, 0xf0, 0xaf, 0x8f, 0xa2, 0x10, 0x61,
-	0x4a, 0x36, 0x07, 0x4f, 0x6d, 0x67, 0x51, 0xf0, 0x5c, 0x2a, 0x19, 0x58, 0xbb, 0xf2, 0x1d, 0x76,
-	0x4b, 0x7e, 0x20, 0x8c, 0x7e, 0x96, 0xac, 0x27, 0x8c, 0x4e, 0x45, 0x8c, 0xae, 0x23, 0x8d, 0x64,
-	0xf4, 0x3b, 0xcf, 0x98, 0x19, 0x55, 0xd4, 0x42, 0x2e, 0xb7, 0x79, 0x40, 0x6e, 0x0f, 0x94, 0x31,
-	0x85, 0x1c, 0xd2, 0x2e, 0xc7, 0x78, 0x4e, 0x99, 0x54, 0x04, 0x1a, 0x21, 0xf2, 0x7a, 0xf0, 0x85,
-	0x78, 0x55, 0x21, 0x37, 0x60, 0xfc, 0x2e, 0xfe, 0x57, 0x9d, 0x74, 0xf1, 0x34, 0xc5, 0xcf, 0x29,
-	0x27, 0xca, 0xed, 0xd3, 0xd2, 0x61, 0x50, 0x64, 0xbe, 0xf3, 0xbb, 0x4f, 0x17, 0x95, 0x4f, 0x3e,
-	0x5d, 0x54, 0xfe, 0xfa, 0xe9, 0xa2, 0xf2, 0xd1, 0x67, 0x8b, 0x43, 0x9f, 0x7c, 0xb6, 0x38, 0xf4,
-	0xe7, 0xcf, 0x16, 0x87, 0xbe, 0xfe, 0x72, 0xd9, 0xf4, 0xf6, 0xeb, 0xc5, 0x4c, 0xc9, 0xae, 0xae,
-	0xe8, 0x4e, 0x55, 0x37, 0xf4, 0x9a, 0x63, 0x1f, 0xd0, 0x92, 0x27, 0x46, 0x2b, 0xe2, 0x7f, 0xf2,
-	0x1f, 0x0f, 0xcf, 0xde, 0x42, 0x60, 0x8b, 0x4f, 0x67, 0xd6, 0xed, 0xcc, 0xad, 0x9a, 0x59, 0x1c,
-	0x47, 0x1b, 0x5e, 0xfb, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x33, 0xb3, 0x1f, 0x9e, 0x15, 0x30,
-	0x00, 0x00,
+	// 3191 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3a, 0xcb, 0x6f, 0x1b, 0xc7,
+	0xf9, 0x5a, 0xbd, 0xf9, 0x51, 0x94, 0xa9, 0xb1, 0x24, 0xaf, 0x68, 0x47, 0x94, 0xd7, 0x89, 0x23,
+	0x3b, 0xfe, 0x51, 0xb1, 0xf2, 0x0b, 0x7e, 0xb6, 0x7f, 0x69, 0x5d, 0x93, 0xa2, 0x6d, 0xc9, 0xb6,
+	0xac, 0x48, 0x56, 0x1e, 0x45, 0x51, 0x76, 0xc9, 0x1d, 0x51, 0x2b, 0x91, 0xbb, 0xcc, 0xee, 0xd2,
+	0x8e, 0x5a, 0xe4, 0x52, 0x14, 0xcd, 0xa1, 0x97, 0xa0, 0x3d, 0x15, 0x0d, 0xda, 0x1e, 0x7a, 0x4a,
+	0xcf, 0xbd, 0x14, 0xfd, 0x03, 0x8a, 0xf6, 0x92, 0xa2, 0x97, 0xf6, 0x42, 0x14, 0x49, 0x1f, 0x00,
+	0x6f, 0xbd, 0xf7, 0x50, 0xcc, 0x37, 0xb3, 0xbb, 0xb3, 0x7c, 0x89, 0xb4, 0xad, 0xa4, 0x87, 0xde,
+	0x38, 0xdf, 0x7c, 0xef, 0xf9, 0xe6, 0x7b, 0xcc, 0x12, 0x66, 0x6b, 0x87, 0xe5, 0x15, 0xbd, 0x66,
+	0xae, 0xb8, 0xf5, 0x62, 0xd5, 0xf4, 0x32, 0x35, 0xc7, 0xf6, 0x6c, 0x32, 0xa2, 0xd7, 0xcc, 0xd4,
+	0xd9, 0xb2, 0x6d, 0x97, 0x2b, 0x74, 0x05, 0x41, 0xc5, 0xfa, 0xde, 0x0a, 0xad, 0xd6, 0xbc, 0x23,
+	0x8e, 0x91, 0x4a, 0xb7, 0x6e, 0x7a, 0x66, 0x95, 0xba, 0x9e, 0x5e, 0xad, 0x09, 0x04, 0xed, 0xf0,
+	0x9a, 0x9b, 0x31, 0x6d, 0xe4, 0x5d, 0xb2, 0x1d, 0xba, 0xf2, 0xf8, 0xea, 0x4a, 0x99, 0x5a, 0xd4,
+	0xd1, 0x3d, 0x6a, 0x08, 0x9c, 0x65, 0x09, 0xc7, 0xa2, 0xde, 0x13, 0xdb, 0x39, 0x34, 0xad, 0x72,
+	0x27, 0xcc, 0x73, 0x42, 0x1c, 0xc3, 0xd4, 0x2d, 0xcb, 0xf6, 0x74, 0xcf, 0xb4, 0x2d, 0x57, 0xec,
+	0x06, 0x46, 0xec, 0x53, 0xbd, 0xe2, 0xed, 0x73, 0xa8, 0xf6, 0x31, 0xc0, 0xec, 0x86, 0x5d, 0xdc,
+	0x41, 0xc3, 0xb6, 0xe9, 0x7b, 0x75, 0xea, 0x7a, 0xeb, 0x1e, 0xad, 0x92, 0x55, 0x98, 0xac, 0x39,
+	0xa6, 0xed, 0x98, 0xde, 0x91, 0xaa, 0x2c, 0x29, 0xcb, 0x4a, 0x76, 0xbe, 0xd9, 0x48, 0x13, 0x1f,
+	0x76, 0xc5, 0xae, 0x9a, 0x1e, 0xda, 0xba, 0x1d, 0xe0, 0x91, 0xd7, 0x21, 0x66, 0xe9, 0x55, 0xea,
+	0xd6, 0xf4, 0x12, 0x55, 0x47, 0x96, 0x94, 0xe5, 0x58, 0xf6, 0x4c, 0xb3, 0x91, 0x3e, 0x1d, 0x00,
+	0x25, 0xaa, 0x10, 0x93, 0xbc, 0x06, 0xb1, 0x52, 0xc5, 0xa4, 0x96, 0x57, 0x30, 0x0d, 0x75, 0x12,
+	0xc9, 0x50, 0x16, 0x07, 0xae, 0x1b, 0xb2, 0x2c, 0x1f, 0x46, 0x76, 0x60, 0xbc, 0xa2, 0x17, 0x69,
+	0xc5, 0x55, 0x47, 0x97, 0x46, 0x96, 0xe3, 0xab, 0x2f, 0x65, 0xf4, 0x9a, 0x99, 0xe9, 0x64, 0x4a,
+	0xe6, 0x3e, 0xe2, 0xe5, 0x2d, 0xcf, 0x39, 0xca, 0xce, 0x36, 0x1b, 0xe9, 0x24, 0x27, 0x94, 0xd8,
+	0x0a, 0x56, 0xa4, 0x0c, 0x71, 0xc9, 0x71, 0xea, 0x18, 0x72, 0xbe, 0xdc, 0x9d, 0xf3, 0xad, 0x10,
+	0x99, 0xb3, 0x5f, 0x68, 0x36, 0xd2, 0x73, 0x12, 0x0b, 0x49, 0x86, 0xcc, 0x99, 0x7c, 0xa8, 0xc0,
+	0xac, 0x43, 0xdf, 0xab, 0x9b, 0x0e, 0x35, 0x0a, 0x96, 0x6d, 0xd0, 0x82, 0x30, 0x66, 0x1c, 0x45,
+	0x5e, 0xed, 0x2e, 0x72, 0x5b, 0x50, 0x6d, 0xda, 0x06, 0x95, 0x0d, 0xd3, 0x9a, 0x8d, 0xf4, 0x39,
+	0xa7, 0x6d, 0x33, 0x54, 0x40, 0x55, 0xb6, 0x49, 0xfb, 0x3e, 0x79, 0x08, 0x93, 0x35, 0xdb, 0x28,
+	0xb8, 0x35, 0x5a, 0x52, 0x87, 0x97, 0x94, 0xe5, 0xf8, 0xea, 0xd9, 0x0c, 0x8f, 0x38, 0xd4, 0x81,
+	0x45, 0x65, 0xe6, 0xf1, 0xd5, 0xcc, 0x96, 0x6d, 0xec, 0xd4, 0x68, 0x09, 0xcf, 0x73, 0xa6, 0xc6,
+	0x17, 0x11, 0xde, 0x13, 0x02, 0x48, 0xb6, 0x20, 0xe6, 0x33, 0x74, 0xd5, 0x09, 0x34, 0xa7, 0x27,
+	0x47, 0x1e, 0x56, 0x7c, 0xe1, 0x46, 0xc2, 0x4a, 0xc0, 0x48, 0x0e, 0x26, 0x4c, 0xab, 0xec, 0x50,
+	0xd7, 0x55, 0x63, 0xc8, 0x8f, 0x20, 0xa3, 0x75, 0x0e, 0xcb, 0xd9, 0xd6, 0x9e, 0x59, 0xce, 0xce,
+	0x31, 0xc5, 0x04, 0x9a, 0xc4, 0xc5, 0xa7, 0x24, 0xb7, 0x61, 0xd2, 0xa5, 0xce, 0x63, 0xb3, 0x44,
+	0x5d, 0x15, 0x24, 0x2e, 0x3b, 0x1c, 0x28, 0xb8, 0xa0, 0x32, 0x3e, 0x9e, 0xac, 0x8c, 0x0f, 0x63,
+	0x31, 0xee, 0x96, 0xf6, 0xa9, 0x51, 0xaf, 0x50, 0x47, 0x8d, 0x87, 0x31, 0x1e, 0x00, 0xe5, 0x18,
+	0x0f, 0x80, 0xa4, 0x0e, 0x73, 0xf4, 0xfd, 0x1a, 0x75, 0xcc, 0x2a, 0xb5, 0x3c, 0xbd, 0xb2, 0xe5,
+	0x98, 0x25, 0xba, 0x6e, 0xed, 0xd9, 0x6a, 0x02, 0x7d, 0x9e, 0x42, 0x5d, 0xf2, 0x9d, 0x30, 0xb2,
+	0x17, 0x9a, 0x8d, 0x74, 0xba, 0x23, 0xb1, 0x24, 0xaa, 0x33, 0xf7, 0x94, 0x0e, 0x71, 0x29, 0x48,
+	0xc8, 0x05, 0x18, 0x39, 0xa4, 0xfc, 0x3e, 0xc7, 0xb2, 0x33, 0xcd, 0x46, 0x3a, 0x71, 0x48, 0xe5,
+	0xab, 0xcc, 0x76, 0xc9, 0x25, 0x18, 0x7b, 0xac, 0x57, 0xea, 0x14, 0xc3, 0x21, 0x96, 0x3d, 0xdd,
+	0x6c, 0xa4, 0x4f, 0x21, 0x40, 0x42, 0xe4, 0x18, 0x37, 0x86, 0xaf, 0x29, 0xa9, 0x3d, 0x48, 0xb6,
+	0x5e, 0x83, 0x13, 0x91, 0x53, 0x85, 0x33, 0x5d, 0x62, 0xff, 0x24, 0xc4, 0x6d, 0x8c, 0x4e, 0x4e,
+	0x25, 0x13, 0xda, 0x3f, 0x47, 0x20, 0x11, 0x89, 0x33, 0x72, 0x03, 0x46, 0xbd, 0xa3, 0x1a, 0x45,
+	0x61, 0xd3, 0xab, 0x49, 0x39, 0x12, 0x1f, 0x1d, 0xd5, 0x28, 0x26, 0x98, 0x69, 0x86, 0x11, 0xb9,
+	0x1d, 0x48, 0xc3, 0x54, 0xa8, 0xd9, 0x8e, 0xe7, 0xaa, 0xc3, 0x4b, 0x23, 0xcb, 0x09, 0xae, 0x02,
+	0x02, 0x64, 0x15, 0x10, 0x40, 0xbe, 0x15, 0xcd, 0x44, 0x23, 0x18, 0xb1, 0x17, 0xda, 0xe3, 0xfe,
+	0xe9, 0x53, 0xd0, 0x75, 0x88, 0x7b, 0x15, 0xb7, 0x40, 0x2d, 0xbd, 0x58, 0xa1, 0x86, 0x3a, 0xba,
+	0xa4, 0x2c, 0x4f, 0x66, 0xd5, 0x66, 0x23, 0x3d, 0xeb, 0x31, 0xbf, 0x22, 0x54, 0xa2, 0x85, 0x10,
+	0x8a, 0x09, 0x9b, 0x3a, 0x5e, 0x81, 0xa5, 0x70, 0x75, 0x4c, 0x4a, 0xd8, 0xd4, 0xf1, 0x36, 0xf5,
+	0x2a, 0x8d, 0x24, 0x6c, 0x01, 0x23, 0x37, 0x21, 0x51, 0x77, 0x69, 0xa1, 0x54, 0xa9, 0xbb, 0x1e,
+	0x75, 0xd6, 0xb7, 0xd4, 0x71, 0x94, 0x98, 0x6a, 0x36, 0xd2, 0xf3, 0x75, 0x97, 0xe6, 0x7c, 0xb8,
+	0x44, 0x3c, 0x25, 0xc3, 0xbf, 0xa8, 0x40, 0xd3, 0x3e, 0x56, 0x20, 0x11, 0xc9, 0x0a, 0xe4, 0x5a,
+	0x87, 0x33, 0x17, 0x18, 0x78, 0xe6, 0xa4, 0xfd, 0xcc, 0x07, 0x3f, 0xf1, 0x8b, 0x30, 0x8a, 0xfe,
+	0xe4, 0x75, 0x13, 0x59, 0x5a, 0x51, 0x5f, 0xe2, 0xbe, 0xf6, 0x67, 0x05, 0x92, 0xad, 0x95, 0x81,
+	0xc9, 0x79, 0xaf, 0x4e, 0xeb, 0x54, 0x78, 0x02, 0xe5, 0x20, 0x40, 0x96, 0x83, 0x00, 0xf2, 0xbf,
+	0x00, 0x07, 0x76, 0xb1, 0xe0, 0x52, 0x2c, 0xb7, 0xc3, 0xe1, 0xe9, 0x1d, 0xd8, 0xc5, 0x1d, 0xda,
+	0x52, 0x6e, 0x7d, 0x18, 0x31, 0x60, 0x86, 0x51, 0x39, 0x5c, 0x5e, 0x81, 0x21, 0xf8, 0x51, 0xb9,
+	0xd0, 0xb5, 0x58, 0x65, 0x5f, 0x68, 0x36, 0xd2, 0x0b, 0x07, 0x76, 0x51, 0x82, 0xc9, 0x96, 0x9f,
+	0x6a, 0xd9, 0xd2, 0xfe, 0xa0, 0xc0, 0xcc, 0x86, 0x5d, 0xdc, 0x72, 0x28, 0x43, 0xf8, 0xc2, 0x8c,
+	0xfb, 0x1f, 0x98, 0x60, 0x54, 0xa6, 0xc1, 0x4d, 0x8a, 0xf1, 0x2e, 0xe1, 0xc0, 0x2e, 0xae, 0x1b,
+	0x91, 0x2e, 0x81, 0x43, 0xc8, 0x15, 0x18, 0x77, 0xa8, 0xee, 0xda, 0x16, 0x5e, 0x1a, 0x81, 0xcd,
+	0x21, 0x32, 0x36, 0x87, 0x68, 0xff, 0xe2, 0xe7, 0x95, 0xd3, 0xad, 0x12, 0xad, 0xf8, 0x26, 0x5d,
+	0x86, 0x71, 0x2e, 0x51, 0xb6, 0x09, 0xd9, 0xcb, 0x36, 0x21, 0xe0, 0x29, 0x6d, 0x0a, 0x9c, 0x36,
+	0x72, 0xac, 0xd3, 0x24, 0xf3, 0x47, 0x07, 0x32, 0x7f, 0xac, 0x0f, 0xf3, 0xff, 0xa6, 0xc0, 0xe9,
+	0x0d, 0x54, 0x2a, 0xea, 0x81, 0xa8, 0x55, 0xca, 0xa0, 0x56, 0x0d, 0x1f, 0x6b, 0xd5, 0x4d, 0x18,
+	0xdf, 0x33, 0x2b, 0x1e, 0x75, 0xd0, 0x03, 0xf1, 0xd5, 0x99, 0x20, 0x4c, 0xa9, 0x77, 0x1b, 0x37,
+	0xb8, 0xe6, 0x1c, 0x49, 0xd6, 0x9c, 0x43, 0x06, 0x3c, 0xe6, 0x7b, 0x30, 0x25, 0xf3, 0x26, 0xff,
+	0x0f, 0xe3, 0xae, 0xa7, 0x7b, 0xd4, 0x55, 0x95, 0xa5, 0x91, 0xe5, 0xe9, 0xd5, 0x44, 0x20, 0x9e,
+	0x41, 0x39, 0x33, 0x8e, 0x20, 0x33, 0xe3, 0x10, 0xed, 0xc7, 0x49, 0x18, 0xd9, 0xb0, 0x8b, 0x64,
+	0x09, 0x86, 0x03, 0xe7, 0x24, 0x9b, 0x8d, 0xf4, 0x94, 0x29, 0xbb, 0x65, 0xd8, 0x34, 0xa2, 0xbd,
+	0x73, 0xa2, 0xcf, 0xde, 0xf9, 0xc4, 0x23, 0x2a, 0x32, 0x08, 0x4c, 0xf4, 0x3d, 0x08, 0x64, 0x83,
+	0x9e, 0x9e, 0xf7, 0x79, 0xb3, 0xbe, 0xcf, 0x06, 0x68, 0xe1, 0xdf, 0x8a, 0x16, 0x4e, 0x88, 0xa6,
+	0xa8, 0xa7, 0x2f, 0x97, 0x8f, 0xbb, 0x34, 0xec, 0x71, 0x14, 0xb0, 0x14, 0x08, 0x78, 0xde, 0xfd,
+	0xf9, 0x25, 0x18, 0xb3, 0x9f, 0x58, 0xd4, 0x11, 0x83, 0x11, 0x7a, 0x1d, 0x01, 0xb2, 0xd7, 0x11,
+	0x40, 0x28, 0x9c, 0x45, 0xf7, 0x17, 0x70, 0xe9, 0xee, 0x9b, 0xb5, 0x42, 0xdd, 0xa5, 0x4e, 0xa1,
+	0xec, 0xd8, 0xf5, 0x9a, 0xab, 0x9e, 0xc2, 0xbb, 0x7d, 0xb1, 0xd9, 0x48, 0x6b, 0x88, 0xf6, 0xd0,
+	0xc7, 0xda, 0x75, 0xa9, 0x73, 0x07, 0x71, 0x24, 0x9e, 0x6a, 0x37, 0x1c, 0xf2, 0x3d, 0x05, 0x2e,
+	0x96, 0xec, 0x6a, 0x8d, 0x35, 0x21, 0xd4, 0x28, 0xf4, 0x12, 0x79, 0x7a, 0x49, 0x59, 0x9e, 0xca,
+	0xbe, 0xda, 0x6c, 0xa4, 0xaf, 0x84, 0x14, 0x6f, 0x1e, 0x2f, 0x5c, 0x3b, 0x1e, 0x3b, 0x32, 0xa0,
+	0x8e, 0xf6, 0x39, 0xa0, 0xca, 0xc3, 0xce, 0xd8, 0x73, 0x1f, 0x76, 0xa6, 0x9e, 0xc7, 0xb0, 0xf3,
+	0x73, 0x05, 0x96, 0xc4, 0xd8, 0x60, 0x5a, 0xe5, 0x82, 0x43, 0x5d, 0xbb, 0xee, 0x94, 0x68, 0x41,
+	0x84, 0x06, 0x6b, 0xf0, 0x5d, 0x75, 0x0e, 0x75, 0x5f, 0xee, 0x24, 0x69, 0x5b, 0x10, 0x6c, 0x4b,
+	0xf8, 0xd9, 0x2b, 0xcd, 0x46, 0x7a, 0x39, 0xe4, 0xda, 0x09, 0x47, 0x52, 0x66, 0xb1, 0x37, 0x26,
+	0xb9, 0x07, 0x13, 0x25, 0x87, 0xea, 0x1e, 0x35, 0xb0, 0x87, 0x63, 0xd3, 0x0b, 0x7f, 0x79, 0xc8,
+	0xf8, 0x0f, 0x1d, 0x99, 0x47, 0xfe, 0x43, 0x07, 0x9f, 0xcb, 0x04, 0xba, 0x3c, 0x97, 0x09, 0x90,
+	0x3c, 0xdc, 0x4d, 0x3f, 0x97, 0xe1, 0x2e, 0xf9, 0x0c, 0xc3, 0xdd, 0x37, 0x20, 0x7e, 0x78, 0xcd,
+	0x2d, 0xf8, 0x0a, 0xcd, 0x20, 0xab, 0xf3, 0xb2, 0x9b, 0xc3, 0x17, 0x18, 0xe6, 0x6c, 0xa1, 0x25,
+	0x6f, 0x9b, 0x0f, 0xaf, 0xb9, 0xeb, 0x6d, 0x2a, 0x42, 0x08, 0x65, 0xa9, 0x89, 0x71, 0x17, 0xd2,
+	0x54, 0xd2, 0x3d, 0x5c, 0x84, 0xde, 0x01, 0x5f, 0xb1, 0x6e, 0xe1, 0x2b, 0xa0, 0xd1, 0x91, 0x74,
+	0xf6, 0xd9, 0x47, 0xd2, 0xc5, 0xff, 0x8e, 0xa4, 0xff, 0xa1, 0x23, 0xe9, 0x7c, 0xf2, 0x8c, 0x76,
+	0x0f, 0xe6, 0x3a, 0x1e, 0x0a, 0x4b, 0x88, 0x45, 0xd3, 0xc0, 0xb5, 0xfc, 0x62, 0xe7, 0xc3, 0xe4,
+	0x80, 0xf7, 0x61, 0xda, 0xdf, 0x15, 0x98, 0xdf, 0x60, 0x4d, 0xb8, 0x48, 0x91, 0xe6, 0xb7, 0xa9,
+	0xdf, 0xa0, 0x49, 0x5d, 0xa1, 0xd2, 0x47, 0x57, 0x78, 0xe2, 0x3d, 0xc5, 0x1b, 0x30, 0x65, 0xd1,
+	0x27, 0x85, 0x96, 0x9c, 0x8f, 0xe5, 0xdb, 0xa2, 0x4f, 0xb6, 0xda, 0xd3, 0x7e, 0x5c, 0x02, 0x6b,
+	0xbf, 0x1c, 0x86, 0x33, 0x6d, 0x86, 0xba, 0x35, 0xdb, 0x72, 0x29, 0xf9, 0x89, 0x02, 0xaa, 0x13,
+	0x6e, 0x60, 0xd4, 0xb0, 0xc4, 0x5b, 0xaf, 0x78, 0xdc, 0xf6, 0xf8, 0xea, 0x75, 0xbf, 0xbe, 0x77,
+	0x62, 0x90, 0xd9, 0x6e, 0x21, 0xde, 0xe6, 0xb4, 0xbc, 0xf0, 0xbf, 0xd4, 0x6c, 0xa4, 0xcf, 0x3b,
+	0x9d, 0x31, 0x24, 0x6d, 0xcf, 0x74, 0x41, 0x49, 0x39, 0x70, 0xae, 0x17, 0xff, 0x13, 0x19, 0x81,
+	0x2d, 0x98, 0x93, 0xe6, 0x39, 0x6e, 0x25, 0xbe, 0x0a, 0x0f, 0x32, 0xb7, 0x5c, 0x82, 0x31, 0xea,
+	0x38, 0xb6, 0x23, 0xcb, 0x44, 0x80, 0x8c, 0x8a, 0x00, 0xed, 0x03, 0x1c, 0xfb, 0xa2, 0xf2, 0xc8,
+	0x3e, 0x10, 0x3e, 0x72, 0xf2, 0xb5, 0x98, 0x39, 0xf9, 0x79, 0xa4, 0x5a, 0x67, 0xce, 0x50, 0xc7,
+	0xec, 0x62, 0xb3, 0x91, 0x4e, 0xe1, 0x64, 0x19, 0x02, 0x65, 0x4f, 0x27, 0x5b, 0xf7, 0xb4, 0x0f,
+	0xe3, 0x30, 0x86, 0x7d, 0x46, 0x30, 0x84, 0x2b, 0xbd, 0x87, 0x70, 0x92, 0x87, 0x53, 0x7e, 0x20,
+	0x16, 0xf6, 0xf4, 0x92, 0x27, 0xac, 0x54, 0xb2, 0xe7, 0x9a, 0x8d, 0xb4, 0xea, 0x6f, 0xdd, 0xc6,
+	0x1d, 0x89, 0x78, 0x3a, 0xba, 0x43, 0xae, 0x43, 0x1c, 0xdb, 0x25, 0xde, 0x3d, 0x89, 0xe1, 0x13,
+	0x93, 0x3e, 0x03, 0xf3, 0xae, 0x47, 0x4e, 0xfa, 0x21, 0x94, 0x5d, 0x07, 0x6c, 0xb2, 0x7c, 0x5a,
+	0x3e, 0xb9, 0xe1, 0x75, 0x40, 0x78, 0x1b, 0x71, 0x5c, 0x02, 0x93, 0x32, 0x9c, 0x0a, 0x3a, 0x8b,
+	0x8a, 0x59, 0x35, 0x3d, 0xff, 0xb1, 0x7b, 0x11, 0x1d, 0x8b, 0xce, 0x08, 0x5a, 0x89, 0xfb, 0x88,
+	0xc0, 0xa3, 0x99, 0x39, 0x57, 0x75, 0x22, 0x1b, 0x91, 0xce, 0x68, 0x3a, 0xba, 0x47, 0x7e, 0xa5,
+	0xc0, 0xc5, 0x16, 0x49, 0x85, 0xe2, 0x51, 0x70, 0x8b, 0x0b, 0xa5, 0x8a, 0xee, 0xba, 0xfc, 0x21,
+	0x69, 0x42, 0x7a, 0xfa, 0xee, 0xa4, 0x40, 0xf6, 0xc8, 0xbf, 0xcd, 0x39, 0x46, 0xb4, 0xa9, 0x57,
+	0x29, 0xd7, 0x69, 0xa5, 0xd9, 0x48, 0xbf, 0xe2, 0x1c, 0x87, 0x2b, 0xb9, 0xe2, 0xfc, 0xb1, 0xc8,
+	0x64, 0x07, 0xe2, 0x35, 0xea, 0x54, 0x4d, 0xd7, 0xc5, 0x31, 0x82, 0x3f, 0xcb, 0xcf, 0x4b, 0xba,
+	0x6d, 0x85, 0xbb, 0xdc, 0xeb, 0x12, 0xba, 0xec, 0x75, 0x09, 0xcc, 0x32, 0x74, 0xc9, 0x76, 0x0c,
+	0xdb, 0xa2, 0xfc, 0x3b, 0xc7, 0xa4, 0x98, 0xd5, 0x04, 0x2c, 0x32, 0xab, 0x09, 0x18, 0x79, 0x00,
+	0x33, 0x7c, 0xd2, 0x28, 0x18, 0xb4, 0xe6, 0xd0, 0x12, 0xb6, 0x5d, 0x31, 0x3c, 0xec, 0x25, 0x16,
+	0xe8, 0x7c, 0x73, 0x2d, 0xd8, 0x8b, 0x9c, 0x46, 0xb2, 0x75, 0x97, 0xac, 0x05, 0x23, 0x16, 0xb4,
+	0x99, 0xd4, 0xf7, 0x90, 0x95, 0xfa, 0x87, 0x02, 0x71, 0xc9, 0x01, 0x64, 0x1b, 0x26, 0xdd, 0x7a,
+	0xf1, 0x80, 0x96, 0x82, 0x84, 0xb9, 0xd8, 0xd9, 0x55, 0x99, 0x1d, 0x8e, 0x26, 0x7a, 0x31, 0x41,
+	0x13, 0xe9, 0xc5, 0x04, 0x0c, 0x53, 0x16, 0x75, 0x8a, 0xfc, 0xe9, 0xcc, 0x4f, 0x59, 0x0c, 0x10,
+	0x49, 0x59, 0x0c, 0x90, 0x7a, 0x17, 0x26, 0x04, 0x5f, 0x76, 0x81, 0x0f, 0x4d, 0xcb, 0x90, 0x2f,
+	0x30, 0x5b, 0xcb, 0x17, 0x98, 0xad, 0x83, 0x8b, 0x3e, 0xdc, 0xfb, 0xa2, 0xa7, 0x4c, 0x38, 0xdd,
+	0xe1, 0x1a, 0x3c, 0x45, 0xd2, 0x55, 0x8e, 0xed, 0x26, 0x7e, 0xaa, 0xc0, 0xc5, 0xfe, 0x22, 0xbe,
+	0x3f, 0xf1, 0xf7, 0x64, 0xf1, 0xfe, 0x88, 0x1a, 0x61, 0xd8, 0x22, 0xed, 0x38, 0x05, 0x4f, 0xbe,
+	0x73, 0xd3, 0x7e, 0x38, 0x06, 0x67, 0x7b, 0xa8, 0xc8, 0xa6, 0xa3, 0x85, 0xaa, 0xfe, 0xbe, 0x59,
+	0xad, 0x57, 0xc3, 0xd1, 0x68, 0xcf, 0xd1, 0x4b, 0xac, 0x2c, 0x8a, 0xd0, 0xfb, 0xca, 0x71, 0x86,
+	0x66, 0x1e, 0x70, 0x0e, 0x3e, 0xf4, 0xb6, 0xa0, 0x97, 0xea, 0x75, 0xb5, 0x33, 0x86, 0x5c, 0xaf,
+	0xbb, 0xa0, 0x90, 0x5f, 0x2b, 0x70, 0xbe, 0xab, 0x8a, 0x98, 0xfb, 0x6c, 0xbb, 0x82, 0x41, 0x1d,
+	0x5f, 0xcd, 0x3d, 0xad, 0xaa, 0xd9, 0xa3, 0x2d, 0xdb, 0xae, 0x70, 0x85, 0x5f, 0x69, 0x36, 0xd2,
+	0x2f, 0x57, 0x7b, 0xe1, 0x49, 0x6a, 0xbf, 0xd0, 0x13, 0x91, 0x35, 0x1b, 0xbd, 0x9c, 0x73, 0x52,
+	0x71, 0xaf, 0x1d, 0x6f, 0x66, 0x7f, 0xa2, 0x1f, 0x46, 0x63, 0xfe, 0xc5, 0x76, 0xff, 0x32, 0x86,
+	0x83, 0xc5, 0xbd, 0xf6, 0x9b, 0x61, 0x48, 0x1f, 0xc3, 0x83, 0xfc, 0xa2, 0x8f, 0xc0, 0xbc, 0xd5,
+	0x8f, 0x36, 0x27, 0x1a, 0x9c, 0x5f, 0xc6, 0xf9, 0x6a, 0x79, 0x88, 0x61, 0x1d, 0xb8, 0x6f, 0xba,
+	0x1e, 0xb9, 0x06, 0xe3, 0xd8, 0xce, 0xfb, 0x75, 0x02, 0xc2, 0x3a, 0xc1, 0x6b, 0x0e, 0xdf, 0x95,
+	0x6b, 0x0e, 0x87, 0x68, 0xbb, 0x40, 0xf8, 0x0b, 0x72, 0x45, 0xea, 0x81, 0xc9, 0x4d, 0x48, 0x94,
+	0x38, 0x94, 0x1a, 0xd2, 0xac, 0x82, 0x5f, 0x95, 0x82, 0x8d, 0xe8, 0xc4, 0x32, 0x25, 0xc3, 0xb5,
+	0xeb, 0x70, 0x0a, 0xa5, 0xdf, 0xa1, 0xc1, 0xf7, 0x86, 0x3e, 0x9b, 0x40, 0xed, 0x0d, 0x20, 0x48,
+	0x9a, 0xc3, 0x5a, 0x3d, 0x28, 0xf5, 0x57, 0x61, 0x16, 0xa9, 0x77, 0xad, 0xd2, 0x53, 0xd1, 0xdf,
+	0x04, 0x75, 0xc7, 0x73, 0xa8, 0x5e, 0x35, 0xad, 0x72, 0xab, 0x05, 0x17, 0x60, 0xc4, 0xaa, 0x57,
+	0x91, 0x45, 0x82, 0x1f, 0xa3, 0x55, 0xaf, 0xca, 0xc7, 0x68, 0xd5, 0xab, 0x81, 0xfa, 0x6b, 0xb4,
+	0x42, 0x3d, 0x3a, 0xa8, 0xf8, 0x4f, 0x14, 0x00, 0xfe, 0xe0, 0x8d, 0xc3, 0x67, 0xbf, 0x8d, 0xf3,
+	0x75, 0x88, 0xe3, 0x79, 0x1a, 0x85, 0x03, 0x1b, 0x6b, 0xbb, 0xb2, 0x3c, 0xc6, 0x3b, 0x5e, 0x0e,
+	0xde, 0xb0, 0x23, 0x05, 0x1e, 0x42, 0x28, 0x23, 0xad, 0x50, 0xdd, 0xf5, 0x49, 0x47, 0x42, 0x52,
+	0x0e, 0x6e, 0x25, 0x0d, 0xa1, 0xda, 0x13, 0x38, 0xcd, 0x7d, 0x5d, 0x33, 0x74, 0x2f, 0x1c, 0xfc,
+	0x5e, 0x97, 0x3f, 0x2c, 0x45, 0x63, 0xb1, 0xd7, 0x24, 0x3a, 0xc0, 0x60, 0x53, 0x07, 0x35, 0xab,
+	0x7b, 0xa5, 0xfd, 0x4e, 0xd2, 0xdf, 0x85, 0xc4, 0x9e, 0x6e, 0x56, 0xfc, 0x27, 0x54, 0xff, 0x46,
+	0xa8, 0xa1, 0x16, 0x51, 0x02, 0x1e, 0xd4, 0x9c, 0xe4, 0xcd, 0xd6, 0x5b, 0x32, 0x25, 0xc3, 0x03,
+	0x7b, 0x73, 0xf8, 0xc8, 0xf6, 0x65, 0xd9, 0xdb, 0x22, 0xfd, 0x78, 0x7b, 0xa3, 0x04, 0x03, 0xd8,
+	0x1b, 0x87, 0x58, 0xde, 0x32, 0x1e, 0xe8, 0xce, 0x21, 0x75, 0xb4, 0x8f, 0x14, 0x98, 0x8b, 0xde,
+	0x8c, 0x07, 0xd4, 0x75, 0xf5, 0x32, 0x25, 0xff, 0x37, 0x98, 0xfd, 0x77, 0x87, 0xc2, 0xef, 0x19,
+	0x23, 0xd4, 0x32, 0x44, 0x51, 0x99, 0xe6, 0x0f, 0x63, 0xbe, 0x3c, 0x7e, 0xbf, 0xa8, 0xdc, 0x63,
+	0xde, 0x1d, 0xda, 0x66, 0xf8, 0xd9, 0x09, 0x18, 0xa3, 0x8f, 0xa9, 0xe5, 0x69, 0xdf, 0x57, 0xc4,
+	0x81, 0xb4, 0x7c, 0xd9, 0xec, 0xf7, 0xd6, 0xdc, 0x09, 0xc7, 0x4d, 0x2c, 0x1b, 0xd4, 0xef, 0x8a,
+	0xf1, 0x03, 0x6b, 0xcb, 0x96, 0xfc, 0x81, 0xb5, 0x65, 0x4b, 0xfb, 0xbd, 0xe2, 0xe7, 0xac, 0xc8,
+	0xc7, 0xb8, 0x2f, 0x5a, 0x0f, 0xb2, 0x06, 0xb1, 0x03, 0xf1, 0x29, 0x8c, 0x8f, 0xbd, 0x6d, 0x1f,
+	0xc8, 0xf0, 0x05, 0x33, 0xc0, 0x91, 0x5f, 0x30, 0x03, 0xe0, 0xe5, 0x14, 0xc4, 0xa5, 0xbf, 0x5e,
+	0x90, 0x38, 0x4c, 0x88, 0x65, 0x72, 0xe8, 0xf2, 0x25, 0x88, 0x4b, 0x9f, 0xe8, 0xc9, 0x14, 0x4c,
+	0x6e, 0xda, 0x06, 0xdd, 0xb2, 0x1d, 0x2f, 0x39, 0xc4, 0x56, 0x77, 0xa9, 0x6e, 0x54, 0x18, 0xaa,
+	0x72, 0xf9, 0x67, 0x0a, 0x4c, 0xfa, 0x72, 0x09, 0xc0, 0xf8, 0x9b, 0xbb, 0xf9, 0xdd, 0xfc, 0x5a,
+	0x72, 0x88, 0x31, 0xdc, 0xca, 0x6f, 0xae, 0xad, 0x6f, 0xde, 0x49, 0x2a, 0x6c, 0xb1, 0xbd, 0xbb,
+	0xb9, 0xc9, 0x16, 0xc3, 0x24, 0x01, 0xb1, 0x9d, 0xdd, 0x5c, 0x2e, 0x9f, 0x5f, 0xcb, 0xaf, 0x25,
+	0x47, 0x18, 0xd1, 0xed, 0x5b, 0xeb, 0xf7, 0xf3, 0x6b, 0xc9, 0x51, 0x86, 0xb7, 0xbb, 0x79, 0x6f,
+	0xf3, 0xe1, 0xdb, 0x9b, 0xc9, 0x31, 0x8e, 0x97, 0x7d, 0xb0, 0xfe, 0xe8, 0x51, 0x7e, 0x2d, 0x39,
+	0xce, 0xf0, 0xee, 0xe7, 0x6f, 0xed, 0xe4, 0xd7, 0x92, 0x13, 0x6c, 0x6b, 0x6b, 0x3b, 0x9f, 0x7f,
+	0xb0, 0xc5, 0xb6, 0x26, 0xd9, 0x32, 0x77, 0x6b, 0x33, 0x97, 0xbf, 0xcf, 0xb8, 0xc4, 0x98, 0x86,
+	0xdb, 0xf9, 0x8d, 0x7c, 0x8e, 0x6d, 0xc2, 0xea, 0xef, 0xc6, 0x60, 0x0a, 0x8f, 0xcd, 0x7f, 0xf2,
+	0x7d, 0x0d, 0xe2, 0xfc, 0xb2, 0xf0, 0x67, 0x0b, 0x29, 0x92, 0x53, 0xf3, 0x6d, 0x8f, 0xf1, 0x79,
+	0xe6, 0x37, 0x6d, 0x88, 0xdc, 0x84, 0x29, 0x89, 0xc8, 0x25, 0xd3, 0x21, 0x15, 0xab, 0xcd, 0xa9,
+	0x17, 0x70, 0xdd, 0xed, 0xfe, 0x6a, 0x43, 0x4c, 0x2a, 0x4f, 0x49, 0x03, 0x4a, 0x95, 0x88, 0x8e,
+	0x97, 0x1a, 0x4d, 0x7a, 0xda, 0x10, 0xf9, 0x1a, 0xc4, 0x79, 0x89, 0xe2, 0x52, 0xcf, 0x84, 0xf4,
+	0x91, 0xca, 0xd5, 0x43, 0x85, 0x0c, 0x4c, 0xde, 0xa1, 0x1e, 0x27, 0x9f, 0x0d, 0xc9, 0xc3, 0x82,
+	0x99, 0x92, 0x4c, 0xd1, 0x86, 0xc8, 0x06, 0xc4, 0x7c, 0x7c, 0x97, 0x70, 0xfd, 0xba, 0x95, 0xda,
+	0x54, 0xaa, 0xc3, 0xb6, 0xc8, 0x37, 0xda, 0xd0, 0xab, 0x0a, 0xd3, 0x9e, 0xf7, 0x07, 0x6d, 0xda,
+	0x47, 0xda, 0x86, 0x1e, 0xda, 0xaf, 0x41, 0xc2, 0xef, 0x11, 0x38, 0x8f, 0x05, 0xa9, 0x42, 0x44,
+	0x9b, 0x87, 0x9e, 0x5c, 0xa6, 0x45, 0xf2, 0x79, 0x28, 0xd8, 0x48, 0x89, 0x37, 0x9a, 0x96, 0x7a,
+	0x70, 0xc9, 0x42, 0x82, 0x67, 0x8e, 0x87, 0x1d, 0xec, 0x91, 0x53, 0x4a, 0x77, 0x1e, 0xab, 0x3f,
+	0x88, 0xc1, 0x38, 0x7f, 0xb6, 0x23, 0x6f, 0x01, 0xf0, 0x5f, 0x58, 0xe0, 0xe7, 0x3a, 0xfe, 0x91,
+	0x24, 0x35, 0xdf, 0xf9, 0xad, 0x4f, 0x5b, 0xf8, 0xee, 0x1f, 0xff, 0xfa, 0xa3, 0xe1, 0xd3, 0xda,
+	0xf4, 0xca, 0xe3, 0xab, 0x2b, 0x07, 0x76, 0x51, 0xfc, 0x3b, 0xf7, 0x86, 0x72, 0x99, 0xbc, 0x0d,
+	0xc0, 0xb5, 0x89, 0xf2, 0x8d, 0x6a, 0xc8, 0x55, 0x6f, 0xef, 0x29, 0xdb, 0x19, 0xf3, 0x86, 0x91,
+	0x31, 0xfe, 0x26, 0x4c, 0x05, 0x8c, 0x77, 0xa8, 0x27, 0x7c, 0xd8, 0xe1, 0xff, 0x0d, 0x5d, 0xed,
+	0x3f, 0x87, 0xcc, 0xe7, 0xb5, 0x19, 0xc1, 0xdc, 0xa5, 0x9e, 0xc4, 0xdf, 0x82, 0xa4, 0xfc, 0xc2,
+	0x8c, 0xea, 0x9f, 0xed, 0xfc, 0xf6, 0xcc, 0xc5, 0x9c, 0xeb, 0xf5, 0x30, 0xad, 0xa5, 0x51, 0xd8,
+	0x82, 0x36, 0xeb, 0x5b, 0x22, 0x3d, 0x32, 0x53, 0x26, 0xef, 0x5d, 0x88, 0x8b, 0xb3, 0x47, 0x51,
+	0x81, 0xab, 0xfb, 0x0c, 0x88, 0x14, 0xf2, 0x9f, 0xd5, 0x4e, 0xf9, 0xfc, 0x6b, 0x9c, 0x8e, 0xb1,
+	0xbe, 0x33, 0x78, 0x8a, 0x9a, 0x45, 0x76, 0xd3, 0x5a, 0x8c, 0xb1, 0xc3, 0xca, 0xcb, 0x18, 0x95,
+	0x9e, 0x2d, 0x6d, 0xbd, 0x88, 0x4c, 0x17, 0xb5, 0x05, 0xc6, 0xb4, 0xc8, 0xb0, 0xa8, 0xb1, 0xc2,
+	0xbf, 0x3e, 0x8a, 0x46, 0x84, 0x09, 0xd9, 0x1c, 0x3c, 0xb5, 0x9d, 0x45, 0xc6, 0x73, 0xa9, 0x64,
+	0xa0, 0xed, 0xca, 0x77, 0x58, 0x95, 0xfc, 0x40, 0x28, 0xfd, 0x2c, 0x59, 0x4f, 0x28, 0x9d, 0x8a,
+	0x28, 0x5d, 0x47, 0x1c, 0x49, 0xe9, 0x77, 0x9e, 0x31, 0x33, 0xaa, 0x28, 0x85, 0x5c, 0x6e, 0xb3,
+	0x80, 0xdc, 0x1e, 0x28, 0x63, 0x0a, 0x3e, 0xa4, 0x9d, 0x8f, 0xf1, 0x9c, 0x32, 0xa9, 0x08, 0x34,
+	0x42, 0x64, 0x7f, 0x70, 0x47, 0xbc, 0xaa, 0x90, 0x1b, 0x30, 0x7e, 0x17, 0xff, 0xd4, 0x4e, 0xba,
+	0x58, 0x9a, 0xe2, 0xf7, 0x94, 0x23, 0xe5, 0xf6, 0x69, 0xe9, 0x30, 0x68, 0x32, 0xdf, 0xf9, 0xed,
+	0x67, 0x8b, 0xca, 0xa7, 0x9f, 0x2d, 0x2a, 0x7f, 0xf9, 0x6c, 0x51, 0xf9, 0xe8, 0xf3, 0xc5, 0xa1,
+	0x4f, 0x3f, 0x5f, 0x1c, 0xfa, 0xd3, 0xe7, 0x8b, 0x43, 0x5f, 0x7f, 0xb9, 0x6c, 0x7a, 0xfb, 0xf5,
+	0x62, 0xa6, 0x64, 0x57, 0x57, 0x74, 0xa7, 0xaa, 0x1b, 0x7a, 0xcd, 0xb1, 0x0f, 0x68, 0xc9, 0x13,
+	0xab, 0x15, 0xf1, 0x87, 0xfa, 0x4f, 0x86, 0x67, 0x6f, 0x21, 0x60, 0x8b, 0x6f, 0x67, 0xd6, 0xed,
+	0xcc, 0xad, 0x9a, 0x59, 0x1c, 0x47, 0x1d, 0x5e, 0xfb, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+	0xa5, 0x2f, 0x0a, 0x3e, 0x30, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -3890,6 +3898,13 @@ func (m *ServiceConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	if len(m.Name) > 0 {
+		i -= len(m.Name)
+		copy(dAtA[i:], m.Name)
+		i = encodeVarintSubmit(dAtA, i, uint64(len(m.Name)))
+		i--
+		dAtA[i] = 0x1a
+	}
 	if len(m.Ports) > 0 {
 		dAtA6 := make([]byte, len(m.Ports)*10)
 		var j5 int
@@ -5744,6 +5759,10 @@ func (m *ServiceConfig) Size() (n int) {
 		}
 		n += 1 + sovSubmit(uint64(l)) + l
 	}
+	l = len(m.Name)
+	if l > 0 {
+		n += 1 + l + sovSubmit(uint64(l))
+	}
 	return n
 }
 
@@ -7686,6 +7705,38 @@ func (m *ServiceConfig) Unmarshal(dAtA []byte) error {
 			} else {
 				return fmt.Errorf("proto: wrong wireType = %d for field Ports", wireType)
 			}
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowSubmit
+				}
+				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 ErrInvalidLengthSubmit
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthSubmit
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Name = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipSubmit(dAtA[iNdEx:])
diff --git a/pkg/api/submit.proto b/pkg/api/submit.proto
index 0e2f92eb..bbdd09d9 100644
--- a/pkg/api/submit.proto
+++ b/pkg/api/submit.proto
@@ -41,6 +41,7 @@ message IngressConfig {
 message ServiceConfig {
     ServiceType type = 1;
     repeated uint32 ports = 2;
+    string name = 3; // The name of the service resource that is created. If empty a name will be generated based on the job ID.
 }
 
 // Ingress type is being kept here to maintain backwards compatibility for a while.



Test patch:
diff --git a/internal/server/submit/conversion/conversions_test.go b/internal/server/submit/conversion/conversions_test.go
index 9f7a46e4..1f73d822 100644
--- a/internal/server/submit/conversion/conversions_test.go
+++ b/internal/server/submit/conversion/conversions_test.go
@@ -8,6 +8,7 @@ import (
 	v1 "k8s.io/api/core/v1"
 	networking "k8s.io/api/networking/v1"
 
+	"github.com/armadaproject/armada/internal/server/configuration"
 	"github.com/armadaproject/armada/internal/server/submit/testfixtures"
 	"github.com/armadaproject/armada/pkg/api"
 	"github.com/armadaproject/armada/pkg/armadaevents"
@@ -19,10 +20,12 @@ func TestSubmitJobFromApiRequest(t *testing.T) {
 	tests := map[string]struct {
 		jobReq            *api.JobSubmitRequestItem
 		expectedSubmitJob *armadaevents.SubmitJob
+		submissionConfig  configuration.SubmissionConfig
 	}{
 		"No Services or ingresses": {
 			jobReq:            testfixtures.JobSubmitRequestItem(1),
 			expectedSubmitJob: testfixtures.SubmitJob(1),
+			submissionConfig:  testfixtures.DefaultSubmissionConfig(),
 		},
 		"NodePort Service": {
 			jobReq: jobSubmitRequestItemWithServices([]*api.ServiceConfig{
@@ -63,6 +66,7 @@ func TestSubmitJobFromApiRequest(t *testing.T) {
 					},
 				},
 			}),
+			submissionConfig: testfixtures.DefaultSubmissionConfig(),
 		},
 		"Headless Service": {
 			jobReq: jobSubmitRequestItemWithServices([]*api.ServiceConfig{
@@ -103,6 +107,7 @@ func TestSubmitJobFromApiRequest(t *testing.T) {
 					},
 				},
 			}),
+			submissionConfig: testfixtures.DefaultSubmissionConfig(),
 		},
 		"Ingress": {
 			jobReq: jobSubmitRequestItemWithIngresses([]*api.IngressConfig{
@@ -184,6 +189,167 @@ func TestSubmitJobFromApiRequest(t *testing.T) {
 					},
 				},
 			}),
+			submissionConfig: testfixtures.DefaultSubmissionConfig(),
+		},
+		"Service With Custom Name With Feature Flag Enabled": {
+			jobReq: jobSubmitRequestItemWithServices([]*api.ServiceConfig{
+				{
+					Type:  api.ServiceType_NodePort,
+					Ports: []uint32{8080},
+					Name:  "my-custom-service",
+				},
+			}),
+			expectedSubmitJob: SubmitJobMsgWithK8sObjects([]*armadaevents.KubernetesObject{
+				{
+					ObjectMeta: &armadaevents.ObjectMeta{
+						Namespace: testfixtures.DefaultNamespace,
+						Name:      "my-custom-service",
+						Annotations: map[string]string{
+							"armada_jobset_id": testfixtures.DefaultJobset,
+							"armada_owner":     testfixtures.DefaultOwner,
+						},
+						Labels: map[string]string{
+							"armada_job_id":   "00000000000000000000000001",
+							"armada_queue_id": testfixtures.DefaultQueue.Name,
+						},
+					},
+					Object: &armadaevents.KubernetesObject_Service{
+						Service: &v1.ServiceSpec{
+							Ports: []v1.ServicePort{
+								{
+									Name:     "testContainer-8080",
+									Protocol: "TCP",
+									Port:     8080,
+								},
+							},
+							Selector: map[string]string{
+								"armada_job_id": "00000000000000000000000001",
+							},
+							ClusterIP: "",
+							Type:      v1.ServiceTypeNodePort,
+						},
+					},
+				},
+			}),
+			submissionConfig: testfixtures.SubmissionConfigWithCustomServiceNamesEnabled(),
+		},
+		"Service With Custom Name But Feature Flag Disabled": {
+			jobReq: jobSubmitRequestItemWithServices([]*api.ServiceConfig{
+				{
+					Type:  api.ServiceType_NodePort,
+					Ports: []uint32{8080},
+					Name:  "my-custom-service",
+				},
+			}),
+			expectedSubmitJob: SubmitJobMsgWithK8sObjects([]*armadaevents.KubernetesObject{
+				{
+					ObjectMeta: &armadaevents.ObjectMeta{
+						Namespace: testfixtures.DefaultNamespace,
+						Name:      "armada-00000000000000000000000001-0-service-0",
+						Annotations: map[string]string{
+							"armada_jobset_id": testfixtures.DefaultJobset,
+							"armada_owner":     testfixtures.DefaultOwner,
+						},
+						Labels: map[string]string{
+							"armada_job_id":   "00000000000000000000000001",
+							"armada_queue_id": testfixtures.DefaultQueue.Name,
+						},
+					},
+					Object: &armadaevents.KubernetesObject_Service{
+						Service: &v1.ServiceSpec{
+							Ports: []v1.ServicePort{
+								{
+									Name:     "testContainer-8080",
+									Protocol: "TCP",
+									Port:     8080,
+								},
+							},
+							Selector: map[string]string{
+								"armada_job_id": "00000000000000000000000001",
+							},
+							ClusterIP: "",
+							Type:      v1.ServiceTypeNodePort,
+						},
+					},
+				},
+			}),
+			submissionConfig: testfixtures.DefaultSubmissionConfig(),
+		},
+		"Multiple Services": {
+			jobReq: jobSubmitRequestItemWithServices([]*api.ServiceConfig{
+				{
+					Type:  api.ServiceType_NodePort,
+					Ports: []uint32{8080},
+					Name:  "my-custom-service",
+				},
+				{
+					Type:  api.ServiceType_NodePort,
+					Ports: []uint32{9000},
+				},
+			}),
+			expectedSubmitJob: SubmitJobMsgWithK8sObjects([]*armadaevents.KubernetesObject{
+				{
+					ObjectMeta: &armadaevents.ObjectMeta{
+						Namespace: testfixtures.DefaultNamespace,
+						Name:      "my-custom-service",
+						Annotations: map[string]string{
+							"armada_jobset_id": testfixtures.DefaultJobset,
+							"armada_owner":     testfixtures.DefaultOwner,
+						},
+						Labels: map[string]string{
+							"armada_job_id":   "00000000000000000000000001",
+							"armada_queue_id": testfixtures.DefaultQueue.Name,
+						},
+					},
+					Object: &armadaevents.KubernetesObject_Service{
+						Service: &v1.ServiceSpec{
+							Ports: []v1.ServicePort{
+								{
+									Name:     "testContainer-8080",
+									Protocol: "TCP",
+									Port:     8080,
+								},
+							},
+							Selector: map[string]string{
+								"armada_job_id": "00000000000000000000000001",
+							},
+							ClusterIP: "",
+							Type:      v1.ServiceTypeNodePort,
+						},
+					},
+				},
+				{
+					ObjectMeta: &armadaevents.ObjectMeta{
+						Namespace: testfixtures.DefaultNamespace,
+						Name:      "armada-00000000000000000000000001-0-service-0", // Validate that custom service names don't increment the service ID
+						Annotations: map[string]string{
+							"armada_jobset_id": testfixtures.DefaultJobset,
+							"armada_owner":     testfixtures.DefaultOwner,
+						},
+						Labels: map[string]string{
+							"armada_job_id":   "00000000000000000000000001",
+							"armada_queue_id": testfixtures.DefaultQueue.Name,
+						},
+					},
+					Object: &armadaevents.KubernetesObject_Service{
+						Service: &v1.ServiceSpec{
+							Ports: []v1.ServicePort{
+								{
+									Name:     "testContainer-9000",
+									Protocol: "TCP",
+									Port:     9000,
+								},
+							},
+							Selector: map[string]string{
+								"armada_job_id": "00000000000000000000000001",
+							},
+							ClusterIP: "",
+							Type:      v1.ServiceTypeNodePort,
+						},
+					},
+				},
+			}),
+			submissionConfig: testfixtures.SubmissionConfigWithCustomServiceNamesEnabled(),
 		},
 	}
 
@@ -191,7 +357,7 @@ func TestSubmitJobFromApiRequest(t *testing.T) {
 		t.Run(name, func(t *testing.T) {
 			actual := SubmitJobFromApiRequest(
 				tc.jobReq,
-				testfixtures.DefaultSubmissionConfig(),
+				tc.submissionConfig,
 				testfixtures.DefaultJobset, testfixtures.DefaultQueue.Name, testfixtures.DefaultOwner,
 				func() string {
 					return testfixtures.TestUlid(1)
diff --git a/internal/server/submit/testfixtures/test_fixtures.go b/internal/server/submit/testfixtures/test_fixtures.go
index 75d1595d..c2d5ea5d 100644
--- a/internal/server/submit/testfixtures/test_fixtures.go
+++ b/internal/server/submit/testfixtures/test_fixtures.go
@@ -28,6 +28,11 @@ var (
 		ContainerPort: 8080,
 		Protocol:      "TCP",
 	}
+	MetricsContainerPort = v1.ContainerPort{
+		Name:          "metricsContainerPort",
+		ContainerPort: 9000,
+		Protocol:      "TCP",
+	}
 	DefaultResources = v1.ResourceRequirements{
 		Requests: v1.ResourceList{
 			"cpu":    resource.MustParse("1"),
@@ -41,7 +46,7 @@ var (
 	DefaultContainers = []v1.Container{
 		{
 			Name:      "testContainer",
-			Ports:     []v1.ContainerPort{DefaultContainerPort},
+			Ports:     []v1.ContainerPort{DefaultContainerPort, MetricsContainerPort},
 			Resources: DefaultResources,
 		},
 	}
@@ -74,6 +79,21 @@ func DefaultSubmissionConfig() configuration.SubmissionConfig {
 	}
 }
 
+func SubmissionConfigWithCustomServiceNamesEnabled() configuration.SubmissionConfig {
+	return configuration.SubmissionConfig{
+		AllowedPriorityClassNames: map[string]bool{DefaultPriorityClass: true},
+		DefaultPriorityClassName:  DefaultPriorityClass,
+		DefaultJobLimits:          armadaresource.ComputeResources{"cpu": resource.MustParse("1")},
+		DefaultJobTolerations:     DefaultTolerations,
+		MaxPodSpecSizeBytes:       1000,
+		MinJobResources:           map[v1.ResourceName]resource.Quantity{},
+		MinTerminationGracePeriod: 30 * time.Second,
+		MaxTerminationGracePeriod: 300 * time.Second,
+		DefaultActiveDeadline:     1 * time.Hour,
+		AllowCustomServiceNames:   true,
+	}
+}
+
 func CreatePreemptJobSequenceEvents(jobIds []string, reason string) []*armadaevents.EventSequence_Event {
 	events := make([]*armadaevents.EventSequence_Event, len(jobIds))
 	for i, jobId := range jobIds {