@spinnaker/azure 2026.0.1 → 2026.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as e from"angular";import{module as n}from"angular";import{HelpContentsRegistry as t,REST as a,CloudProviderRegistry as r,ConfirmationModalService as l,RecentHistoryService as i,InstanceReader as s,InstanceWriter as o,ModalInjector as c,ReactModal as d,ModalClose as u,noop as p,SETTINGS as g,TaskMonitor as m,AccountService as f,NetworkReader as v,LoadBalancerWriter as h,NameUtils as B,SECURITY_GROUP_READER as A,LOAD_BALANCER_READ_SERVICE as y,FirewallLabels as b,Registry as S,BakeExecutionLabel as D,AuthenticationService as w,PipelineTemplates as C,BakeryReader as z,StageConstants as G,TaskExecutor as k,InfrastructureCaches as I,CACHE_INITIALIZER_SERVICE as F,IMAGE_READER as E,ModalWizard as T,SERVER_GROUP_WRITER as x,UserVerification as N,ReactInjector as P,TaskMonitorWrapper as R,TaskReason as L,ServerGroupWarningMessageService as M,ServerGroupReader as U,ApplicationNameValidator as V,DeploymentStrategyRegistry as _}from"@spinnaker/core";import H from"lodash";import O from"@uirouter/angularjs";import Q from"angular-ui-bootstrap";import X from"react";import{Modal as q,Button as W}from"react-bootstrap";import j from"react-select";var Y,Z;(Z=Y||(Y={}))[Z.TAG_NUMBER_EXCEED=0]="TAG_NUMBER_EXCEED",Z[Z.TAG_KEY_LENGTH_EXCEED=1]="TAG_KEY_LENGTH_EXCEED",Z[Z.TAG_VALUE_LENGTH_EXCEED=2]="TAG_VALUE_LENGTH_EXCEED",Z[Z.TAG_KEY_INVALID_CHARACTER=3]="TAG_KEY_INVALID_CHARACTER",Z[Z.TAG_VALUE_INVALID_CHARACTER=4]="TAG_VALUE_INVALID_CHARACTER",Z[Z.TAG_OBJECT_UNDEFINED=5]="TAG_OBJECT_UNDEFINED";const $=[{type:"Azure Load Balancer",description:""},{type:"Azure Application Gateway",description:""}],J=class{static checkTags(e){if(!e)return{isValid:!1,error:5,errorMessage:"instanceTags is not defined"};const n=Object.keys(e).length;if(!(n>=0&&n<=J.TAG_LIMITATION))return{isValid:!1,error:0,errorMessage:`Number of tags exceeds the limit: ${J.TAG_LIMITATION}`};for(const[n,t]of Object.entries(e)){if(n.length>J.TAG_KEY_LENGTH_LIMITATION)return{isValid:!1,error:1,errorMessage:`Length of Tag key: ${n} exceeds the limit: ${J.TAG_KEY_LENGTH_LIMITATION}`};if(t.length>J.TAG_VALUE_LENGTH_LIMITATION)return{isValid:!1,error:2,errorMessage:`Length of Tag value: ${t} exceeds the limit: ${J.TAG_VALUE_LENGTH_LIMITATION}`};if(J.TAG_INVALID_CHAR_REG_EXR.test(n))return{isValid:!1,error:3,errorMessage:`Invalid characters in Tag key: ${n}`};if(J.TAG_INVALID_CHAR_REG_EXR.test(t))return{isValid:!1,error:4,errorMessage:`Invalid characters in Tag value: ${t}`}}return{isValid:!0,error:null}}static getLoadBalancerType(e){return e=e.toLowerCase().split("_").join(" "),$.find((n=>n.type.toLowerCase()===e))||null}};let K=J;K.TAG_LIMITATION=8,K.TAG_KEY_LENGTH_LIMITATION=512,K.TAG_VALUE_LENGTH_LIMITATION=256,K.TAG_INVALID_CHAR_REG_EXR=/[<>%&\\?/]/;const ee={"azure.securityGroup.ingress.description":"Friendly description of the rule you want to enable (limit 80 chars.)","azure.securityGroup.ingress.priority":"Rules are processed in priority order; the lower the number, the higher the priority. We recommend leaving gaps between rules - 100, 200, 300, etc. - so that it's easier to add new rules without having to edit existing rules. There are several default rules that can be overridden with priority (65000, 65001 and 65500). For more information visit http://portal.azure.com.","azure.securityGroup.ingress.source":"The source filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the incoming traffic from a specific source IP address range (CIDR format) that will be allowed or denied by this rule.","azure.securityGroup.ingress.sourcePortRange":"The source port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which ports incoming traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.","azure.securityGroup.ingress.destination":"The destination filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the outgoing traffic from a specific destination IP address range (CIDR format) that will be allowed or denied by this rule.","azure.securityGroup.ingress.destinationPortRange":"The destination port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which destination ports traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.","azure.securityGroup.ingress.direction":"Specifies whether the rule is for inbound or outbound traffic.","azure.securityGroup.ingress.actions":"To adjust the priority of a rule, move it up or down in the list of rules. Rules at the top of the list have the highest priority.","azure.securityGroup.ingress.destPortRanges":"Provide a single port, such as 80; a port range, such as 1024-65535; or a comma-separated list of single ports and/or port ranges, such as 80,1024-65535. Provide an asterisk (*) to allow traffic on any port.","azure.securityGroup.ingress.sourceIPCIDRRanges":"Provide an address range using CIDR notation, such as 192.168.99.0/24; an IP address, such as 192.168.99.0; or a comma-separated list of address ranges or IP addresses, such as 10.0.0.0/24,44.66.0.0/24","azure.serverGroup.imageName":"(Required) <b>Image</b> is the deployable Azure Machine Image.","azure.serverGroup.stack":"(Required) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.","azure.serverGroup.detail":"(Required) <b>Detail</b> is a naming component to help distinguish specifics of the server group.","azure.serverGroup.scriptLocation":"The location of custom scripts separated by comma or semicolon to be downloaded on to each instance. A single script should be like: fileUri. Multiple scripts should be like fileUri1,fileUri2 or fileUri1;fileUri2","azure.serverGroup.commandToExecute":"Command(s) to execute custom scripts provided during provisioning of an instance.","azure.serverGroup.customData":"Script or metadata to be injected into each instances.","azure.serverGroup.customTags":`Custom tags on Virtual Machine Scale Set. Allow ${K.TAG_LIMITATION} tags at most.`,"azure.serverGroup.enableInboundNAT":"An Azure load balancer of the basic sku will be created with adding inbound NAT port-forwarding rules to facilitate loggin on VM instances. There is no charge for creating an Azure load balancer of the basic sku. This option is disabled if Availability Zones are set which require Standard Azure Load Balancer and an extra Network Security Group with correct inbound and outbound rules configured.","azure.serverGroup.lun":"Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.","azure.serverGroup.diskSizeGB":"Specifies the size of an empty data disk in gigabytes. This value cannot be larger than 1023 GB","azure.serverGroup.managedDisk.storageAccountType":"You can choose between Azure managed disks types to support your workload or scenario.","azure.serverGroup.caching":"Changing the default host caching policy can adversely impact the performance of your application. You should run performance tests to measure its impact. To improve the total IOPS/throughput, we recommend striping across multiple disks and using premium (SSD) disks.","azure.serverGroup.userAssignedIdentities":"Allows your server to access Azure resources. Learn more here: https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview","azure.loadBalancer.dnsName":'If there is no custom DNS label specified, a default DNS name will be created. The default value will be "GeneratedText.cloudapp.net" for Azure Application Gateway or "GeneratedText.[region].cloudapp.azure.com" for Azure Load Balancer.',"azure.loadBalancer.probes.probeInterval":"Probe interval in seconds. This value is the time interval between two consecutive probes.","azure.loadBalancer.probes.timeout":"Probe time-out in seconds. If a valid response is not received within this time-out period, the probe is marked as failed. Note that the time-out value should not be more than the Interval value.","azure.loadBalancer.probes.unhealthyThreshold":"Probe retry count. The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.","azure.loadBalancer.loadBalancingRules.idleTimeout":"Keep a TCP or HTTP connection open without relying on clients to send keep-alive messages.","azure.loadBalancer.loadBalancingRules.sessionPersistence":'Session persistence specifies that traffic from a client should be handled by the same virtual machine in the backend pool for the duration of a session. "None" specifies that successive requests from the same client may be handled by any virtual machine. "Client IP" specifies that successive requests from the same client IP address will be handled by the same virtual machine. "Client IP and protocol" specifies that successive requests from the same client IP address and protocol combination will be handled by the same virtual machine.'};Object.keys(ee).forEach((e=>t.register(e,ee[e])));const ne="spinnaker.azure.image.reader";n(ne,[]).factory("azureImageReader",(function(){return{findImages:function(e){return a("/images/find").query(e).get().then((function(e){return e}),(function(){return[]}))},getImage:function(e,n,t){return a("/images").path(t,n,e).query({provider:"azure"}).get().then((function(e){return e&&e.length?e[0]:null}),(function(){return null}))}}}));const te="spinnaker.azure.instanceType.service";n(te,[]).factory("azureInstanceTypeService",["$q",function(e){const n=[{type:"general",label:"General Purpose",description:"Balanced CPU-to-memory ratio. Ideal for testing and development, small to medium databases, and low to medium traffic web servers.",families:[{type:"B-series",description:"The B-series burstable VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web servers, small databases and development and test environments.",instanceTypes:[{name:"Standard_B1ms",label:"Standard_B1ms",cpu:1,memory:2,storage:{type:"SSD",count:2,size:4}},{name:"Standard_B1s",label:"Standard_B1s",cpu:1,memory:1,storage:{type:"SSD",count:2,size:2}},{name:"Standard_B2ms",label:"Standard_B2ms",cpu:2,memory:8,storage:{type:"SSD",count:4,size:16}},{name:"Standard_B2s",label:"Standard_B2s",cpu:2,memory:4,storage:{type:"SSD",count:4,size:8}},{name:"Standard_B4ms",label:"Standard_B4ms",cpu:4,memory:16,storage:{type:"SSD",count:8,size:32}},{name:"Standard_B8ms",label:"Standard_B8ms",cpu:8,memory:32,storage:{type:"SSD",count:16,size:64}},{name:"Standard_B1ls",label:"Standard_B1ls",cpu:1,memory:.5,storage:{type:"SSD",count:2,size:1}}]},{type:"Dsv3-series",description:"The Dsv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.",instanceTypes:[{name:"Standard_D2s_v3",label:"Standard_D2s_v3",cpu:2,memory:8,storage:{type:"SSD",count:4,size:16}},{name:"Standard_D4s_v3",label:"Standard_D4s_v3",cpu:4,memory:16,storage:{type:"SSD",count:8,size:32}},{name:"Standard_D8s_v3",label:"Standard_D8s_v3",cpu:8,memory:32,storage:{type:"SSD",count:16,size:64}},{name:"Standard_D16s_v3",label:"Standard_D16s_v3",cpu:16,memory:64,storage:{type:"SSD",count:32,size:128}},{name:"Standard_D32s_v3",label:"Standard_D32s_v3",cpu:32,memory:128,storage:{type:"SSD",count:32,size:256}},{name:"Standard_D64s_v3",label:"Standard_D64s_v3",cpu:64,memory:256,storage:{type:"SSD",count:32,size:512}}]},{type:"Dv3-series",description:"The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.",instanceTypes:[{name:"Standard_D2_v3",label:"Standard_D2_v3",cpu:2,memory:8,storage:{type:"SSD",count:4,size:50}},{name:"Standard_D4_v3",label:"Standard_D4_v3",cpu:4,memory:16,storage:{type:"SSD",count:8,size:100}},{name:"Standard_D8_v3",label:"Standard_D8_v3",cpu:8,memory:32,storage:{type:"SSD",count:16,size:200}},{name:"Standard_D16_v3",label:"Standard_D16_v3",cpu:16,memory:64,storage:{type:"SSD",count:32,size:400}},{name:"Standard_D32_v3",label:"Standard_D32_v3",cpu:32,memory:128,storage:{type:"SSD",count:32,size:800}},{name:"Standard_D64_v3",label:"Standard_D64_v3",cpu:64,memory:256,storage:{type:"SSD",count:32,size:1600}}]},{type:"DSv2-series",description:"",instanceTypes:[{name:"Standard_DS1_v2",label:"Standard_DS1_v2",cpu:1,memory:3.5,storage:{type:"SSD",count:4,size:7}},{name:"Standard_DS2_v2",label:"Standard_DS2_v2",cpu:2,memory:7,storage:{type:"SSD",count:8,size:14}},{name:"Standard_DS3_v2",label:"Standard_DS3_v2",cpu:4,memory:14,storage:{type:"SSD",count:16,size:28}},{name:"Standard_DS4_v2",label:"Standard_DS4_v2",cpu:8,memory:28,storage:{type:"SSD",count:32,size:56}},{name:"Standard_DS5_v2",label:"Standard_DS5_v2",cpu:16,memory:56,storage:{type:"SSD",count:64,size:112}},{name:"Standard_DS11_v2",label:"Standard_DS11_v2",cpu:2,memory:14,storage:{type:"SSD",count:8,size:28}},{name:"Standard_DS12_v2",label:"Standard_DS12_v2",cpu:4,memory:28,storage:{type:"SSD",count:16,size:56}},{name:"Standard_DS13_v2",label:"Standard_DS13_v2",cpu:8,memory:56,storage:{type:"SSD",count:32,size:112}},{name:"Standard_DS14_v2",label:"Standard_DS14_v2",cpu:16,memory:112,storage:{type:"SSD",count:64,size:224}},{name:"Standard_DS15_v2",label:"Standard_DS15_v2",cpu:20,memory:140,storage:{type:"SSD",count:64,size:280}}]},{type:"Dv2-series",description:"",instanceTypes:[{name:"Standard_D1_v2",label:"Standard_D1_v2",cpu:1,memory:3.5,storage:{type:"SSD",count:4,size:50}},{name:"Standard_D2_v2",label:"Standard_D2_v2",cpu:2,memory:7,storage:{type:"SSD",count:8,size:100}},{name:"Standard_D3_v2",label:"Standard_D3_v2",cpu:4,memory:14,storage:{type:"SSD",count:16,size:200}},{name:"Standard_D4_v2",label:"Standard_D4_v2",cpu:8,memory:28,storage:{type:"SSD",count:32,size:400}},{name:"Standard_D5_v2",label:"Standard_D5_v2",cpu:16,memory:56,storage:{type:"SSD",count:64,size:800}},{name:"Standard_D11_v2",label:"Standard_D11_v2",cpu:2,memory:14,storage:{type:"SSD",count:8,size:100}},{name:"Standard_D12_v2",label:"Standard_D12_v2",cpu:4,memory:28,storage:{type:"SSD",count:16,size:200}},{name:"Standard_D13_v2",label:"Standard_D13_v2",cpu:8,memory:56,storage:{type:"SSD",count:32,size:400}},{name:"Standard_D14_v2",label:"Standard_D14_v2",cpu:16,memory:112,storage:{type:"SSD",count:64,size:800}},{name:"Standard_D15_v2",label:"Standard_D15_v2",cpu:20,memory:140,storage:{type:"SSD",count:64,size:280}}]},{type:"Av2-series",description:"",instanceTypes:[{name:"Standard_A1_v2",label:"Standard_A1_v2",cpu:1,memory:2,storage:{type:"SSD",count:2,size:10}},{name:"Standard_A2m_v2",label:"Standard_A2m_v2",cpu:2,memory:16,storage:{type:"SSD",count:4,size:20}},{name:"Standard_A2_v2",label:"Standard_A2_v2",cpu:2,memory:4,storage:{type:"SSD",count:4,size:20}},{name:"Standard_A4m_v2",label:"Standard_A4m_v2",cpu:4,memory:32,storage:{type:"SSD",count:8,size:40}},{name:"Standard_A4_v2",label:"Standard_A4_v2",cpu:4,memory:8,storage:{type:"SSD",count:8,size:40}},{name:"Standard_A8m_v2",label:"Standard_A8m_v2",cpu:8,memory:64,storage:{type:"SSD",count:16,size:80}},{name:"Standard_A8_v2",label:"Standard_A8_v2",cpu:8,memory:16,storage:{type:"SSD",count:16,size:80}}]},{type:"DC-series",description:"",instanceTypes:[{name:"Standard_DC2s",label:"Standard_DC2s",cpu:2,memory:8,storage:{type:"SSD",count:2,size:100}},{name:"Standard_DC4s",label:"Standard_DC4s",cpu:4,memory:16,storage:{type:"SSD",count:4,size:200}}]}],icon:"hdd"},{type:"compute",label:"Compute Optimized",description:"High CPU-to-memory ratio. Good for medium traffic web servers, network appliances, batch processes, and application servers.",families:[{type:"Fsv2-series",description:"",instanceTypes:[{name:"Standard_F2s_v2",label:"Standard_F2s_v2",cpu:2,memory:4,storage:{type:"SSD",count:4,size:16}},{name:"Standard_F4s_v2",label:"Standard_F4s_v2",cpu:4,memory:8,storage:{type:"SSD",count:8,size:32}},{name:"Standard_F8s_v2",label:"Standard_F8s_v2",cpu:8,memory:16,storage:{type:"SSD",count:16,size:64}},{name:"Standard_F16s_v2",label:"Standard_F16s_v2",cpu:16,memory:32,storage:{type:"SSD",count:32,size:128}},{name:"Standard_F32s_v2",label:"Standard_F32s_v2",cpu:32,memory:64,storage:{type:"SSD",count:32,size:256}},{name:"Standard_F64s_v2",label:"Standard_F64s_v2",cpu:64,memory:128,storage:{type:"SSD",count:32,size:512}},{name:"Standard_F72s_v2",label:"Standard_F72s_v2",cpu:72,memory:144,storage:{type:"SSD",count:32,size:576}}]},{type:"Fs-series",description:"",instanceTypes:[{name:"Standard_F1s",label:"Standard_F1s",cpu:1,memory:2,storage:{type:"SSD",count:4,size:4}},{name:"Standard_F2s",label:"Standard_F2s",cpu:2,memory:4,storage:{type:"SSD",count:8,size:8}},{name:"Standard_F4s",label:"Standard_F4s",cpu:4,memory:8,storage:{type:"SSD",count:16,size:16}},{name:"Standard_F8s",label:"Standard_F8s",cpu:8,memory:16,storage:{type:"SSD",count:32,size:32}},{name:"Standard_F16s",label:"Standard_F16s",cpu:16,memory:32,storage:{type:"SSD",count:64,size:64}}]},{type:"F-series",description:"",instanceTypes:[{name:"Standard_F1",label:"Standard_F1",cpu:1,memory:2,storage:{type:"SSD",count:4,size:16}},{name:"Standard_F2",label:"Standard_F2",cpu:2,memory:4,storage:{type:"SSD",count:8,size:32}},{name:"Standard_F4",label:"Standard_F4",cpu:4,memory:8,storage:{type:"SSD",count:16,size:64}},{name:"Standard_F8",label:"Standard_F8",cpu:8,memory:16,storage:{type:"SSD",count:32,size:128}},{name:"Standard_F16",label:"Standard_F16",cpu:16,memory:32,storage:{type:"SSD",count:64,size:256}}]}],icon:"hdd"},{type:"custom",label:"Custom Type",description:"Select the instance type below.",families:[],icon:"asterisk"}];function t(e){return e&&e.storage?e.storage.count*e.storage.size:0}function a(){return n.map((function(e){for(const n of e.families)for(const e of n.instanceTypes)null==e.costFactor&&(e.costFactor=0);e.stats=function(e){const n={cpu:{min:Number.MAX_VALUE,max:-Number.MAX_VALUE},memory:{min:Number.MAX_VALUE,max:-Number.MAX_VALUE},storage:{min:Number.MAX_VALUE,max:-Number.MAX_VALUE},families:[]};return e.families&&e.families.length&&e.families.forEach((function(e){n.families.push(e.type);const a=H.minBy(e.instanceTypes,"cpu").cpu||Number.MAX_VALUE,r=H.maxBy(e.instanceTypes,"cpu").cpu||-Number.MAX_VALUE,l=H.minBy(e.instanceTypes,"memory").memory||Number.MAX_VALUE,i=H.maxBy(e.instanceTypes,"memory").memory||-Number.MAX_VALUE,s=t(H.minBy(e.instanceTypes,t))||Number.MAX_VALUE,o=t(H.maxBy(e.instanceTypes,t))||-Number.MAX_VALUE;n.cpu.min=Math.min(n.cpu.min,a),n.cpu.max=Math.max(n.cpu.max,r),n.memory.min=Math.min(n.memory.min,l),n.memory.max=Math.max(n.memory.max,i),n.storage.min=Math.min(n.storage.min,s),n.storage.max=Math.max(n.storage.max,o)})),n}(e)})),e.when(n)}return{getCategories:a,getAvailableTypesForRegions:function(e,n){const[t]=n;return e[t]},getAllTypesByRegion:function(){return a()}}}]);const ae="spinnaker.azure.instance.detail.controller";n(ae,[O,Q]).controller("azureInstanceDetailsCtrl",["$scope","$state","$uibModal","instance","app","$q",function(e,n,t,a,c,d){function u(){const t={};let r,l,o,u,p;return c.serverGroups?(c.serverGroups.data.some((function(e){return e.instances.some((function(n){if(n.id===a.instanceId)return r=n,l=e.loadBalancers,o=e.account,u=e.region,p=e.vpcId,t.serverGroup=e.name,t.vpcId=e.vpcId,!0}))})),r||(c.loadBalancers.data.some((function(e){return e.instances.some((function(n){if(n.id===a.instanceId)return r=n,l=[e.name],o=e.account,u=e.region,p=e.vpcId,!0}))})),r||c.loadBalancers.data.some((function(e){return e.serverGroups.some((function(n){return!!n.isDisabled&&n.instances.some((function(n){if(n.id===a.instanceId)return r=n,l=[e.name],o=e.account,u=e.region,p=e.vpcId,!0}))}))})))):(r={},l=[],o=a.account,u=a.region),r&&o&&u?(t.account=o,t.region=u,i.addExtraDataToLatest("instances",t),s.getInstanceDetails(o,u,a.instanceId).then((function(n){e.state.loading=!1,function(n,t){c.isStandalone&&(n.health=t.health),n.health=n.health||[];const a=n.health.filter((function(e){return"Azure"!==e.type||"Unknown"!==e.state}));t.health&&a.forEach((function(e){const n=t.health.filter((function(n){return n.type===e.type}));n.length&&H.defaults(e,n[0])})),e.healthMetrics=a}(r,n),e.instance=H.defaults(n,r),e.instance.account=o,e.instance.region=u,e.instance.vpcId=p,e.instance.loadBalancers=l;const t=H.find(e.healthMetrics,(function(e){return"Discovery"===e.type}));if(t&&t.vipAddress){const n=t.vipAddress;e.instance.vipAddress=n.includes(",")?n.split(","):[n]}e.baseIpAddress=n.publicDnsName||n.privateIpAddress}),(function(){e.state.loading=!1,n.go("^")}))):(r||(e.instanceIdNotFound=a.instanceId,e.state.loading=!1),d.when(null))}e.detailsTemplateUrl=r.getValue("azure","instance.detailsTemplateUrl"),e.state={loading:!0,standalone:c.isStandalone},this.canDeregisterFromLoadBalancer=function(){return e.instance.health.some((function(e){return"LoadBalancer"===e.type}))},this.canRegisterWithLoadBalancer=function(){const n=e.instance;if(!n.loadBalancers||!n.loadBalancers.length)return!1;const t=n.health.some((function(e){return"LoadBalancer"===e.type&&"OutOfService"===e.state})),a=n.health.some((function(e){return"LoadBalancer"===e.type}));return t||!a},this.canRegisterWithDiscovery=function(){const n=e.instance.health.filter((function(e){return"Discovery"===e.type}));return!!n.length&&"OutOfService"===n[0].state},this.terminateInstance=function(){const t=e.instance,a={application:c,title:"Terminating "+t.instanceId,onTaskComplete:function(){n.includes("**.instanceDetails",{instanceId:t.instanceId})&&n.go("^")}};l.confirm({header:"Really terminate "+t.instanceId+"?",buttonText:"Terminate "+t.instanceId,account:t.account,taskMonitorConfig:a,submitMethod:function(){return o.terminateInstance(t,c)}})},this.terminateInstanceAndShrinkServerGroup=function(){const t=e.instance,a={application:c,title:"Terminating "+t.instanceId+" and shrinking server group",onTaskComplete:function(){n.includes("**.instanceDetails",{instanceId:t.instanceId})&&n.go("^")}};l.confirm({header:"Really terminate "+t.instanceId+" and shrink "+t.serverGroup+"?",buttonText:"Terminate "+t.instanceId+" and shrink "+t.serverGroup,account:t.account,taskMonitorConfig:a,submitMethod:function(){return o.terminateInstanceAndShrinkServerGroup(t,c)}})},this.rebootInstance=function(){const n=e.instance,t={application:c,title:"Rebooting "+n.instanceId};l.confirm({header:"Really reboot "+n.instanceId+"?",buttonText:"Reboot "+n.instanceId,account:n.account,taskMonitorConfig:t,submitMethod:function(){return o.rebootInstance(n,c)}})},this.registerInstanceWithLoadBalancer=function(){const n=e.instance,t=n.loadBalancers.join(" and "),a={application:c,title:"Registering "+n.instanceId+" with "+t};l.confirm({header:"Really register "+n.instanceId+" with "+t+"?",buttonText:"Register "+n.instanceId,account:n.account,taskMonitorConfig:a,submitMethod:function(){return o.registerInstanceWithLoadBalancer(n,c)}})},this.deregisterInstanceFromLoadBalancer=function(){const n=e.instance,t=n.loadBalancers.join(" and "),a={application:c,title:"Deregistering "+n.instanceId+" from "+t};l.confirm({header:"Really deregister "+n.instanceId+" from "+t+"?",buttonText:"Deregister "+n.instanceId,account:n.account,taskMonitorConfig:a,submitMethod:function(){return o.deregisterInstanceFromLoadBalancer(n,c)}})},this.enableInstanceInDiscovery=function(){const n=e.instance,t={application:c,title:"Enabling "+n.instanceId+" in discovery"};l.confirm({header:"Really enable "+n.instanceId+" in discovery?",buttonText:"Enable "+n.instanceId,account:n.account,taskMonitorConfig:t,submitMethod:function(){return o.enableInstanceInDiscovery(n,c)}})},this.disableInstanceInDiscovery=function(){const n=e.instance,t={application:c,title:"Disabling "+n.instanceId+" in discovery"};l.confirm({header:"Really disable "+n.instanceId+" in discovery?",buttonText:"Disable "+n.instanceId,account:n.account,taskMonitorConfig:t,submitMethod:function(){return o.disableInstanceInDiscovery(n,c)}})},this.hasHealthState=function(n,t){return e.instance.health.some((function(e){return e.type===n&&e.state===t}))};(c.isStandalone?u():d.all([c.serverGroups.ready(),c.loadBalancers.ready()]).then(u)).then((()=>{e.$$destroyed||c.isStandalone||c.serverGroups.onRefresh(e,u)})),e.account=a.account}]);const re=class extends X.Component{constructor(e){super(e),this.choose=()=>{this.close();const e=r.getValue("azure","loadBalancer");c.modalService.open({templateUrl:e.createLoadBalancerTemplateUrl,windowClass:"modal-z-index",controller:`${e.createLoadBalancerController} as ctrl`,size:"lg",resolve:{application:()=>this.props.app,loadBalancer:()=>null,isNew:()=>!0,forPipelineConfig:()=>!1,loadBalancerType:()=>this.state.selectedChoice}}).result.catch((()=>{}))},this.close=e=>{this.props.dismissModal(e)},this.state={choices:$,selectedChoice:$[0]}}static show(e){return d.show(re,{...e,className:"create-pipeline-modal-overflow-visible"})}choiceSelected(e){this.setState({selectedChoice:e})}render(){const{choices:e,selectedChoice:n}=this.state;return X.createElement(X.Fragment,null,X.createElement(u,{dismiss:this.close}),X.createElement(q.Header,null,X.createElement(q.Title,null,"Select Type of Load Balancer")),X.createElement(q.Body,null,X.createElement("div",{className:"modal-body"},X.createElement("div",{className:"card-choices"},e.map((e=>X.createElement("div",{key:e.type,className:"card "+(n===e?"active":""),onClick:()=>this.choiceSelected(e)},X.createElement("h3",{className:"load-balancer-label"},e.type),X.createElement("div",null,e.description))))),X.createElement("div",{className:"load-balancer-description"}))),X.createElement(q.Footer,null,X.createElement(W,{onClick:this.choose},"Configure Load Balancer ",X.createElement("span",{className:"glyphicon glyphicon-chevron-right"}))))}};let le=re;le.defaultProps={closeModal:p,dismissModal:p};const ie=g.providers.azure||{defaults:{}};ie&&(ie.resetToOriginal=g.resetProvider("azure"));const se="spinnaker.azure.loadBalancer.transformer";n(se,[]).factory("azureLoadBalancerTransformer",["$q",function(e){return{normalizeLoadBalancer:function(n){n.serverGroups.forEach((function(e){e.account=n.account,e.region=n.region,e.detachedInstances?(e.detachedInstances=e.detachedInstances.map((function(e){return{id:e}})),e.instances=e.instances.concat(e.detachedInstances)):e.detachedInstances=[]}));const t=H.filter(n.serverGroups,{isDisabled:!1});return n.provider=n.type,n.instances=H.chain(t).map("instances").flatten().value(),n.detachedInstances=H.chain(t).map("detachedInstances").flatten().value(),e.resolve(n)},convertLoadBalancerForEditing:function(e){const n={region:e.region,credentials:e.account,name:e.name,stack:e.stack,detail:e.detail,vnet:e.vnet,subnet:e.subnet,probes:[],loadBalancingRules:[]};if(e.elb){const t=e.elb;n.securityGroups=t.securityGroups,n.vnet=t.vnet,t.loadBalancingRules&&(n.loadBalancingRules=t.loadBalancingRules),n.probes=t.probes,t.dnsName&&"dns-not-found"!==t.dnsName&&(n.dnsName=t.dnsName.split(".")[0])}return n},constructNewLoadBalancerTemplate:function(e){return{stack:"",detail:"frontend",credentials:e.defaultCredentials.azure||ie.defaults.account,region:e.defaultRegions.azure||ie.defaults.region,cloudProvider:"azure",vnet:null,subnet:null,probes:[{probeName:"",probeProtocol:"HTTP",probePort:"80",probePath:"/",probeInterval:30,unhealthyThreshold:8,timeout:120}],securityGroups:[],loadBalancingRules:[{ruleName:"",protocol:"HTTP",externalPort:80,backendPort:80,probeName:"",persistence:"None",idleTimeout:4}],sku:"Standard_v2"}}}}]);const oe="spinnaker.azure.loadBalancer.create.controller";n(oe,[O,se]).controller("azureCreateLoadBalancerCtrl",["$scope","$uibModalInstance","$state","azureLoadBalancerTransformer","application","loadBalancer","isNew","loadBalancerType",function(e,n,t,a,r,l,i,s){const o=this;function c(){if(e.$$destroyed)return;n.close();const a={name:e.loadBalancer.name,accountId:e.loadBalancer.credentials,region:e.loadBalancer.region,provider:"azure"};t.includes("**.loadBalancerDetails")?t.go("^.loadBalancerDetails",a):t.go(".loadBalancerDetails",a)}function d(){const n=e.loadBalancer.credentials,t=e.loadBalancer.region,a={};r.getDataSource("loadBalancers").refresh(!0).then((()=>{r.getDataSource("loadBalancers").data.forEach((e=>{e.account===n&&(a[e.region]=a[e.region]||[],a[e.region].push(e.name))})),e.existingLoadBalancerNames=a[t]||[]}))}e.regions=[],e.pages={location:"azure/src/loadBalancer/configure/createLoadBalancerProperties.html",listeners:"azure/src/loadBalancer/configure/listeners.html",healthCheck:"azure/src/loadBalancer/configure/healthCheck.html",advancedSettings:"azure/src/loadBalancer/configure/advancedSettings.html"},e.isNew=i,e.loadBalancerType=s.type,e.isALB="Azure Load Balancer"===s.type,e.state={accountsLoaded:!1,submitting:!1},e.validSkus=["Standard_v2","Standard_Small"],e.taskMonitor=new m({application:r,title:(i?"Creating ":"Updating ")+"your load balancer",modalInstance:n,onTaskComplete:function(){r.loadBalancers.refresh(),r.loadBalancers.onNextRefresh(e,c)}}),function(){if(l){if(e.loadBalancer=a.convertLoadBalancerForEditing(l),i){const n=B.parseLoadBalancerName(e.loadBalancer.name);e.loadBalancer.stack=n.stack,e.loadBalancer.detail=n.freeFormDetails,delete e.loadBalancer.name}}else e.loadBalancer=a.constructNewLoadBalancerTemplate(r);i&&(d(),f.listAccounts("azure").then((function(n){e.accounts=n,e.state.accountsLoaded=!0,o.accountUpdated()})))}(),this.requiresHealthCheckPath=function(){return e.loadBalancer.probes[0].probeProtocol&&0===e.loadBalancer.probes[0].probeProtocol.indexOf("HTTP")},this.updateName=function(){e.loadBalancer.name=this.getName()},this.getName=function(){const n=e.loadBalancer,t=[r.name,n.stack||"",n.detail||""].join("-");return H.trimEnd(t,"-")},this.accountUpdated=function(){f.getRegionsForAccount(e.loadBalancer.credentials).then((function(n){e.regions=n,o.regionUpdated()}))},this.regionUpdated=function(){d(),o.updateName(),o.vnetUpdated()},this.vnetUpdated=function(){const n=e.loadBalancer.credentials,t=e.loadBalancer.region;e.loadBalancer.selectedVnet=null,e.loadBalancer.vnet=null,e.loadBalancer.vnetResourceGroup=null,o.selectedVnets=[],v.listNetworks().then((function(e){e.azure&&e.azure.forEach((e=>{e.account===n&&e.region===t&&o.selectedVnets.push(e)}))})),o.subnetUpdated()},this.subnetUpdated=function(){e.loadBalancer.selectedSubnet=null,e.loadBalancer.subnet=null,o.selectedSubnets=[]},this.selectedVnetChanged=function(n){e.loadBalancer.vnet=n.name,e.loadBalancer.vnetResourceGroup=n.resourceGroup,e.loadBalancer.selectedSubnet=null,e.loadBalancer.subnet=null,o.selectedSubnets=[],n.subnets&&n.subnets.map((function(e){let n=!0;e.devices&&e.devices.map((function(e){e&&"applicationGateways"!==e.type&&(n=!1)})),n&&o.selectedSubnets.push(e)}))},this.removeListener=function(n){e.loadBalancer.loadBalancingRules.splice(n,1)},this.addListener=function(){e.loadBalancer.loadBalancingRules.push({protocol:"HTTP"})},this.submit=function(){const n=i?"Create":"Update";e.taskMonitor.submit((function(){const t={cloudProvider:"azure",appName:r.name,clusterName:e.loadBalancer.clusterName,resourceGroupName:e.loadBalancer.clusterName,loadBalancerName:e.loadBalancer.name};e.loadBalancer.selectedVnet&&(e.loadBalancer.vnet=e.loadBalancer.selectedVnet.name,e.loadBalancer.vnetResourceGroup=e.loadBalancer.selectedVnet.resourceGroup),e.loadBalancer.selectedSubnet&&(e.loadBalancer.subnet=e.loadBalancer.selectedSubnet.name);const a=e.loadBalancer.clusterName||e.loadBalancer.name,l=a+"-probe",i=a+"-rule";return e.loadBalancer.type="upsertLoadBalancer",e.loadBalancer.loadBalancerType=e.loadBalancerType,e.loadBalancer.vnet||e.loadBalancer.subnetType||(e.loadBalancer.securityGroups=null),e.loadBalancer.probes[0].probeName=l,e.loadBalancer.loadBalancingRules.forEach(((e,n)=>{e.ruleName=i+n,e.probeName=l})),"TCP"===e.loadBalancer.probes[0].probeProtocol&&(e.loadBalancer.probes[0].probePath=void 0),h.upsertLoadBalancer(e.loadBalancer,r,n,t)}))},this.cancel=function(){n.dismiss()}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/createLoadBalancerProperties.html",'<div>\n <div ng-if="!state.accountsLoaded" style="height: 200px" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div class="modal-body" ng-if="state.accountsLoaded">\n <div class="form-group">\n <div\n class="col-md-12 well"\n ng-class="{\'alert-danger\': form.loadBalancerName.$error.validateUnique, \'alert-info\': !form.loadBalancerName.$error.validateUnique}"\n >\n <strong>Your {{loadBalancerType}} will be named:</strong>\n <span>{{ctrl.getName()}}</span>\n \x3c!-- Angular does not seem to run length validation on hidden inputs, hence the text + display:none --\x3e\n <input\n type="text"\n style="display: none"\n ng-maxlength="32"\n class="form-control input-sm"\n ng-model="loadBalancer.name"\n validate-unique="existingLoadBalancerNames"\n validate-ignore-case="true"\n name="loadBalancerName"\n />\n <validation-error\n ng-if="form.loadBalancerName.$error.validateUnique"\n message="There is already a load balancer in {{loadBalancer.credentials}}:{{loadBalancer.region}} with that name."\n ></validation-error>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Account</div>\n <div class="col-md-7">\n <account-select-field\n required\n component="loadBalancer"\n field="credentials"\n accounts="accounts"\n provider="\'azure\'"\n on-change="ctrl.accountUpdated()"\n ></account-select-field>\n </div>\n </div>\n <region-select-field\n required\n label-columns="3"\n component="loadBalancer"\n field="region"\n account="loadBalancer.credentials"\n provider="\'azure\'"\n on-change="ctrl.regionUpdated()"\n regions="regions"\n ></region-select-field>\n\n <div class="form-group" ng-if="!isALB">\n <div class="col-md-3 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n required\n ng-model="loadBalancer.selectedVnet"\n on-select="ctrl.selectedVnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks"\n >{{$select.selected.name}}</ui-select-match\n >\n <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">\n <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-if="!isALB">\n <div class="col-md-3 sm-label-right">Subnet</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n required\n ng-model="loadBalancer.selectedSubnet"\n on-select="ctrl.selectedSubnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">\n <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Stack <help-field key="azure.loadBalancer.stack"></help-field></div>\n <div class="col-md-3">\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-model="loadBalancer.stack"\n name="stackName"\n ng-change="ctrl.updateName()"\n ng-pattern="/^[a-zA-Z0-9]*$/"\n />\n </div>\n <div class="col-md-6 form-inline">\n <label class="sm-label-right"> Detail <help-field key="azure.loadBalancer.detail"></help-field> </label>\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-model="loadBalancer.detail"\n name="detailName"\n ng-change="ctrl.updateName()"\n ng-pattern="/^[a-zA-Z0-9-]*$/"\n />\n </div>\n <div class="col-md-7 col-md-offset-3" ng-if="form.stackName.$error.pattern">\n <validation-error message="Stack can only contain letters and numbers."></validation-error>\n </div>\n <div class="col-md-7 col-md-offset-3" ng-if="form.detailName.$error.pattern">\n <validation-error message="Detail can only contain letters, numbers, and dashes."></validation-error>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-9 col-md-offset-3" ng-if="form.loadBalancerName.$error.maxlength">\n <validation-error message="Load Balancer name can only be 32 characters."></validation-error>\n </div>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/listeners.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th>Protocol</th>\n <th>External Port</th>\n <th></th>\n <th>Internal Port</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in loadBalancer.loadBalancingRules">\n <td>\n <select\n class="form-control input-sm"\n ng-model="rule.protocol"\n ng-init="rule.protocol = (isALB ? \'TCP\' : \'HTTP\')"\n ng-options="protocol for protocol in (isALB ? [\'TCP\', \'UDP\'] : [\'HTTP\'])"\n ></select>\n </td>\n <td>\n <input class="form-control input-sm" type="number" min="0" ng-model="rule.externalPort" required />\n </td>\n <td class="small" style="padding-top: 10px">→</td>\n <td>\n <input class="form-control input-sm" type="number" min="0" ng-model="rule.backendPort" required />\n </td>\n <td>\n <a href class="sm-label" ng-click="ctrl.removeListener($index)"\n ><span class="glyphicon glyphicon-trash"></span\n ></a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="5">\n <button class="add-new col-md-12" ng-click="ctrl.addListener()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new port mapping\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/healthCheck.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed" ng-if="!isALB">\n <thead>\n <tr>\n <th width="35%">Protocol</th>\n <th width="30%">Host</th>\n <th><span ng-if="ctrl.requiresHealthCheckPath()">Path</span></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.probes[0].probeProtocol"\n required\n ng-options="protocol for protocol in [\'HTTP\']"\n ></select>\n </td>\n <td>\n <input class="form-control input-sm" type="text" ng-model="loadBalancer.probes[0].probePort" />\n </td>\n <td>\n <input\n ng-if="ctrl.requiresHealthCheckPath()"\n class="form-control input-sm"\n type="text"\n ng-model="loadBalancer.probes[0].probePath"\n required\n />\n </td>\n </tr>\n </tbody>\n </table>\n\n <table class="table table-condensed packed" ng-if="isALB">\n <thead>\n <tr>\n <th width="35%">Protocol</th>\n <th width="30%">Port</th>\n <th><span ng-if="ctrl.requiresHealthCheckPath()">Path</span></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.probes[0].probeProtocol"\n ng-init="loadBalancer.probes[0].probeProtocol = \'TCP\'"\n required\n ng-options="protocol for protocol in [\'TCP\', \'HTTP\']"\n ></select>\n </td>\n <td>\n <input class="form-control input-sm" type="text" ng-model="loadBalancer.probes[0].probePort" />\n </td>\n <td>\n <input\n ng-if="ctrl.requiresHealthCheckPath()"\n class="form-control input-sm"\n type="text"\n ng-model="loadBalancer.probes[0].probePath"\n required\n />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/advancedSettings.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-12">\n <div class="form-group">\n <div class="col-md-3">\n <b>Custom DNS Label</b>\n <help-field key="azure.loadBalancer.dnsName"></help-field>\n </div>\n <div class="col-md-6">\n <input class="form-control input-sm" type="text" ng-model="loadBalancer.dnsName" />\n <span>.{{loadBalancer.region}}.cloudapp.azure.com</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3">\n <b>Health Check</b>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Interval</b>\n <help-field key="azure.loadBalancer.probes.probeInterval"></help-field>\n </div>\n <div class="col-md-4">\n <input class="form-control input-sm" type="number" min="0" ng-model="loadBalancer.probes[0].probeInterval" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Unhealthy Threshold</b>\n <help-field key="azure.loadBalancer.probes.unhealthyThreshold"></help-field>\n </div>\n <div class="col-md-4">\n <input\n class="form-control input-sm"\n type="number"\n min="0"\n ng-model="loadBalancer.probes[0].unhealthyThreshold"\n />\n </div>\n </div>\n <div class="form-group" ng-if="isALB">\n <div class="col-md-4 sm-label-right">\n <b>Idle Timeout</b>\n <help-field key="azure.loadBalancer.loadBalancingRules.idleTimeout"></help-field>\n </div>\n <div class="col-md-4">\n <input\n class="form-control input-sm"\n type="number"\n min="0"\n ng-model="loadBalancer.loadBalancingRules[0].idleTimeout"\n />\n </div>\n </div>\n <div class="form-group" ng-if="!isALB">\n <div class="col-md-4 sm-label-right">\n <b>Timeout</b>\n <help-field key="azure.loadBalancer.probes.timeout"></help-field>\n </div>\n <div class="col-md-4">\n <input class="form-control input-sm" type="number" min="0" ng-model="loadBalancer.probes[0].timeout" />\n </div>\n </div>\n <div class="form-group" ng-if="isNew && !isALB">\n <div class="col-md-4 sm-label-right">\n <b>SKU</b>\n <help-field key="azure.loadBalancer.sku"></help-field>\n </div>\n <div class="col-md-4">\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.sku"\n ng-options="sku for sku in validSkus"\n ></select>\n </div>\n </div>\n <div class="form-group" ng-if="isALB">\n <div class="col-md-4 sm-label-right">\n <b>Session persistence</b>\n <help-field key="azure.loadBalancer.loadBalancingRules.sessionPersistence"></help-field>\n </div>\n <div class="col-md-4">\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.sessionPersistence"\n ng-init="loadBalancer.sessionPersistence = \'None\'"\n required\n ng-options="p for p in [\'None\', \'Client IP\', \'Client IP and protocol\']"\n ></select>\n </div>\n </div>\n </div>\n </div>\n</div>\n')}]);const ce="spinnaker.azure.loadBalancer.details.controller";e.module(ce,[Q,O,A,y]).controller("azureLoadBalancerDetailsCtrl",["$scope","$state","$exceptionHandler","$uibModal","loadBalancer","app","securityGroupReader","loadBalancerReader","$q",function(n,t,a,r,i,s,o,c,d){function u(){if(n.loadBalancer=s.loadBalancers.data.filter((function(e){return e.name===i.name&&e.region===i.region&&e.account===i.accountId}))[0],n.loadBalancer){return c.getLoadBalancerDetails(n.loadBalancer.provider,i.accountId,i.region,i.name).then((function(e){n.state.loading=!1;const t=[],a=e.filter((function(e){return e.name===i.name}));if(a.length&&(n.loadBalancer.elb=a[0],n.loadBalancer.account=i.accountId,n.loadBalancer.elb.securityGroups&&(n.loadBalancer.elb.securityGroups.forEach((function(e){const n=o.getApplicationSecurityGroup(s,i.accountId,i.region,e);n&&t.push(n)})),n.securityGroups=H.sortBy(t,"name")),n.loadBalancer.loadBalancerType&&n.loadBalancer.loadBalancerType.includes("_"))){const e=n.loadBalancer.loadBalancerType;n.loadBalancer.loadBalancerType=e.split("_").map((e=>{const n=e.toLowerCase();return n.substring(0,1).toUpperCase()+n.substring(1)})).join(" ")}}))}return n.loadBalancer||t.go("^"),d.when(null)}n.state={loading:!0},n.firewallsLabel=b.get("Firewalls"),s.ready().then(u).then((()=>{n.$$destroyed||s.onRefresh(n,u)})),this.editLoadBalancer=function(){r.open({templateUrl:"azure/src/loadBalancer/configure/editLoadBalancer.html",controller:"azureCreateLoadBalancerCtrl as ctrl",size:"lg",resolve:{application:function(){return s},loadBalancer:function(){return e.copy(n.loadBalancer)},isNew:function(){return!1},loadBalancerType:function(){return{type:n.loadBalancer.loadBalancerType}}}})},this.deleteLoadBalancer=function(){if(n.loadBalancer.instances&&n.loadBalancer.instances.length)return;const e={application:s,title:"Deleting "+i.name},t={cloudProvider:"azure",loadBalancerName:n.loadBalancer.name,loadBalancerType:n.loadBalancer.loadBalancerType,credentials:n.loadBalancer.account,region:i.region,appName:s.name};l.confirm({header:"Really delete "+i.name+"?",buttonText:"Delete "+i.name,account:i.accountId,taskMonitorConfig:e,submitMethod:()=>h.deleteLoadBalancer(t,s)})}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/editLoadBalancer.html",'<form name="form" novalidate validate-on-submit>\n <v2-modal-wizard\n heading="Edit {{loadBalancerType}} {{loadBalancer.name}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="Listeners" label="Listeners" done="true">\n <ng-include src="pages.listeners"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Health Check" label="Health Check" done="true" hide-subheading="true">\n <ng-include src="pages.healthCheck"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Advanced Settings" label="Advanced Settings" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="taskMonitor.submitting"\n submitting="taskMonitor.submitting"\n on-click="form.$valid && ctrl.submit()"\n is-new="isNew"\n ></submit-button>\n </div>\n</form>\n')}]);const de="spinnaker.azure.pipeline.stage.bake.executionDetails.controller";n(de,[O]).controller("azureBakeExecutionDetailsCtrl",["$scope","$stateParams","executionDetailsSectionService","$interpolate",function(e,n,t,a){e.configSections=["bakeConfig","taskStatus"];const r=()=>{e.detailsSection=n.details,e.provider=e.stage.context.cloudProviderType||"azure",e.roscoMode=g.feature.roscoMode||"function"==typeof g.feature.roscoSelector&&g.feature.roscoSelector(e.stage.context),e.bakeryDetailUrl=a(e.roscoMode&&g.roscoDetailUrl?g.roscoDetailUrl:g.bakeryDetailUrl)},l=()=>t.synchronizeSection(e.configSections,r);l(),e.$on("$stateChangeSuccess",l)}]);const ue="spinnaker.azure.serverGroup.transformer";n(ue,[]).factory("azureServerGroupTransformer",(function(){function e(e,n){if(Array.isArray(e.customScriptsSettings.fileUris))n.customScriptsSettings.fileUris=e.customScriptsSettings.fileUris;else{const t=e.customScriptsSettings.fileUris;t.includes(",")?n.customScriptsSettings.fileUris=t.split(","):t.includes(";")?n.customScriptsSettings.fileUris=t.split(";"):n.customScriptsSettings.fileUris=[t],n.customScriptsSettings.fileUris.forEach((function(e,t){n.customScriptsSettings.fileUris[t]=e.trim()}))}}return{convertServerGroupCommandToDeployConfiguration:function(n){let t;t="editPipeline"===n.viewState.mode||"createPipeline"===n.viewState.mode?{imageName:"",isCustom:"true",publisher:"",offer:"",sku:"",version:"",region:n.region,uri:"",ostype:""}:n.selectedImage;const a={name:n.application,cloudProvider:n.selectedProvider,application:n.application,stack:n.stack,strategy:n.strategy,rollback:{onFailure:n.rollback?n.rollback.onFailure:null},scaleDown:n.scaleDown,maxRemainingAsgs:n.maxRemainingAsgs,delayBeforeDisableSec:n.delayBeforeDisableSec,delayBeforeScaleDownSec:n.delayBeforeScaleDownSec,allowDeleteActive:"redblack"===n.strategy||null,allowScaleDownActive:"redblack"===n.strategy||null,detail:n.freeFormDetails,freeFormDetails:n.freeFormDetails,healthSettings:n.healthSettings,image:n.image,account:n.credentials,selectedProvider:"azure",vnet:n.vnet,vnetResourceGroup:n.selectedVnet.resourceGroup,subnet:n.subnet,useSourceCapacity:!1,capacity:{min:n.sku.capacity,max:n.sku.capacity},credentials:n.credentials,region:n.region,securityGroupName:n.securityGroupName,loadBalancerName:n.loadBalancerName,loadBalancerType:n.loadBalancerType,user:"[anonymous]",upgradePolicy:"Manual",type:"createServerGroup",sku:{name:"Standard_DS1_v2",tier:"Standard",capacity:n.sku.capacity},instanceTags:n.instanceTags,dataDisks:n.dataDisks,userAssignedIdentities:n.userAssignedIdentities,viewState:n.viewState,osConfig:{customData:n.osConfig?n.osConfig.customData:null},customScriptsSettings:{fileUris:null,commandToExecute:""},zonesEnabled:n.zonesEnabled,zones:n.zonesEnabled?n.zones:[],enableInboundNAT:n.enableInboundNAT};if(null!=n.image&&0!=n.image.isCustom||(a.image=t),void 0!==n.stack&&(a.name=a.name+"-"+n.stack),void 0!==n.freeFormDetails&&(a.name=a.name+"-"+n.freeFormDetails),void 0!==n.customScriptsSettings&&(a.customScriptsSettings.commandToExecute=n.customScriptsSettings.commandToExecute,H.isEmpty(n.customScriptsSettings.fileUris)||e(n,a)),n.instanceType){const e=n.instanceType;a.instanceType=n.instanceType,a.sku.name=e,a.sku.tier=e.substring(0,e.indexOf("_"))}return a.interestingHealthProviderNames=[],a},normalizeServerGroup:function(e){return e},parseCustomScriptsSettings:e}}));const pe="spinnaker.azure.serverGroupCommandBuilder.service";e.module(pe,[ne,ue]).factory("azureServerGroupCommandBuilder",["$q","azureImageReader","azureServerGroupTransformer",function(n,t,a){function r(e,n){const a=(n=n||{}).account||e.defaultCredentials.azure,r=n.region||e.defaultRegions.azure;return t.findImages({provider:"azure"}).then((function(t){return{application:e.name,credentials:a,region:r,images:t,loadBalancers:[],selectedVnetSubnets:[],strategy:"",sku:{capacity:1},zonesEnabled:!1,zones:[],instanceTags:{},dataDisks:[],selectedProvider:"azure",viewState:{instanceProfile:"custom",allImageSelection:null,useAllImageSelection:!1,useSimpleCapacity:!0,usePreferredZones:!0,mode:n.mode||"create",disableStrategySelection:!0,loadBalancersConfigured:!1,networkSettingsConfigured:!1,securityGroupsConfigured:!1},enableInboundNAT:!1}}))}return{buildNewServerGroupCommand:r,buildNewServerGroupCommandForPipeline:function(){return n.when({viewState:{requiresTemplateSelection:!0}})},buildServerGroupCommandFromExisting:function(e,t,r){r=r||"clone";const l=B.parseServerGroupName(t.name),i={application:e.name,strategy:"",stack:l.stack,freeFormDetails:l.freeFormDetails,credentials:t.account,loadBalancers:t.loadBalancers,selectedSubnets:t.selectedVnetSubnets,selectedVnet:t.selectedVnet,securityGroups:t.securityGroups,loadBalancerName:t.loadBalancerName,loadBalancerType:t.loadBalancerType,securityGroupName:t.securityGroupName,region:t.region,vnet:t.vnet,vnetResourceGroup:t.vnetResourceGroup,subnet:t.subnet,zones:t.zones,zonesEnabled:t.zones&&t.zones.length>0,instanceTags:{},dataDisks:t.dataDisks,sku:t.sku,capacity:{min:t.capacity.min,max:t.capacity.max,desired:t.capacity.desired},tags:[],instanceType:t.sku.name,selectedProvider:"azure",source:{account:t.account,region:t.region,serverGroupName:t.name,asgName:t.name},viewState:{allImageSelection:null,useAllImageSelection:!1,useSimpleCapacity:!0,usePreferredZones:!1,listImplicitSecurityGroups:!1,mode:r,disableStrategySelection:!0},enableInboundNAT:t.enableInboundNAT};return void 0!==t.customScriptsSettings&&(i.customScriptsSettings={},i.customScriptsSettings.commandToExecute=t.customScriptsSettings.commandToExecute,H.isEmpty(t.customScriptsSettings.fileUris)||a.parseCustomScriptsSettings(t,i)),n.when(i)},buildServerGroupCommandFromPipeline:function(n,t){const a=H.cloneDeep(t),l=a.region;return r(n,{account:a.account,region:l}).then((function(n){const r={disableImageSelection:!0,useSimpleCapacity:!0,mode:"editPipeline",submitButtonLabel:"Done",instanceProfile:t.viewState.instanceProfile,instanceTypeDetails:t.viewState.instanceTypeDetails},i={region:l,credentials:a.account,viewState:r};t.viewState.instanceTypeDetails&&(i.instanceType=t.viewState.instanceTypeDetails.name),a.strategy=a.strategy||"";return e.extend({},n,a,i)}))}}}]);const ge="spinnaker.azure.pipeline.stage.bakeStage";n(ge,[pe,ne,de]).config((function(){S.pipeline.registerStage({provides:"bake",cloudProvider:"azure",label:"Bake",description:"Bakes an image",templateUrl:"azure/src/pipeline/stages/bake/bakeStage.html",executionDetailsUrl:"azure/src/pipeline/stages/bake/bakeExecutionDetails.html",executionLabelComponent:D,extraLabelLines:e=>e.masterStage.context.allPreviouslyBaked||e.masterStage.context.somePreviouslyBaked?1:0,supportsCustomTimeout:!0,validators:[{type:"requiredField",fieldName:"package"},{type:"requiredField",fieldName:"regions"},{type:"upstreamVersionProvided",checkParentTriggers:!0,getMessage:e=>"Bake stages should always have a stage or trigger preceding them that provides version information: <ul>"+e.map((e=>`<li>${e}</li>`)).join("")+"</ul>Otherwise, Spinnaker will bake and deploy the most-recently built package."}],restartable:!0})})).controller("azureBakeStageCtrl",["$scope","$q","azureImageReader","$uibModal",function(e,n,t,a){function r(){t.findImages({provider:"azure",managedImages:!0,account:e.stage.account}).then((function(n){let t=[];for(let e in n){let a=n[e],r={id:a.imageName,osType:a.ostype,name:a.imageName};t.push(r)}e.managedImageOptions=t})).catch((()=>{}))}e.stage.extendedAttributes=e.stage.extendedAttributes||{},e.stage.regions=e.stage.regions||[],e.stage.user||(e.stage.user=w.getAuthenticatedUser().name),e.viewState={loading:!0},this.addExtendedAttribute=function(){e.stage.extendedAttributes||(e.stage.extendedAttributes={}),a.open({templateUrl:C.addExtendedAttributes,controller:"bakeStageAddExtendedAttributeController",controllerAs:"addExtendedAttribute",resolve:{extendedAttribute:function(){return{key:"",value:""}}}}).result.then((function(n){e.stage.extendedAttributes[n.key]=n.value})).catch((()=>{}))},this.removeExtendedAttribute=function(n){delete e.stage.extendedAttributes[n]},this.showTemplateFileName=function(){return e.viewState.roscoMode||e.stage.templateFileName},this.showExtendedAttributes=function(){return e.viewState.roscoMode||e.stage.extendedAttributes&&H.size(e.stage.extendedAttributes)>0},this.showVarFileName=function(){return e.viewState.roscoMode||e.stage.varFileName},this.showDefaultImages=function(){e.managedImagesWasChosen=!1,e.defaultImagesWasChosen=!0,e.customImagesWasChosen=!1,e.stage.managedImage=null,e.stage.publisher=null,e.stage.offer=null,e.stage.sku=null,e.stage.osType=null,e.stage.packageType=null},this.showManagedImages=function(){r(),e.managedImagesWasChosen=!0,e.defaultImagesWasChosen=!1,e.customImagesWasChosen=!1,e.stage.osType=null,e.stage.baseOs=null,e.stage.publisher=null,e.stage.offer=null,e.stage.sku=null,e.stage.packageType=null},this.showCustomImages=function(){e.managedImagesWasChosen=!1,e.defaultImagesWasChosen=!1,e.customImagesWasChosen=!0,e.stage.baseOs=null,e.stage.managedImage=null,e.stage.osType=null,e.stage.packageType=null},this.onChangeAccount=()=>{e.stage.osType=null,e.stage.packageType=null,e.stage.managedImage=null,e.stage.account&&f.getRegionsForAccount(e.stage.account).then((function(n){e.regions=n.map((e=>e.name))})).catch((()=>{})),e.managedImagesWasChosen&&r()},e.onChangeManagedImage=()=>{e.stage.packageType=null;const n=H.find(e.managedImageOptions,{id:e.stage.managedImage});e.stage.osType=n.osType.toLowerCase()},this.onChangeOsType=function(n){e.stage.packageType=null},e.$watch("stage",(function(){H.forOwn(e.stage,(function(n,t){""===n&&delete e.stage[t]})),"function"==typeof g.feature.roscoSelector&&(e.viewState.roscoMode=g.feature.roscoSelector(e.stage))}),!0),n.all([f.getCredentialsKeyedByAccount("azure"),z.getRegions("azure"),z.getBaseOsOptions("azure"),z.getBaseLabelOptions()]).then((function([n,t,a,l]){e.accounts=Object.keys(n),e.regions=t,1===e.regions.length?e.stage.region=e.regions[0]:e.regions.includes(e.stage.region)||delete e.stage.region,!e.stage.regions.length&&e.application.defaultRegions.azure&&e.stage.regions.push(e.application.defaultRegions.azure),!e.stage.regions.length&&e.application.defaultRegions.azure&&e.stage.regions.push(e.application.defaultRegions.azure),e.baseOsOptions=a.baseImages,e.baseLabelOptions=l,e.osTypeOptions=["linux","windows"],e.packageTypeOptions=["DEB","RPM"],e.viewState.roscoMode=g.feature.roscoMode||"function"==typeof g.feature.roscoSelector&&g.feature.roscoSelector(e.stage),e.showAdvancedOptions=function(){const n=e.stage;return!!(n.templateFileName||n.extendedAttributes&&H.size(n.extendedAttributes)>0||n.varFileName)}(),e.viewState.loading=!1,null!=e.stage.managedImage&&(e.managedImagesWasChosen=!0,r()),e.defaultImagesWasChosen=null!=e.stage.baseOs,e.customImagesWasChosen=null!=e.stage.publisher}))}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/bake/bakeStage.html",'<div ng-controller="azureBakeStageCtrl as bakeStageCtrl">\n <div ng-if="viewState.loading" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div ng-if="!viewState.loading">\n <stage-config-field label="Account">\n <account-select-field\n component="stage"\n field="account"\n accounts="accounts"\n provider="\'azure\'"\n on-change="bakeStageCtrl.onChangeAccount()"\n />\n </stage-config-field>\n\n <stage-config-field label="Regions">\n <checklist items="regions" model="stage.regions" inline="true" include-select-all-button="true"></checklist>\n </stage-config-field>\n\n <div class="panel panel-default">\n <div class="panel-heading">\n <label class="col-md-3 sm-label-right"></label>\n <div class="btn-group btn-group-xs" role="group" aria-label="Source Image">\n <button\n class="btn btn-default"\n aria-pressed="true"\n ng-click="bakeStageCtrl.showDefaultImages()"\n ng-class="{active: defaultImagesWasChosen}"\n >\n Default Images\n </button>\n <button\n class="btn btn-default"\n aria-pressed="true"\n ng-click="bakeStageCtrl.showManagedImages()"\n ng-class="{active: managedImagesWasChosen}"\n >\n Managed Images\n </button>\n <button\n class="btn btn-default"\n aria-pressed="true"\n ng-click="bakeStageCtrl.showCustomImages()"\n ng-class="{active: customImagesWasChosen}"\n >\n Custom Image\n </button>\n </div>\n </div>\n\n <div class="panel-body">\n <stage-config-field label="Base OS" ng-show="defaultImagesWasChosen">\n <bake-stage-choose-os model="stage.baseOs" base-os-options="baseOsOptions"></bake-stage-choose-os>\n </stage-config-field>\n\n <stage-config-field label="Managed Image" ng-show="managedImagesWasChosen">\n <bake-stage-choose-managed-image\n model="stage.managedImage"\n managed-image-options="managedImageOptions"\n on-change="onChangeManagedImage"\n ></bake-stage-choose-managed-image>\n </stage-config-field>\n\n <stage-config-field label="Publisher" ng-show="customImagesWasChosen">\n <input type="text" class="form-control input-sm" ng-model="stage.publisher" />\n </stage-config-field>\n <stage-config-field label="Offer" ng-show="customImagesWasChosen">\n <input type="text" class="form-control input-sm" ng-model="stage.offer" />\n </stage-config-field>\n <stage-config-field label="SKU" ng-show="customImagesWasChosen">\n <input type="text" class="form-control input-sm" ng-model="stage.sku" />\n </stage-config-field>\n\n <stage-config-field label="OS Type" ng-show="customImagesWasChosen">\n <label class="radio-inline" ng-repeat="osType in osTypeOptions">\n <input\n type="radio"\n ng-model="stage.osType"\n ng-value="osType"\n name="osType"\n ng-change="bakeStageCtrl.onChangeOsType(value)"\n />\n {{osType}}\n </label>\n </stage-config-field>\n\n <stage-config-field label="Package Type" ng-show="stage.osType === \'linux\'">\n <label class="radio-inline" ng-repeat="packageType in packageTypeOptions">\n <input type="radio" ng-model="stage.packageType" ng-value="packageType" name="packageType" />\n {{packageType}}\n </label>\n </stage-config-field>\n </div>\n </div>\n\n <stage-config-field label="Package" help-key="pipeline.config.bake.package">\n <input type="text" class="form-control input-sm" ng-model="stage.package" />\n </stage-config-field>\n\n <stage-config-field label="Base Label">\n <label class="radio-inline" ng-repeat="baseLabel in baseLabelOptions">\n <input type="radio" ng-model="stage.baseLabel" ng-value="baseLabel" />\n {{baseLabel}}\n </label>\n </stage-config-field>\n \x3c!-- Even if the roscoMode flag is false, we should show the control if rebake is set. --\x3e\n <stage-config-field label="Rebake" ng-if="viewState.roscoMode || stage.rebake">\n <div class="checkbox" style="margin-bottom: 0">\n <label>\n <input type="checkbox" ng-model="stage.rebake" />\n Rebake image without regard to the status of any existing bake\n </label>\n </div>\n </stage-config-field>\n <stage-config-field label="Base Name">\n <input type="text" class="form-control input-sm" ng-model="stage.baseName" />\n </stage-config-field>\n <div class="form-group">\n <div class="col-md-9 col-md-offset-1">\n <div class="checkbox">\n <label>\n <input type="checkbox" ng-model="showAdvancedOptions" />\n <strong>Show Advanced Options</strong>\n </label>\n </div>\n </div>\n </div>\n <div ng-class="{collapse: showAdvancedOptions !== true, \'collapse.in\': showAdvancedOptions === true}">\n <stage-config-field\n label="Template File Name"\n help-key="pipeline.config.bake.templateFileName"\n ng-if="bakeStageCtrl.showTemplateFileName()"\n >\n <input type="text" class="form-control input-sm" ng-model="stage.templateFileName" />\n </stage-config-field>\n <stage-config-field\n label="Extended Attributes"\n help-key="pipeline.config.bake.extendedAttributes"\n ng-if="bakeStageCtrl.showExtendedAttributes()"\n >\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 40%">Key</th>\n <th style="width: 60%">Value</th>\n <th class="text-right">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="(key,value) in stage.extendedAttributes">\n <td>\n <strong class="small">{{key}}</strong>\n </td>\n <td>\n <input\n type="text"\n ng-model="stage.extendedAttributes[key]"\n value="{{value}}"\n class="form-control input-sm"\n />\n </td>\n <td class="text-right">\n <a class="small" href ng-click="bakeStageCtrl.removeExtendedAttribute(key)">Remove</a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="7">\n <button class="btn btn-block btn-sm add-new" ng-click="bakeStageCtrl.addExtendedAttribute()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add Extended Attribute\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </stage-config-field>\n <stage-config-field\n label="Var File Name"\n help-key="pipeline.config.bake.varFileName"\n ng-if="bakeStageCtrl.showVarFileName()"\n >\n <input type="text" class="form-control input-sm" ng-model="stage.varFileName" />\n </stage-config-field>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/bake/bakeExecutionDetails.html",'<div ng-controller="azureBakeExecutionDetailsCtrl">\n <execution-details-section-nav sections="configSections"></execution-details-section-nav>\n <div class="step-section-details" ng-if="detailsSection === \'bakeConfig\'">\n <div class="row">\n <div class="col-md-6">\n <dl class="dl-narrow dl-horizontal">\n <dt if-multiple-providers>Provider</dt>\n <dd if-multiple-providers>Azure</dd>\n <dt>Image</dt>\n <dd>{{stage.context.ami}}</dd>\n <dt>Region</dt>\n <dd>{{stage.context.region}}</dd>\n <dt>Package</dt>\n <dd>{{stage.context.package}}</dd>\n </dl>\n </div>\n <div class="col-md-6">\n <dl class="dl-narrow dl-horizontal">\n <dt>Base OS</dt>\n <dd>{{stage.context.baseOs}}</dd>\n <dt>Label</dt>\n <dd>{{stage.context.baseLabel}}</dd>\n <dt ng-if="roscoMode || execution.trigger.rebake || stage.context.rebake">Rebake</dt>\n <dd ng-if="roscoMode || execution.trigger.rebake || stage.context.rebake">\n {{execution.trigger.rebake || stage.context.rebake || false}}\n </dd>\n <dt ng-if="stage.context.templateFileName">Template</dt>\n <dd ng-if="stage.context.templateFileName">{{stage.context.templateFileName}}</dd>\n <dt ng-if="stage.context.varFileName">Var File</dt>\n <dd ng-if="stage.context.varFileName">{{stage.context.varFileName}}</dd>\n </dl>\n </div>\n </div>\n <stage-failure-message stage="stage" message="stage.failureMessage"></stage-failure-message>\n\n <div class="row" ng-if="stage.context.region && stage.context.status.resourceId">\n <div class="col-md-12">\n <div class="alert alert-{{stage.isFailed ? \'danger\' : \'info\'}}">\n <div ng-if="stage.context.previouslyBaked">No changes detected; reused existing bake</div>\n <a target="_blank" href="{{ bakeryDetailUrl(stage) }}"> View Bakery Details </a>\n </div>\n </div>\n </div>\n </div>\n <div class="step-section-details" ng-if="detailsSection === \'taskStatus\'">\n <div class="row">\n <execution-step-details item="stage"></execution-step-details>\n </div>\n </div>\n</div>\n')}]);const me="spinnaker.azure.pipeline.stage.destroyAsgStage";n(me,[]).config((function(){S.pipeline.registerStage({provides:"destroyServerGroup",cloudProvider:"azure",templateUrl:"azure/src/pipeline/stages/destroyAsg/destroyAsgStage.html",executionStepLabelUrl:"azure/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html",accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"targetImpedance",message:"This pipeline will attempt to destroy a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})})).controller("azureDestroyAsgStageCtrl",["$scope",function(e){const n=this,t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("azure").then((function(n){e.accounts=n,e.state.accounts=!0})),n.accountUpdated=function(){f.getAccountDetails(t.credentials).then((function(e){t.regions=[e.org]}))},e.targets=G.TARGET_LIST,t.regions=t.regions||[],t.cloudProvider="azure",t.interestingHealthProviderNames=[],!t.credentials&&e.application.defaultCredentials.azure&&(t.credentials=e.application.defaultCredentials.azure),t.credentials&&n.accountUpdated(),t.target||(t.target=e.targets[0].val)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/destroyAsg/destroyAsgStage.html",'<div ng-controller="azureDestroyAsgStageCtrl as destroyAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html",'<span class="task-label"> Destroy Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const fe="spinnaker.azure.pipeline.stage.disableAsgStage";n(fe,[]).config((function(){S.pipeline.registerStage({provides:"disableServerGroup",alias:"disableAsg",cloudProvider:"azure",templateUrl:"azure/src/pipeline/stages/disableAsg/disableAsgStage.html",executionStepLabelUrl:"azure/src/pipeline/stages/disableAsg/disableAsgStepLabel.html",validators:[{type:"targetImpedance",message:"This pipeline will attempt to disable a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})})).controller("azureDisableAsgStageCtrl",["$scope",function(e){const n=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("azure").then((function(n){e.accounts=n,e.state.accounts=!0})),e.targets=G.TARGET_LIST,n.regions=n.regions||[],n.cloudProvider="azure",n.isNew&&e.application.attributes.platformHealthOnly&&(n.interestingHealthProviderNames=[]),!n.credentials&&e.application.defaultCredentials.azure&&(n.credentials=e.application.defaultCredentials.azure),!n.regions.length&&e.application.defaultRegions.azure&&n.regions.push(e.application.defaultRegions.azure),n.target||(n.target=e.targets[0].val)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/disableAsg/disableAsgStage.html",'<div ng-controller="azureDisableAsgStageCtrl as disableAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'azureService\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/disableAsg/disableAsgStepLabel.html",'<span class="task-label"> Disable Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const ve="spinnaker.azure.pipeline.stage.enableAsgStage";n(ve,[]).config((function(){S.pipeline.registerStage({provides:"enableServerGroup",alias:"enableAsg",cloudProvider:"azure",templateUrl:"azure/src/pipeline/stages/enableAsg/enableAsgStage.html",executionStepLabelUrl:"azure/src/pipeline/stages/enableAsg/enableAsgStepLabel.html",validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})})).controller("azureEnableAsgStageCtrl",["$scope",function(e){const n=this,t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("azure").then((function(n){e.accounts=n,e.state.accounts=!0})),n.reset=()=>{n.accountUpdated(),n.resetSelectedCluster()},e.targets=G.TARGET_LIST,t.regions=t.regions||[],t.cloudProvider="azure",t.isNew&&(t.interestingHealthProviderNames=[]),!t.credentials&&e.application.defaultCredentials.azure&&(t.credentials=e.application.defaultCredentials.azure),!t.regions.length&&e.application.defaultRegions.azure&&t.regions.push(e.application.defaultRegions.azure),t.target||(t.target=e.targets[0].val),e.$watch("stage.credentials",e.accountUpdated)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/enableAsg/enableAsgStage.html",'<div ng-controller="azureEnableAsgStageCtrl as enableAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'azureService\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/enableAsg/enableAsgStepLabel.html",'<span class="task-label"> Enable Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const he="spinnaker.azure.securityGroup.write.service",Be=he;n(he,[O]).factory("azureSecurityGroupWriter",(function(){return{deleteSecurityGroup:function(e,n,t={}){t.type="deleteSecurityGroup",t.securityGroupName=e.name,t.regions=[e.region],t.credentials=e.accountId,t.appName=n.name;const a=k.executeTask({job:[t],application:n,description:`Delete ${b.get("Firewalls")}: ${e.name}`});return I.clearCache("securityGroup"),a},upsertSecurityGroup:function(e,n,t,a={}){a.securityGroupName=e.name,H.assignWith(a,e,(function(e,n){return H.isUndefined(e)?n:e}));const r=k.executeTask({job:[a],application:n,description:`${t} ${b.get("Firewall")}: ${Be}`});return I.clearCache("securityGroup"),r}}}));const Ae="spinnaker.azure.securityGroup.create.controller";n(Ae,[O,he]).controller("azureCreateSecurityGroupCtrl",["$scope","$uibModalInstance","$state","$controller","application","securityGroup","azureSecurityGroupWriter",function(e,n,t,a,r,l,i){e.pages={location:"azure/src/securityGroup/configure/createSecurityGroupProperties.html",ingress:"azure/src/securityGroup/configure/createSecurityGroupIngress.html"},e.regions=[],e.firewallLabel=b.get("Firewall");const s=this;function o(){if(e.$$destroyed)return;n.close();const a={name:e.securityGroup.name,accountId:e.securityGroup.credentials||e.securityGroup.accountName,region:e.securityGroup.regions[0],provider:"azure"};t.includes("**.firewallDetails")?t.go("^.firewallDetails",a):t.go(".firewallDetails",a)}function c(e,n,t){const a=e[t],r=e[n].priority,l=e[t].priority;e[t]=e[n],e[n]=a,e[n].priority=r,e[t].priority=l}e.isNew=!0,e.state={submitting:!1,infiniteScroll:{numToAdd:20,currentItems:20}},f.listAccounts("azure").then((function(n){e.accounts=n,s.accountUpdated()})),s.addMoreItems=function(){e.state.infiniteScroll.currentItems+=e.state.infiniteScroll.numToAdd},e.taskMonitor=new m({application:r,title:`Creating your ${b.get("firewall")}`,modalInstance:n,onTaskComplete:function(){r.securityGroups.refresh(),r.securityGroups.onNextRefresh(e,o)}}),e.securityGroup=l,s.accountUpdated=function(){f.getRegionsForAccount(e.securityGroup.credentials).then((function(n){e.regions=n,e.securityGroup.regions=n,s.updateName(),s.regionUpdated()}))},this.regionUpdated=function(){s.vnetUpdated()},this.vnetUpdated=function(){const n=e.securityGroup.credentials,t=e.securityGroup.region;e.securityGroup.selectedVnet=null,e.securityGroup.vnet=null,e.securityGroup.vnetResourceGroup=null,s.selectedVnets=[],v.listNetworks().then((function(e){e.azure&&e.azure.forEach((e=>{e.account===n&&e.region===t&&s.selectedVnets.push(e)}))})),s.subnetUpdated()},this.subnetUpdated=function(){e.securityGroup.selectedSubnet=null,e.securityGroup.subnet=null,s.selectedSubnets=[]},this.selectedVnetChanged=function(n){e.securityGroup.vnet=n.name,e.securityGroup.vnetResourceGroup=n.resourceGroup,e.securityGroup.selectedSubnet=null,e.securityGroup.subnet=null,s.selectedSubnets=[],n.subnets&&n.subnets.map((function(e){s.selectedSubnets.push(e)}))},s.cancel=function(){n.dismiss()},s.updateName=function(){const n=e.securityGroup;let t=r.name;n.detail&&(t+="-"+n.detail),n.name=t,e.namePreview=t},s.upsert=function(){e.taskMonitor.submit((function(){const n={cloudProvider:"azure",appName:r.name,region:e.securityGroup.region,vpcId:"null"};return e.securityGroup.selectedVnet&&(e.securityGroup.vnet=e.securityGroup.selectedVnet.name,e.securityGroup.vnetResourceGroup=e.securityGroup.selectedVnet.resourceGroup),e.securityGroup.selectedSubnet&&(e.securityGroup.subnet=e.securityGroup.selectedSubnet.name),e.securityGroup.type="upsertSecurityGroup",i.upsertSecurityGroup(e.securityGroup,r,"Create",n)}))},s.addRule=function(n){n.push({name:e.securityGroup.name+"-Rule"+n.length,priority:0==n.length?100:100*(n.length+1),protocolUI:"tcp",protocol:"tcp",access:"Allow",direction:"InBound",sourceAddressPrefix:"*",sourceAddressPrefixes:[],sourcePortRange:"*",destinationAddressPrefix:"*",destinationPortRange:"*",destinationPortRanges:[],destPortRanges:"*",sourceIPCIDRRanges:"*"})},s.portUpdated=function(e,n){if(!H.isEmpty(e[n].destPortRanges)){const t=e[n].destPortRanges.split(",");t.length>1?(e[n].destinationPortRanges=[],t.forEach((t=>e[n].destinationPortRanges.push(t))),e[n].destinationPortRange=null):(e[n].destinationPortRange=e[n].destPortRanges,e[n].destinationPortRanges=[])}},s.sourceIPCIDRUpdated=function(e,n){if(!H.isEmpty(e[n].destPortRanges)){const t=e[n].sourceIPCIDRRanges.split(",");t.length>1?(e[n].sourceAddressPrefixes=[],t.forEach((t=>e[n].sourceAddressPrefixes.push(t))),e[n].sourceAddressPrefix=null):(e[n].sourceAddressPrefix=e[n].sourceIPCIDRRanges,e[n].sourceAddressPrefixes=[])}},s.protocolUpdated=function(e,n){e[n].protocol=e[n].protocolUI},s.removeRule=function(e,n){e.splice(n,1)},s.moveUp=function(e,n){0!==n&&c(e,n,n-1)},s.moveDown=function(e,n){n!==e.length-1&&c(e,n,n+1)},e.securityGroup.securityRules=[]}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupProperties.html",'<div class="modal-body">\n <div class="form-group">\n <div\n class="col-md-12 well"\n ng-class="{\'alert-danger\': form.securityGroupName.$error.validateUnique, \'alert-info\': !form.securityGroupName.$error.validateUnique}"\n >\n <strong>Your <firewall-label label="firewall"></firewall-label> will be named:</strong>\n <span ng-bind="namePreview"></span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Detail</div>\n <div class="col-md-4">\n <input\n type="text"\n class="form-control input-sm"\n required\n ng-model="securityGroup.detail"\n ng-change="ctrl.updateName()"\n />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Description</div>\n <div class="col-md-8">\n <input type="text" class="form-control input-sm" ng-model="securityGroup.description" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Account</div>\n <div class="col-md-8">\n <account-select-field\n required\n component="securityGroup"\n field="credentials"\n accounts="accounts"\n provider="\'azure\'"\n on-change="ctrl.accountUpdated()"\n ></account-select-field>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-12">\n <region-select-field\n label-columns="4"\n component="securityGroup"\n field="region"\n field-columns="8"\n account="securityGroup.credentials"\n provider="\'azure\'"\n on-change="ctrl.regionUpdated()"\n regions="regions"\n ></region-select-field>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedVnet"\n on-select="ctrl.selectedVnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">\n <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Subnet</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedSubnet"\n on-select="ctrl.selectedSubnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">\n <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupIngress.html",'<div class="modal-body">\n <div class="row"></div>\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 21%">Protocol</th>\n <th style="width: 32%">\n Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>\n </th>\n <th style="width: 32%">\n Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>\n </th>\n <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in securityGroup.securityRules">\n <td>\n <select class="form-control input-sm" ng-model="rule.protocolUI">\n <option value="tcp">TCP</option>\n <option value="udp">UDP</option>\n <option value="*">ANY</option>\n </select>\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="*"\n pattern="^*$|^((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?(,((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?)*$"\n ng-model="rule.sourceIPCIDRRanges"\n ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="80"\n pattern="^*$|^((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5]))(,((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])))*$"\n ng-model="rule.destPortRanges"\n ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-up"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-down"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-12">\n <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new\n <firewall-label label="Firewall"></firewall-label> Rule\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]);const ye="spinnaker.azure.securityGroup.azure.edit.controller";n(ye,[O,F,A,he]).controller("azureEditSecurityGroupCtrl",["$scope","$uibModalInstance","$exceptionHandler","$state","securityGroupReader","cacheInitializer","application","securityGroup","azureSecurityGroupWriter",function(e,n,t,a,r,l,i,s,o){function c(){if(e.$$destroyed)return;n.close();const t={name:e.securityGroup.name,accountId:e.securityGroup.credentials||e.securityGroup.accountName,region:e.securityGroup.region,provider:"azure"};a.includes("**.firewallDetails")?a.go("^.firewallDetails",t):a.go(".firewallDetails",t)}function d(e,n,t){const a=e[t],r=e[n].priority,l=e[t].priority;e[t]=e[n],e[n]=a,e[n].priority=r,e[t].priority=l}e.pages={ingress:"azure/src/securityGroup/configure/createSecurityGroupIngress.html"},s.securityRules=H.map(s.securityRules,(function(e){return H.isEmpty(e.protocol)||(e.protocolUI=e.protocol.toLowerCase()),e.destPortRanges=e.destinationPortRangeModel,e.sourceIPCIDRRanges=e.sourceAddressPrefixModel,e})),e.securityGroup=s,e.state={refreshingSecurityGroups:!1},e.taskMonitor=new m({application:i,title:`Updating your ${b.get("firewall")}`,modalInstance:n,onTaskComplete:function(){i.securityGroups.refresh(),i.securityGroups.onNextRefresh(e,c)}}),this.getSecurityGroupRefreshTime=function(){return I.get("securityGroups").getStats().ageMax},this.refreshSecurityGroups=function(){return e.state.refreshingSecurityGroups=!0,l.refreshCache("securityGroups").then((function(){r.getAllSecurityGroups().then((function(n){const t=s.accountName,a=s.region,r=H.filter(n[t].azure[a],{});e.availableSecurityGroups=H.map(r,"name")})).then((function(){e.state.refreshingSecurityGroups=!1}))}))},this.addRule=function(n){n.push({name:e.securityGroup.name+"-Rule"+n.length,priority:0===n.length?100:100*(n.length+1),protocolUI:"tcp",access:"Allow",direction:"InBound",sourceAddressPrefix:"*",sourceAddressPrefixes:[],sourcePortRange:"*",destinationAddressPrefix:"*",destinationPortRange:"*",destinationPortRanges:[],destPortRanges:"*",sourceIPCIDRRanges:"*"})},this.portUpdated=function(e,n){if(!H.isEmpty(e[n].sourceIPCIDRRanges)){const t=e[n].destPortRanges.split(",");t.length>1?(e[n].destinationPortRanges=[],t.forEach((t=>e[n].destinationPortRanges.push(t))),e[n].destinationPortRange=null):(e[n].destinationPortRange=e[n].destPortRanges,e[n].destinationPortRanges=[])}},this.sourceIPCIDRUpdated=function(e,n){if(!H.isEmpty(e[n].sourceIPCIDRRanges)){const t=e[n].sourceIPCIDRRanges.split(",");t.length>1?(e[n].sourceAddressPrefixes=[],t.forEach((t=>e[n].sourceAddressPrefixes.push(t))),e[n].sourceAddressPrefix=null):(e[n].sourceAddressPrefix=e[n].sourceIPCIDRRanges,e[n].sourceAddressPrefixes=[])}},this.removeRule=function(e,n){e.splice(n,1)},this.moveUp=function(e,n){0!==n&&d(e,n,n-1)},this.moveDown=function(e,n){n!==e.length-1&&d(e,n,n+1)},e.taskMonitor.onTaskComplete=n.dismiss,this.upsert=function(){e.taskMonitor.submit((function(){const n={cloudProvider:"azure",appName:i.name,region:e.securityGroup.region,subnet:null,vpcId:"null"};return e.securityGroup.type="upsertSecurityGroup",o.upsertSecurityGroup(e.securityGroup,i,"Update",n)}))},this.cancel=function(){n.dismiss()}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupIngress.html",'<div class="modal-body">\n <div class="row"></div>\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 21%">Protocol</th>\n <th style="width: 32%">\n Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>\n </th>\n <th style="width: 32%">\n Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>\n </th>\n <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in securityGroup.securityRules">\n <td>\n <select class="form-control input-sm" ng-model="rule.protocolUI">\n <option value="tcp">TCP</option>\n <option value="udp">UDP</option>\n <option value="*">ANY</option>\n </select>\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="*"\n pattern="^*$|^((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?(,((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?)*$"\n ng-model="rule.sourceIPCIDRRanges"\n ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="80"\n pattern="^*$|^((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5]))(,((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])))*$"\n ng-model="rule.destPortRanges"\n ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-up"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-down"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-12">\n <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new\n <firewall-label label="Firewall"></firewall-label> Rule\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]);const be="spinnaker.azure.securityGroup.clone.controller";n(be,[he,Ae]).controller("azureCloneSecurityGroupController",["$scope","$uibModalInstance","$controller","$state","azureSecurityGroupWriter","securityGroup","application",function(e,n,t,a,r,l,i){const s=this;function o(){if(e.$$destroyed)return;n.close();const t={name:e.securityGroup.name,accountId:e.securityGroup.credentials||e.securityGroup.accountName,region:e.securityGroup.region,provider:"azure"};a.includes("**.firewallDetails")?a.go("^.firewallDetails",t):a.go(".firewallDetails",t)}function c(e,n,t){const a=e[t],r=e[n].priority,l=e[t].priority;e[t]=e[n],e[n]=a,e[n].priority=r,e[t].priority=l}e.firewallLabel=b.get("Firewall"),e.pages={location:"azure/src/securityGroup/configure/createSecurityGroupProperties.html",ingress:"azure/src/securityGroup/configure/createSecurityGroupIngress.html"},l.securityRules=H.map(l.securityRules,(function(e){const n=e.destinationPortRange.split("-");return e.startPort=Number(n[0]),e.endPort=Number(n[1]),e})),s.accountUpdated=function(){f.getRegionsForAccount(e.securityGroup.credentials).then((function(n){e.regions=n,e.securityGroup.regions=n,s.updateName()}))},s.cancel=function(){n.dismiss()},s.updateName=function(){const n=e.securityGroup;let t=i.name;n.detail&&(t+="-"+n.detail),n.name=t,e.namePreview=t},e.securityGroup=l,e.state={refreshingSecurityGroups:!1},e.taskMonitor=new m({application:i,title:`Updating your ${b.get("firewall")}`,modalInstance:n,onTaskComplete:function(){i.securityGroups.refresh(),i.securityGroups.onNextRefresh(e,o)}}),f.listAccounts("azure").then((function(n){e.accounts=n,s.accountUpdated()})),s.addRule=function(n){n.push({name:e.securityGroup.name+"-Rule"+n.length,priority:0===n.length?100:100*(n.length+1),protocol:"tcp",access:"Allow",direction:"InBound",sourceAddressPrefix:"*",sourcePortRange:"*",destinationAddressPrefix:"*",destinationPortRange:"7001-7001",startPort:7001,endPort:7001})},s.portUpdated=function(e,n){e[n].destinationPortRange=e[n].startPort+"-"+e[n].endPort},s.removeRule=function(e,n){e.splice(n,1)},s.moveUp=function(e,n){0!==n&&c(e,n,n-1)},s.moveDown=function(e,n){n!==e.length-1&&c(e,n,n+1)},s.upsert=function(){e.taskMonitor.submit((function(){const n={cloudProvider:"azure",appName:i.name,region:e.securityGroup.region,subnet:"none",vpcId:"null"};return e.securityGroup.type="upsertSecurityGroup",r.upsertSecurityGroup(e.securityGroup,i,"Clone",n)}))}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupProperties.html",'<div class="modal-body">\n <div class="form-group">\n <div\n class="col-md-12 well"\n ng-class="{\'alert-danger\': form.securityGroupName.$error.validateUnique, \'alert-info\': !form.securityGroupName.$error.validateUnique}"\n >\n <strong>Your <firewall-label label="firewall"></firewall-label> will be named:</strong>\n <span ng-bind="namePreview"></span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Detail</div>\n <div class="col-md-4">\n <input\n type="text"\n class="form-control input-sm"\n required\n ng-model="securityGroup.detail"\n ng-change="ctrl.updateName()"\n />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Description</div>\n <div class="col-md-8">\n <input type="text" class="form-control input-sm" ng-model="securityGroup.description" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Account</div>\n <div class="col-md-8">\n <account-select-field\n required\n component="securityGroup"\n field="credentials"\n accounts="accounts"\n provider="\'azure\'"\n on-change="ctrl.accountUpdated()"\n ></account-select-field>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-12">\n <region-select-field\n label-columns="4"\n component="securityGroup"\n field="region"\n field-columns="8"\n account="securityGroup.credentials"\n provider="\'azure\'"\n on-change="ctrl.regionUpdated()"\n regions="regions"\n ></region-select-field>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedVnet"\n on-select="ctrl.selectedVnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">\n <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Subnet</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedSubnet"\n on-select="ctrl.selectedSubnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">\n <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupIngress.html",'<div class="modal-body">\n <div class="row"></div>\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 21%">Protocol</th>\n <th style="width: 32%">\n Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>\n </th>\n <th style="width: 32%">\n Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>\n </th>\n <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in securityGroup.securityRules">\n <td>\n <select class="form-control input-sm" ng-model="rule.protocolUI">\n <option value="tcp">TCP</option>\n <option value="udp">UDP</option>\n <option value="*">ANY</option>\n </select>\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="*"\n pattern="^*$|^((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?(,((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?)*$"\n ng-model="rule.sourceIPCIDRRanges"\n ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="80"\n pattern="^*$|^((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5]))(,((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])))*$"\n ng-model="rule.destPortRanges"\n ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-up"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-down"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-12">\n <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new\n <firewall-label label="Firewall"></firewall-label> Rule\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]);const Se="spinnaker.azure.securityGroup.azure.details.controller";e.module(Se,[O,A,he,be]).controller("azureSecurityGroupDetailsCtrl",["$scope","$state","resolvedSecurityGroup","app","azureSecurityGroupWriter","securityGroupReader","$uibModal",function(n,t,a,r,i,s,o){const c=r,d=a;function u(){return s.getSecurityGroupDetails(c,d.accountId,d.provider,d.region,d.vpcId,d.name).then((function(e){n.state.loading=!1,!e||H.isEmpty(e)?p():n.securityGroup=e}),(function(){p()}))}function p(){t.go("^")}n.state={loading:!0},n.firewallLabel=b.get("Firewall"),u().then((()=>{n.$$destroyed||r.securityGroups.onRefresh(n,u)})),this.editInboundRules=function(){o.open({templateUrl:"azure/src/securityGroup/configure/editSecurityGroup.html",controller:"azureEditSecurityGroupCtrl as ctrl",resolve:{securityGroup:function(){return e.copy(n.securityGroup)},application:function(){return c}}})},this.cloneSecurityGroup=function(){o.open({templateUrl:"azure/src/securityGroup/clone/cloneSecurityGroup.html",controller:"azureCloneSecurityGroupController as ctrl",resolve:{securityGroup:function(){const t=e.copy(n.securityGroup);return t.region&&(t.regions=[t.region]),t},application:function(){return c}}})},this.deleteSecurityGroup=function(){const e={application:c,title:"Deleting "+d.name};l.confirm({header:"Really delete "+d.name+"?",buttonText:"Delete "+d.name,account:d.accountId,taskMonitorConfig:e,submitMethod:function(){return n.securityGroup.type="deleteSecurityGroup",i.deleteSecurityGroup(d,c,{cloudProvider:"azure",vpcId:n.securityGroup.vpcId})}})},r.isStandalone&&(r.securityGroups={refresh:u})}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/editSecurityGroup.html",'<form name="form" novalidate validate-on-submit>\n <v2-modal-wizard\n heading="Edit {{securityGroup.name}}: {{securityGroup.region}}: {{securityGroup.credentials}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="Ingress" label="Ingress" done="true">\n <ng-include src="pages.ingress"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="taskMonitor.submitting"\n submitting="taskMonitor.submitting"\n on-click="form.$valid && ctrl.upsert()"\n ></submit-button>\n </div>\n</form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/clone/cloneSecurityGroup.html",'<v2-modal-wizard heading="Clone {{firewallLabel}}">\n <v2-wizard-page key="Location" label="Location">\n <ng-include src="pages.location"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Ingress" label="Ingress" done="true">\n <ng-include src="pages.ingress"></ng-include>\n </v2-wizard-page>\n</v2-modal-wizard>\n')}]);const De="spinnaker.azure.securityGroup.reader";n(De,[]).factory("azureSecurityGroupReader",(function(){return{resolveIndexedSecurityGroup:function(e,n,t){const a=t.split("/");return e[n.account][n.region][a[a.length-1]]}}}));const we="spinnaker.azure.securityGroup.transformer";n(we,[]).factory("azureSecurityGroupTransformer",(function(){return{normalizeSecurityGroup:function(){}}}));const Ce="spinnaker.azure.serverGroup.configure.instanceArchetype.controller";n(Ce,[]).controller("azureInstanceArchetypeCtrl",["$scope","instanceTypeService","modalWizardService",function(e,n,t){const a=t.getWizard();e.$watch("command.viewState.instanceProfile",(function(){e.command.viewState.instanceProfile&&"custom"!==e.command.viewState.instanceProfile?(a.includePage("instance-type"),a.markClean("instance-profile"),a.markComplete("instance-profile")):a.excludePage("instance-type")})),e.$watch("command.viewState.instanceType",(function(e){e&&(a.markClean("instance-profile"),a.markComplete("instance-profile"))}))}]);const ze="spinnaker.azure.serverGroup.configure.instanceType.controller";n(ze,[]).controller("azureInstanceTypeCtrl",["$scope","modalWizardService",function(e,n){n.getWizard().markComplete("instance-type"),n.getWizard().markClean("instance-type")}]);const Ge="spinnaker.azure.serverGroup.configure.advancedSetting.controller";n(Ge,[]).controller("azureServerGroupAdvancedSettingsCtrl",["$scope","modalWizardService",function(e,n){n.getWizard().markComplete("advanced"),e.$watch("form.$valid",(function(e){e?n.getWizard().markClean("advanced"):n.getWizard().markDirty("advanced")}))}]);const ke="spinnaker.azure.serverGroup.configure.wizard.advancedSettings.selector.directive";e.module(ke,[]).directive("azureServerGroupAdvancedSettingsSelector",(function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"adv",controller:"azureServerGroupAdvancedSettingsSelectorCtrl"}})).controller("azureServerGroupAdvancedSettingsSelectorCtrl",(function(){this.addDataDisk=()=>{const n=e.copy(this.command.dataDisks);this.command.dataDisks=n.concat([{lun:0,managedDisk:{storageAccountType:"Standard_LRS"},diskSizeGB:1,caching:"None",createOption:"Empty"}])},this.removeDataDisk=n=>{const t=e.copy(this.command.dataDisks);t.splice(n,1),this.command.dataDisks=t}})),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Number of Instances</div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="adv.command.sku.capacity"\n min="0"\n max="100"\n required\n />\n </div>\n </div>\n <div></div>\n <div class="form-group">\n <div class="col-xs-4 sm-label-right">\n <b>Custom Data</b>\n <help-field key="azure.serverGroup.customData"></help-field>\n </div>\n <div class="col-md-7">\n <input type="text" class="form-control input-sm" ng-model="adv.command.osConfig.customData" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Custom Script</b>\n <help-field key="azure.serverGroup.scriptLocation"></help-field>\n </div>\n <div class="col-md-7">\n <input type="text" class="form-control input-sm" ng-model="adv.command.customScriptsSettings.fileUris" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Command To Execute</b>\n <help-field key="azure.serverGroup.commandToExecute"></help-field>\n </div>\n <div class="col-md-7">\n <input\n type="text"\n class="form-control input-sm"\n ng-model="adv.command.customScriptsSettings.commandToExecute"\n />\n </div>\n </div>\n <div class="form-group" ng-if="adv.command.loadBalancerType === \'Azure Application Gateway\'">\n <div class="col-md-4 sm-label-right">\n <input type="checkbox" ng-model="adv.command.enableInboundNAT" ng-disabled="adv.command.zonesEnabled" />\n </div>\n <div class="col-md-7">\n <b>Enable inbound NAT port-forwarding rules to connect to VM instances</b>\n <help-field key="azure.serverGroup.enableInboundNAT"></help-field>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>User-Assigned Identities</b>\n <help-field key="azure.serverGroup.userAssignedIdentities"></help-field>\n </div>\n <div class="col-md-7">\n <input type="text" class="form-control input-sm" ng-model="adv.command.userAssignedIdentities" />\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-left">Data Disks</div>\n <div class="col-md-11">\n <table class="table table-condensed packed tags">\n <thead>\n <tr>\n <th>\n LUN\n <help-field key="azure.serverGroup.lun"></help-field>\n </th>\n <th>\n Size (GB)\n <help-field key="azure.serverGroup.diskSizeGB"></help-field>\n </th>\n <th>\n Type\n <help-field key="azure.serverGroup.managedDisk.storageAccountType"></help-field>\n </th>\n <th>\n Caching\n <help-field key="azure.serverGroup.caching"></help-field>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="disk in adv.command.dataDisks">\n <td>\n <input type="number" class="form-control input-sm" ng-model="disk.lun" required min="0" />\n </td>\n <td>\n <input type="number" class="form-control input-sm" ng-model="disk.diskSizeGB" required min="1" />\n </td>\n <td>\n <ui-select ng-model="disk.managedDisk.storageAccountType" class="form-control input-sm" required>\n <ui-select-match placeholder="Select...">{{$select.selected}}</ui-select-match>\n <ui-select-choices\n repeat="dataDiskType in adv.command.backingData.dataDiskTypes | filter: $select.search"\n >\n <span ng-bind-html="dataDiskType | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </td>\n <td>\n <ui-select ng-model="disk.caching" class="form-control input-sm" required>\n <ui-select-match placeholder="Select...">{{$select.selected}}</ui-select-match>\n <ui-select-choices\n repeat="dataDiskCachingType in adv.command.backingData.dataDiskCachingTypes | filter: $select.search"\n >\n <span ng-bind-html="dataDiskCachingType | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </td>\n <td>\n <a class="btn btn-link sm-label" style="margin-top: 0" ng-click="adv.removeDataDisk($index)">\n <span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="4">\n <button class="btn btn-block btn-sm add-new" ng-click="adv.addDataDisk()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add New Data Disk\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n</div>\n')}]);const Ie="spinnaker.azure.serverGroup.configure.basicSettings.image.filter";n(Ie,[]).filter("regional",(function(){return function(e,n){return H.filter(e,(function(e){return e.region===n||null===e.region}))}}));const Fe="spinnaker.azure.serverGroup.configure.basicSettings";e.module(Fe,[O,Q,Ie,E]).controller("azureServerGroupBasicSettingsCtrl",["$scope","$controller","$uibModalStack","$state","imageReader",function(n,t,a,r,l){n.$watch("form.$valid",(function(e){e?(T.markClean("basic-settings"),T.markComplete("basic-settings")):T.markIncomplete("basic-settings")})),this.imageChanged=e=>{n.command.imageName=e.imageName,n.command.selectedImage=e,T.markClean("basic-settings")},e.extend(this,t("BasicSettingsMixin",{$scope:n,imageReader:l,$uibModalStack:a,$state:r})),this.stackPattern={test:function(e){return(n.command.viewState.templatingEnabled?/^([a-zA-Z0-9]*(\${.+})*)*$/:/^[a-zA-Z0-9]*$/).test(e)}},this.detailPattern={test:function(e){return(n.command.viewState.templatingEnabled?/^([a-zA-Z0-9-]*(\${.+})*)*$/:/^[a-zA-Z0-9-]*$/).test(e)}}}]);const Ee="spinnaker.azure.serverGroup.configure.wizard.capacity.selector.directive";n(Ee,[]).directive("azureServerGroupCapacitySelector",(function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"cap",controller:"azureServerGroupCapacitySelectorCtrl"}})).controller("azureServerGroupCapacitySelectorCtrl",(function(){})),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.html",'<div>\n <div class="form-group">\n <div class="col-md-12">\n <p>Sets desired instance count.</p>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Number of Instances</div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="cap.command.sku.capacity"\n min="0"\n max="100"\n required\n />\n </div>\n </div>\n</div>\n')}]);const Te="spinnaker.azure.serverGroup.configure.healthSetting.controller";n(Te,[]).controller("azureServerGroupHealthSettingsCtrl",["$scope",function(e){void 0===e.command.healthSettings&&(e.command.healthSettings={}),this.healthCheckProtocols=[{displayName:"N/A",name:null},{displayName:"HTTP",name:"http"},{displayName:"TCP",name:"tcp"}],this.requiresHealthCheckPath=function(){return"http"===e.command.healthSettings.protocol},this.changeHealthCheckProtocol=function(n){null==n?(e.command.healthSettings.protocol=null,e.command.healthSettings.port=null,e.command.healthSettings.requestPath=null):this.requiresHealthCheckPath()||(e.command.healthSettings.requestPath=null)}}]);const xe="spinnaker.azure.serverGroup.configure.wizard.healthSettings.selector.directive";n(xe,[]).directive("azureServerGroupHealthSettingsSelector",["azureServerGroupConfigurationService",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.html",scope:{command:"="}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.html",'<div class="container-fluid form-horizontal" ng-controller="azureServerGroupHealthSettingsCtrl as healthCtrl">\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Protocol</div>\n <div class="col-md-7">\n <select\n class="form-control input-sm"\n ng-model="command.healthSettings.protocol"\n ng-options="protocol.name as protocol.displayName for protocol in healthCtrl.healthCheckProtocols"\n ng-change="healthCtrl.changeHealthCheckProtocol(command.healthSettings.protocol)"\n ></select>\n </div>\n </div>\n <div class="form-group" ng-if="command.healthSettings.protocol">\n <div class="col-md-3 sm-label-right">Port</div>\n <div class="col-md-7">\n <input class="form-control input-sm" type="text" ng-model="command.healthSettings.port" required />\n </div>\n </div>\n <div class="form-group" ng-if="healthCtrl.requiresHealthCheckPath()">\n <div class="col-md-3 sm-label-right">Path</div>\n <div class="col-md-7">\n <input class="form-control input-sm" type="text" ng-model="command.healthSettings.requestPath" required />\n </div>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-9 col-md-offset-3">\n <p>Health settings here will be applied directly to the VM Scale Set.</p>\n </div>\n </div>\n</div>\n')}]);const Ne="spinnaker.azure.serverGroup.configure.imageSettings.controller";n(Ne,[]).controller("azureServerGroupImageSettingsCtrl",["$scope",function(e){this.clearImage=function(){0==e.command.image.isCustom?e.command.image={isCustom:!1}:e.command.image.region=e.command.region},T.markComplete("image-settings"),e.$watch("form.$valid",(function(e){e?T.markClean("image-settings"):T.markDirty("image-settings")}))}]);const Pe="spinnaker.azure.serverGroup.configure.wizard.imageSettingsSelector.directive";n(Pe,[]).directive("azureServerGroupImageSettingsSelector",["azureServerGroupConfigurationService",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.html",scope:{command:"="}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.html",'<div class="container-fluid form-horizontal" ng-controller="azureServerGroupImageSettingsCtrl as imageCtrl">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Use custom image?</div>\n <input type="checkbox" ng-model="command.image.isCustom" ng-change="imageCtrl.clearImage()" />\n </div>\n\n <div class="form-group" ng-if="command.image.isCustom === true">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Region</div>\n <div class="col-md-6">\n <span>{{command.image.region}}</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Image Name</div>\n <div class="col-md-6">\n <input type="text" class="input-sm" ng-model="command.image.imageName" required />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">OS Type</div>\n <div class="col-md-6">\n <input type="text" class="input-sm" ng-model="command.image.ostype" required />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">URI</div>\n <div class="col-md-6">\n <input type="text" class="input-sm" ng-model="command.image.uri" required />\n </div>\n </div>\n </div>\n</div>\n')}]);const Re="spinnaker.azure.serverGroup.configure.loadBalancer.controller";n(Re,[y]).controller("azureServerGroupLoadBalancersCtrl",["$scope","loadBalancerReader",function(e,n){function t(t,a){n.getLoadBalancerDetails("azure",e.command.credentials,e.command.region,t).then((function(n){if(n&&0!==n.length){if(n&&1===n.length){const t=n[0],r=e.command.selectedVnet;e.command.selectedVnet=null,e.command.selectedVnetSubnets=[],e.command.allVnets=[],v.listNetworks().then((function(n){n.azure&&n.azure.forEach((n=>{n.account===e.command.credentials&&n.region===e.command.region&&e.command.allVnets.push(n),n.account===e.command.credentials&&n.region===e.command.region&&("Azure Application Gateway"===a&&n.name==t.vnet||"Azure Load Balancer"===a&&n.name===r.name)&&(e.command.selectedVnet=n,n.subnets.map((function(n){let t=!0;n.devices&&n.devices.map((function(e){e&&"applicationGateways"===e.type&&(t=!1)})),t&&e.command.selectedVnetSubnets.push(n.name)})))}))}))}}else{e.command.selectedVnet;const n=e.command.selectedSubnet;e.command.selectedVnetSubnets=[],e.command.allVnets=[],v.listNetworks().then((function(t){t.azure&&t.azure.forEach((t=>{t.account===e.command.credentials&&t.region===e.command.region&&(e.command.allVnets.push(t),t.subnets.map((function(t){let a=!0;t.devices&&t.devices.map((function(e){e&&"applicationGateways"===e.type&&(a=!1)})),a&&(e.command.selectedVnetSubnets.push(t.name),t.name===n&&(e.command.selectedSubnet=n))})))}))}))}}))}T.markClean("load-balancers"),e.command.credentials&&e.command.region&&(e.command.viewState.networkSettingsConfigured=!0,e.command.selectedVnetSubnets=[],null!==e.command.loadBalancerName&&void 0!==e.command.loadBalancerName&&(e.useLoadBalancer=!0),t(e.command.loadBalancerName,e.command.loadBalancerType)),this.loadBalancerChanged=function(n){e.command.viewState.networkSettingsConfigured=!0,T.markComplete("load-balancers");const a=e.command.backingData.loadBalancers;let r=null;if(a){const e=a.find((e=>e.name===n));e&&(r=K.getLoadBalancerType(e.loadBalancerType).type)}null===n&&(e.command.loadBalancerName=null),e.command.selectedVnetSubnets=[],e.command.loadBalancerType=r,I.clearCache("networks"),t(n,r)}}]);const Le="spinnaker.azure.serverGroup.configure.loadBalancer.directive";n(Le,[]).directive("azureServerGroupLoadBalancersSelector",["azureServerGroupConfigurationService",function(){return{restrict:"E",scope:{command:"="},templateUrl:"azure/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.html"}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.html",'<h5 class="text-center" ng-if="!command.viewState.loadBalancersConfigured">Please select an account and region.</h5>\n<div\n ng-if="command.viewState.loadBalancersConfigured"\n ng-controller="azureServerGroupLoadBalancersCtrl as loadBalancerCtrl"\n>\n <div class="form-group">\n <div class="col-md-3 sm-label-right"><b>Load Balancers</b></div>\n <div class="col-md-7">\n <label for="useLoadBalancerCheckbox">\n <input\n type="checkbox"\n ng-model="useLoadBalancer"\n id="useLoadBalancerCheckbox"\n ng-change="loadBalancerCtrl.loadBalancerChanged(null)"\n />\n Use load balancer\n </label>\n <ui-select\n ng-model="command.loadBalancerName"\n class="form-control input-sm"\n ng-change="loadBalancerCtrl.loadBalancerChanged($select.selected)"\n ng-show="useLoadBalancer"\n >\n <ui-select-match placeholder="select a loadBalancer">{{$select.selected}}</ui-select-match>\n <ui-select-choices repeat="loadBalancer in command.loadBalancers | filter: $select.search">\n <span ng-bind-html="loadBalancer | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-show="command.loadBalancerName">\n <div class="col-md-12">\n <div class="well-compact" ng-class="well">\n <h5 class="text-center">\n <p>The load balancer {{command.loadBalancerName}} is an {{command.loadBalancerType}}</p>\n </h5>\n </div>\n </div>\n </div>\n</div>\n')}]);const Me="spinnaker.azure.serverGroup.configure.networkSettings.controller";n(Me,[]).controller("azureServerGroupNetworkSettingsCtrl",["$scope",function(e){T.markClean("network-settings"),e.command.selectedVnet={name:e.command.vnet},e.command.selectedSubnet=e.command.subnet,this.vnetChanged=function(n){e.command.vnet=n,e.command.subnet=e.command.selectedSubnet=null,e.command.selectedVnetSubnets=n.subnets.map((e=>e.name))},this.networkSettingsChanged=function(n){e.command.vnet=e.command.selectedVnet.name,e.command.subnet=n,T.markComplete("network-settings")},this.getVnetName=function(){return e.command.selectedVnet?e.command.selectedVnet.name:"Virtual network was not selected"}}]);const Ue="spinnaker.azure.serverGroup.configure.networkSettings.directive";n(Ue,[]).directive("azureServerGroupNetworkSettingsSelector",(function(){return{restrict:"E",scope:{command:"="},templateUrl:"azure/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.html"}})),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.html",'<h5 class="text-center" ng-if="!command.viewState.networkSettingsConfigured">\n Please select an account, a region and a load balancer first.\n</h5>\n<div\n ng-if="command.viewState.networkSettingsConfigured"\n ng-controller="azureServerGroupNetworkSettingsCtrl as networkSettingCtrl"\n>\n <div class="form-group" ng-if="command.loadBalancerType === \'Azure Load Balancer\' || !command.loadBalancerType">\n <div class="col-md-3 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n required\n class="form-control input-sm"\n ng-model="command.selectedVnet"\n on-select="networkSettingCtrl.vnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectVnet in command.allVnets">\n <span ng-bind-html="selectVnet.name"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-3 sm-label-right"><b>Subnets</b></div>\n <div class="col-md-7">\n <ui-select\n required\n ng-model="command.selectedSubnet"\n class="form-control input-sm"\n on-select="networkSettingCtrl.networkSettingsChanged($item)"\n >\n <ui-select-match placeholder="Select from an existing subnet">{{$select.selected}}</ui-select-match>\n <ui-select-choices repeat="subnet in command.selectedVnetSubnets | filter: $select.search">\n <span ng-bind-html="subnet | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-if="!command.viewState.hideClusterNamePreview">\n <div class="col-md-12">\n <div class="well-compact" ng-class="well">\n <h5 class="text-center">\n <p>Your server group will be using a subnet in virtual network:</p>\n <p>\n <strong> {{networkSettingCtrl.getVnetName()}} </strong>\n </p>\n </h5>\n </div>\n </div>\n </div>\n</div>\n')}]);const Ve="spinnaker.azure.serverGroup.configure.securityGroups.controller";n(Ve,[]).controller("azureServerGroupSecurityGroupsCtrl",["$scope",function(e){T.markClean("security-groups"),T.markComplete("security-groups"),e.command.selectedSecurityGroup={id:e.command.securityGroupName},this.securityGroupChanged=function(n){e.command.securityGroupName=n.id,T.markComplete("security-groups")}}]);const _e="spinnaker.azure.serverGroup.configure.securityGroupSelector.directive";n(_e,[]).directive("azureServerGroupSecurityGroupsSelector",["azureServerGroupConfigurationService",function(e){return{restrict:"E",scope:{command:"="},templateUrl:"azure/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.html",link:function(n){n.firewallLabel=b.get("firewall"),n.getSecurityGroupRefreshTime=function(){return I.get("securityGroups").getStats().ageMax},n.refreshSecurityGroups=function(){n.refreshing=!0,e.refreshSecurityGroups(n.command).then((function(){n.refreshing=!1}))}}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.html",'<h5 class="text-center" ng-if="!command.viewState.securityGroupsConfigured">Please select an account and region.</h5>\n<div\n ng-if="command.viewState.securityGroupsConfigured"\n ng-controller="azureServerGroupSecurityGroupsCtrl as securityGroupCtrl"\n>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n <b><firewall-label label="Firewalls"></firewall-label></b>\n </div>\n <div class="col-md-7">\n <ui-select\n ng-model="command.selectedSecurityGroup"\n class="form-control input-sm"\n on-select="securityGroupCtrl.securityGroupChanged($item)"\n >\n <ui-select-match placeholder="select a {{firewallLabel}}">{{$select.selected.id}}</ui-select-match>\n <ui-select-choices\n repeat="securityGroup in command.backingData.filtered.securityGroups | anyFieldFilter: {name: $select.search, id: $select.search}"\n >\n <span ng-bind-html="securityGroup.id | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-9 col-md-offset-3">\n <p>\n <span ng-if="refreshing"><span class="fa fa-sync-alt fa-spin"></span></span>\n <firewall-label label="Firewalls"></firewall-label>\n <span ng-if="!refreshing">last refreshed {{ getSecurityGroupRefreshTime() | timestamp }}</span>\n <span ng-if="refreshing"> refreshing...</span>\n </p>\n <p>\n If you\'re not finding a <firewall-label label="firewall"></firewall-label> that was recently added,\n <a href ng-click="refreshSecurityGroups()">click here</a> to refresh the list.\n </p>\n </div>\n </div>\n</div>\n')}]);const He="spinnaker.azure.serverGroup.configure.wizard.tags.directive";n(He,[]).directive("azureTagsSelector",(function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/tags/tagsSelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"tagsSelectorCtrl",controller:"TagsSelectorCtrl"}})).controller("TagsSelectorCtrl",["$scope",function(){this.getTagResult=function(){return K.checkTags(this.command.instanceTags)}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/tags/tagsSelector.directive.html",'<div class="form-group">\n <div class="col-md-12" style="color: red" ng-if="!tagsSelectorCtrl.getTagResult().isValid">\n {{ tagsSelectorCtrl.getTagResult().errorMessage }}\n </div>\n <div class="col-md-4 sm-label-left">\n <b>Custom Tags</b>\n <help-field key="azure.serverGroup.customTags"></help-field>\n </div>\n <div class="col-md-12">\n <map-editor\n model="tagsSelectorCtrl.command.instanceTags"\n add-button-label="Add New Tags"\n allow-empty="true"\n ></map-editor>\n </div>\n</div>\n')}]);const Oe="spinnaker.azure.serverGroup.configure.wizard.capacity.zone.directive";n(Oe,[]).directive("azureZoneSelector",(function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/zones/zoneSelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"vm",controller:["$scope",function(e){this.updateEnableInboundNAT=()=>{e.vm.command.zonesEnabled&&(e.vm.command.enableInboundNAT=!1)}}]}})),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/zones/zoneSelector.directive.html",'<div class="form-group" ng-if="vm.command.region">\n <div class="col-md-10">\n <label ng-if="vm.command.backingData.filtered.zones && vm.command.backingData.filtered.zones.length !== 0">\n <input type="checkbox" ng-model="vm.command.zonesEnabled" ng-change="vm.updateEnableInboundNAT()" />\n Set availability zones\n </label>\n <ui-select multiple ng-if="vm.command.zonesEnabled" ng-model="vm.command.zones" class="form-control input-sm">\n <ui-select-match>{{ $item }}</ui-select-match>\n <ui-select-choices repeat="zone as zone in vm.command.backingData.filtered.zones">\n <span>{{ zone }}</span>\n </ui-select-choices>\n </ui-select>\n </div>\n</div>\n<h5 class="text-center" ng-if="!vm.command.region">Please select a region.</h5>\n<h5\n class="text-center"\n ng-if="vm.command.region && !(vm.command.backingData.filtered.zones && vm.command.backingData.filtered.zones.length !== 0)"\n>\n Current region does not support availability zones\n</h5>\n')}]);const Qe="spinnaker.azure.serverGroup.configure";n(Qe,[Fe,Re,Ce,ze,Ve,Ge,xe,Pe,Ne,Te,Le,Ee,_e,ue,ke,Me,Ue,Oe,He]);const Xe="spinnaker.azure.serverGroup.configure.service";e.module(Xe,[ne,y,A,F,te]).factory("azureServerGroupConfigurationService",["$q","azureImageReader","securityGroupReader","cacheInitializer","loadBalancerReader","azureInstanceTypeService",function(n,t,a,r,l,i){const s=["Standard_LRS","StandardSSD_LRS","Premium_LRS"],o=["None","ReadOnly","ReadWrite"],c=["EC2","ELB"],d=["OldestInstance","NewestInstance","OldestLaunchConfiguration","ClosestToNextInstanceHour","Default"];function u(n){const t={dirty:{}};if(n.region){const a=[t.dirty];a.push(function(e){const n=e,t={dirty:{}},a=[n.region],{credentialsKeyedByAccount:r}=n.backingData,{locationToInstanceTypesMap:l}=r[n.credentials];if(a.every((e=>!e)))return t;const s=i.getAvailableTypesForRegions(l,a).map((e=>e.name)),o=n.instanceType;H.every([o,!H.startsWith(o,"custom"),!H.includes(s,o)])&&(t.dirty.instanceType=n.instanceType,n.instanceType=null);return n.backingData.filtered.instanceTypes=s,t}(n).dirty),e.extend(...a)}else n.backingData.filtered.instanceTypes=[];return t}function p(e){const n={dirty:{}},t=e.backingData.filtered;if(!e.region)return n;let{regionsSupportZones:a,availabilityZones:r}=e.backingData.credentialsKeyedByAccount[e.credentials];return a=a||[],r=r||[],t.zones=a.includes(e.region)?r:[],n}function g(e){const n=e.backingData.securityGroups[e.credentials]||{azure:{}};return H.chain(n[e.region]).sortBy("name").value()}function m(e){const n={dirty:{}};let t;e.backingData.filtered.securityGroups&&(t=e.backingData.filtered.securityGroups);const a=g(e);return e.selectedSecurityGroup&&(e.selectedSecurityGroup=null,n.dirty.securityGroups=!0),t!=a&&(e.backingData.filtered.securityGroups=a,n.dirty.securityGroups=!0),e.backingData.filtered.securityGroups===[]?e.viewState.securityGroupsConfigured=!1:e.viewState.securityGroupsConfigured=!0,n}function v(e){return H.chain(e).map("name").uniq().value().sort()}function h(e){const n={dirty:{}},t=e.loadBalancers,a=v(e.backingData.loadBalancers);if(t&&e.loadBalancers){const r=H.intersection(a,e.loadBalancers),l=H.xor(r,t);e.loadBalancers=r,l.length&&(n.dirty.loadBalancers=l)}return e.backingData.filtered.loadBalancers=a,n}function B(e){const n=e.backingData.loadBalancers,t=H.filter(n,(function(n){return n.account===e.credentials&&n.region===e.region}));return e.loadBalancers=v(t),e.viewState.loadBalancersConfigured=!0,{dirty:{}}}return{configureUpdateCommand:function(n){n.backingData={healthCheckTypes:e.copy(c),terminationPolicies:e.copy(d)}},configureCommand:function(t,r){return n.all([f.getCredentialsKeyedByAccount("azure"),a.loadSecurityGroups(),l.loadLoadBalancers(t.name)]).then((function([n,t,a]){var l;r.backingData={credentialsKeyedByAccount:n,securityGroups:t,loadBalancers:a,dataDiskTypes:e.copy(s),dataDiskCachingTypes:e.copy(o),accounts:H.keys(n),filtered:{}},(l=r).regionChanged=function(n,t=!1){const a={dirty:{}};return n.region&&n.credentials&&(e.extend(a.dirty,B(n).dirty),e.extend(a.dirty,m(n).dirty),e.extend(a.dirty,u(n).dirty),e.extend(a.dirty,p(n).dirty)),t||(n.loadBalancerName=null,n.loadBalancerType=null,n.vnet=null,n.vnetResourceGroup=null,n.subnet=null,n.selectedSubnet=null,n.selectedVnet=null,n.selectedVnetSubnets=[],n.viewState.networkSettingsConfigured=!1,n.selectedSecurityGroup=null,n.securityGroupName=null,n.zonesEnabled=!1,n.zones=[]),a},l.credentialsChanged=function(n,t){const a={dirty:{}},r=n.backingData;if(n.credentials){const l=r.credentialsKeyedByAccount[n.credentials]||{regions:[],defaultKeyPair:null};r.filtered.regions=l.regions,H.chain(r.filtered.regions).some({name:n.region}).value()?e.extend(a.dirty,n.regionChanged(n,t).dirty):(n.region=null,a.dirty.region=!0),n.region&&e.extend(a.dirty,B(n).dirty),e.extend(a.dirty,u(n).dirty)}else n.region=null;return a}}))},configureImages:function(e){const n={dirty:{}};let t=null;return e.viewState.disableImageSelection||(e.region?(t=e.backingData.packageImages.filter((function(n){return n.amis&&n.amis[e.region]})).map((function(n){return{imageName:n.imageName,ami:n.amis?n.amis[e.region][0]:null}})),e.amiName&&!t.some((function(n){return n.imageName===e.amiName}))&&(n.dirty.amiName=!0,e.amiName=null)):e.amiName=null,e.backingData.filtered.images=t),n},configureSecurityGroupOptions:m,configureLoadBalancerOptions:h,refreshLoadBalancers:function(e,n){return l.listLoadBalancers("azure").then((function(t){e.backingData.loadBalancers=t,n||h(e)}))},refreshSecurityGroups:function(e,n){return r.refreshCache("securityGroups").then((function(){return a.getAllSecurityGroups().then((function(t){e.backingData.securityGroups=t,n||m(e)}))}))},getRegionalSecurityGroups:g,refreshInstanceTypes:function(e){return r.refreshCache("instanceTypes").then((function(){return i.getAllTypesByRegion().then((function(n){e.backingData.instanceTypes=n,u(e)}))}))},configureZones:p}}]);const qe="spinnaker.azure.cloneServerGroup.controller";n(qe,[O,Xe,ue,x]).controller("azureCloneServerGroupCtrl",["$scope","$uibModalInstance","$q","$state","serverGroupWriter","azureServerGroupConfigurationService","serverGroupCommand","application","title",function(e,n,t,a,r,l,i,s,o){function c(){if(e.$$destroyed)return;const n=e.taskMonitor.task.execution.stages.find((e=>"cloneServerGroup"===e.type));if(n&&n.context["deploy.server.groups"]){const t=n.context["deploy.server.groups"][e.command.region];if(t){const n={serverGroup:t,accountId:e.command.credentials,region:e.command.region,provider:"azure"};let r="^.^.^.clusters.serverGroup";a.includes("**.clusters.serverGroup")&&(r="^.serverGroup"),a.includes("**.clusters.cluster.serverGroup")&&(r="^.^.serverGroup"),a.includes("**.clusters")&&(r=".serverGroup"),a.go(r,n)}}}function d(){l.configureCommand(s,i).then((function(){const n=i.viewState.mode;"clone"!==n&&"create"!==n||(i.viewState.useAllImageSelection=!0),e.state.loaded=!0,function(){const e=i.viewState.mode;"clone"!==e&&"editPipeline"!==e||(T.markComplete("basic-settings"),T.markComplete("load-balancers"),T.markComplete("network-settings"),T.markComplete("security-groups"),T.markComplete("instance-type"),T.markComplete("zones"))}(),p(e.command.credentialsChanged(e.command,!0)),p(e.command.regionChanged(e.command,!0)),e.$watch("command.credentials",u(e.command.credentialsChanged)),e.$watch("command.region",u(e.command.regionChanged))}))}function u(n){return function(t,a){t!==a&&p(n(e.command))}}function p(e){e.dirty.loadBalancers&&(T.markDirty("load-balancers"),T.markDirty("network-settings")),e.dirty.securityGroups&&T.markDirty("security-groups"),e.dirty.instanceType&&T.markDirty("instance-type"),(e.dirty.zoneEnabled||e.dirty.zones)&&T.markDirty("zones")}e.pages={templateSelection:"azure/src/serverGroup/configure/wizard/templateSelection.html",basicSettings:"azure/src/serverGroup/configure/wizard/basicSettings/basicSettings.html",imageSettings:"azure/src/serverGroup/configure/wizard/image/imageSettings.html",healthSettings:"azure/src/serverGroup/configure/wizard/healthSettings/healthSettings.html",loadBalancers:"azure/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html",networkSettings:"azure/src/serverGroup/configure/wizard/networkSettings/networkSettings.html",securityGroups:"azure/src/serverGroup/configure/wizard/securityGroup/securityGroups.html",instanceType:"azure/src/serverGroup/configure/wizard/instanceType/instanceType.html",zones:"azure/src/serverGroup/configure/wizard/capacity/zones.html",tags:"azure/src/serverGroup/configure/wizard/tags/tags.html",advancedSettings:"azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html"},e.firewallsLabel=b.get("Firewalls"),e.title=o,e.applicationName=s.name,e.application=s,e.command=i,e.command.backingData=e.command.backingData||{},e.command.backingData.filtered=e.command.backingData.filtered||{},e.command.backingData.filtered.regions=e.command.backingData.filtered.regions||[],e.state={loaded:!1,requiresTemplateSelection:!!i.viewState.requiresTemplateSelection},this.templateSelectionText={copied:["account, region, subnet, cluster name (stack, details)","load balancers",b.get("firewalls"),"instance type","all fields on the Advanced Settings page"],notCopied:[],additionalCopyText:"If a server group exists in this cluster at the time of deployment, its scaling policies will be copied over to the new server group."},e.command.viewState.disableStrategySelection||this.templateSelectionText.notCopied.push("the deployment strategy (if any) used to deploy the most recent server group"),e.taskMonitor=new m({application:s,title:"Creating your server group",modalInstance:n,onTaskComplete:function(){s.serverGroups.refresh(),s.serverGroups.onNextRefresh(e,c)}}),this.submit=function(){if("editPipeline"===e.command.viewState.mode||"createPipeline"===e.command.viewState.mode)return n.close(e.command);e.taskMonitor.submit((function(){return r.cloneServerGroup(e.command,s)}))},this.cancel=function(){n.dismiss()},this.toggleSuspendedProcess=function(n){e.command.suspendedProcesses=e.command.suspendedProcesses||[];const t=e.command.suspendedProcesses.indexOf(n);-1===t?e.command.suspendedProcesses.push(n):e.command.suspendedProcesses.splice(t,1)},this.processIsSuspended=function(n){return e.command.suspendedProcesses.includes(n)},e.state.requiresTemplateSelection?e.state.loaded=!0:d(),this.templateSelected=()=>{e.state.requiresTemplateSelection=!1,d()},this.isValid=function(){return e.command&&e.command.application&&e.command.credentials&&e.command.instanceType&&e.command.region&&(!e.command.zonesEnabled||0!==e.command.zones.length)&&K.checkTags(e.command.instanceTags).isValid}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/templateSelection.html",'<deploy-initializer\n cloud-provider="azure"\n command="command"\n application="application"\n parent-state="state"\n dismiss="ctrl.cancel()"\n template-selection-text="ctrl.templateSelectionText"\n on-template-selected="ctrl.templateSelected()"\n></deploy-initializer>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/basicSettings/basicSettings.html",'<div class="container-fluid form-horizontal" ng-controller="azureServerGroupBasicSettingsCtrl as basicSettingsCtrl">\n <div class="modal-body">\n <ng-form name="basicSettings">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Account</div>\n <div class="col-md-7">\n <account-select-field\n required\n read-only="command.viewState.readOnlyFields.credentials"\n component="command"\n field="credentials"\n accounts="command.backingData.accounts"\n provider="\'azure\'"\n ></account-select-field>\n </div>\n </div>\n <region-select-field\n required\n read-only="command.viewState.readOnlyFields.region"\n label-columns="3"\n component="command"\n field="region"\n account="command.credentials"\n provider="\'azure\'"\n regions="command.backingData.filtered.regions"\n ></region-select-field>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n Stack\n <help-field key="azure.serverGroup.stack"></help-field>\n </div>\n <div class="col-md-7">\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-pattern="basicSettingsCtrl.stackPattern"\n name="stack"\n ng-model="command.stack"\n />\n </div>\n </div>\n <div class="form-group row slide-in" ng-if="basicSettings.stack.$error.pattern">\n <div class="col-sm-9 col-sm-offset-2 error-message">\n <span>Stack can only contain letters and numbers.</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n Detail\n <help-field key="azure.serverGroup.detail"></help-field>\n </div>\n <div class="col-md-7">\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-pattern="basicSettingsCtrl.detailPattern"\n name="details"\n ng-model="command.freeFormDetails"\n />\n </div>\n </div>\n <div class="form-group row slide-in" ng-if="basicSettings.details.$error.pattern">\n <div class="col-sm-9 col-sm-offset-2 error-message">\n <span>Detail can only contain letters, numbers, and dashes(-).</span>\n </div>\n </div>\n <div class="form-group" ng-if="!command.viewState.disableImageSelection">\n <div class="col-md-3 sm-label-right">\n Image\n <help-field key="azure.serverGroup.imageName"></help-field>\n </div>\n <div class="col-md-9">\n <ui-select\n class="form-control input-sm"\n required\n ng-model="command.selectedImage"\n on-select="basicSettingsCtrl.imageChanged($item)"\n >\n <ui-select-match placeholder="Pick an image">{{$select.selected.imageName}}</ui-select-match>\n <ui-select-choices repeat="image in command.images | regional:command.region | filter:$select.search">\n <span ng-bind-html="image.imageName"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n <deployment-strategy-selector\n ng-if="!command.viewState.disableStrategySelection && command.selectedProvider"\n command="command"\n ></deployment-strategy-selector>\n <div class="form-group" ng-if="!command.viewState.hideClusterNamePreview">\n <div class="col-md-12">\n <div\n class="well-compact"\n ng-class="basicSettingsCtrl.showPreviewAsWarning() ? \'alert alert-warning\' : \'well\'"\n >\n <h5 class="text-center">\n <p>Your server group will be in the cluster:</p>\n <p>\n <strong>\n {{basicSettingsCtrl.getNamePreview()}}\n <span ng-if="basicSettingsCtrl.createsNewCluster()"> (new cluster)</span>\n </strong>\n </p>\n <div\n class="text-left"\n ng-if="!basicSettingsCtrl.createsNewCluster() && command.viewState.mode === \'create\' && latestServerGroup"\n >\n <p>There is already a server group in this cluster. Do you want to clone it?</p>\n <p>\n Cloning copies the entire configuration from the selected server group, allowing you to modify\n whichever fields (e.g. image) you need to change in the new server group.\n </p>\n <p>\n To clone a server group, select "Clone" from the "Server Group Actions" menu in the details view of\n the server group.\n </p>\n <p>\n <a href ng-click="basicSettingsCtrl.navigateToLatestServerGroup()">\n Go to details for {{latestServerGroup.name}}\n </a>\n </p>\n </div>\n </h5>\n </div>\n </div>\n </div>\n </ng-form>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/image/imageSettings.html",'<div class="row">\n <div class="col-md-12">\n <azure-server-group-image-settings-selector command="command"></azure-server-group-image-settings-selector>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/healthSettings/healthSettings.html",'<div class="row">\n <div class="col-md-12">\n <azure-server-group-health-settings-selector command="command"></azure-server-group-health-settings-selector>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html",'<div class="row">\n <azure-server-group-load-balancers-selector command="command"></azure-server-group-load-balancers-selector>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/networkSettings/networkSettings.html",'<div class="row">\n <azure-server-group-network-settings-selector command="command"></azure-server-group-network-settings-selector>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/securityGroup/securityGroups.html",'<div class="row">\n <azure-server-group-security-groups-selector command="command"></azure-server-group-security-groups-selector>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/instanceType/instanceType.html",'<div ng-show="!!(command.region)">\n <v2-instance-archetype-selector ng-if="command.region" command="command"></v2-instance-archetype-selector>\n <div style="padding: 0 15px">\n <v2-instance-type-selector\n ng-if="command.viewState.instanceProfile && !(command.viewState.instanceProfile === \'custom\' || command.viewState.instanceProfile === \'buildCustom\' )"\n command="command"\n ></v2-instance-type-selector>\n </div>\n</div>\n<h5 class="text-center" ng-if="!command.region">Please select a region.</h5>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/capacity/zones.html",'<ng-form name="zonesSubForm">\n <div class="container-fluid form-horizontal">\n <azure-zone-selector command="command"></azure-zone-selector>\n </div>\n</ng-form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/tags/tags.html",'<ng-form name="zonesSubForm">\n <div class="container-fluid form-horizontal">\n <azure-tags-selector command="command"></azure-tags-selector>\n </div>\n</ng-form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html",'<div class="row">\n <div class="col-md-12">\n <azure-server-group-advanced-settings-selector command="command"></azure-server-group-advanced-settings-selector>\n </div>\n</div>\n')}]);class We extends X.Component{constructor(e){super(e),this.state={verified:!1},this.handleVerification=e=>{this.setState({verified:e})}}render(){const{onSubmit:e,onCancel:n,isValid:t,account:a}=this.props,{verified:r}=this.state;return X.createElement("div",{className:"modal-footer"},X.createElement(N,{expectedValue:a,onValidChange:this.handleVerification}),X.createElement("button",{className:"btn btn-default",onClick:n},"Cancel"),X.createElement("button",{type:"submit",className:"btn btn-primary",onClick:e,disabled:!t||!r},"Submit"))}}const je=class extends X.Component{constructor(e){super(e),this.close=e=>{this.props.dismissModal.apply(null,e)},this.submit=()=>{const{command:e,taskMonitor:n}=this.state,{serverGroup:t,application:a}=this.props;n.submit((()=>P.serverGroupWriter.rollbackServerGroup(t,a,e)))},this.filterServerGroups=e=>e.filter((e=>0!==e.instanceCounts.total)).sort(((e,n)=>n.name.localeCompare(e.name))),this.isValid=()=>void 0!==this.state.command.rollbackContext.restoreServerGroupName,this.handleServerGroupChange=e=>{const{disabledServerGroups:n}=this.props,t={...this.state.command};t.rollbackContext.restoreServerGroupName=e.value;const a=this.filterServerGroups(n).find((function(n){return n.name===e.value}));t.targetSize=a.capacity.max,this.setState({command:t})},this.handleTaskReasonChange=e=>{const n={...this.state.command};n.reason=e,this.setState({command:n})};const{application:n,serverGroup:t}=e;this.state={taskMonitor:new m({application:n,title:"Rolling back your server group",modalInstance:m.modalInstanceEmulation((()=>this.props.dismissModal()))}),submitting:!0,command:{interestingHealthProviderNames:[],rollbackType:"EXPLICIT",rollbackContext:{rollbackServerGroupName:t.name,enableAndDisableOnly:!0}}}}static show(e){return d.show(je,e,{})}render(){const{command:e,taskMonitor:n,submitting:t}=this.state,{serverGroup:a,disabledServerGroups:r}=this.props,l=this.isValid(),i=this.filterServerGroups(r).map((e=>({label:e.name,value:e.name})));return X.createElement(q,{onHide:this.close},X.createElement(R,{monitor:n}),t&&X.createElement("form",{role:"form"},X.createElement(u,{dismiss:this.close}),X.createElement(q.Header,null,X.createElement(q.Title,null,"Rollback ",a.name)),X.createElement(q.Body,null,X.createElement("div",{className:"row"},X.createElement("div",{className:"col-sm-3 sm-label-right"},"Restore to"),X.createElement("div",{className:"col-sm-6"},X.createElement(j,{value:e.rollbackContext.restoreServerGroupName,onChange:this.handleServerGroupChange,options:i}))),X.createElement(L,{reason:e.taskReason,onChange:this.handleTaskReasonChange})),X.createElement(We,{onSubmit:this.submit,onCancel:this.close,isValid:l,account:a.account})))}};let Ye=je;Ye.defaultProps={closeModal:p,dismissModal:p};const Ze="spinnaker.azure.serverGroup.details.controller";e.module(Ze,[O,pe,x]).controller("azureServerGroupDetailsCtrl",["$scope","$state","$templateCache","app","serverGroup","azureServerGroupCommandBuilder","$uibModal","serverGroupWriter",function(n,t,a,r,i,s,o,c){function d(){const a=function(){let e=H.find(r.serverGroups.data,(function(e){return e.name===i.name&&e.account===i.accountId&&e.region===i.region}));return e||r.loadBalancers.data.some((function(n){if(n.account===i.accountId&&n.region===i.region)return n.serverGroups.some((function(n){if(n.name===i.name)return e=n,!0}))})),e||t.go("^"),e}();return U.getServerGroup(r.name,i.accountId,i.region,i.name).then((function(l){if(n.state.loading=!1,e.extend(l,a),l.account=i.accountId,n.serverGroup=l,H.isEmpty(n.serverGroup))t.go("^");else{if(n.image=l.image?l.image:void 0,l.image&&l.image.description){l.image.description.split(", ").forEach((function(e){const n=e.split("=");2===n.length&&"ancestor_name"===n[0]&&(l.image.baseImage=n[1])}))}l.launchConfig&&l.launchConfig.securityGroups&&(n.securityGroups=H.chain(l.launchConfig.securityGroups).map((function(e){return H.find(r.securityGroups.data,{accountName:i.accountId,region:i.region,id:e})||H.find(r.securityGroups.data,{accountName:i.accountId,region:i.region,name:e})})).compact().value())}}))}n.state={loading:!0},n.firewallsLabel=b.get("Firewalls"),this.application=r,d().then((()=>{n.$$destroyed||r.serverGroups.onRefresh(n,d)})),this.destroyServerGroup=function(){const e=n.serverGroup,a={name:e.name,accountId:e.account,region:e.region},i={application:r,title:"Destroying "+e.name,onTaskComplete:function(){t.includes("**.serverGroup",a)&&t.go("^")}},s={header:"Really destroy "+e.name+"?",buttonText:"Destroy "+e.name,account:e.account,taskMonitorConfig:i,submitMethod:function(){return c.destroyServerGroup(e,r)}};M.addDestroyWarningMessage(r,e,s),l.confirm(s)},this.disableServerGroup=function(){const e=n.serverGroup,t={application:r,title:"Disabling "+e.name},a={header:"Really disable "+e.name+"?",buttonText:"Disable "+e.name,account:e.account,taskMonitorConfig:t,submitMethod:()=>c.disableServerGroup(e,r)};M.addDisableWarningMessage(r,e,a),l.confirm(a)},this.enableServerGroup=function(){const t=n.serverGroup,a={application:r,title:"Enabling "+t.name};l.confirm({header:"Really enable "+t.name+"?",buttonText:"Enable "+t.name,account:t.account,taskMonitorConfig:a,submitMethod:n=>c.enableServerGroup(t,r,e.extend(n,{interestingHealthProviderNames:[]}))})},this.rollbackServerGroup=()=>{const e=n.serverGroup,t=H.find(r.clusters,{name:e.cluster,account:e.account}),a=H.filter(t.serverGroups,{isDisabled:!0,region:e.region});Ye.show({application:r,serverGroup:e,disabledServerGroups:a})},this.cloneServerGroup=e=>{o.open({templateUrl:"azure/src/serverGroup/configure/wizard/serverGroupWizard.html",controller:"azureCloneServerGroupCtrl as ctrl",size:"lg",resolve:{title:()=>"Clone "+e.name,application:()=>r,serverGroupCommand:()=>s.buildServerGroupCommandFromExisting(r,e)}})},this.truncateCommitHash=function(){return n.serverGroup&&n.serverGroup.buildInfo&&n.serverGroup.buildInfo.commit?n.serverGroup.buildInfo.commit.substring(0,8):null}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/serverGroupWizard.html",'<div>\n <div ng-if="state.requiresTemplateSelection">\n <ng-include src="pages.templateSelection"></ng-include>\n </div>\n <div ng-if="!state.loaded" style="height: 200px" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div>\n <form name="serverGroupWizardForm" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard\n ng-show="state.loaded && !state.requiresTemplateSelection"\n heading="{{title}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="basic-settings" label="Basic Settings" hide-subheading="true">\n <ng-include src="pages.basicSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="image-settings" label="Image">\n <ng-include src="pages.imageSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="load-balancers" label="Load Balancers" mark-complete-on-view="false">\n <ng-include src="pages.loadBalancers"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="network-settings" label="Network Settings" mark-complete-on-view="false">\n <ng-include src="pages.networkSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="health-settings" label="Health" mark-complete-on-view="false">\n <ng-include src="pages.healthSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="security-groups" label="{{firewallsLabel}}" mark-complete-on-view="false" done="true">\n <ng-include src="pages.securityGroups"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="instance-type" label="Instance Type" mark-complete-on-view="false" done="false">\n <ng-include src="pages.instanceType"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="zones" label="Zones" mark-complete-on-view="false" done="false">\n <ng-include src="pages.zones"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="tags" label="Tags" mark-complete-on-view="false" done="true">\n <ng-include src="pages.tags"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="advanced-settings" label="Advanced Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer" ng-if="state.loaded">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">\n Cancel\n </button>\n <submit-button\n is-disabled="taskMonitor.submitting || !ctrl.isValid()"\n label="command.viewState.submitButtonLabel"\n submitting="taskMonitor.submitting"\n on-click="serverGroupWizardForm.$valid && ctrl.submit()"\n is-new="true"\n ></submit-button>\n </div>\n </form>\n </div>\n</div>\n')}]);const $e="spinnaker.azure.serverGroup.details.azure";n($e,[Ze]);const Je="spinnaker.azure.validation.applicationName";n(Je,[]).factory("azureApplicationNameValidator",(function(){return{validate:function(e){const n=[];return e&&e.length&&function(e,n){/^([a-zA-Z][a-zA-Z0-9]*)?$/.test(e)||n.push("The application name must begin with a letter and must contain only letters or digits. No special characters are allowed.")}(e,n),{warnings:[],errors:n}}}})).run(["azureApplicationNameValidator",function(e){V.registerValidator("azure",e)}]);!function(e,n){void 0===n&&(n={});var t=n.insertAt;if(e&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===t&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}('.cloud-provider-logo .icon-azure {\n -webkit-mask-image: url("data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 22.1.0%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg version%3D%221.1%22 id%3D%22Layer_1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22 x%3D%220px%22 y%3D%220px%22%09 viewBox%3D%220 0 48 48%22 style%3D%22enable-background%3Anew 0 0 48 48%3B%22 xml%3Aspace%3D%22preserve%22%3E%3Cstyle type%3D%22text%2Fcss%22%3E%09.st0%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2300A2D8%3B%7D%09.st1%7Bfill%3A%23F79E1C%3B%7D%09.st2%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232ABAEC%3B%7D%09.st3%7Bfill%3A%23F7B218%3B%7D%09.st4%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3Anone%3B%7D%09.st5%7Bfill%3A%2300A2D8%3B%7D%09.st6%7Bfill%3A%232ABAEC%3B%7D%09.st7%7Bfill%3A%23323A45%3B%7D%09.st8%7Bfill%3A%2388909B%3B%7D%09.st9%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st10%7Bfill%3A%23A3BF3A%3B%7D%09.st11%7Bfill%3A%2380A23E%3B%7D%09.st12%7Bfill%3A%237B4D87%3B%7D%09.st13%7Bfill%3A%232F75BB%3B%7D%09.st14%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2385C9D5%3B%7D%09.st15%7Bopacity%3A0.15%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st16%7Bfill%3A%23A5D9E2%3B%7D%09.st17%7Bfill%3A%2385C9D5%3B%7D%09.st18%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23323A45%3B%7D%09.st19%7Bfill%3A%23FFFFFF%3B%7D%09.st20%7Bfill%3A%23DAEFF3%3B%7D%09.st21%7Bfill%3A%232A65AF%3B%7D%09.st22%7Bfill%3A%23F6ECF4%3B%7D%09.st23%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232F75BB%3B%7D%09.st24%7Bfill%3Anone%3B%7D%09.st25%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9BA19%3B%7D%09.st26%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23A3BF3A%3B%7D%09.st27%7Bfill%3A%23F6931D%3B%7D%09.st28%7Bfill%3A%235E6D80%3B%7D%09.st29%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3B%7D%09.st30%7Bfill%3A%2300B8E2%3B%7D%09.st31%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%235E6D80%3B%7D%09.st32%7Bfill%3Anone%3Bstroke%3A%2385C9D5%3Bstroke-width%3A0%3Bstroke-linecap%3Around%3Bstroke-linejoin%3Around%3B%7D%09.st33%7Bfill%3A%232A89CA%3B%7D%09.st34%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237B4D87%3B%7D%09.st35%7Bopacity%3A0.3%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st36%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3B%7D%09.st37%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2378B843%3B%7D%09.st38%7Bfill%3A%2378B843%3B%7D%09.st39%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23EDF0F4%3B%7D%09.st40%7Bfill%3A%23005BA3%3B%7D%09.st41%7Bfill%3A%230F80B0%3B%7D%09.st42%7Bfill%3A%23005F87%3B%7D%09.st43%7Bfill%3A%23B7D332%3B%7D%09.st44%7Bfill%3A%237FB900%3B%7D%09.st45%7Bopacity%3A0.6%3Bfill%3A%23FFFFFF%3B%7D%09.st46%7Bopacity%3A0.4%3Bfill%3A%23FFFFFF%3B%7D%09.st47%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_13_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st48%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_64_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st49%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_65_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st50%7Bfill%3A%2373BDCD%3B%7D%09.st51%7Bopacity%3A0.6%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st52%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3Bstroke%3A%23FFFFFF%3Bstroke-width%3A4%3Bstroke-miterlimit%3A10%3B%7D%09.st53%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3B%7D%09.st54%7Bclip-path%3Aurl(%23XMLID_67_)%3Bfill%3Anone%3B%7D%09.st55%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F7B218%3B%7D%09.st56%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_69_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st57%7Bopacity%3A0.8%3Bfill%3A%23FFFFFF%3B%7D%09.st58%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_79_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st59%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23DB5B26%3B%7D%09.st60%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F58B1F%3B%7D%09.st61%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_84_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st62%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23404B59%3B%7D%09.st63%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_118_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st64%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23D1B0D3%3B%7D%09.st65%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_119_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st66%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2315B2E7%3B%7D%09.st67%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23E1F3F8%3B%7D%09.st68%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_120_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st69%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_124_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st70%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_125_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st71%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_126_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st72%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237C8737%3B%7D%09.st73%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_127_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st74%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_130_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st75%7Bfill%3A%23CCCBCB%3B%7D%09.st76%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2388909B%3B%7D%09.st77%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st78%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_131_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st79%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_133_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st80%7Bdisplay%3Anone%3B%7D%09.st81%7Bfill%3A%2345B6F4%3B%7D%09.st82%7Bfill%3A%2389919C%3B%7D%09.st83%7Bfill%3A%2361ADD1%3B%7D%09.st84%7Bfill%3A%233899C6%3B%7D%09.st85%7Bfill%3A%23F78F08%3B%7D%09.st86%7Bfill%3A%23C1BFBC%3B%7D%09.st87%7Bfill%3A%237A7A7A%3B%7D%09.st88%7Bfill%3A%23B3B4B5%3B%7D%09.st89%7Bopacity%3A0.48%3B%7D%09.st90%7Bfill%3A%23A0A1A2%3B%7D%09.st91%7Bfill%3A%23A1DEF0%3B%7D%09.st92%7Bfill%3A%23804998%3B%7D%09.st93%7Bfill%3A%230072C6%3B%7D%09.st94%7Bfill%3A%2359B4D9%3B%7D%09.st95%7Bfill%3A%233999C6%3B%7D%09.st96%7Bfill%3A%230078D7%3B%7D%09.st97%7Bfill%3A%23D1B972%3B%7D%09.st98%7Bfill%3A%23FEE087%3B%7D%09.st99%7Bfill%3A%23B1CE2D%3B%7D%09.st100%7Bfill%3A%237FBA00%3B%7D%09.st101%7Bfill%3A%23FCD116%3B%7D%09.st102%7Bfill%3A%23719904%3B%7D%09.st103%7Bfill%3A%23B8D432%3B%7D%09.st104%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23804898%3B%7D%09.st105%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%236B2980%3B%7D%09.st106%7Bfill%3A%236B2980%3B%7D%09.st107%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st108%7Bopacity%3A0.2%3Bfill%3A%231E1E1E%3Benable-background%3Anew %3B%7D%09.st109%7Bfill%3A%2333BCF0%3B%7D%09.st110%7Bopacity%3A0.2%3Bfill%3A%23636363%3B%7D%09.st111%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_134_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st112%7Bfill%3A%238B77B6%3B%7D%09.st113%7Bfill%3A%239B6CAC%3B%7D%09.st114%7Bfill%3A%23874B94%3B%7D%09.st115%7Bopacity%3A0.4%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st116%7Bopacity%3A0.8%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st117%7Bopacity%3A0.6%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st118%7Bopacity%3A0.25%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st119%7Bfill%3A%23DD5900%3B%7D%09.st120%7Bfill%3A%23FF8C00%3B%7D%09.st121%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%233E3E3E%3B%7D%09.st122%7Bfill%3Aurl(%23path3060_1_)%3B%7D%09.st123%7Bfill%3A%231870C5%3B%7D%09.st124%7Bfill%3A%2372BFDF%3B%7D%09.st125%7Bfill%3A%233C3938%3B%7D%09.st126%7Bfill%3A%230072AC%3B%7D%09.st127%7Bfill%3A%230079B6%3B%7D%09.st128%7Bfill%3A%2300A2D9%3B%7D%09.st129%7Bfill%3A%23BFDC34%3B%7D%09.st130%7Bfill%3A%23898989%3B%7D%09.st131%7Bfill%3A%23EDF0F5%3B%7D%09.st132%7Bfill%3A%23A3A4A7%3B%7D%09.st133%7Bfill%3A%23353535%3B%7D%09.st134%7Bfill%3A%23FF8C02%3B%7D%09.st135%7Bfill%3A%2300AC8C%3B%7D%09.st136%7Bfill%3A%236EC2E9%3B%7D%09.st137%7Bfill%3A%23442359%3B%7D%09.st138%7Bfill%3A%236DC0E6%3B%7D%09.st139%7Bfill%3A%23432056%3B%7D%09.st140%7Bfill%3A%2386CAD7%3B%7D%09.st141%7Bfill%3A%23009E48%3B%7D%09.st142%7Bopacity%3A0.2%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st143%7Bfill%3A%2368217A%3B%7D%09.st144%7Bfill%3A%23E5E5E5%3B%7D%09.st145%7Bopacity%3A0.15%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st146%7Bfill%3A%233898C6%3B%7D%09.st147%7Bfill%3A%2380BA42%3B%7D%09.st148%7Bfill%3A%23B3D234%3B%7D%09.st149%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9F9F9%3B%7D%09.st150%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23008EBE%3B%7D%09.st151%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F1F1F2%3B%7D%09.st152%7Bfill%3A%23BAD80A%3B%7D%09.st153%7Bclip-path%3Aurl(%23SVGID_2_)%3B%7D%09.st154%7Bfill%3A%2300BCF2%3B%7D%09.st155%7Bfill%3A%235AB4DA%3B%7D%09.st156%7Bfill%3Anone%3Bstroke%3A%235AB4DA%3Bstroke-width%3A0.75%3Bstroke-miterlimit%3A10%3B%7D%09.st157%7Bfill%3A%233898C5%3B%7D%09.st158%7Bfill%3A%237A7B7B%3B%7D%09.st159%7Bfill%3A%23545555%3B%7D%09.st160%7Bfill%3A%23D6EAF3%3B%7D%09.st161%7Bfill%3A%23009580%3B%7D%09.st162%7Bfill%3A%23BA141A%3B%7D%09.st163%7Bfill%3A%237AC3E1%3B%7D%09.st164%7Bfill%3A%23E27226%3B%7D%09.st165%7Bfill%3A%23FF9D26%3B%7D%09.st166%7Bopacity%3A0.12%3Bfill%3A%23BA141A%3B%7D%09.st167%7Bfill%3A%233C98C5%3B%7D%09.st168%7Bfill%3A%235AB3D8%3B%7D%09.st169%7Bfill%3A%23AAD8EB%3B%7D%09.st170%7Bfill%3A%23797979%3B%7D%09.st171%7Bfill%3A%23959595%3B%7D%09.st172%7Bfill%3A%23D1D1D1%3B%7D%09.st173%7Bclip-path%3Aurl(%23SVGID_4_)%3B%7D%09.st174%7Bfill%3A%2333A2E5%3B%7D%09.st175%7Bfill%3A%2371C2EA%3B%7D%09.st176%7Bfill%3A%23005091%3B%7D%09.st177%7Bclip-path%3Aurl(%23SVGID_6_)%3B%7D%09.st178%7Bfill%3A%23ACD64D%3B%7D%3C%2Fstyle%3E%3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cg%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2226.5%2C4.5 12.5%2C15.5 1.5%2C35.5 11.5%2C35.5 %09%09%09%09%22%2F%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2227.5%2C7.5 21.5%2C22.5 32.5%2C35.5 11.5%2C40.5 46.5%2C40.5 %09%09%09%09%22%2F%3E%09%09%09%3C%2Fg%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");\n mask-image: url("data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 22.1.0%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg version%3D%221.1%22 id%3D%22Layer_1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22 x%3D%220px%22 y%3D%220px%22%09 viewBox%3D%220 0 48 48%22 style%3D%22enable-background%3Anew 0 0 48 48%3B%22 xml%3Aspace%3D%22preserve%22%3E%3Cstyle type%3D%22text%2Fcss%22%3E%09.st0%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2300A2D8%3B%7D%09.st1%7Bfill%3A%23F79E1C%3B%7D%09.st2%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232ABAEC%3B%7D%09.st3%7Bfill%3A%23F7B218%3B%7D%09.st4%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3Anone%3B%7D%09.st5%7Bfill%3A%2300A2D8%3B%7D%09.st6%7Bfill%3A%232ABAEC%3B%7D%09.st7%7Bfill%3A%23323A45%3B%7D%09.st8%7Bfill%3A%2388909B%3B%7D%09.st9%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st10%7Bfill%3A%23A3BF3A%3B%7D%09.st11%7Bfill%3A%2380A23E%3B%7D%09.st12%7Bfill%3A%237B4D87%3B%7D%09.st13%7Bfill%3A%232F75BB%3B%7D%09.st14%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2385C9D5%3B%7D%09.st15%7Bopacity%3A0.15%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st16%7Bfill%3A%23A5D9E2%3B%7D%09.st17%7Bfill%3A%2385C9D5%3B%7D%09.st18%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23323A45%3B%7D%09.st19%7Bfill%3A%23FFFFFF%3B%7D%09.st20%7Bfill%3A%23DAEFF3%3B%7D%09.st21%7Bfill%3A%232A65AF%3B%7D%09.st22%7Bfill%3A%23F6ECF4%3B%7D%09.st23%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232F75BB%3B%7D%09.st24%7Bfill%3Anone%3B%7D%09.st25%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9BA19%3B%7D%09.st26%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23A3BF3A%3B%7D%09.st27%7Bfill%3A%23F6931D%3B%7D%09.st28%7Bfill%3A%235E6D80%3B%7D%09.st29%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3B%7D%09.st30%7Bfill%3A%2300B8E2%3B%7D%09.st31%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%235E6D80%3B%7D%09.st32%7Bfill%3Anone%3Bstroke%3A%2385C9D5%3Bstroke-width%3A0%3Bstroke-linecap%3Around%3Bstroke-linejoin%3Around%3B%7D%09.st33%7Bfill%3A%232A89CA%3B%7D%09.st34%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237B4D87%3B%7D%09.st35%7Bopacity%3A0.3%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st36%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3B%7D%09.st37%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2378B843%3B%7D%09.st38%7Bfill%3A%2378B843%3B%7D%09.st39%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23EDF0F4%3B%7D%09.st40%7Bfill%3A%23005BA3%3B%7D%09.st41%7Bfill%3A%230F80B0%3B%7D%09.st42%7Bfill%3A%23005F87%3B%7D%09.st43%7Bfill%3A%23B7D332%3B%7D%09.st44%7Bfill%3A%237FB900%3B%7D%09.st45%7Bopacity%3A0.6%3Bfill%3A%23FFFFFF%3B%7D%09.st46%7Bopacity%3A0.4%3Bfill%3A%23FFFFFF%3B%7D%09.st47%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_13_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st48%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_64_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st49%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_65_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st50%7Bfill%3A%2373BDCD%3B%7D%09.st51%7Bopacity%3A0.6%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st52%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3Bstroke%3A%23FFFFFF%3Bstroke-width%3A4%3Bstroke-miterlimit%3A10%3B%7D%09.st53%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3B%7D%09.st54%7Bclip-path%3Aurl(%23XMLID_67_)%3Bfill%3Anone%3B%7D%09.st55%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F7B218%3B%7D%09.st56%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_69_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st57%7Bopacity%3A0.8%3Bfill%3A%23FFFFFF%3B%7D%09.st58%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_79_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st59%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23DB5B26%3B%7D%09.st60%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F58B1F%3B%7D%09.st61%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_84_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st62%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23404B59%3B%7D%09.st63%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_118_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st64%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23D1B0D3%3B%7D%09.st65%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_119_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st66%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2315B2E7%3B%7D%09.st67%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23E1F3F8%3B%7D%09.st68%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_120_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st69%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_124_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st70%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_125_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st71%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_126_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st72%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237C8737%3B%7D%09.st73%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_127_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st74%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_130_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st75%7Bfill%3A%23CCCBCB%3B%7D%09.st76%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2388909B%3B%7D%09.st77%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st78%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_131_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st79%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_133_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st80%7Bdisplay%3Anone%3B%7D%09.st81%7Bfill%3A%2345B6F4%3B%7D%09.st82%7Bfill%3A%2389919C%3B%7D%09.st83%7Bfill%3A%2361ADD1%3B%7D%09.st84%7Bfill%3A%233899C6%3B%7D%09.st85%7Bfill%3A%23F78F08%3B%7D%09.st86%7Bfill%3A%23C1BFBC%3B%7D%09.st87%7Bfill%3A%237A7A7A%3B%7D%09.st88%7Bfill%3A%23B3B4B5%3B%7D%09.st89%7Bopacity%3A0.48%3B%7D%09.st90%7Bfill%3A%23A0A1A2%3B%7D%09.st91%7Bfill%3A%23A1DEF0%3B%7D%09.st92%7Bfill%3A%23804998%3B%7D%09.st93%7Bfill%3A%230072C6%3B%7D%09.st94%7Bfill%3A%2359B4D9%3B%7D%09.st95%7Bfill%3A%233999C6%3B%7D%09.st96%7Bfill%3A%230078D7%3B%7D%09.st97%7Bfill%3A%23D1B972%3B%7D%09.st98%7Bfill%3A%23FEE087%3B%7D%09.st99%7Bfill%3A%23B1CE2D%3B%7D%09.st100%7Bfill%3A%237FBA00%3B%7D%09.st101%7Bfill%3A%23FCD116%3B%7D%09.st102%7Bfill%3A%23719904%3B%7D%09.st103%7Bfill%3A%23B8D432%3B%7D%09.st104%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23804898%3B%7D%09.st105%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%236B2980%3B%7D%09.st106%7Bfill%3A%236B2980%3B%7D%09.st107%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st108%7Bopacity%3A0.2%3Bfill%3A%231E1E1E%3Benable-background%3Anew %3B%7D%09.st109%7Bfill%3A%2333BCF0%3B%7D%09.st110%7Bopacity%3A0.2%3Bfill%3A%23636363%3B%7D%09.st111%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_134_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st112%7Bfill%3A%238B77B6%3B%7D%09.st113%7Bfill%3A%239B6CAC%3B%7D%09.st114%7Bfill%3A%23874B94%3B%7D%09.st115%7Bopacity%3A0.4%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st116%7Bopacity%3A0.8%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st117%7Bopacity%3A0.6%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st118%7Bopacity%3A0.25%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st119%7Bfill%3A%23DD5900%3B%7D%09.st120%7Bfill%3A%23FF8C00%3B%7D%09.st121%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%233E3E3E%3B%7D%09.st122%7Bfill%3Aurl(%23path3060_1_)%3B%7D%09.st123%7Bfill%3A%231870C5%3B%7D%09.st124%7Bfill%3A%2372BFDF%3B%7D%09.st125%7Bfill%3A%233C3938%3B%7D%09.st126%7Bfill%3A%230072AC%3B%7D%09.st127%7Bfill%3A%230079B6%3B%7D%09.st128%7Bfill%3A%2300A2D9%3B%7D%09.st129%7Bfill%3A%23BFDC34%3B%7D%09.st130%7Bfill%3A%23898989%3B%7D%09.st131%7Bfill%3A%23EDF0F5%3B%7D%09.st132%7Bfill%3A%23A3A4A7%3B%7D%09.st133%7Bfill%3A%23353535%3B%7D%09.st134%7Bfill%3A%23FF8C02%3B%7D%09.st135%7Bfill%3A%2300AC8C%3B%7D%09.st136%7Bfill%3A%236EC2E9%3B%7D%09.st137%7Bfill%3A%23442359%3B%7D%09.st138%7Bfill%3A%236DC0E6%3B%7D%09.st139%7Bfill%3A%23432056%3B%7D%09.st140%7Bfill%3A%2386CAD7%3B%7D%09.st141%7Bfill%3A%23009E48%3B%7D%09.st142%7Bopacity%3A0.2%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st143%7Bfill%3A%2368217A%3B%7D%09.st144%7Bfill%3A%23E5E5E5%3B%7D%09.st145%7Bopacity%3A0.15%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st146%7Bfill%3A%233898C6%3B%7D%09.st147%7Bfill%3A%2380BA42%3B%7D%09.st148%7Bfill%3A%23B3D234%3B%7D%09.st149%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9F9F9%3B%7D%09.st150%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23008EBE%3B%7D%09.st151%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F1F1F2%3B%7D%09.st152%7Bfill%3A%23BAD80A%3B%7D%09.st153%7Bclip-path%3Aurl(%23SVGID_2_)%3B%7D%09.st154%7Bfill%3A%2300BCF2%3B%7D%09.st155%7Bfill%3A%235AB4DA%3B%7D%09.st156%7Bfill%3Anone%3Bstroke%3A%235AB4DA%3Bstroke-width%3A0.75%3Bstroke-miterlimit%3A10%3B%7D%09.st157%7Bfill%3A%233898C5%3B%7D%09.st158%7Bfill%3A%237A7B7B%3B%7D%09.st159%7Bfill%3A%23545555%3B%7D%09.st160%7Bfill%3A%23D6EAF3%3B%7D%09.st161%7Bfill%3A%23009580%3B%7D%09.st162%7Bfill%3A%23BA141A%3B%7D%09.st163%7Bfill%3A%237AC3E1%3B%7D%09.st164%7Bfill%3A%23E27226%3B%7D%09.st165%7Bfill%3A%23FF9D26%3B%7D%09.st166%7Bopacity%3A0.12%3Bfill%3A%23BA141A%3B%7D%09.st167%7Bfill%3A%233C98C5%3B%7D%09.st168%7Bfill%3A%235AB3D8%3B%7D%09.st169%7Bfill%3A%23AAD8EB%3B%7D%09.st170%7Bfill%3A%23797979%3B%7D%09.st171%7Bfill%3A%23959595%3B%7D%09.st172%7Bfill%3A%23D1D1D1%3B%7D%09.st173%7Bclip-path%3Aurl(%23SVGID_4_)%3B%7D%09.st174%7Bfill%3A%2333A2E5%3B%7D%09.st175%7Bfill%3A%2371C2EA%3B%7D%09.st176%7Bfill%3A%23005091%3B%7D%09.st177%7Bclip-path%3Aurl(%23SVGID_6_)%3B%7D%09.st178%7Bfill%3A%23ACD64D%3B%7D%3C%2Fstyle%3E%3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cg%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2226.5%2C4.5 12.5%2C15.5 1.5%2C35.5 11.5%2C35.5 %09%09%09%09%22%2F%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2227.5%2C7.5 21.5%2C22.5 32.5%2C35.5 11.5%2C40.5 46.5%2C40.5 %09%09%09%09%22%2F%3E%09%09%09%3C%2Fg%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");\n background-color: #0078d4;\n}\n');const Ke="spinnaker.azure";n(Ke,[me,ve,fe,ge,$e,ue,qe,Qe,te,se,ce,oe,ae,Se,Ae,ye,we,De,ne,Je]).config((function(){r.registerProvider("azure",{name:"Azure",logo:{path:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAACrCAYAAACEwDK4AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABCZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI2MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTcxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0wNS0wNlQxMjowNTozMTwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjguMzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K8Qjg7wAAM9JJREFUeAHtnQeAFdX1/8/MvLa9L1tgF5Zl6UUUggoIggVLrCQYY42a/jPlb4rxr9EkvxhNIz9bEjUmllhRRFCxIKII0hVY2jaWLbC9vf5mft9z571lwd1lWfWXRM+FeW/ezJ07937uveeee+6ZWbIsazG2EpIgBITA554AywKWCSRC4XPfFgSAEDiCgMiEI3DIDyEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEh8B9DQPuPyWk0o+2WlRnyhYorW8O5++pb0irq2pIqu6y46uaAtau6tv6+L89Yf9akzF3/aeWS/AqBfycCjk8jM5ZljUa6FrZyTdPCvd0DcZJwvAhbLrZkbN158RMZXaGIsbcx4Cira3ej8ydWtoeza1u9haf8atXItkBkeER3pkYiRDpEm6FppBkaBci9zxHvWIq0/4L77kGaEoSAEBgEge7OOIhre73ECocvJNOcTDrFIUIzOmk1vuuxdWBDV6YEfOWGTXN0kzcyrilIRftq27JK6xoT9jX43Adawp6qVr+npQ3RHU6yDGRR18mhWfgyIARc5HATuSzIHadGOosfyCCLNIroWrGl6V/AgdXYRDAwGglCYBAEPjHBAAGQhftfgO10bOOwpbeHKNLQ6e/E1nqwxd9Seqi91QgFQjctmJi2bEd1ybef2D4+pDnIgY6vYTOw6djQ3ykxBUoEOr2lIyULGgG+SDPx3+Q97PN/UwkE+4BFYc1gDSITgsdlH5NPISAEBkPgYwuG+s7AxENdwZNfKj00c3+Td3ppTevo6uZOagsa1OoNUZs/SN6QhpHfSUH06Wm5cQ03YayPmGZq2IijFI/T7vTR3LMAsDA1YKnAn5qFi5RWgF+QEmpXncUHYmjQJKIRyLAiiB8xMLkI8FkJQkAIDI7AgAQDtAEnkXlNiPRJD6yujNta7w9X1tW7mvyUc8rv3h3lDVkjIzAR8HzfaWDk5x6NWYPOI7gzjpJwNXfeAPq420WsWaDzQzvgjs0CQAkCPsqxoh0dX0pAsMqg0rPPq12c4+s4duyovcdHWZIQzBQShIAQGCyBAQkGJH45th8GwlTywDtV1Bh0kstwK5VfwyQ/0W1CCNhqPXdQ7pmq07MdINbpY30Y5zion6qX9+j1OB6dNBwWBkeeVtfaguKoE9H0IRiOOmFfIp9CQAgMnMCABAOm9SfABlDiQJeLdxuUGAmRg9UC1Qd1CAKNQuQiQ+2Z5MCgzRMB1gr66qV9HR941nuPCcHCVglMJyQIASEwWAIDEgy6HoIl0EkmrwyYsP7DYKhGdjW/t9V6BxYLWU/gEMEUgk99Wp1f3aSvD00JhgGVq68k5LgQ+LwTGGAHMnxqgsDGP/R2HVME3g4HFgGHk1Li4V8iFZANS61j2BLqcAb73IP9JA8n07CxloFyUjVsHgO2UeD6DKJgHjQmmFepFdc34vpOfEsYAAHwwyoShcCsLRYdx9gOBa5qpDmIc02xc5/kN+7DjVZH+sFPMt3PQlqHe3O/pdFRMeyCwLYBexZvrxz0fdGx5MKxzved8jHPcNLHTN6yvMMo7L4WgmQmSjQUJXPDS6rdotAOywo/pWmOF/u6ExpUPs6dBn+NU4DlBNKcwxy6CZZmB6ZQTaZlNcDkUg/1qgztrhRx92FrxsbOXh3SEFl+W2diivoV8GBnOG1nZU1HY8AMpHtc7P+SYVlmKtjxMlNlwAq9Ce+V+8GNGX6sgPtehEo41UHhQopEkskIhSKRyD7d1J/TnNqaj5X4Z+jiAQoGaoj1tVivO2bPOwYkNlD+K0OE4s4yHOFF0HTGdBs8kSGLnJNNM6KhAb2Fhth+dB6tUGh2hCJfM0z9HDhd8GiHwCkwESuXTAOrqmx1YaVFJy+ZH1LE2hBvGLtwAI5egXqkvb63tHH+cxEsq+sEDDM/NXRrzqGGDjrj58/RIZ+bgtBCg1jmPn3yEFr6o7lcGZC1VhGEwkSTTNbCFn8cQCHLOg2JXo+J8AKl4bKOCAVT11CjDj0f9bIf9VL1ce7xWbl2oIKBVWTeIMU/mfBxBUs/ueg5x+kzGtpE6gf7WoZ97+HV5EpMUCspv7lqOp2QzxqsNQYfPMX4iGAg3XGuYQWuJN1N67dW0o+XbKIEZyKWaYP0t5vPpzQe5Fi70l20vbyeFtzy9ESf4Sl5+tYL3jl91JAPyNR3QV7UIO2d2D6XwSTX1TBNz2GBevHPn6U2I5+KCy26ek4uVdb7aX+j7YYCzQuyVyHKwtdUdFz026hhaxDk0NhHv7mp8pRfvcDV4KJFs4vo6/OgsIQdZDnCl5qmvhXJ/moQSX/mLhmoYOhCyXn7xATDp0xyIMKh+c21u3x72lwJSV0RzApCtPAPb9O+316ETm1i+EKrPSqgYTopYhaaEArcXq9cvIqCqRnkxojThEnItqommlOYgUFOeWDS/v31ZLryKOB2uDfXdM0+fRQu050hjE8HcPnnUjCA4TegkX1Vh9PLph0VVBFOhud7kF697XyK78HbtOA1Axf4h1aU0vb6Jrr8zInZJw1N4ykcsxtsyPrj4+tT9lIiJYYjdNfyUroegkE3TMJ/1Lt+NfJXBeHz2GBv8Fm5bqCCAUY5K+pNyP1lIP3uX4aIMzeQmUqt5nI0wHc6M39YJvnqD9C+Lict33uQzh01pBOrrx/RFtBgMB8NBtk167mV26jLlUbjCtLJX9NM7U4D5kd7eOPnN9hIe86sSXRdZRcEg0HXzSliN685mFx7NM1A+7Nakd7avijhfBosYrnInwf6dZBcLlalefPhOhbSgw5IuyAIkeYiF1QbZXANBQLkcbspBcNnOkZyfMMtFQo2UEIHwooUtCC4q+KwEx8RtpWgTRgt+ObnYFgF/wgvHO8OuCemWXQVFrK/ATa4B1FZVQuFwW1UtuewULDCWNViwtw0NXp6VSltaNYov6g1EYIhFwcP8LWDCa1NnVkbIcCHZDpQqiC1dem0fFcdnT8mF3dS1rNifN5uRSwW4S+hTBsGc5+Pew1YJaCz5bjD0FodlA4biAdPCYXxv51CjiZUB6b21IT8eT/uvfq6fqCCAQ0xlol/H6EAgMprkr+5EUUDC4WBCAYYspShkHLTXTQqJ49q1tXQw6+VsWBg8NzoPxIw0tXywYde30th+HL81xlFdNefD+AZDg+alp0HtazLDpgQFLdffaqdBkZAKMbQg62TLTJg+DLzwlagAOKEhcMhbOiMNArbZGR/EjroWKdlDMXveMvlDOO5kC7Mh7tIC3fBONoUIWM/pkPlON+IzYU5eA7czIY4TLiE61o9nijbFYwEd7lcroM4z0JpBLaTkPZ0ZGQsXNQyI7CQYmE5ELbwcInbcqG3JFu6I01p8KooPAlHk8SnzrYTgz1V4NGKcmoRrFDpkSDKUo9SVViRCKZI+jZE3Yxte0x4oW6GQ5DMRbkvsHTtAp0lJpa8OdH2di/7y5Ir3haoqtagSfBdlGTFsneC0wmJZZHDofMcbyS2QXfWR1/bNMzQ3HT+zFHUUr6HVuz20VPv1CjBYPESO+4LhkXI3a0QYOehQ76JZ3fewD1XozwQhH0HlNONBuNJ77G60ndsFC8QmGS69PmW6RiL6VKGRmEX5jO4hL2Mg8lOy5UVclhD8BhhogHu7NAL76GwwzCb4fbfZGnORrSDhrBpHHDo6oFB1kC5PfgoEEgMut0uDCplyHeov3z0dW6gggFltjr6SmTAx7n/RuXKYfGCJnP4x4CT4ogoNFu37W+VNKrUtgJi55jBC8t3G+enIxCiby0opnveqaV122qpNmQezHcZfUhjx6HSfbVU2himjNwkOm9CHt2GngXbA7qMHXgWzA90YebanQlUJOqW88riw8yzdP0KwzS+gH7Bnal1a0VNqjcUGRXvcU+aUjAEPcXuLHg0DI3Vgc6CtFSpUGVoJOxf1tDeTruqm8IlI/MdQzzo12DBq0W4DRmGVeYyXHuQdvO6HWVxmstZhF48ZVZJgUqHOwH7pHBgrxTurxFMifg+WJGBThCi9/bUQFboNKYwi7LjeLGAL4VYgINb2IBDm4lHXcksgE9ZAYTRaV1QOzZX1H7o0I3STVW1tVMLcrkQI5DfU3A/rDQwERhmuaEjeKBJMY945FkFVWT7XLT4pDlwH6wmJsa5shBnNOp7FOp9r33BwD9x3Umn/uDxsQEjgc47KYv0PIuWlG6n1VsPUBvkZQpyxivdyoMXwsmyQlMNyzUVdzgF2yxcvwnfFdh46ZTbBmtNnOOEUCjEQis1DcYKxKtF/riT9hkQhx8yvFGPRC41jUAybC54zgcMFAb+cCEfnLhGb++soOS4eJoyIoccpuVA/WZDTGbrqrWhjSEHm0srrJDDKEUzrDi1pKCD3G7dZUa6ILvfQWIP95mRfk4MVDDwMpFSFbmpx7Z+0v3oKe7EaBRcfg78xemgZfDnoIItULgSY/IG+6aVgMSSB5BgJ2RIE/JkBoNhPTM3mya6A7Q7ktT115U72lB5vL6NoesjwX/fC9vb/B495Wun8QCPDoUGZfexWOHQlSEYgp1eyrv2HxQxPLTtkcupAA+KqF4LVVkt92pU8rcVG0t+8XQp+Z3caTB+mgFyehLp9ism0lUzMEACGHeVmkNtNOXaR6hg8lDa9KuF9LtH3qBfvdFIcXERR3uXlzY8cDmNSYpDXhAf2Whs7Rr5/T+/NnL5dsg+ZzxW/bj5QcxE3qIL5xbTH66ZQUlofRGMQxoUCnQLdZ3Xa9G1i5fR66UtWGBJgirShbmLg3Kz3LT0ptNpdHYKyoOGy/0CdHSHgzburaJb/vo+balnTdczUTfNiRbK7MYg+/ULxtNt55+oKiiCfDnBZeHtz9Hysi7KTUyn1EQHle73Uvo1j5MDM5ROCI9Dj15Ooy/8LXkzcik/OYnS4jW6/eF1zp/e4021TC1NQT/Oj517DpxX2eEZm5Hioek5aB7YkgJrqT0+gV7cVENXnJivGNg1yMIbewA/6Yo/nHLQOeRkPPavVpWAt92wwl448bV3tXsb77/lgkNfmTQEhvkIZn4Omn7dQw5a+GA9PXMd95leQ+pFf75gaEHmZdsXXxKno15sb0CDLvz+o/RKdSttfuQGSmpuoXm3r8TadgIFgu107YUT6LcXTwNHFtycS4N+/dg6umfFLuqKc2uY743TnNY4ZvjdS6fSLedMaEUsP9rxo4h/3FrDQAUDJKQe4A7o9weo06spSWVDtDtlz/1eaeBgMGKRz2fHDIXC1NXlw0r1sbJgx7fQR3kk5sDChfdRaCVgOAecN28oSEh3CKIUqYj9f7D6XouUypDKCOw7rpk/1vezV8qqH1ldTbedO3EYjlUdnYS/I5jy6q4DkMYZKd86s4TFCt4NEYTDV1w0L3wFDyTohDAzJqdnUNDAMhwP4+iGplrK5DGa6Lt3L6XnyjB3j4+noYkaZWcmUUdHgCpqO+jG+99HBzTo2mnDERPsoNXE5QyjlPQsemDFFrrzrVoqyE2lYZlx9P7WcgqFeQDDiI+Otw0j/cV3rlQ2kJJhyfSl2cMpFYaPvQd99Py6/fTqxib6wuYl9NbiSyhbjY48yeG7GDTz+49Qg5FNxcMz6Oq5+eisEVq3s41eXF9Jj6zdR7++8ESVdxQDxBz0yPItdOtTu6gz3kUnjxlK58/IgzAJ04bSJnrlwzDd+0otrd1WR6/ech7ED7dPJ40tyKIWB0wnaFVNgSDFO+JoVkm2GbSCSwPk2JKI4p44Pr/YSk6fVd0UHB2E1B2Z6TqQ4vHUWcFI+TLO6gAD2gikMd3wkwdeu9yNMs6bnt195YIJmfR8ZYgefn2fEgzs3M8MWJuCHciOpyWircPXV9PGok7HYs5I8XhOyEhOxXtBIvWtHb71kJCbcd1+XGAa7vSMnCxrJAwvvQqG5at25HzzqdJ5ltNjq2A8fVDscbE7iVKhhW4vb6Vf3fsSdTjS6aTiJKqqNlH/ts+dBq2OBdCCm56gze0eaK1u+t7csZSKwu3d34p6qqV7XthL28oPpj7znXmsyXChjjscq1fGEsS8R4t3Ifat542G8zNUW+6Y3P4ReFyN7bPhTY2e6AjcWWNB7cJ4VZTLU2mi+SV5tPS7meSOrkfxMebD8bgkLBRVx4+quywYjghIPyXJjUbFEfnZDB2dL0LDUtAOLJqGa/MhKWuOuKbHD5zz/vGJtZV4nmMfBA0b9awvz58YvOPFHf72sCN+ZXnjRByr6nEJ52f2X55ZP7wTL4+aOTlLWdCwNg63PTQprERwg+JgS3TegYiAKNd52hiV8izV+PyKd0rp+X1szzXoR4sm0rdnl/ClKuzc30Rf/fVyWru3qVswQH0hF+C21rXTL/c20twpBfT0905T8f3ovGoeyr8wYlx290oKxGXSRScPofu/Ol3FiX3csegLNONHS6g17Kav/88aev7G2ciP3WFffGMrNVipVFQQT6t/Mi92CV03HxpIhxdTF26cAZQSqzJYMSirqqdbn95DZqKT7rzyBLphxmF5fC2u2YZyLPrFctpem0h3vLKTbj17HGt0dMc1s1Xa/1iylm5+4xBNKXHR0htPvwsHF4NNvfYzVffcoS9f9LMXLlrdauT/YNGkLdedlLca59mmMqAAmy1UlfCV6EgLX/nwUC7sq2ByOI/ng/mSvZtpZ1krHYS31RCUyQ6sR2Jagfa95e9fw6O60YaMrwTEWVNaT9fcswao9Zx5k/PQTvRqXFeHLWzqoXgsXuVFE/rIl+HRJhgR6wTbcx+nucOo9PklRBZluB1020PvQXNKoTfuPpfGpbhVGj7kD+Mq4jjo5vtX0LaOOBo/LI5W3nIxeuPh8IMvttDs21bS21vaaOnOJu3C8ZmxGe7hSAPY65lmP9GDQ7DulmtgmBidA1USHUGpWkcP4dEUuKjx0GdTEj3qSExAYE5vM8DRZEiZ4kxu7DzFODLAuwgPaemUFmdnD/2r18DXxc7xPoNzI08QE/BmNLn1/bPXC2MHLarEbpVmah349jnjnJF5Y7ITX67wJ9774ocnQBBgTFPLivx+uknYn/fga7vHY1gwvn3OWO4lHo3Vlz7C4XJhLwpBcUP837/wPkacbJo5KcMWClzxyLuBUX9cQQZtuO9KamrrYejHOb6TH9Wcm5kQFQpIF8IWJmt0OHRu3Ul/eX4TdTjTKD1Zs4UChIaJuoBFQbmxOzFlefT66XTm/2yidz9oph0dQRqfxH2QaMcBFFcP0KTifPXbgjZEMCPwjCoTQjgzKR4CkB+Sw2nU2y//uY4I05eTJ2XZQgHnTAgwe3CwaDLK8b1zxtNdGJH/trKcfgrB4ISgZFsDy0lf0G6zkYi1Ciny6/h4hUMF7OPm9LdLfrIEMbVxXb7AVhzD6DywgLorwZ1+gmsvfXN9KTXBtpeE5//nDcOKO9cFMnD6ScWU8uC7mNK76ME3K+hn80d2J85lZpuDgbaegDpBgdU1HOHme1+lLnTcb140hkYnumAjQLG6r1RvLst4fE1V2uWzCmGbOzKYpjYCCalVGfsMX8lAcRT34zbc4TPpqdvOVELBhPaFXFAcVz5aodcXpifXNZORGEcP3XSmEgomFgzRkzgByslKoxvn5NOvVzXT31/fbiesUj++jwEJhgi5RsJLbWQgrNOiBzdQE+yzUK2QkejN+PY99vknXITVuxl47hrrDMGwSZNzPPTSd06lF3fW0neeKqWEOIym3Rfb6bFRjI1SEJ4IuB4JRnC/Hrew01TFRrXwiI0jPqilj1xxAs0tycg0TYM7cr+CAauGNWgjaIxKAGCeSKHrzxqVs2Lxlpy1ZR0ldcGwK9flGIPmziJq/Lvry0+q1uMKc9NTaV5BGsdPsTTLrrNY5nAwFuxDPT+RVZSjo6WDqjpcFNa9dP3Zp9jRuXwoB6tbyvIPVTY7NTnWhkGBOeBadKa//GSOuoYbEcqA48gdX4vwLObLvNT3pdnFdhwIDTZsdT8WjwKPGzeccmgdHYw36K1t9TR+ZoGKOyY9gUIwzq18fzeVn1VERUpgwOuC64PnGuj4XO1cEWEInC2VHbApJGHKYd/LFj4QoUq7s4XNpbNG0W9f3UN+TBs3NProlEx7sFA3jH1oGnf6itjPI74tcz2EUdBp6Wz8G3gww5ciz5eyRvb06nIKOt10xexC+3rkj9djmNjc0UPohaoAvbx6Tw/BgIFPlQFtC7EsaIMWVHjuoHfAIa4MQmFYmgsa0BhunpWwE8D93WrDvfjlY1AdjaRIvDMHF39EMOB8XndDtnPT/clDJL/U6JxZhTQzH5o1tCsT3JVSAQ2GV7lWr9tOQU8CjR2ZRiPcdp3rWGmxA1cOyjSxgH6zqo621zX3AtuOeaxPtKhjB5jRML9yeTgbiR4HdaF19CcYuOAslHlT+9FbKE3DgZaKYKGQptOjXudmF0dFBRo+x7bxCIxenEhMIAAQ1xMCM2KtgiOrZSZ1XCM/8mVGLd68BGTH7vtTCxutaDztqBBOAQIi4p06oUgbHrcmsyKSlXP/m3vT7jh77GjNwtOlmnvM/7y8rdCJTvil+UWcKGsTPnRLNVdUZeWjPQKXpTvECokmWVHfpmbbHqxUFGWzrdTEKga0JJSVH1XnaZOOaRHrPkqfRVtTnRIw+cnWCVl8TQhHIVRxjZKcipxGtS0taNTZWEnATB2BPQLsSuB4nCZrezDv5zip6SDmpTUN+FWALUQXnT+ZfrlkAzwRs2gOphuXzymmry8YS8OT+X58K5QWAoEbaHV1E4AlwJ6g06ShPACGlYAKY3WGTZqGMto7KAPajQfTPT+Wc8uqGyAYCqKdjvMVDRGzLrZ79LceZ1ZpbdqQTsN/4Ohz/f1Gu5ih7gBHphW7WjHVctCiWSXRS1gocO1odP0ZY2jZPetpnx8Oao1dNBn5VbwUN+wimon64EXbiop6evDd/Yrhwz86k9NaA5n5qq7p67DPqxU5iJ6tm1YiWLHaVYrtiIAaZisngvo48hwaERuyJ+ZDq+GAN5LpEEoc14J0QA+gHVWt5HThxcedAfr5ko2kId8hCA8Wdfwe1DCaRGdrhOIhCP0BPQWaE96VrAwTKsmBfgxIMGCcGM+QsfyBxuHEMhUqXo0gPW7Ts5zY58Z3dPnhNoiRy74lXEzIiYLjQDcijs/X6XByORy4s9iNOmYPUhUeHbo4PgfVicL2mjt3NHQt6Nb9B7RpNhGgRSu1tQvWvjbUf/Jls4pDd61uSn1uVXkyBAOm9+7kmtqG7HcPwMcEasy35o5EwiaqgCFwDlBpsYz0uKV9yAZjK818UqfGTj93adI9mG6x4QbXO9AglHDAlILLqzqhenGWugS3QWpst8E3P1PARjxenozNVflePh+MoHDvDbm8UPttWw5rUqqTolNHkJ7BIgl16HLHQzvAa/dY7eAQQY6gfbz7wDW06M4Xacv+CP19dQ39FX4dEwoS6PfXz6SpMHZirUaVuBM+CHGYfWt6AsXHceNFvjFNsEvDv7kOOW3so86xPAsDKX4icBM/ApfRt8PWM7ct7Mr/1hKvL1TXrx+BnbL9aXVZeVgByeFcLHnjQ3ivx1MROvyIdM4xplYsgLn9IRMlE4ZTdsIGavZr9NBbZfSnSyfZWprKuy2kbd2CaOHvVgF7Al130Rj/hJT4f4TDgSUOh/sddDzlcIZOOAUysAQrFlj9tEbi9w6c6xZ6+D1t+bulI2xtRLVilWGuTq5elvEm6pjnqBwiYMaWKz6uminaTpPPh2m2iw7h9Wl/WrZXadIcV2OtBk3eQD3qmDo6IEgS4oPcCHgVZ8B2GU6LwzEFAwrDIy90JjRtNrBxZ0ZGj6xZTurIoAbxHod4hOdGzXNQDnxevcgFHcI+og6rDwZh79jAWB6i1Kqq+HjstB0p9skQ4UTEWgYAQh9hVb/fYEBlQPXAG1aJ5ahnDZlXLTjR+d+vPJnREkkqfHlvo75gVCas71spAqEwd3K+8kTCCM69ArLbDqqvHnU3zokd0BHUD/7AFahwHrnhFISRFPYWFo4Q6g5bFULcaKo8wkODUN0I3GwDLNKIJcydlEHGMsFxUSAWvh1e7kdJfBcwx3Hw4+mEmnbgTDjSRU7INl6o7A4oBPsWvHDbRbSn4hDdB+/O5Vs7aX+DRWffvIz+9N1ZtGjqcBWdNb4grPM8igX5ZZ48xcU/nk6osnIZWG4iwHkHFc6Dgi0e1flYnvk8FCYVsY8PtBtHbtJonpv0Gy92eSdkXmIk7CVoCY+9vZs8cSlUjzcTj7rmETWosWc7+3MqJmg1ienxWCJ20Rsb95MJwcD5xGMZioyu2rtOv3hoFTWAV1qGm24/a9xfca8/OZ2efbF7Rr9bARtSUIPPhVoNgTOaxXYRXgHLw3Y6etA4rkcWjnaw88E/+XjPR0EYH1evagFqusj7sEKFfDRuTAatue4MCnax4xxfG20GqiFCZ8OBxGSse3Mj+DQEA8aXYowlI6K3xT0GFpDPgYejInf/7LmD/e6fvaXco31HTx9TMJimA3oj2wjUdAAAefg0MuISPTmzCtNHrIWWff9rpbRg1Cx6fHMthfCU7ne+OIGT34l5JKYeVgYMl+x4c8xg550ziWVJGOz47dhaKECNeFluNpb6WMfRYPFm6WQozQD+f2igrJYPQH4jK2GKw4t1VSNBpy2HWqweaI5er6Yn3HpUDI0q6zqhoWRgydPWLNjjVl2LO/LaesmIbPrj18+g3yJfV9y+lDYh7o8f3UznQzCwsp0Cb1Edajr36upm+CTkJKley5og5xl/9wMlgRbT3km+EFKGf0ZhXgzVkTWJK7j99xoW3v5MwtuaJ7UrGOGOdXRH7PWaJE1rgFfgroZD7aeV1ofJl2bRvEKXz+3KeT9kUiU/rwJDeIZh6SMgdCaYYa/jnXI/7CAavbmvheYXgwmyZI/pTiqHkLx/fTWF8adQnv7O7HdxfAU0gd7yAnGjp+hacBgwjEDm8OAMlYT1cBfehZ6J36e4HXoedBVoiL0V+UguPQunNEiQzU2BRgghEQz6KAuOT8rUqSLaIuTwNcycnIFAgAXqcYdjagwQCmxEGZRTyXHn5pO9gG0A/QbNacL9V0uAYOC2nomZJMoZKoHxbtwNCybT2gfX006sx/83nsYL4vmx/ByPd3pO4tsgvgHV0IYxeBRsFLmoguyoInTE/exq5k/uchzYSIp36xd4yIORyKt5aMP2Who3fTg6I+KxtEeDVK7KUPdZSFgxDU1db3/01nzYOYqPF+ek0gdtFq1cd4BuPHWE3eXQXFkpUgZMCJu6imYqD6EjQ5icMWGYnSgaG4/3ERzDnBmdHCnCIu5AB//HDxbQ6JtewHIwbAveAI2Jd1Nhbg4Nwft7GmAnWrKhgqafPwlTw2hjx5zPgoYAnZZefL9K2Ywc7jg6KY8HMJWyyqt9YxaV8BfvI5j++GzYeIZDCLGFrbfO2MeVxnt4zuKkLnfaiMw4s/ThG894HhGXxjo0RvJ8/J6GbS6282Z884miOnh3Prx6NwTDDGgTKEu0Ur92z5uYDaXQtfOK6Qu5SVWIj0Gh15Cd4Q7lHwjEjaxu6WJBMA7I2lkTtLQgvKVdae/uPkiGCyJTjeycRm+1qdKGIyOrCXaIaVmTimCieHsX7a211SwHViTCWD5mIcx2OdbK4ZGqNHMIMFSC2qKpDPzLFor9xEfKrIr8J4bwsTINa3sGWkACFDsWDFnog8VQ4ycDce5p0wopC0/9scf5I29VqM76jbNL1iDeP9Di74VQeBD7S1EV73Gldddzj5vGxIFq+tEGwEu2uieNTs53kAsPEP1myTae9aMNomPy1ACdyoBQeO29PfTrFTvU7x5Jqt3D6dpn+He0S9JlpwzHkmaIPtxzkB6Heze7arOA4TaOToGYTrr6oVWU4HLSyKHxNDWLbafcCbAQz88uQBBAG4KYARXkgwNcftX0wIXWku7mY9zeiGaOzSU3lkmfXFlBO1sxdeF5DG8QgHCLpqbOIN2Nx9LDSOfsaUOiDalnp+BUcGMYgHmvt+B2BIrwd0cm7tjffBo68/ze4vRxbN0T6yvf0vTAsrOmjXgYZf9dTChwfOzXYHuBwuEX8PONL88sCPMTlm9uPKDqg+0inLfFT6yjMq9OQ1M0uvOS8Xwpj8DDeKeXUDw2L67IMNzDn1tVylIQj4tHRmLqOJKFwr3PrqUHV+/HdI2nhVwXHJhXr+EDxHgHZ5r4rD0Ft2j2jNGUYTbCsKjR3a/vQRbdWAhQ5UFKXNNID+2IpyHY9brdbvbROe7QZ656pBSVWrHmGCtQjxj/lruxNYy+M6dHzBQDxj7E5MIlYEkW4lgfDbdbddGXTiqkDoygUP+w2hHxXnbKiNfRmP6JjV831obtZS1svYzpexXeCBQVDmhdUVTc0FjF52/e5QB3WvV985WzyN98kLpCLjrtphfpsffLaGvZAVq5vZyuuHM5XXbfBtp46LDSw8o2z30N9MlYpcVGEf7mdsYGqoVnT6ZRRhc54j304z+vpe89sobeK6ulLeX76Rk4Vc3+wT9pX3sctXnbaPE3TkFe1OKoytNZP3ycLrt3Da3ff5BzqtJswF8Eu+pPq8jvSKaSUamUzVYZVUCLfnHVbKzjtJELHpDn3ryU7nppC22oqqEtFQfoXuyf+v+epGZ3JpqrSXd/lQfnoJqsqYRVKjCSmeZujM6V+NlrmFKUOgoOYuPWrN8z47ENZedt3nvg5F4jHnUQdbO7pi30nj9svn7FnKHc+XsPDsc2nCj96vyJezXYIVx4pP7RrVUqrgVv03tf30UJmKoPG5ZBtz+7ybztnxtSbn1y3cQfP/7+7O8/vVatSHFkCK3R+Br1xTkThoU68bSt10Xzf7Oc3itvwDMnB+jau5bT/3+pmk4YNxyztjBqKqrho+7QfroDnoeA9mjtxIG16OYr0TaXAnc5251iduKbL8ZzcN5OWrxkJ93x7HpqDwcRHQ0AQtkH79834Al7wS+X0eK3dvN0uq078ePYiXb6fq+Itmm7s9iNot/4/yYn7VGtv8x0hSPhtmDwUFfI5FpKxGCeqxl4g0e0Y39lwST6zVvL8eihh86ZPXwHZp5vH52eP+h/tt0fHtFqmRf4LPWCF1QQ6wBOuMHBsT4QoYAV8eOhllIc7MRIlIu6Ly4ZnkX34HmF7/5jI9XGp9CP/radXOEAloLR8dFScrPj6c5LJ0ZvB5dYNIxWuKN3mIlqNYJPKMHAjYqFBjccaAf8ZOJLd19OC3/2BG3vSqInN7TBIWYNBAqPUh4sbSWRx9lJS39+Lk3LhjIIwchykJ+vmFmcTI9tqKPXttShCOzvBw3GAbsF/ibgiJQgnKouVPlhNywkRknJHlp+6zl02Z2v0SEtlRavqKI/LC2HAAtTEB3MifceDHN76cW7LlLaggl7HDtw8eydW1MAjbgpqL388g/P2KIS7uXj+oUzsu9b/VSaNy0z7qcP7xweNEOT4i9+tNK75Ipua38vl6lDna7UdXmpce7xKSm9uidzJAgQ/jOKtVlDUmpHZfjHbmtz0MPLdtK1UwqptaGNGsAtDR35/e2HwmvC1gcQwE14gjUe5RthBsO+E3++rGLjbeehOOF8OKakzj5xpLFwcik9+0EnlVfH05d+/a56TXI43EWXzCuhexdNoeJrHiMj1dbGeBZlG5gNag8GqMWvNftD5hvI2utQXWoAcQj2a1DXZyGvkAgmffnsiVTf1Ux/WF5Bf1qp0R9fWUrOcKfiqhqDFQ8HLD9deoab3z8KVe74wzEFA5rA4WHr+NPv84po3+vz/P/FiS/OGr3Xmaw1Fg8dyrfDHFAtW+aho0zhJdO8ISn04NVjaE9riK4+c/wGnH//6HwlJyc3/XnZxvv84cCOaXnJSEhPxpYKdTs9MS3ec8vFxR14fqEKTz9W4lqfael56BdTUcFTL5o7Pn/W1EL9oVU72t7aVtdkGhneIRmacclJ+RkXTBtdwL4FaoqCZleYk0Y/uwRaqSfRl+F04IQacjwstVlt5Hjsps7ecQkuY9+Ku68qf3vr7tZn19fH7Tnkhg0knJ+YoOddOL1A/8qpcPlHVLwwRXXRWCO47yeX0WU7qvAsRVXDhqqONkxDtPRkI+2C6fnpi2aMxRX2fZRXIKYb7JU3pjCHttx/BT2/5gN69v3aSKPf2olHsvcU5sTv/+L0vKZzp4xk0ZUHY+BEzLQn4omu5Aism7Bi7Fowc9wrwfiqB370sEq614/UxPjO9b9bWPPLJe/RvtrIXqwj1Z1zWZHv+0t6jX7EwaYHzq9RevgRR3v9UYmj5b/95txTX9tZ60lNYHMGDGtDM+k3C0f7w07HKojIDSBWie92iDU/DABtQX+oYdawGTwio4yOFrz1kx3mShf/13neL27eG4GXbHNzwNGRkZ4Qd8OCk4vnjMwbzmu2P1w4hhLwgh8OIXC0xSQet7x4Uu3uhrYnzz0h5xm0NfaNUAGCaydWdXbjDzjNQwWfAZE69MZLTqPL5p1Iz60tpeUba/DmjBxe+IGBN5WmFsbjmZUSyk+M23tlLJHj/Ob20W+A+XYeGs5LgOLxwpFhzu/fgSWdPRtjl/WThGqo0Xggxktzk3PctOyGafTMB9X03WfKKQlLgN3TrViSg/jmjtEFifv41fB8LIINkSI3YN7+1+NJChUwEvHnI5unoXgT0HmhB8M9kWgTtr+hsl4ZaHpIi1sX2y4wPdRYpesOODcK+RuHJxuzDVJ9m0c0bsO8hM3qKUuqEij56FVGGuwYAZjzDqD9VeI4j5S8HM9mf3bHTcVEJwnKqdthuuDIoF4bx9oJJqBKjYRaoDyYuGwjsBWie2diOYv95sJYrWA9FMlAzyezCdaBKuzvx9aCjWuZjWjIrzkeLsIl8JXJhhSKw6ocO7dqYd3yY30OeVIvvWVO6ECEkfWItz47cWwq9KhJmFbgNSmRNhgedmpO51s43m/A48+YOugnYutAxC1I94N+LxjESdQHJmmRK2HduQiX81QlC7PLRuR1PdT5F/GbX9rC3PsNSGcM+uYUiEwolzrXObPkeRnL3lGQpKfC3jAT+7y0lc5+KZDQmLlqVRiI4K3k4Pb1PO7Vq4aD9LkuTke7OA9+C/MhoHNxHxzqLVjQOrQ7kdbrvZ091rHYYNFnPESowclqbGgcaFKxD7WD31G5oNRaPhcNfFp1+Gi82PEjvrsTw1Ek1J3WEZH+734AYhnuVoYKeBDrQaPgQ88VwaEK55jBgAPiBxCZt48EnNuLg7z1G5APNmDhUQi2ZxzbYauPxFiV5HX0jXweaULwaJlhLQDfODeedVUdDk6jUDWOESy/VURuuEVqFIfmCE8a9hTAU1vkaMCle5FGr9oljkMm0Prodoy7HHla05zv4Qhvn1pA/rgl/h2DYBnKM9oMaR7LaVWjeGtwjgXkgALi7kJE3noLXN8r8Dx/OlRKDAqRIeAH87OB90ihj2kOFqb91gHONyKNp1GHz4a18HwIhUl4xD0DbjGQ0Swi2EdTDyG9g3gx3nuuj/EGqmMKBtyvDFJwF6TgKFY8/ZhzBaLr7Oz9qEHlRpdGp45KCFwQ2+O5a2yfv5WTkxqc8AOBH0EGkKi6jBktD/uIGHPbtWMN9pNnzYMLqAAUuc8KHlyig7gK+ejEZbx9YgFpsqA4LiEXu7nm0cqxz9tnMjg17R0UjLdPLaTY2sDHugfqkOXAyuj2qeS1Lz2k+2bIBB7rMNdhMbrRjU49a5hBxRl42os68O6AZmr1BagVD/b48Ict/fCAC2Hyxf4svAzMy+e2GsDr9yzPeG3eviXPh9Vba1hWq8D92MDGsqr7oDozuA/+Ow8ShIAQGAyBAXUePRheZjpcGfDLKLzv8hm85lwHe4G3HU8f1raFUkqrW5JKD3oT6zp8yfubfZkNbb4hLf5Qts8y3KxIsP83vPr8EdOoDpkOnqvh73toI/H6s9yYVsHWdBYIrNTxn7iDuqTKA8GkvgfxEV0PGsSVcokQ+JwTGJBg0NzuD9FRf4kpM4wqHnYM4TnjRwLiuHEwHSezvWHKqm8JppU3tsZV4gmV/c0dwaomb2eCI8IGthRfCHM5X8fJXjN+um7oWdjgKMcuwZi8sroBgcD7Sj5gZxDiwYPLJQgBITAIAgMSDJwuhAEbYfo1xCAOG9tYI+Ctz/DgFfapVRWdOWW1jSfub/FO3VPv/cLOurZ5LUHL0wX3XV5KM9hrDzMPg58yY3sGLmMNwhYS0ekGaxS8C1UjeiR2X7aESxACQmAQBAYsGAaR9jEvmTsikX3Ol/MGbWMIvi+HWfZrOxsC46rqG2l/R5j21XuprL6FDuC1YniqGJ5d2PAydTxgj9fm4G1CcL1V6/h4zJQfTsHEhbcuWDbZyCZBCAiBQRD4lwqGnvmFJsDrvb+HgGialGVcPSkrf07P87zP/hM1rV2+2ta2mroOy1da05m4s7Yl91AXtAx/CG6oeGIwxJJBXwvL576jr5ffQkAIDIyArZUPLO7/WSy8iGQGJhMn44aF8JaDtxK7LLMGoNXimzv8AWw8bWFPpuHYRrQEQznlzV59ZEp8XWqckx1tnoOw6XVdHeckCAEh0A+Bf0vB0E9++zwFTYN9TFkDaoFAYG8+CUJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAIfCYIWJZV8pkoiBRCCAiBT4QAywQdKX1bhMMnwlMSEQL/8QSisuDb/wtm7JLg/HaJgAAAAABJRU5ErkJggg=="},image:{reader:"azureImageReader"},serverGroup:{transformer:"azureServerGroupTransformer",detailsTemplateUrl:"azure/src/serverGroup/details/serverGroupDetails.html",detailsController:"azureServerGroupDetailsCtrl",cloneServerGroupTemplateUrl:"azure/src/serverGroup/configure/wizard/serverGroupWizard.html",cloneServerGroupController:"azureCloneServerGroupCtrl",commandBuilder:"azureServerGroupCommandBuilder",configurationService:"azureServerGroupConfigurationService"},instance:{instanceTypeService:"azureInstanceTypeService",detailsTemplateUrl:"azure/src/instance/details/instanceDetails.html",detailsController:"azureInstanceDetailsCtrl"},loadBalancer:{transformer:"azureLoadBalancerTransformer",detailsTemplateUrl:"azure/src/loadBalancer/details/loadBalancerDetail.html",detailsController:"azureLoadBalancerDetailsCtrl",createLoadBalancerTemplateUrl:"azure/src/loadBalancer/configure/createLoadBalancer.html",createLoadBalancerController:"azureCreateLoadBalancerCtrl",CreateLoadBalancerModal:le},securityGroup:{transformer:"azureSecurityGroupTransformer",reader:"azureSecurityGroupReader",detailsTemplateUrl:"azure/src/securityGroup/details/securityGroupDetail.html",detailsController:"azureSecurityGroupDetailsCtrl",createSecurityGroupTemplateUrl:"azure/src/securityGroup/configure/createSecurityGroup.html",createSecurityGroupController:"azureCreateSecurityGroupCtrl"}})})),_.registerProvider("azure",["redblack"]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/details/serverGroupDetails.html",'<div class="details-panel" ng-class="{ disabled: serverGroup.isDisabled }">\n <div class="header" ng-if="state.loading">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n </div>\n\n <div class="header" ng-if="!state.loading">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="header-text horizontal middle">\n <span class="glyphicon glyphicon-th"></span>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>{{serverGroup.name}}</h3>\n </div>\n <div class="actions" ng-class="{ insights: serverGroup.insightActions.length > 0 }">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>\n Server Group Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li><a href ng-if="!serverGroup.isDisabled" ng-click="ctrl.rollbackServerGroup()">Rollback</a></li>\n <div ng-if="false">\n <li><a href ng-click="ctrl.resizeServerGroup()">Resize</a></li>\n </div>\n <li><a href ng-click="ctrl.disableServerGroup()">Disable</a></li>\n <li><a href ng-click="ctrl.enableServerGroup()">Enable</a></li>\n <li><a href ng-click="ctrl.destroyServerGroup()">Destroy</a></li>\n <li><a href ng-click="ctrl.cloneServerGroup(serverGroup)">Clone</a></li>\n </ul>\n </div>\n <div class="dropdown" ng-if="serverGroup.insightActions.length > 0" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>\n Insight <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li ng-repeat="action in serverGroup.insightActions">\n <a target="_blank" href="{{action.url}}">{{action.label}}</a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class="content" ng-if="!state.loading">\n <h4 class="text-center" ng-if="serverGroup.isDisabled">[SERVER GROUP IS DISABLED]</h4>\n\n <server-group-running-tasks-details\n server-group="serverGroup"\n application="ctrl.application"\n ></server-group-running-tasks-details>\n\n <collapsible-section heading="Server Group Information" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Created</dt>\n <dd>{{serverGroup.createdTime | timestamp}}</dd>\n <dt>Region</dt>\n <dd>\n <account-tag account="serverGroup.account" provider="serverGroup.type" pad="right"></account-tag>\n {{serverGroup.region}}\n </dd>\n <dt>Image</dt>\n <dd>{{serverGroup.image.imageName}}</dd>\n <dt>SKU</dt>\n <dd>{{serverGroup.sku.name}}</dd>\n </dl>\n </collapsible-section>\n\n <collapsible-section heading="Size" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Current</dt>\n <dd>{{serverGroup.instances.length}}</dd>\n </dl>\n </collapsible-section>\n\n <collapsible-section heading="Health" expanded="true">\n <dl class="dl-horizontal dl-narrow" ng-if="serverGroup">\n <dt>Instances</dt>\n <dd>\n <health-counts container="serverGroup.instanceCounts" class="pull-left"></health-counts>\n </dd>\n </dl>\n </collapsible-section>\n\n <collapsible-section heading="{{firewallsLabel}}">\n <dl class="dl-horizontal dl-narrow">\n <dt>Name</dt>\n <dd>{{serverGroup.securityGroupName}}</dd>\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/serverGroupWizard.html",'<div>\n <div ng-if="state.requiresTemplateSelection">\n <ng-include src="pages.templateSelection"></ng-include>\n </div>\n <div ng-if="!state.loaded" style="height: 200px" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div>\n <form name="serverGroupWizardForm" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard\n ng-show="state.loaded && !state.requiresTemplateSelection"\n heading="{{title}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="basic-settings" label="Basic Settings" hide-subheading="true">\n <ng-include src="pages.basicSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="image-settings" label="Image">\n <ng-include src="pages.imageSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="load-balancers" label="Load Balancers" mark-complete-on-view="false">\n <ng-include src="pages.loadBalancers"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="network-settings" label="Network Settings" mark-complete-on-view="false">\n <ng-include src="pages.networkSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="health-settings" label="Health" mark-complete-on-view="false">\n <ng-include src="pages.healthSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="security-groups" label="{{firewallsLabel}}" mark-complete-on-view="false" done="true">\n <ng-include src="pages.securityGroups"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="instance-type" label="Instance Type" mark-complete-on-view="false" done="false">\n <ng-include src="pages.instanceType"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="zones" label="Zones" mark-complete-on-view="false" done="false">\n <ng-include src="pages.zones"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="tags" label="Tags" mark-complete-on-view="false" done="true">\n <ng-include src="pages.tags"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="advanced-settings" label="Advanced Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer" ng-if="state.loaded">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">\n Cancel\n </button>\n <submit-button\n is-disabled="taskMonitor.submitting || !ctrl.isValid()"\n label="command.viewState.submitButtonLabel"\n submitting="taskMonitor.submitting"\n on-click="serverGroupWizardForm.$valid && ctrl.submit()"\n is-new="true"\n ></submit-button>\n </div>\n </form>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/instance/details/instanceDetails.html",'<div class="details-panel">\n <div class="header">\n <instance-details-header\n health-state="instance.healthState"\n instance-id="instance ? instance.instanceId : instanceIdNotFound"\n loading="state.loading"\n standalone="state.standalone"\n ></instance-details-header>\n </div>\n <div class="content" ng-if="!state.loading && instance">\n <collapsible-section heading="Instance Information" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Launched</dt>\n <dd ng-if="instance.launchTime">{{instance.launchTime | timestamp}}</dd>\n <dd ng-if="!instance.launchTime">(Unknown)</dd>\n <dt>In</dt>\n <dd>\n <account-tag account="instance.account" provider="instance.provider" pad="right"></account-tag>\n {{instance.region || \'(Unknown)\'}}\n </dd>\n <dt>Type</dt>\n <dd>{{instance.instanceType || \'(Unknown)\'}}</dd>\n <dt ng-if="instance.serverGroup">Server Group</dt>\n <dd ng-if="instance.serverGroup">\n <a\n ui-sref="^.serverGroup({region: instance.region,\n accountId: instance.account,\n serverGroup: instance.serverGroup,\n provider: instance.provider})"\n >{{instance.serverGroup}}</a\n >\n </dd>\n </dl>\n </collapsible-section>\n </div>\n <div class="content" ng-if="!state.loading && !instance">\n <div class="content-section">\n <div class="content-body text-center">\n <h3>Instance not found.</h3>\n </div>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/details/loadBalancerDetail.html",'<div class="details-panel">\n <div ng-if="state.loading" class="header">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n </div>\n\n <div ng-if="!state.loading" class="header">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="header-text horizontal middle">\n <i class="fa icon-sitemap"></i>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>{{loadBalancer.name}}</h3>\n </div>\n <div>\n <div class="actions">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>\n Load Balancer Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li><a href ng-click="ctrl.editLoadBalancer()">Edit Load Balancer</a></li>\n <li ng-if="!loadBalancer.serverGroups.length">\n <a href ng-click="ctrl.deleteLoadBalancer()">Delete Load Balancer</a>\n </li>\n <li\n ng-if="loadBalancer.serverGroups.length"\n class="disabled"\n tooltip="You must detach all server groups before you can delete this load balancer."\n >\n <a href>Delete Load Balancer</a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div ng-if="!state.loading" class="content">\n <collapsible-section heading="Load Balancer Details" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Type</dt>\n <dd>{{loadBalancer.loadBalancerType}}</dd>\n <dt>Created</dt>\n <dd>{{loadBalancer.elb.createdTime | timestamp}}</dd>\n <dt>In</dt>\n <dd>\n <account-tag account="loadBalancer.account" pad="right" provider="loadBalancer.type"></account-tag>\n {{loadBalancer.region}}\n </dd>\n <dt ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">VNet</dt>\n <dd ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">{{loadBalancer.elb.vnet}}</dd>\n <dt ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">Subnet</dt>\n <dd ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">{{loadBalancer.elb.subnet}}</dd>\n </dl>\n <dl class="horizontal-when-filters-collapsed">\n <dt ng-if="loadBalancer.serverGroups">Server Groups</dt>\n <dd ng-if="loadBalancer.serverGroups">\n <ul class="collapse-margin-on-filter-collapse">\n <li ng-repeat="serverGroup in loadBalancer.serverGroups | orderBy: [\'isDisabled\', \'-name\']">\n <a\n ui-sref="^.serverGroup({region: serverGroup.region,\n accountId: serverGroup.account,\n serverGroup: serverGroup.name,\n provider: \'azure\'})"\n >\n {{serverGroup.name}}\n </a>\n </li>\n </ul>\n </dd>\n </dl>\n <dl class="horizontal-when-filters-collapsed">\n <dt ng-if="loadBalancer.elb.dnsName">DNS Name:</dt>\n <dd>\n <a target="_blank" href="//{{loadBalancer.elb.dnsName}}">{{loadBalancer.elb.dnsName}}</a>\n <copy-to-clipboard\n class="copy-to-clipboard copy-to-clipboard-sm"\n text="loadBalancer.elb.dnsName"\n tool-tip="\'Copy DNS Name to clipboard\'"\n >\n </copy-to-clipboard>\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Status" expanded="true">\n <health-counts class="pull-left" container="loadBalancer.instanceCounts"></health-counts>\n </collapsible-section>\n <collapsible-section heading="Listeners">\n <dl>\n <dt>Load Balancer → Instance</dt>\n <dd ng-repeat="loadBalancingRule in loadBalancer.elb.loadBalancingRules">\n {{loadBalancingRule.protocol}}:{{loadBalancingRule.externalPort}} → {{loadBalancingRule.backendPort}}\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="{{firewallsLabel}}">\n <ul>\n <li ng-repeat="securityGroup in securityGroups | orderBy:\'name\'">\n <a\n ui-sref="^.firewallDetails({name:securityGroup.name, accountId: loadBalancer.account, region: loadBalancer.region, vpcId: loadBalancer.vpcId, provider: loadBalancer.provider})"\n >\n {{securityGroup.name}} ({{securityGroup.id}})\n </a>\n </li>\n </ul>\n </collapsible-section>\n <collapsible-section heading="Health Checks">\n <dl class="horizontal-when-filters-collapsed">\n <dt>Target</dt>\n <dd>{{loadBalancer.elb.probes[0].probeProtocol}}</dd>\n <dt>Interval</dt>\n <dd>{{loadBalancer.elb.probes[0].probeInterval}} seconds</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{{loadBalancer.elb.probes[0].unhealthyThreshold}}</dd>\n <dt>Timeout</dt>\n <dd>{{loadBalancer.elb.probes[0].timeout}} seconds</dd>\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/createLoadBalancer.html",'<form name="form" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard heading="Create New {{loadBalancerType}}" task-monitor="taskMonitor" dismiss="$dismiss()">\n <v2-wizard-page key="Location" label="Location">\n <ng-include src="pages.location"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Listeners" label="Listeners" done="true">\n <ng-include src="pages.listeners"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Health Check" label="Health Check" done="true" hide-subheading="true">\n <ng-include src="pages.healthCheck"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Advanced Settings" label="Advanced Settings" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="!state.accountsLoaded || taskMonitor.submitting"\n submitting="taskMonitor.submitting"\n on-click="form.$valid && ctrl.submit()"\n is-new="isNew"\n ></submit-button>\n </div>\n</form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/details/securityGroupDetail.html",'<div class="details-panel">\n <div class="header">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div ng-if="state.loading" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div class="header-text horizontal middle" ng-if="!state.loading">\n <span class="glyphicon glyphicon-transfer"></span>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>\n {{securityGroup.name || \'(not found)\'}}\n </h3>\n </div>\n <div class="actions">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" ng-disabled="disabled" uib-dropdown-toggle>\n <firewall-label label="Firewall"></firewall-label> Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li>\n <a href ng-click="ctrl.deleteSecurityGroup()">Delete <firewall-label label="Firewall"></firewall-label></a>\n </li>\n <li><a href ng-click="ctrl.editInboundRules()">Edit Inbound Rules</a></li>\n <li>\n <a href ng-click="ctrl.cloneSecurityGroup()">Clone <firewall-label label="Firewall"></firewall-label></a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class="content" ng-if="!state.loading">\n <collapsible-section heading="{{firewallLabel}} Details" expanded="true">\n <dl class="dl-horizontal dl-medium">\n <dt>ID</dt>\n <dd>{{securityGroup.id}}</dd>\n <dt>Account</dt>\n <dd><account-tag account="securityGroup.accountName"></account-tag></dd>\n <dt>Region</dt>\n <dd>{{securityGroup.region}}</dd>\n <dt>Description:</dt>\n <dd>{{securityGroup.description}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section\n heading="Security Rules ({{securityGroup.securityRules.length || 0}})"\n expanded="{{!!(securityGroup.securityRules && securityGroup.securityRules.length)}}"\n >\n <div ng-if="!securityGroup.securityRules.length">None</div>\n <dl\n ng-class="insightCtrl.vm.filtersExpanded ? \'\' : \'dl-horizontal dl-medium\'"\n ng-repeat="rule in securityGroup.securityRules | orderBy: \'rule.priority\'"\n >\n <dt>Name</dt>\n <dd>{{rule.name}}</dd>\n <dt>Priority</dt>\n <dd>{{rule.priority}}</dd>\n <dt>Direction</dt>\n <dd>{{rule.direction}}</dd>\n <dt>Access</dt>\n <dd>{{rule.access}}</dd>\n <dt>Protocol</dt>\n <dd>{{rule.protocol}}</dd>\n <dt>Src Addr Prefix</dt>\n <dd>{{rule.sourceAddressPrefixModel}}</dd>\n <dt>Src Port Range</dt>\n <dd>{{rule.sourcePortRange}}</dd>\n <dt>Dest Addr Prefix</dt>\n <dd>{{rule.destinationAddressPrefix}}</dd>\n <dt>Dest Port Range</dt>\n <dd>{{rule.destinationPortRangeModel}}</dd>\n <hr />\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroup.html",'<form name="form" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard heading="Create New {{firewallLabel}}" task-monitor="taskMonitor" dismiss="$dismiss()">\n <v2-wizard-page key="Location" label="Location">\n <ng-include src="pages.location"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Ingress" label="Ingress" done="true">\n <ng-include src="pages.ingress"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="state.submitting"\n submitting="state.submitting"\n on-click="form.$valid && ctrl.upsert()"\n is-new="isNew"\n >\n </submit-button>\n </div>\n</form>\n')}]);export{Ke as AZURE_MODULE};
|
|
1
|
+
import*as e from"angular";import{module as n}from"angular";import{HelpContentsRegistry as t,REST as a,CloudProviderRegistry as r,ConfirmationModalService as l,InstanceWriter as i,RecentHistoryService as s,InstanceReader as o,ModalInjector as c,ReactModal as d,ModalClose as u,noop as p,SETTINGS as g,TaskMonitor as m,AccountService as f,NetworkReader as v,LoadBalancerWriter as h,NameUtils as B,SECURITY_GROUP_READER as A,LOAD_BALANCER_READ_SERVICE as y,FirewallLabels as b,Registry as S,BakeExecutionLabel as D,AuthenticationService as w,PipelineTemplates as C,BakeryReader as z,StageConstants as k,TaskExecutor as G,InfrastructureCaches as I,CACHE_INITIALIZER_SERVICE as F,IMAGE_READER as T,ModalWizard as E,SERVER_GROUP_WRITER as x,UserVerification as N,ReactInjector as P,TaskMonitorWrapper as R,TaskReason as L,ServerGroupWarningMessageService as M,ServerGroupReader as U,ApplicationNameValidator as V,DeploymentStrategyRegistry as H}from"@spinnaker/core";import _ from"lodash";import O from"@uirouter/angularjs";import Q from"angular-ui-bootstrap";import q from"react";import{Modal as X,Button as W}from"react-bootstrap";import j from"react-select";const Y=[{type:"Azure Load Balancer",description:""},{type:"Azure Application Gateway",description:""}],Z=class e{static checkTags(n){if(!n)return{isValid:!1,error:5,errorMessage:"instanceTags is not defined"};const t=Object.keys(n).length;if(!(t>=0&&t<=e.TAG_LIMITATION))return{isValid:!1,error:0,errorMessage:`Number of tags exceeds the limit: ${e.TAG_LIMITATION}`};for(const[t,a]of Object.entries(n)){if(t.length>e.TAG_KEY_LENGTH_LIMITATION)return{isValid:!1,error:1,errorMessage:`Length of Tag key: ${t} exceeds the limit: ${e.TAG_KEY_LENGTH_LIMITATION}`};if(a.length>e.TAG_VALUE_LENGTH_LIMITATION)return{isValid:!1,error:2,errorMessage:`Length of Tag value: ${a} exceeds the limit: ${e.TAG_VALUE_LENGTH_LIMITATION}`};if(e.TAG_INVALID_CHAR_REG_EXR.test(t))return{isValid:!1,error:3,errorMessage:`Invalid characters in Tag key: ${t}`};if(e.TAG_INVALID_CHAR_REG_EXR.test(a))return{isValid:!1,error:4,errorMessage:`Invalid characters in Tag value: ${a}`}}return{isValid:!0,error:null}}static getLoadBalancerType(e){return e=e.toLowerCase().split("_").join(" "),Y.find(n=>n.type.toLowerCase()===e)||null}};Z.TAG_LIMITATION=8,Z.TAG_KEY_LENGTH_LIMITATION=512,Z.TAG_VALUE_LENGTH_LIMITATION=256,Z.TAG_INVALID_CHAR_REG_EXR=/[<>%&\\?/]/;let $=Z;const J={"azure.securityGroup.ingress.description":"Friendly description of the rule you want to enable (limit 80 chars.)","azure.securityGroup.ingress.priority":"Rules are processed in priority order; the lower the number, the higher the priority. We recommend leaving gaps between rules - 100, 200, 300, etc. - so that it's easier to add new rules without having to edit existing rules. There are several default rules that can be overridden with priority (65000, 65001 and 65500). For more information visit http://portal.azure.com.","azure.securityGroup.ingress.source":"The source filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the incoming traffic from a specific source IP address range (CIDR format) that will be allowed or denied by this rule.","azure.securityGroup.ingress.sourcePortRange":"The source port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which ports incoming traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.","azure.securityGroup.ingress.destination":"The destination filter can be Any, an IP address range or a default tag('Internet', 'VirtualNetwork', AzureLoadBalancer'). It specifies the outgoing traffic from a specific destination IP address range (CIDR format) that will be allowed or denied by this rule.","azure.securityGroup.ingress.destinationPortRange":"The destination port range can be a single port, such as 80, or a port range, such as 1024-65535. This specifies from which destination ports traffic will be allowed or denied by this rule. Provide an asterisk (*) to allow traffic from clients connecting from any port.","azure.securityGroup.ingress.direction":"Specifies whether the rule is for inbound or outbound traffic.","azure.securityGroup.ingress.actions":"To adjust the priority of a rule, move it up or down in the list of rules. Rules at the top of the list have the highest priority.","azure.securityGroup.ingress.destPortRanges":"Provide a single port, such as 80; a port range, such as 1024-65535; or a comma-separated list of single ports and/or port ranges, such as 80,1024-65535. Provide an asterisk (*) to allow traffic on any port.","azure.securityGroup.ingress.sourceIPCIDRRanges":"Provide an address range using CIDR notation, such as 192.168.99.0/24; an IP address, such as 192.168.99.0; or a comma-separated list of address ranges or IP addresses, such as 10.0.0.0/24,44.66.0.0/24","azure.serverGroup.imageName":"(Required) <b>Image</b> is the deployable Azure Machine Image.","azure.serverGroup.stack":"(Required) <b>Stack</b> is one of the core naming components of a cluster, used to create vertical stacks of dependent services for integration testing.","azure.serverGroup.detail":"(Required) <b>Detail</b> is a naming component to help distinguish specifics of the server group.","azure.serverGroup.scriptLocation":"The location of custom scripts separated by comma or semicolon to be downloaded on to each instance. A single script should be like: fileUri. Multiple scripts should be like fileUri1,fileUri2 or fileUri1;fileUri2","azure.serverGroup.commandToExecute":"Command(s) to execute custom scripts provided during provisioning of an instance.","azure.serverGroup.customData":"Script or metadata to be injected into each instances.","azure.serverGroup.customTags":`Custom tags on Virtual Machine Scale Set. Allow ${$.TAG_LIMITATION} tags at most.`,"azure.serverGroup.enableInboundNAT":"An Azure load balancer of the basic sku will be created with adding inbound NAT port-forwarding rules to facilitate loggin on VM instances. There is no charge for creating an Azure load balancer of the basic sku. This option is disabled if Availability Zones are set which require Standard Azure Load Balancer and an extra Network Security Group with correct inbound and outbound rules configured.","azure.serverGroup.lun":"Specifies the logical unit number of the data disk. This value is used to identify data disks within the VM and therefore must be unique for each data disk attached to a VM.","azure.serverGroup.diskSizeGB":"Specifies the size of an empty data disk in gigabytes. This value cannot be larger than 1023 GB","azure.serverGroup.managedDisk.storageAccountType":"You can choose between Azure managed disks types to support your workload or scenario.","azure.serverGroup.caching":"Changing the default host caching policy can adversely impact the performance of your application. You should run performance tests to measure its impact. To improve the total IOPS/throughput, we recommend striping across multiple disks and using premium (SSD) disks.","azure.serverGroup.userAssignedIdentities":"Allows your server to access Azure resources. Learn more here: https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview","azure.loadBalancer.dnsName":'If there is no custom DNS label specified, a default DNS name will be created. The default value will be "GeneratedText.cloudapp.net" for Azure Application Gateway or "GeneratedText.[region].cloudapp.azure.com" for Azure Load Balancer.',"azure.loadBalancer.probes.probeInterval":"Probe interval in seconds. This value is the time interval between two consecutive probes.","azure.loadBalancer.probes.timeout":"Probe time-out in seconds. If a valid response is not received within this time-out period, the probe is marked as failed. Note that the time-out value should not be more than the Interval value.","azure.loadBalancer.probes.unhealthyThreshold":"Probe retry count. The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.","azure.loadBalancer.loadBalancingRules.idleTimeout":"Keep a TCP or HTTP connection open without relying on clients to send keep-alive messages.","azure.loadBalancer.loadBalancingRules.sessionPersistence":'Session persistence specifies that traffic from a client should be handled by the same virtual machine in the backend pool for the duration of a session. "None" specifies that successive requests from the same client may be handled by any virtual machine. "Client IP" specifies that successive requests from the same client IP address will be handled by the same virtual machine. "Client IP and protocol" specifies that successive requests from the same client IP address and protocol combination will be handled by the same virtual machine.'};Object.keys(J).forEach(e=>t.register(e,J[e]));const K="spinnaker.azure.image.reader";n(K,[]).factory("azureImageReader",function(){return{findImages:function(e){return a("/images/find").query(e).get().then(function(e){return e},function(){return[]})},getImage:function(e,n,t){return a("/images").path(t,n,e).query({provider:"azure"}).get().then(function(e){return e&&e.length?e[0]:null},function(){return null})}}});const ee="spinnaker.azure.instanceType.service";n(ee,[]).factory("azureInstanceTypeService",["$q",function(e){const n=[{type:"general",label:"General Purpose",description:"Balanced CPU-to-memory ratio. Ideal for testing and development, small to medium databases, and low to medium traffic web servers.",families:[{type:"B-series",description:"The B-series burstable VMs are ideal for workloads that do not need the full performance of the CPU continuously, like web servers, small databases and development and test environments.",instanceTypes:[{name:"Standard_B1ms",label:"Standard_B1ms",cpu:1,memory:2,storage:{type:"SSD",count:2,size:4}},{name:"Standard_B1s",label:"Standard_B1s",cpu:1,memory:1,storage:{type:"SSD",count:2,size:2}},{name:"Standard_B2ms",label:"Standard_B2ms",cpu:2,memory:8,storage:{type:"SSD",count:4,size:16}},{name:"Standard_B2s",label:"Standard_B2s",cpu:2,memory:4,storage:{type:"SSD",count:4,size:8}},{name:"Standard_B4ms",label:"Standard_B4ms",cpu:4,memory:16,storage:{type:"SSD",count:8,size:32}},{name:"Standard_B8ms",label:"Standard_B8ms",cpu:8,memory:32,storage:{type:"SSD",count:16,size:64}},{name:"Standard_B1ls",label:"Standard_B1ls",cpu:1,memory:.5,storage:{type:"SSD",count:2,size:1}}]},{type:"Dsv3-series",description:"The Dsv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.",instanceTypes:[{name:"Standard_D2s_v3",label:"Standard_D2s_v3",cpu:2,memory:8,storage:{type:"SSD",count:4,size:16}},{name:"Standard_D4s_v3",label:"Standard_D4s_v3",cpu:4,memory:16,storage:{type:"SSD",count:8,size:32}},{name:"Standard_D8s_v3",label:"Standard_D8s_v3",cpu:8,memory:32,storage:{type:"SSD",count:16,size:64}},{name:"Standard_D16s_v3",label:"Standard_D16s_v3",cpu:16,memory:64,storage:{type:"SSD",count:32,size:128}},{name:"Standard_D32s_v3",label:"Standard_D32s_v3",cpu:32,memory:128,storage:{type:"SSD",count:32,size:256}},{name:"Standard_D64s_v3",label:"Standard_D64s_v3",cpu:64,memory:256,storage:{type:"SSD",count:32,size:512}}]},{type:"Dv3-series",description:"The Dv3-series sizes offer a combination of vCPU, memory, and temporary storage for most production workloads.",instanceTypes:[{name:"Standard_D2_v3",label:"Standard_D2_v3",cpu:2,memory:8,storage:{type:"SSD",count:4,size:50}},{name:"Standard_D4_v3",label:"Standard_D4_v3",cpu:4,memory:16,storage:{type:"SSD",count:8,size:100}},{name:"Standard_D8_v3",label:"Standard_D8_v3",cpu:8,memory:32,storage:{type:"SSD",count:16,size:200}},{name:"Standard_D16_v3",label:"Standard_D16_v3",cpu:16,memory:64,storage:{type:"SSD",count:32,size:400}},{name:"Standard_D32_v3",label:"Standard_D32_v3",cpu:32,memory:128,storage:{type:"SSD",count:32,size:800}},{name:"Standard_D64_v3",label:"Standard_D64_v3",cpu:64,memory:256,storage:{type:"SSD",count:32,size:1600}}]},{type:"DSv2-series",description:"",instanceTypes:[{name:"Standard_DS1_v2",label:"Standard_DS1_v2",cpu:1,memory:3.5,storage:{type:"SSD",count:4,size:7}},{name:"Standard_DS2_v2",label:"Standard_DS2_v2",cpu:2,memory:7,storage:{type:"SSD",count:8,size:14}},{name:"Standard_DS3_v2",label:"Standard_DS3_v2",cpu:4,memory:14,storage:{type:"SSD",count:16,size:28}},{name:"Standard_DS4_v2",label:"Standard_DS4_v2",cpu:8,memory:28,storage:{type:"SSD",count:32,size:56}},{name:"Standard_DS5_v2",label:"Standard_DS5_v2",cpu:16,memory:56,storage:{type:"SSD",count:64,size:112}},{name:"Standard_DS11_v2",label:"Standard_DS11_v2",cpu:2,memory:14,storage:{type:"SSD",count:8,size:28}},{name:"Standard_DS12_v2",label:"Standard_DS12_v2",cpu:4,memory:28,storage:{type:"SSD",count:16,size:56}},{name:"Standard_DS13_v2",label:"Standard_DS13_v2",cpu:8,memory:56,storage:{type:"SSD",count:32,size:112}},{name:"Standard_DS14_v2",label:"Standard_DS14_v2",cpu:16,memory:112,storage:{type:"SSD",count:64,size:224}},{name:"Standard_DS15_v2",label:"Standard_DS15_v2",cpu:20,memory:140,storage:{type:"SSD",count:64,size:280}}]},{type:"Dv2-series",description:"",instanceTypes:[{name:"Standard_D1_v2",label:"Standard_D1_v2",cpu:1,memory:3.5,storage:{type:"SSD",count:4,size:50}},{name:"Standard_D2_v2",label:"Standard_D2_v2",cpu:2,memory:7,storage:{type:"SSD",count:8,size:100}},{name:"Standard_D3_v2",label:"Standard_D3_v2",cpu:4,memory:14,storage:{type:"SSD",count:16,size:200}},{name:"Standard_D4_v2",label:"Standard_D4_v2",cpu:8,memory:28,storage:{type:"SSD",count:32,size:400}},{name:"Standard_D5_v2",label:"Standard_D5_v2",cpu:16,memory:56,storage:{type:"SSD",count:64,size:800}},{name:"Standard_D11_v2",label:"Standard_D11_v2",cpu:2,memory:14,storage:{type:"SSD",count:8,size:100}},{name:"Standard_D12_v2",label:"Standard_D12_v2",cpu:4,memory:28,storage:{type:"SSD",count:16,size:200}},{name:"Standard_D13_v2",label:"Standard_D13_v2",cpu:8,memory:56,storage:{type:"SSD",count:32,size:400}},{name:"Standard_D14_v2",label:"Standard_D14_v2",cpu:16,memory:112,storage:{type:"SSD",count:64,size:800}},{name:"Standard_D15_v2",label:"Standard_D15_v2",cpu:20,memory:140,storage:{type:"SSD",count:64,size:280}}]},{type:"Av2-series",description:"",instanceTypes:[{name:"Standard_A1_v2",label:"Standard_A1_v2",cpu:1,memory:2,storage:{type:"SSD",count:2,size:10}},{name:"Standard_A2m_v2",label:"Standard_A2m_v2",cpu:2,memory:16,storage:{type:"SSD",count:4,size:20}},{name:"Standard_A2_v2",label:"Standard_A2_v2",cpu:2,memory:4,storage:{type:"SSD",count:4,size:20}},{name:"Standard_A4m_v2",label:"Standard_A4m_v2",cpu:4,memory:32,storage:{type:"SSD",count:8,size:40}},{name:"Standard_A4_v2",label:"Standard_A4_v2",cpu:4,memory:8,storage:{type:"SSD",count:8,size:40}},{name:"Standard_A8m_v2",label:"Standard_A8m_v2",cpu:8,memory:64,storage:{type:"SSD",count:16,size:80}},{name:"Standard_A8_v2",label:"Standard_A8_v2",cpu:8,memory:16,storage:{type:"SSD",count:16,size:80}}]},{type:"DC-series",description:"",instanceTypes:[{name:"Standard_DC2s",label:"Standard_DC2s",cpu:2,memory:8,storage:{type:"SSD",count:2,size:100}},{name:"Standard_DC4s",label:"Standard_DC4s",cpu:4,memory:16,storage:{type:"SSD",count:4,size:200}}]}],icon:"hdd"},{type:"compute",label:"Compute Optimized",description:"High CPU-to-memory ratio. Good for medium traffic web servers, network appliances, batch processes, and application servers.",families:[{type:"Fsv2-series",description:"",instanceTypes:[{name:"Standard_F2s_v2",label:"Standard_F2s_v2",cpu:2,memory:4,storage:{type:"SSD",count:4,size:16}},{name:"Standard_F4s_v2",label:"Standard_F4s_v2",cpu:4,memory:8,storage:{type:"SSD",count:8,size:32}},{name:"Standard_F8s_v2",label:"Standard_F8s_v2",cpu:8,memory:16,storage:{type:"SSD",count:16,size:64}},{name:"Standard_F16s_v2",label:"Standard_F16s_v2",cpu:16,memory:32,storage:{type:"SSD",count:32,size:128}},{name:"Standard_F32s_v2",label:"Standard_F32s_v2",cpu:32,memory:64,storage:{type:"SSD",count:32,size:256}},{name:"Standard_F64s_v2",label:"Standard_F64s_v2",cpu:64,memory:128,storage:{type:"SSD",count:32,size:512}},{name:"Standard_F72s_v2",label:"Standard_F72s_v2",cpu:72,memory:144,storage:{type:"SSD",count:32,size:576}}]},{type:"Fs-series",description:"",instanceTypes:[{name:"Standard_F1s",label:"Standard_F1s",cpu:1,memory:2,storage:{type:"SSD",count:4,size:4}},{name:"Standard_F2s",label:"Standard_F2s",cpu:2,memory:4,storage:{type:"SSD",count:8,size:8}},{name:"Standard_F4s",label:"Standard_F4s",cpu:4,memory:8,storage:{type:"SSD",count:16,size:16}},{name:"Standard_F8s",label:"Standard_F8s",cpu:8,memory:16,storage:{type:"SSD",count:32,size:32}},{name:"Standard_F16s",label:"Standard_F16s",cpu:16,memory:32,storage:{type:"SSD",count:64,size:64}}]},{type:"F-series",description:"",instanceTypes:[{name:"Standard_F1",label:"Standard_F1",cpu:1,memory:2,storage:{type:"SSD",count:4,size:16}},{name:"Standard_F2",label:"Standard_F2",cpu:2,memory:4,storage:{type:"SSD",count:8,size:32}},{name:"Standard_F4",label:"Standard_F4",cpu:4,memory:8,storage:{type:"SSD",count:16,size:64}},{name:"Standard_F8",label:"Standard_F8",cpu:8,memory:16,storage:{type:"SSD",count:32,size:128}},{name:"Standard_F16",label:"Standard_F16",cpu:16,memory:32,storage:{type:"SSD",count:64,size:256}}]}],icon:"hdd"},{type:"custom",label:"Custom Type",description:"Select the instance type below.",families:[],icon:"asterisk"}];function t(e){return e&&e.storage?e.storage.count*e.storage.size:0}function a(){return n.map(function(e){for(const n of e.families)for(const e of n.instanceTypes)null==e.costFactor&&(e.costFactor=0);e.stats=function(e){const n={cpu:{min:Number.MAX_VALUE,max:-Number.MAX_VALUE},memory:{min:Number.MAX_VALUE,max:-Number.MAX_VALUE},storage:{min:Number.MAX_VALUE,max:-Number.MAX_VALUE},families:[]};return e.families&&e.families.length&&e.families.forEach(function(e){n.families.push(e.type);const a=_.minBy(e.instanceTypes,"cpu").cpu||Number.MAX_VALUE,r=_.maxBy(e.instanceTypes,"cpu").cpu||-Number.MAX_VALUE,l=_.minBy(e.instanceTypes,"memory").memory||Number.MAX_VALUE,i=_.maxBy(e.instanceTypes,"memory").memory||-Number.MAX_VALUE,s=t(_.minBy(e.instanceTypes,t))||Number.MAX_VALUE,o=t(_.maxBy(e.instanceTypes,t))||-Number.MAX_VALUE;n.cpu.min=Math.min(n.cpu.min,a),n.cpu.max=Math.max(n.cpu.max,r),n.memory.min=Math.min(n.memory.min,l),n.memory.max=Math.max(n.memory.max,i),n.storage.min=Math.min(n.storage.min,s),n.storage.max=Math.max(n.storage.max,o)}),n}(e)}),e.when(n)}return{getCategories:a,getAvailableTypesForRegions:function(e,n){const[t]=n;return e[t]},getAllTypesByRegion:function(){return a()}}}]);const ne="spinnaker.azure.instance.detail.controller";n(ne,[O,Q]).controller("azureInstanceDetailsCtrl",["$scope","$state","$uibModal","instance","app","$q",function(e,n,t,a,c,d){function u(){const t={};let r,l,i,u,p;return c.serverGroups?(c.serverGroups.data.some(function(e){return e.instances.some(function(n){if(n.id===a.instanceId)return r=n,l=e.loadBalancers,i=e.account,u=e.region,p=e.vpcId,t.serverGroup=e.name,t.vpcId=e.vpcId,!0})}),r||(c.loadBalancers.data.some(function(e){return e.instances.some(function(n){if(n.id===a.instanceId)return r=n,l=[e.name],i=e.account,u=e.region,p=e.vpcId,!0})}),r||c.loadBalancers.data.some(function(e){return e.serverGroups.some(function(n){return!!n.isDisabled&&n.instances.some(function(n){if(n.id===a.instanceId)return r=n,l=[e.name],i=e.account,u=e.region,p=e.vpcId,!0})})}))):(r={},l=[],i=a.account,u=a.region),r&&i&&u?(t.account=i,t.region=u,s.addExtraDataToLatest("instances",t),o.getInstanceDetails(i,u,a.instanceId).then(function(n){e.state.loading=!1,function(n,t){c.isStandalone&&(n.health=t.health),n.health=n.health||[];const a=n.health.filter(function(e){return"Azure"!==e.type||"Unknown"!==e.state});t.health&&a.forEach(function(e){const n=t.health.filter(function(n){return n.type===e.type});n.length&&_.defaults(e,n[0])}),e.healthMetrics=a}(r,n),e.instance=_.defaults(n,r),e.instance.account=i,e.instance.region=u,e.instance.vpcId=p,e.instance.loadBalancers=l;const t=_.find(e.healthMetrics,function(e){return"Discovery"===e.type});if(t&&t.vipAddress){const n=t.vipAddress;e.instance.vipAddress=n.includes(",")?n.split(","):[n]}e.baseIpAddress=n.publicDnsName||n.privateIpAddress},function(){e.state.loading=!1,n.go("^")})):(r||(e.instanceIdNotFound=a.instanceId,e.state.loading=!1),d.when(null))}e.detailsTemplateUrl=r.getValue("azure","instance.detailsTemplateUrl"),e.state={loading:!0,standalone:c.isStandalone},this.canDeregisterFromLoadBalancer=function(){return e.instance.health.some(function(e){return"LoadBalancer"===e.type})},this.canRegisterWithLoadBalancer=function(){const n=e.instance;if(!n.loadBalancers||!n.loadBalancers.length)return!1;const t=n.health.some(function(e){return"LoadBalancer"===e.type&&"OutOfService"===e.state}),a=n.health.some(function(e){return"LoadBalancer"===e.type});return t||!a},this.canRegisterWithDiscovery=function(){const n=e.instance.health.filter(function(e){return"Discovery"===e.type});return!!n.length&&"OutOfService"===n[0].state},this.terminateInstance=function(){const t=e.instance,a={application:c,title:"Terminating "+t.instanceId,onTaskComplete:function(){n.includes("**.instanceDetails",{instanceId:t.instanceId})&&n.go("^")}};l.confirm({header:"Really terminate "+t.instanceId+"?",buttonText:"Terminate "+t.instanceId,account:t.account,taskMonitorConfig:a,submitMethod:function(){return i.terminateInstance(t,c)}})},this.terminateInstanceAndShrinkServerGroup=function(){const t=e.instance,a={application:c,title:"Terminating "+t.instanceId+" and shrinking server group",onTaskComplete:function(){n.includes("**.instanceDetails",{instanceId:t.instanceId})&&n.go("^")}};l.confirm({header:"Really terminate "+t.instanceId+" and shrink "+t.serverGroup+"?",buttonText:"Terminate "+t.instanceId+" and shrink "+t.serverGroup,account:t.account,taskMonitorConfig:a,submitMethod:function(){return i.terminateInstanceAndShrinkServerGroup(t,c)}})},this.rebootInstance=function(){const n=e.instance,t={application:c,title:"Rebooting "+n.instanceId};l.confirm({header:"Really reboot "+n.instanceId+"?",buttonText:"Reboot "+n.instanceId,account:n.account,taskMonitorConfig:t,submitMethod:function(){return i.rebootInstance(n,c)}})},this.registerInstanceWithLoadBalancer=function(){const n=e.instance,t=n.loadBalancers.join(" and "),a={application:c,title:"Registering "+n.instanceId+" with "+t};l.confirm({header:"Really register "+n.instanceId+" with "+t+"?",buttonText:"Register "+n.instanceId,account:n.account,taskMonitorConfig:a,submitMethod:function(){return i.registerInstanceWithLoadBalancer(n,c)}})},this.deregisterInstanceFromLoadBalancer=function(){const n=e.instance,t=n.loadBalancers.join(" and "),a={application:c,title:"Deregistering "+n.instanceId+" from "+t};l.confirm({header:"Really deregister "+n.instanceId+" from "+t+"?",buttonText:"Deregister "+n.instanceId,account:n.account,taskMonitorConfig:a,submitMethod:function(){return i.deregisterInstanceFromLoadBalancer(n,c)}})},this.enableInstanceInDiscovery=function(){const n=e.instance,t={application:c,title:"Enabling "+n.instanceId+" in discovery"};l.confirm({header:"Really enable "+n.instanceId+" in discovery?",buttonText:"Enable "+n.instanceId,account:n.account,taskMonitorConfig:t,submitMethod:function(){return i.enableInstanceInDiscovery(n,c)}})},this.disableInstanceInDiscovery=function(){const n=e.instance,t={application:c,title:"Disabling "+n.instanceId+" in discovery"};l.confirm({header:"Really disable "+n.instanceId+" in discovery?",buttonText:"Disable "+n.instanceId,account:n.account,taskMonitorConfig:t,submitMethod:function(){return i.disableInstanceInDiscovery(n,c)}})},this.hasHealthState=function(n,t){return e.instance.health.some(function(e){return e.type===n&&e.state===t})};(c.isStandalone?u():d.all([c.serverGroups.ready(),c.loadBalancers.ready()]).then(u)).then(()=>{e.$$destroyed||c.isStandalone||c.serverGroups.onRefresh(e,u)}),e.account=a.account}]);const te=class e extends q.Component{constructor(e){super(e),this.choose=()=>{this.close();const e=r.getValue("azure","loadBalancer");c.modalService.open({templateUrl:e.createLoadBalancerTemplateUrl,windowClass:"modal-z-index",controller:`${e.createLoadBalancerController} as ctrl`,size:"lg",resolve:{application:()=>this.props.app,loadBalancer:()=>null,isNew:()=>!0,forPipelineConfig:()=>!1,loadBalancerType:()=>this.state.selectedChoice}}).result.catch(()=>{})},this.close=e=>{this.props.dismissModal(e)},this.state={choices:Y,selectedChoice:Y[0]}}static show(n){return d.show(e,{...n,className:"create-pipeline-modal-overflow-visible"})}choiceSelected(e){this.setState({selectedChoice:e})}render(){const{choices:e,selectedChoice:n}=this.state;return q.createElement(q.Fragment,null,q.createElement(u,{dismiss:this.close}),q.createElement(X.Header,null,q.createElement(X.Title,null,"Select Type of Load Balancer")),q.createElement(X.Body,null,q.createElement("div",{className:"modal-body"},q.createElement("div",{className:"card-choices"},e.map(e=>q.createElement("div",{key:e.type,className:"card "+(n===e?"active":""),onClick:()=>this.choiceSelected(e)},q.createElement("h3",{className:"load-balancer-label"},e.type),q.createElement("div",null,e.description)))),q.createElement("div",{className:"load-balancer-description"}))),q.createElement(X.Footer,null,q.createElement(W,{onClick:this.choose},"Configure Load Balancer ",q.createElement("span",{className:"glyphicon glyphicon-chevron-right"}))))}};te.defaultProps={closeModal:p,dismissModal:p};let ae=te;const re=g.providers.azure||{defaults:{}};re&&(re.resetToOriginal=g.resetProvider("azure"));const le="spinnaker.azure.loadBalancer.transformer";n(le,[]).factory("azureLoadBalancerTransformer",["$q",function(e){return{normalizeLoadBalancer:function(n){n.serverGroups.forEach(function(e){e.account=n.account,e.region=n.region,e.detachedInstances?(e.detachedInstances=e.detachedInstances.map(function(e){return{id:e}}),e.instances=e.instances.concat(e.detachedInstances)):e.detachedInstances=[]});const t=_.filter(n.serverGroups,{isDisabled:!1});return n.provider=n.type,n.instances=_.chain(t).map("instances").flatten().value(),n.detachedInstances=_.chain(t).map("detachedInstances").flatten().value(),e.resolve(n)},convertLoadBalancerForEditing:function(e){const n={region:e.region,credentials:e.account,name:e.name,stack:e.stack,detail:e.detail,vnet:e.vnet,subnet:e.subnet,probes:[],loadBalancingRules:[]};if(e.elb){const t=e.elb;n.securityGroups=t.securityGroups,n.vnet=t.vnet,t.loadBalancingRules&&(n.loadBalancingRules=t.loadBalancingRules),n.probes=t.probes,t.dnsName&&"dns-not-found"!==t.dnsName&&(n.dnsName=t.dnsName.split(".")[0])}return n},constructNewLoadBalancerTemplate:function(e){return{stack:"",detail:"frontend",credentials:e.defaultCredentials.azure||re.defaults.account,region:e.defaultRegions.azure||re.defaults.region,cloudProvider:"azure",vnet:null,subnet:null,probes:[{probeName:"",probeProtocol:"HTTP",probePort:"80",probePath:"/",probeInterval:30,unhealthyThreshold:8,timeout:120}],securityGroups:[],loadBalancingRules:[{ruleName:"",protocol:"HTTP",externalPort:80,backendPort:80,probeName:"",persistence:"None",idleTimeout:4}],sku:"Standard_v2"}}}}]);const ie="spinnaker.azure.loadBalancer.create.controller";n(ie,[O,le]).controller("azureCreateLoadBalancerCtrl",["$scope","$uibModalInstance","$state","azureLoadBalancerTransformer","application","loadBalancer","isNew","loadBalancerType",function(e,n,t,a,r,l,i,s){const o=this;function c(){if(e.$$destroyed)return;n.close();const a={name:e.loadBalancer.name,accountId:e.loadBalancer.credentials,region:e.loadBalancer.region,provider:"azure"};t.includes("**.loadBalancerDetails")?t.go("^.loadBalancerDetails",a):t.go(".loadBalancerDetails",a)}function d(){const n=e.loadBalancer.credentials,t=e.loadBalancer.region,a={};r.getDataSource("loadBalancers").refresh(!0).then(()=>{r.getDataSource("loadBalancers").data.forEach(e=>{e.account===n&&(a[e.region]=a[e.region]||[],a[e.region].push(e.name))}),e.existingLoadBalancerNames=a[t]||[]})}e.regions=[],e.pages={location:"azure/src/loadBalancer/configure/createLoadBalancerProperties.html",listeners:"azure/src/loadBalancer/configure/listeners.html",healthCheck:"azure/src/loadBalancer/configure/healthCheck.html",advancedSettings:"azure/src/loadBalancer/configure/advancedSettings.html"},e.isNew=i,e.loadBalancerType=s.type,e.isALB="Azure Load Balancer"===s.type,e.state={accountsLoaded:!1,submitting:!1},e.validSkus=["Standard_v2","Standard_Small"],e.taskMonitor=new m({application:r,title:(i?"Creating ":"Updating ")+"your load balancer",modalInstance:n,onTaskComplete:function(){r.loadBalancers.refresh(),r.loadBalancers.onNextRefresh(e,c)}}),function(){if(l){if(e.loadBalancer=a.convertLoadBalancerForEditing(l),i){const n=B.parseLoadBalancerName(e.loadBalancer.name);e.loadBalancer.stack=n.stack,e.loadBalancer.detail=n.freeFormDetails,delete e.loadBalancer.name}}else e.loadBalancer=a.constructNewLoadBalancerTemplate(r);i&&(d(),f.listAccounts("azure").then(function(n){e.accounts=n,e.state.accountsLoaded=!0,o.accountUpdated()}))}(),this.requiresHealthCheckPath=function(){return e.loadBalancer.probes[0].probeProtocol&&0===e.loadBalancer.probes[0].probeProtocol.indexOf("HTTP")},this.updateName=function(){e.loadBalancer.name=this.getName()},this.getName=function(){const n=e.loadBalancer,t=[r.name,n.stack||"",n.detail||""].join("-");return _.trimEnd(t,"-")},this.accountUpdated=function(){f.getRegionsForAccount(e.loadBalancer.credentials).then(function(n){e.regions=n,o.regionUpdated()})},this.regionUpdated=function(){d(),o.updateName(),o.vnetUpdated()},this.vnetUpdated=function(){const n=e.loadBalancer.credentials,t=e.loadBalancer.region;e.loadBalancer.selectedVnet=null,e.loadBalancer.vnet=null,e.loadBalancer.vnetResourceGroup=null,o.selectedVnets=[],v.listNetworks().then(function(e){e.azure&&e.azure.forEach(e=>{e.account===n&&e.region===t&&o.selectedVnets.push(e)})}),o.subnetUpdated()},this.subnetUpdated=function(){e.loadBalancer.selectedSubnet=null,e.loadBalancer.subnet=null,o.selectedSubnets=[]},this.selectedVnetChanged=function(n){e.loadBalancer.vnet=n.name,e.loadBalancer.vnetResourceGroup=n.resourceGroup,e.loadBalancer.selectedSubnet=null,e.loadBalancer.subnet=null,o.selectedSubnets=[],n.subnets&&n.subnets.map(function(e){let n=!0;e.devices&&e.devices.map(function(e){e&&"applicationGateways"!==e.type&&(n=!1)}),n&&o.selectedSubnets.push(e)})},this.removeListener=function(n){e.loadBalancer.loadBalancingRules.splice(n,1)},this.addListener=function(){e.loadBalancer.loadBalancingRules.push({protocol:"HTTP"})},this.submit=function(){const n=i?"Create":"Update";e.taskMonitor.submit(function(){const t={cloudProvider:"azure",appName:r.name,clusterName:e.loadBalancer.clusterName,resourceGroupName:e.loadBalancer.clusterName,loadBalancerName:e.loadBalancer.name};e.loadBalancer.selectedVnet&&(e.loadBalancer.vnet=e.loadBalancer.selectedVnet.name,e.loadBalancer.vnetResourceGroup=e.loadBalancer.selectedVnet.resourceGroup),e.loadBalancer.selectedSubnet&&(e.loadBalancer.subnet=e.loadBalancer.selectedSubnet.name);const a=e.loadBalancer.clusterName||e.loadBalancer.name,l=a+"-probe",i=a+"-rule";return e.loadBalancer.type="upsertLoadBalancer",e.loadBalancer.loadBalancerType=e.loadBalancerType,e.loadBalancer.vnet||e.loadBalancer.subnetType||(e.loadBalancer.securityGroups=null),e.loadBalancer.probes[0].probeName=l,e.loadBalancer.loadBalancingRules.forEach((e,n)=>{e.ruleName=i+n,e.probeName=l}),"TCP"===e.loadBalancer.probes[0].probeProtocol&&(e.loadBalancer.probes[0].probePath=void 0),h.upsertLoadBalancer(e.loadBalancer,r,n,t)})},this.cancel=function(){n.dismiss()}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/createLoadBalancerProperties.html",'<div>\n <div ng-if="!state.accountsLoaded" style="height: 200px" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div class="modal-body" ng-if="state.accountsLoaded">\n <div class="form-group">\n <div\n class="col-md-12 well"\n ng-class="{\'alert-danger\': form.loadBalancerName.$error.validateUnique, \'alert-info\': !form.loadBalancerName.$error.validateUnique}"\n >\n <strong>Your {{loadBalancerType}} will be named:</strong>\n <span>{{ctrl.getName()}}</span>\n \x3c!-- Angular does not seem to run length validation on hidden inputs, hence the text + display:none --\x3e\n <input\n type="text"\n style="display: none"\n ng-maxlength="32"\n class="form-control input-sm"\n ng-model="loadBalancer.name"\n validate-unique="existingLoadBalancerNames"\n validate-ignore-case="true"\n name="loadBalancerName"\n />\n <validation-error\n ng-if="form.loadBalancerName.$error.validateUnique"\n message="There is already a load balancer in {{loadBalancer.credentials}}:{{loadBalancer.region}} with that name."\n ></validation-error>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Account</div>\n <div class="col-md-7">\n <account-select-field\n required\n component="loadBalancer"\n field="credentials"\n accounts="accounts"\n provider="\'azure\'"\n on-change="ctrl.accountUpdated()"\n ></account-select-field>\n </div>\n </div>\n <region-select-field\n required\n label-columns="3"\n component="loadBalancer"\n field="region"\n account="loadBalancer.credentials"\n provider="\'azure\'"\n on-change="ctrl.regionUpdated()"\n regions="regions"\n ></region-select-field>\n\n <div class="form-group" ng-if="!isALB">\n <div class="col-md-3 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n required\n ng-model="loadBalancer.selectedVnet"\n on-select="ctrl.selectedVnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks"\n >{{$select.selected.name}}</ui-select-match\n >\n <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">\n <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-if="!isALB">\n <div class="col-md-3 sm-label-right">Subnet</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n required\n ng-model="loadBalancer.selectedSubnet"\n on-select="ctrl.selectedSubnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">\n <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Stack <help-field key="azure.loadBalancer.stack"></help-field></div>\n <div class="col-md-3">\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-model="loadBalancer.stack"\n name="stackName"\n ng-change="ctrl.updateName()"\n ng-pattern="/^[a-zA-Z0-9]*$/"\n />\n </div>\n <div class="col-md-6 form-inline">\n <label class="sm-label-right"> Detail <help-field key="azure.loadBalancer.detail"></help-field> </label>\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-model="loadBalancer.detail"\n name="detailName"\n ng-change="ctrl.updateName()"\n ng-pattern="/^[a-zA-Z0-9-]*$/"\n />\n </div>\n <div class="col-md-7 col-md-offset-3" ng-if="form.stackName.$error.pattern">\n <validation-error message="Stack can only contain letters and numbers."></validation-error>\n </div>\n <div class="col-md-7 col-md-offset-3" ng-if="form.detailName.$error.pattern">\n <validation-error message="Detail can only contain letters, numbers, and dashes."></validation-error>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-9 col-md-offset-3" ng-if="form.loadBalancerName.$error.maxlength">\n <validation-error message="Load Balancer name can only be 32 characters."></validation-error>\n </div>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/listeners.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th>Protocol</th>\n <th>External Port</th>\n <th></th>\n <th>Internal Port</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in loadBalancer.loadBalancingRules">\n <td>\n <select\n class="form-control input-sm"\n ng-model="rule.protocol"\n ng-init="rule.protocol = (isALB ? \'TCP\' : \'HTTP\')"\n ng-options="protocol for protocol in (isALB ? [\'TCP\', \'UDP\'] : [\'HTTP\'])"\n ></select>\n </td>\n <td>\n <input class="form-control input-sm" type="number" min="0" ng-model="rule.externalPort" required />\n </td>\n <td class="small" style="padding-top: 10px">→</td>\n <td>\n <input class="form-control input-sm" type="number" min="0" ng-model="rule.backendPort" required />\n </td>\n <td>\n <a href class="sm-label" ng-click="ctrl.removeListener($index)"\n ><span class="glyphicon glyphicon-trash"></span\n ></a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="5">\n <button class="add-new col-md-12" ng-click="ctrl.addListener()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new port mapping\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/healthCheck.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed" ng-if="!isALB">\n <thead>\n <tr>\n <th width="35%">Protocol</th>\n <th width="30%">Host</th>\n <th><span ng-if="ctrl.requiresHealthCheckPath()">Path</span></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.probes[0].probeProtocol"\n required\n ng-options="protocol for protocol in [\'HTTP\']"\n ></select>\n </td>\n <td>\n <input class="form-control input-sm" type="text" ng-model="loadBalancer.probes[0].probePort" />\n </td>\n <td>\n <input\n ng-if="ctrl.requiresHealthCheckPath()"\n class="form-control input-sm"\n type="text"\n ng-model="loadBalancer.probes[0].probePath"\n required\n />\n </td>\n </tr>\n </tbody>\n </table>\n\n <table class="table table-condensed packed" ng-if="isALB">\n <thead>\n <tr>\n <th width="35%">Protocol</th>\n <th width="30%">Port</th>\n <th><span ng-if="ctrl.requiresHealthCheckPath()">Path</span></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.probes[0].probeProtocol"\n ng-init="loadBalancer.probes[0].probeProtocol = \'TCP\'"\n required\n ng-options="protocol for protocol in [\'TCP\', \'HTTP\']"\n ></select>\n </td>\n <td>\n <input class="form-control input-sm" type="text" ng-model="loadBalancer.probes[0].probePort" />\n </td>\n <td>\n <input\n ng-if="ctrl.requiresHealthCheckPath()"\n class="form-control input-sm"\n type="text"\n ng-model="loadBalancer.probes[0].probePath"\n required\n />\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/advancedSettings.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="col-md-12">\n <div class="form-group">\n <div class="col-md-3">\n <b>Custom DNS Label</b>\n <help-field key="azure.loadBalancer.dnsName"></help-field>\n </div>\n <div class="col-md-6">\n <input class="form-control input-sm" type="text" ng-model="loadBalancer.dnsName" />\n <span>.{{loadBalancer.region}}.cloudapp.azure.com</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3">\n <b>Health Check</b>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Interval</b>\n <help-field key="azure.loadBalancer.probes.probeInterval"></help-field>\n </div>\n <div class="col-md-4">\n <input class="form-control input-sm" type="number" min="0" ng-model="loadBalancer.probes[0].probeInterval" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Unhealthy Threshold</b>\n <help-field key="azure.loadBalancer.probes.unhealthyThreshold"></help-field>\n </div>\n <div class="col-md-4">\n <input\n class="form-control input-sm"\n type="number"\n min="0"\n ng-model="loadBalancer.probes[0].unhealthyThreshold"\n />\n </div>\n </div>\n <div class="form-group" ng-if="isALB">\n <div class="col-md-4 sm-label-right">\n <b>Idle Timeout</b>\n <help-field key="azure.loadBalancer.loadBalancingRules.idleTimeout"></help-field>\n </div>\n <div class="col-md-4">\n <input\n class="form-control input-sm"\n type="number"\n min="0"\n ng-model="loadBalancer.loadBalancingRules[0].idleTimeout"\n />\n </div>\n </div>\n <div class="form-group" ng-if="!isALB">\n <div class="col-md-4 sm-label-right">\n <b>Timeout</b>\n <help-field key="azure.loadBalancer.probes.timeout"></help-field>\n </div>\n <div class="col-md-4">\n <input class="form-control input-sm" type="number" min="0" ng-model="loadBalancer.probes[0].timeout" />\n </div>\n </div>\n <div class="form-group" ng-if="isNew && !isALB">\n <div class="col-md-4 sm-label-right">\n <b>SKU</b>\n <help-field key="azure.loadBalancer.sku"></help-field>\n </div>\n <div class="col-md-4">\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.sku"\n ng-options="sku for sku in validSkus"\n ></select>\n </div>\n </div>\n <div class="form-group" ng-if="isALB">\n <div class="col-md-4 sm-label-right">\n <b>Session persistence</b>\n <help-field key="azure.loadBalancer.loadBalancingRules.sessionPersistence"></help-field>\n </div>\n <div class="col-md-4">\n <select\n class="form-control input-sm"\n ng-model="loadBalancer.sessionPersistence"\n ng-init="loadBalancer.sessionPersistence = \'None\'"\n required\n ng-options="p for p in [\'None\', \'Client IP\', \'Client IP and protocol\']"\n ></select>\n </div>\n </div>\n </div>\n </div>\n</div>\n')}]);const se="spinnaker.azure.loadBalancer.details.controller";e.module(se,[Q,O,A,y]).controller("azureLoadBalancerDetailsCtrl",["$scope","$state","$exceptionHandler","$uibModal","loadBalancer","app","securityGroupReader","loadBalancerReader","$q",function(n,t,a,r,i,s,o,c,d){function u(){if(n.loadBalancer=s.loadBalancers.data.filter(function(e){return e.name===i.name&&e.region===i.region&&e.account===i.accountId})[0],n.loadBalancer){return c.getLoadBalancerDetails(n.loadBalancer.provider,i.accountId,i.region,i.name).then(function(e){n.state.loading=!1;const t=[],a=e.filter(function(e){return e.name===i.name});if(a.length&&(n.loadBalancer.elb=a[0],n.loadBalancer.account=i.accountId,n.loadBalancer.elb.securityGroups&&(n.loadBalancer.elb.securityGroups.forEach(function(e){const n=o.getApplicationSecurityGroup(s,i.accountId,i.region,e);n&&t.push(n)}),n.securityGroups=_.sortBy(t,"name")),n.loadBalancer.loadBalancerType&&n.loadBalancer.loadBalancerType.includes("_"))){const e=n.loadBalancer.loadBalancerType;n.loadBalancer.loadBalancerType=e.split("_").map(e=>{const n=e.toLowerCase();return n.substring(0,1).toUpperCase()+n.substring(1)}).join(" ")}})}return n.loadBalancer||t.go("^"),d.when(null)}n.state={loading:!0},n.firewallsLabel=b.get("Firewalls"),s.ready().then(u).then(()=>{n.$$destroyed||s.onRefresh(n,u)}),this.editLoadBalancer=function(){r.open({templateUrl:"azure/src/loadBalancer/configure/editLoadBalancer.html",controller:"azureCreateLoadBalancerCtrl as ctrl",size:"lg",resolve:{application:function(){return s},loadBalancer:function(){return e.copy(n.loadBalancer)},isNew:function(){return!1},loadBalancerType:function(){return{type:n.loadBalancer.loadBalancerType}}}})},this.deleteLoadBalancer=function(){if(n.loadBalancer.instances&&n.loadBalancer.instances.length)return;const e={application:s,title:"Deleting "+i.name},t={cloudProvider:"azure",loadBalancerName:n.loadBalancer.name,loadBalancerType:n.loadBalancer.loadBalancerType,credentials:n.loadBalancer.account,region:i.region,appName:s.name};l.confirm({header:"Really delete "+i.name+"?",buttonText:"Delete "+i.name,account:i.accountId,taskMonitorConfig:e,submitMethod:()=>h.deleteLoadBalancer(t,s)})}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/editLoadBalancer.html",'<form name="form" novalidate validate-on-submit>\n <v2-modal-wizard\n heading="Edit {{loadBalancerType}} {{loadBalancer.name}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="Listeners" label="Listeners" done="true">\n <ng-include src="pages.listeners"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Health Check" label="Health Check" done="true" hide-subheading="true">\n <ng-include src="pages.healthCheck"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Advanced Settings" label="Advanced Settings" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="taskMonitor.submitting"\n submitting="taskMonitor.submitting"\n on-click="form.$valid && ctrl.submit()"\n is-new="isNew"\n ></submit-button>\n </div>\n</form>\n')}]);const oe="spinnaker.azure.pipeline.stage.bake.executionDetails.controller";n(oe,[O]).controller("azureBakeExecutionDetailsCtrl",["$scope","$stateParams","executionDetailsSectionService","$interpolate",function(e,n,t,a){e.configSections=["bakeConfig","taskStatus"];const r=()=>{e.detailsSection=n.details,e.provider=e.stage.context.cloudProviderType||"azure",e.roscoMode=g.feature.roscoMode||"function"==typeof g.feature.roscoSelector&&g.feature.roscoSelector(e.stage.context),e.bakeryDetailUrl=a(e.roscoMode&&g.roscoDetailUrl?g.roscoDetailUrl:g.bakeryDetailUrl)},l=()=>t.synchronizeSection(e.configSections,r);l(),e.$on("$stateChangeSuccess",l)}]);const ce="spinnaker.azure.serverGroup.transformer";n(ce,[]).factory("azureServerGroupTransformer",function(){function e(e,n){if(Array.isArray(e.customScriptsSettings.fileUris))n.customScriptsSettings.fileUris=e.customScriptsSettings.fileUris;else{const t=e.customScriptsSettings.fileUris;t.includes(",")?n.customScriptsSettings.fileUris=t.split(","):t.includes(";")?n.customScriptsSettings.fileUris=t.split(";"):n.customScriptsSettings.fileUris=[t],n.customScriptsSettings.fileUris.forEach(function(e,t){n.customScriptsSettings.fileUris[t]=e.trim()})}}return{convertServerGroupCommandToDeployConfiguration:function(n){let t;t="editPipeline"===n.viewState.mode||"createPipeline"===n.viewState.mode?{imageName:"",isCustom:"true",publisher:"",offer:"",sku:"",version:"",region:n.region,uri:"",ostype:""}:n.selectedImage;const a={name:n.application,cloudProvider:n.selectedProvider,application:n.application,stack:n.stack,strategy:n.strategy,rollback:{onFailure:n.rollback?n.rollback.onFailure:null},scaleDown:n.scaleDown,maxRemainingAsgs:n.maxRemainingAsgs,delayBeforeDisableSec:n.delayBeforeDisableSec,delayBeforeScaleDownSec:n.delayBeforeScaleDownSec,allowDeleteActive:"redblack"===n.strategy||null,allowScaleDownActive:"redblack"===n.strategy||null,detail:n.freeFormDetails,freeFormDetails:n.freeFormDetails,healthSettings:n.healthSettings,image:n.image,account:n.credentials,selectedProvider:"azure",vnet:n.vnet,vnetResourceGroup:n.selectedVnet.resourceGroup,subnet:n.subnet,useSourceCapacity:!1,capacity:{min:n.sku.capacity,max:n.sku.capacity},credentials:n.credentials,region:n.region,securityGroupName:n.securityGroupName,loadBalancerName:n.loadBalancerName,loadBalancerType:n.loadBalancerType,user:"[anonymous]",upgradePolicy:"Manual",type:"createServerGroup",sku:{name:"Standard_DS1_v2",tier:"Standard",capacity:n.sku.capacity},instanceTags:n.instanceTags,dataDisks:n.dataDisks,userAssignedIdentities:n.userAssignedIdentities,viewState:n.viewState,osConfig:{customData:n.osConfig?n.osConfig.customData:null},customScriptsSettings:{fileUris:null,commandToExecute:""},zonesEnabled:n.zonesEnabled,zones:n.zonesEnabled?n.zones:[],enableInboundNAT:n.enableInboundNAT};if(null!=n.image&&0!=n.image.isCustom||(a.image=t),void 0!==n.stack&&(a.name=a.name+"-"+n.stack),void 0!==n.freeFormDetails&&(a.name=a.name+"-"+n.freeFormDetails),void 0!==n.customScriptsSettings&&(a.customScriptsSettings.commandToExecute=n.customScriptsSettings.commandToExecute,_.isEmpty(n.customScriptsSettings.fileUris)||e(n,a)),n.instanceType){const e=n.instanceType;a.instanceType=n.instanceType,a.sku.name=e,a.sku.tier=e.substring(0,e.indexOf("_"))}return a.interestingHealthProviderNames=[],a},normalizeServerGroup:function(e){return e},parseCustomScriptsSettings:e}});const de="spinnaker.azure.serverGroupCommandBuilder.service";e.module(de,[K,ce]).factory("azureServerGroupCommandBuilder",["$q","azureImageReader","azureServerGroupTransformer",function(n,t,a){function r(e,n){const a=(n=n||{}).account||e.defaultCredentials.azure,r=n.region||e.defaultRegions.azure;return t.findImages({provider:"azure"}).then(function(t){return{application:e.name,credentials:a,region:r,images:t,loadBalancers:[],selectedVnetSubnets:[],strategy:"",sku:{capacity:1},zonesEnabled:!1,zones:[],instanceTags:{},dataDisks:[],selectedProvider:"azure",viewState:{instanceProfile:"custom",allImageSelection:null,useAllImageSelection:!1,useSimpleCapacity:!0,usePreferredZones:!0,mode:n.mode||"create",disableStrategySelection:!0,loadBalancersConfigured:!1,networkSettingsConfigured:!1,securityGroupsConfigured:!1},enableInboundNAT:!1}})}return{buildNewServerGroupCommand:r,buildNewServerGroupCommandForPipeline:function(){return n.when({viewState:{requiresTemplateSelection:!0}})},buildServerGroupCommandFromExisting:function(e,t,r){r=r||"clone";const l=B.parseServerGroupName(t.name),i={application:e.name,strategy:"",stack:l.stack,freeFormDetails:l.freeFormDetails,credentials:t.account,loadBalancers:t.loadBalancers,selectedSubnets:t.selectedVnetSubnets,selectedVnet:t.selectedVnet,securityGroups:t.securityGroups,loadBalancerName:t.loadBalancerName,loadBalancerType:t.loadBalancerType,securityGroupName:t.securityGroupName,region:t.region,vnet:t.vnet,vnetResourceGroup:t.vnetResourceGroup,subnet:t.subnet,zones:t.zones,zonesEnabled:t.zones&&t.zones.length>0,instanceTags:{},dataDisks:t.dataDisks,sku:t.sku,capacity:{min:t.capacity.min,max:t.capacity.max,desired:t.capacity.desired},tags:[],instanceType:t.sku.name,selectedProvider:"azure",source:{account:t.account,region:t.region,serverGroupName:t.name,asgName:t.name},viewState:{allImageSelection:null,useAllImageSelection:!1,useSimpleCapacity:!0,usePreferredZones:!1,listImplicitSecurityGroups:!1,mode:r,disableStrategySelection:!0},enableInboundNAT:t.enableInboundNAT};return void 0!==t.customScriptsSettings&&(i.customScriptsSettings={},i.customScriptsSettings.commandToExecute=t.customScriptsSettings.commandToExecute,_.isEmpty(t.customScriptsSettings.fileUris)||a.parseCustomScriptsSettings(t,i)),n.when(i)},buildServerGroupCommandFromPipeline:function(n,t){const a=_.cloneDeep(t),l=a.region;return r(n,{account:a.account,region:l}).then(function(n){const r={disableImageSelection:!0,useSimpleCapacity:!0,mode:"editPipeline",submitButtonLabel:"Done",instanceProfile:t.viewState.instanceProfile,instanceTypeDetails:t.viewState.instanceTypeDetails},i={region:l,credentials:a.account,viewState:r};t.viewState.instanceTypeDetails&&(i.instanceType=t.viewState.instanceTypeDetails.name),a.strategy=a.strategy||"";return e.extend({},n,a,i)})}}}]);const ue="spinnaker.azure.pipeline.stage.bakeStage";n(ue,[de,K,oe]).config(function(){S.pipeline.registerStage({provides:"bake",cloudProvider:"azure",label:"Bake",description:"Bakes an image",templateUrl:"azure/src/pipeline/stages/bake/bakeStage.html",executionDetailsUrl:"azure/src/pipeline/stages/bake/bakeExecutionDetails.html",executionLabelComponent:D,extraLabelLines:e=>e.masterStage.context.allPreviouslyBaked||e.masterStage.context.somePreviouslyBaked?1:0,supportsCustomTimeout:!0,validators:[{type:"requiredField",fieldName:"package"},{type:"requiredField",fieldName:"regions"},{type:"upstreamVersionProvided",checkParentTriggers:!0,getMessage:e=>"Bake stages should always have a stage or trigger preceding them that provides version information: <ul>"+e.map(e=>`<li>${e}</li>`).join("")+"</ul>Otherwise, Spinnaker will bake and deploy the most-recently built package."}],restartable:!0})}).controller("azureBakeStageCtrl",["$scope","$q","azureImageReader","$uibModal",function(e,n,t,a){function r(){t.findImages({provider:"azure",managedImages:!0,account:e.stage.account}).then(function(n){let t=[];for(let e in n){let a=n[e],r={id:a.imageName,osType:a.ostype,name:a.imageName};t.push(r)}e.managedImageOptions=t}).catch(()=>{})}e.stage.extendedAttributes=e.stage.extendedAttributes||{},e.stage.regions=e.stage.regions||[],e.stage.user||(e.stage.user=w.getAuthenticatedUser().name),e.viewState={loading:!0},this.addExtendedAttribute=function(){e.stage.extendedAttributes||(e.stage.extendedAttributes={}),a.open({templateUrl:C.addExtendedAttributes,controller:"bakeStageAddExtendedAttributeController",controllerAs:"addExtendedAttribute",resolve:{extendedAttribute:function(){return{key:"",value:""}}}}).result.then(function(n){e.stage.extendedAttributes[n.key]=n.value}).catch(()=>{})},this.removeExtendedAttribute=function(n){delete e.stage.extendedAttributes[n]},this.showTemplateFileName=function(){return e.viewState.roscoMode||e.stage.templateFileName},this.showExtendedAttributes=function(){return e.viewState.roscoMode||e.stage.extendedAttributes&&_.size(e.stage.extendedAttributes)>0},this.showVarFileName=function(){return e.viewState.roscoMode||e.stage.varFileName},this.showDefaultImages=function(){e.managedImagesWasChosen=!1,e.defaultImagesWasChosen=!0,e.customImagesWasChosen=!1,e.stage.managedImage=null,e.stage.publisher=null,e.stage.offer=null,e.stage.sku=null,e.stage.osType=null,e.stage.packageType=null},this.showManagedImages=function(){r(),e.managedImagesWasChosen=!0,e.defaultImagesWasChosen=!1,e.customImagesWasChosen=!1,e.stage.osType=null,e.stage.baseOs=null,e.stage.publisher=null,e.stage.offer=null,e.stage.sku=null,e.stage.packageType=null},this.showCustomImages=function(){e.managedImagesWasChosen=!1,e.defaultImagesWasChosen=!1,e.customImagesWasChosen=!0,e.stage.baseOs=null,e.stage.managedImage=null,e.stage.osType=null,e.stage.packageType=null},this.onChangeAccount=()=>{e.stage.osType=null,e.stage.packageType=null,e.stage.managedImage=null,e.stage.account&&f.getRegionsForAccount(e.stage.account).then(function(n){e.regions=n.map(e=>e.name)}).catch(()=>{}),e.managedImagesWasChosen&&r()},e.onChangeManagedImage=()=>{e.stage.packageType=null;const n=_.find(e.managedImageOptions,{id:e.stage.managedImage});e.stage.osType=n.osType.toLowerCase()},this.onChangeOsType=function(n){e.stage.packageType=null},e.$watch("stage",function(){_.forOwn(e.stage,function(n,t){""===n&&delete e.stage[t]}),"function"==typeof g.feature.roscoSelector&&(e.viewState.roscoMode=g.feature.roscoSelector(e.stage))},!0),n.all([f.getCredentialsKeyedByAccount("azure"),z.getRegions("azure"),z.getBaseOsOptions("azure"),z.getBaseLabelOptions()]).then(function([n,t,a,l]){e.accounts=Object.keys(n),e.regions=t,1===e.regions.length?e.stage.region=e.regions[0]:e.regions.includes(e.stage.region)||delete e.stage.region,!e.stage.regions.length&&e.application.defaultRegions.azure&&e.stage.regions.push(e.application.defaultRegions.azure),!e.stage.regions.length&&e.application.defaultRegions.azure&&e.stage.regions.push(e.application.defaultRegions.azure),e.baseOsOptions=a.baseImages,e.baseLabelOptions=l,e.osTypeOptions=["linux","windows"],e.packageTypeOptions=["DEB","RPM"],e.viewState.roscoMode=g.feature.roscoMode||"function"==typeof g.feature.roscoSelector&&g.feature.roscoSelector(e.stage),e.showAdvancedOptions=function(){const n=e.stage;return!!(n.templateFileName||n.extendedAttributes&&_.size(n.extendedAttributes)>0||n.varFileName)}(),e.viewState.loading=!1,null!=e.stage.managedImage&&(e.managedImagesWasChosen=!0,r()),e.defaultImagesWasChosen=null!=e.stage.baseOs,e.customImagesWasChosen=null!=e.stage.publisher})}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/bake/bakeStage.html",'<div ng-controller="azureBakeStageCtrl as bakeStageCtrl">\n <div ng-if="viewState.loading" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div ng-if="!viewState.loading">\n <stage-config-field label="Account">\n <account-select-field\n component="stage"\n field="account"\n accounts="accounts"\n provider="\'azure\'"\n on-change="bakeStageCtrl.onChangeAccount()"\n />\n </stage-config-field>\n\n <stage-config-field label="Regions">\n <checklist items="regions" model="stage.regions" inline="true" include-select-all-button="true"></checklist>\n </stage-config-field>\n\n <div class="panel panel-default">\n <div class="panel-heading">\n <label class="col-md-3 sm-label-right"></label>\n <div class="btn-group btn-group-xs" role="group" aria-label="Source Image">\n <button\n class="btn btn-default"\n aria-pressed="true"\n ng-click="bakeStageCtrl.showDefaultImages()"\n ng-class="{active: defaultImagesWasChosen}"\n >\n Default Images\n </button>\n <button\n class="btn btn-default"\n aria-pressed="true"\n ng-click="bakeStageCtrl.showManagedImages()"\n ng-class="{active: managedImagesWasChosen}"\n >\n Managed Images\n </button>\n <button\n class="btn btn-default"\n aria-pressed="true"\n ng-click="bakeStageCtrl.showCustomImages()"\n ng-class="{active: customImagesWasChosen}"\n >\n Custom Image\n </button>\n </div>\n </div>\n\n <div class="panel-body">\n <stage-config-field label="Base OS" ng-show="defaultImagesWasChosen">\n <bake-stage-choose-os model="stage.baseOs" base-os-options="baseOsOptions"></bake-stage-choose-os>\n </stage-config-field>\n\n <stage-config-field label="Managed Image" ng-show="managedImagesWasChosen">\n <bake-stage-choose-managed-image\n model="stage.managedImage"\n managed-image-options="managedImageOptions"\n on-change="onChangeManagedImage"\n ></bake-stage-choose-managed-image>\n </stage-config-field>\n\n <stage-config-field label="Publisher" ng-show="customImagesWasChosen">\n <input type="text" class="form-control input-sm" ng-model="stage.publisher" />\n </stage-config-field>\n <stage-config-field label="Offer" ng-show="customImagesWasChosen">\n <input type="text" class="form-control input-sm" ng-model="stage.offer" />\n </stage-config-field>\n <stage-config-field label="SKU" ng-show="customImagesWasChosen">\n <input type="text" class="form-control input-sm" ng-model="stage.sku" />\n </stage-config-field>\n\n <stage-config-field label="OS Type" ng-show="customImagesWasChosen">\n <label class="radio-inline" ng-repeat="osType in osTypeOptions">\n <input\n type="radio"\n ng-model="stage.osType"\n ng-value="osType"\n name="osType"\n ng-change="bakeStageCtrl.onChangeOsType(value)"\n />\n {{osType}}\n </label>\n </stage-config-field>\n\n <stage-config-field label="Package Type" ng-show="stage.osType === \'linux\'">\n <label class="radio-inline" ng-repeat="packageType in packageTypeOptions">\n <input type="radio" ng-model="stage.packageType" ng-value="packageType" name="packageType" />\n {{packageType}}\n </label>\n </stage-config-field>\n </div>\n </div>\n\n <stage-config-field label="Package" help-key="pipeline.config.bake.package">\n <input type="text" class="form-control input-sm" ng-model="stage.package" />\n </stage-config-field>\n\n <stage-config-field label="Base Label">\n <label class="radio-inline" ng-repeat="baseLabel in baseLabelOptions">\n <input type="radio" ng-model="stage.baseLabel" ng-value="baseLabel" />\n {{baseLabel}}\n </label>\n </stage-config-field>\n \x3c!-- Even if the roscoMode flag is false, we should show the control if rebake is set. --\x3e\n <stage-config-field label="Rebake" ng-if="viewState.roscoMode || stage.rebake">\n <div class="checkbox" style="margin-bottom: 0">\n <label>\n <input type="checkbox" ng-model="stage.rebake" />\n Rebake image without regard to the status of any existing bake\n </label>\n </div>\n </stage-config-field>\n <stage-config-field label="Base Name">\n <input type="text" class="form-control input-sm" ng-model="stage.baseName" />\n </stage-config-field>\n <div class="form-group">\n <div class="col-md-9 col-md-offset-1">\n <div class="checkbox">\n <label>\n <input type="checkbox" ng-model="showAdvancedOptions" />\n <strong>Show Advanced Options</strong>\n </label>\n </div>\n </div>\n </div>\n <div ng-class="{collapse: showAdvancedOptions !== true, \'collapse.in\': showAdvancedOptions === true}">\n <stage-config-field\n label="Template File Name"\n help-key="pipeline.config.bake.templateFileName"\n ng-if="bakeStageCtrl.showTemplateFileName()"\n >\n <input type="text" class="form-control input-sm" ng-model="stage.templateFileName" />\n </stage-config-field>\n <stage-config-field\n label="Extended Attributes"\n help-key="pipeline.config.bake.extendedAttributes"\n ng-if="bakeStageCtrl.showExtendedAttributes()"\n >\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 40%">Key</th>\n <th style="width: 60%">Value</th>\n <th class="text-right">Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="(key,value) in stage.extendedAttributes">\n <td>\n <strong class="small">{{key}}</strong>\n </td>\n <td>\n <input\n type="text"\n ng-model="stage.extendedAttributes[key]"\n value="{{value}}"\n class="form-control input-sm"\n />\n </td>\n <td class="text-right">\n <a class="small" href ng-click="bakeStageCtrl.removeExtendedAttribute(key)">Remove</a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="7">\n <button class="btn btn-block btn-sm add-new" ng-click="bakeStageCtrl.addExtendedAttribute()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add Extended Attribute\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </stage-config-field>\n <stage-config-field\n label="Var File Name"\n help-key="pipeline.config.bake.varFileName"\n ng-if="bakeStageCtrl.showVarFileName()"\n >\n <input type="text" class="form-control input-sm" ng-model="stage.varFileName" />\n </stage-config-field>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/bake/bakeExecutionDetails.html",'<div ng-controller="azureBakeExecutionDetailsCtrl">\n <execution-details-section-nav sections="configSections"></execution-details-section-nav>\n <div class="step-section-details" ng-if="detailsSection === \'bakeConfig\'">\n <div class="row">\n <div class="col-md-6">\n <dl class="dl-narrow dl-horizontal">\n <dt if-multiple-providers>Provider</dt>\n <dd if-multiple-providers>Azure</dd>\n <dt>Image</dt>\n <dd>{{stage.context.ami}}</dd>\n <dt>Region</dt>\n <dd>{{stage.context.region}}</dd>\n <dt>Package</dt>\n <dd>{{stage.context.package}}</dd>\n </dl>\n </div>\n <div class="col-md-6">\n <dl class="dl-narrow dl-horizontal">\n <dt>Base OS</dt>\n <dd>{{stage.context.baseOs}}</dd>\n <dt>Label</dt>\n <dd>{{stage.context.baseLabel}}</dd>\n <dt ng-if="roscoMode || execution.trigger.rebake || stage.context.rebake">Rebake</dt>\n <dd ng-if="roscoMode || execution.trigger.rebake || stage.context.rebake">\n {{execution.trigger.rebake || stage.context.rebake || false}}\n </dd>\n <dt ng-if="stage.context.templateFileName">Template</dt>\n <dd ng-if="stage.context.templateFileName">{{stage.context.templateFileName}}</dd>\n <dt ng-if="stage.context.varFileName">Var File</dt>\n <dd ng-if="stage.context.varFileName">{{stage.context.varFileName}}</dd>\n </dl>\n </div>\n </div>\n <stage-failure-message stage="stage" message="stage.failureMessage"></stage-failure-message>\n\n <div class="row" ng-if="stage.context.region && stage.context.status.resourceId">\n <div class="col-md-12">\n <div class="alert alert-{{stage.isFailed ? \'danger\' : \'info\'}}">\n <div ng-if="stage.context.previouslyBaked">No changes detected; reused existing bake</div>\n <a target="_blank" href="{{ bakeryDetailUrl(stage) }}"> View Bakery Details </a>\n </div>\n </div>\n </div>\n </div>\n <div class="step-section-details" ng-if="detailsSection === \'taskStatus\'">\n <div class="row">\n <execution-step-details item="stage"></execution-step-details>\n </div>\n </div>\n</div>\n')}]);const pe="spinnaker.azure.pipeline.stage.destroyAsgStage";n(pe,[]).config(function(){S.pipeline.registerStage({provides:"destroyServerGroup",cloudProvider:"azure",templateUrl:"azure/src/pipeline/stages/destroyAsg/destroyAsgStage.html",executionStepLabelUrl:"azure/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html",accountExtractor:e=>[e.context.credentials],configAccountExtractor:e=>[e.credentials],validators:[{type:"targetImpedance",message:"This pipeline will attempt to destroy a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("azureDestroyAsgStageCtrl",["$scope",function(e){const n=this,t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("azure").then(function(n){e.accounts=n,e.state.accounts=!0}),n.accountUpdated=function(){f.getAccountDetails(t.credentials).then(function(e){t.regions=[e.org]})},e.targets=k.TARGET_LIST,t.regions=t.regions||[],t.cloudProvider="azure",t.interestingHealthProviderNames=[],!t.credentials&&e.application.defaultCredentials.azure&&(t.credentials=e.application.defaultCredentials.azure),t.credentials&&n.accountUpdated(),t.target||(t.target=e.targets[0].val)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/destroyAsg/destroyAsgStage.html",'<div ng-controller="azureDestroyAsgStageCtrl as destroyAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/destroyAsg/destroyAsgStepLabel.html",'<span class="task-label"> Destroy Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const ge="spinnaker.azure.pipeline.stage.disableAsgStage";n(ge,[]).config(function(){S.pipeline.registerStage({provides:"disableServerGroup",alias:"disableAsg",cloudProvider:"azure",templateUrl:"azure/src/pipeline/stages/disableAsg/disableAsgStage.html",executionStepLabelUrl:"azure/src/pipeline/stages/disableAsg/disableAsgStepLabel.html",validators:[{type:"targetImpedance",message:"This pipeline will attempt to disable a server group without deploying a new version into the same cluster."},{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("azureDisableAsgStageCtrl",["$scope",function(e){const n=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("azure").then(function(n){e.accounts=n,e.state.accounts=!0}),e.targets=k.TARGET_LIST,n.regions=n.regions||[],n.cloudProvider="azure",n.isNew&&e.application.attributes.platformHealthOnly&&(n.interestingHealthProviderNames=[]),!n.credentials&&e.application.defaultCredentials.azure&&(n.credentials=e.application.defaultCredentials.azure),!n.regions.length&&e.application.defaultRegions.azure&&n.regions.push(e.application.defaultRegions.azure),n.target||(n.target=e.targets[0].val)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/disableAsg/disableAsgStage.html",'<div ng-controller="azureDisableAsgStageCtrl as disableAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'azureService\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/disableAsg/disableAsgStepLabel.html",'<span class="task-label"> Disable Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const me="spinnaker.azure.pipeline.stage.enableAsgStage";n(me,[]).config(function(){S.pipeline.registerStage({provides:"enableServerGroup",alias:"enableAsg",cloudProvider:"azure",templateUrl:"azure/src/pipeline/stages/enableAsg/enableAsgStage.html",executionStepLabelUrl:"azure/src/pipeline/stages/enableAsg/enableAsgStepLabel.html",validators:[{type:"requiredField",fieldName:"cluster"},{type:"requiredField",fieldName:"target"},{type:"requiredField",fieldName:"regions"},{type:"requiredField",fieldName:"credentials",fieldLabel:"account"}]})}).controller("azureEnableAsgStageCtrl",["$scope",function(e){const n=this,t=e.stage;e.state={accounts:!1,regionsLoaded:!1},f.listAccounts("azure").then(function(n){e.accounts=n,e.state.accounts=!0}),n.reset=()=>{n.accountUpdated(),n.resetSelectedCluster()},e.targets=k.TARGET_LIST,t.regions=t.regions||[],t.cloudProvider="azure",t.isNew&&(t.interestingHealthProviderNames=[]),!t.credentials&&e.application.defaultCredentials.azure&&(t.credentials=e.application.defaultCredentials.azure),!t.regions.length&&e.application.defaultRegions.azure&&t.regions.push(e.application.defaultRegions.azure),t.target||(t.target=e.targets[0].val),e.$watch("stage.credentials",e.accountUpdated)}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/enableAsg/enableAsgStage.html",'<div ng-controller="azureEnableAsgStageCtrl as enableAsgStageCtrl" class="form-horizontal">\n <div ng-if="!pipeline.strategy">\n <account-region-cluster-selector application="application" component="stage" accounts="accounts">\n </account-region-cluster-selector>\n </div>\n <stage-config-field label="Target">\n <target-select model="stage" options="targets"></target-select>\n </stage-config-field>\n <stage-platform-health-override application="application" stage="stage" platform-health-type="\'azureService\'">\n </stage-platform-health-override>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/pipeline/stages/enableAsg/enableAsgStepLabel.html",'<span class="task-label"> Enable Server Group: {{step.context.serverGroupName}} ({{step.context.region}}) </span>\n')}]);const fe="spinnaker.azure.securityGroup.write.service",ve=fe;n(fe,[O]).factory("azureSecurityGroupWriter",function(){return{deleteSecurityGroup:function(e,n,t={}){t.type="deleteSecurityGroup",t.securityGroupName=e.name,t.regions=[e.region],t.credentials=e.accountId,t.appName=n.name;const a=G.executeTask({job:[t],application:n,description:`Delete ${b.get("Firewalls")}: ${e.name}`});return I.clearCache("securityGroup"),a},upsertSecurityGroup:function(e,n,t,a={}){a.securityGroupName=e.name,_.assignWith(a,e,function(e,n){return _.isUndefined(e)?n:e});const r=G.executeTask({job:[a],application:n,description:`${t} ${b.get("Firewall")}: ${ve}`});return I.clearCache("securityGroup"),r}}});const he="spinnaker.azure.securityGroup.create.controller";n(he,[O,fe]).controller("azureCreateSecurityGroupCtrl",["$scope","$uibModalInstance","$state","$controller","application","securityGroup","azureSecurityGroupWriter",function(e,n,t,a,r,l,i){e.pages={location:"azure/src/securityGroup/configure/createSecurityGroupProperties.html",ingress:"azure/src/securityGroup/configure/createSecurityGroupIngress.html"},e.regions=[],e.firewallLabel=b.get("Firewall");const s=this;function o(){if(e.$$destroyed)return;n.close();const a={name:e.securityGroup.name,accountId:e.securityGroup.credentials||e.securityGroup.accountName,region:e.securityGroup.regions[0],provider:"azure"};t.includes("**.firewallDetails")?t.go("^.firewallDetails",a):t.go(".firewallDetails",a)}function c(e,n,t){const a=e[t],r=e[n].priority,l=e[t].priority;e[t]=e[n],e[n]=a,e[n].priority=r,e[t].priority=l}e.isNew=!0,e.state={submitting:!1,infiniteScroll:{numToAdd:20,currentItems:20}},f.listAccounts("azure").then(function(n){e.accounts=n,s.accountUpdated()}),s.addMoreItems=function(){e.state.infiniteScroll.currentItems+=e.state.infiniteScroll.numToAdd},e.taskMonitor=new m({application:r,title:`Creating your ${b.get("firewall")}`,modalInstance:n,onTaskComplete:function(){r.securityGroups.refresh(),r.securityGroups.onNextRefresh(e,o)}}),e.securityGroup=l,s.accountUpdated=function(){f.getRegionsForAccount(e.securityGroup.credentials).then(function(n){e.regions=n,e.securityGroup.regions=n,s.updateName(),s.regionUpdated()})},this.regionUpdated=function(){s.vnetUpdated()},this.vnetUpdated=function(){const n=e.securityGroup.credentials,t=e.securityGroup.region;e.securityGroup.selectedVnet=null,e.securityGroup.vnet=null,e.securityGroup.vnetResourceGroup=null,s.selectedVnets=[],v.listNetworks().then(function(e){e.azure&&e.azure.forEach(e=>{e.account===n&&e.region===t&&s.selectedVnets.push(e)})}),s.subnetUpdated()},this.subnetUpdated=function(){e.securityGroup.selectedSubnet=null,e.securityGroup.subnet=null,s.selectedSubnets=[]},this.selectedVnetChanged=function(n){e.securityGroup.vnet=n.name,e.securityGroup.vnetResourceGroup=n.resourceGroup,e.securityGroup.selectedSubnet=null,e.securityGroup.subnet=null,s.selectedSubnets=[],n.subnets&&n.subnets.map(function(e){s.selectedSubnets.push(e)})},s.cancel=function(){n.dismiss()},s.updateName=function(){const n=e.securityGroup;let t=r.name;n.detail&&(t+="-"+n.detail),n.name=t,e.namePreview=t},s.upsert=function(){e.taskMonitor.submit(function(){const n={cloudProvider:"azure",appName:r.name,region:e.securityGroup.region,vpcId:"null"};return e.securityGroup.selectedVnet&&(e.securityGroup.vnet=e.securityGroup.selectedVnet.name,e.securityGroup.vnetResourceGroup=e.securityGroup.selectedVnet.resourceGroup),e.securityGroup.selectedSubnet&&(e.securityGroup.subnet=e.securityGroup.selectedSubnet.name),e.securityGroup.type="upsertSecurityGroup",i.upsertSecurityGroup(e.securityGroup,r,"Create",n)})},s.addRule=function(n){n.push({name:e.securityGroup.name+"-Rule"+n.length,priority:0==n.length?100:100*(n.length+1),protocolUI:"tcp",protocol:"tcp",access:"Allow",direction:"InBound",sourceAddressPrefix:"*",sourceAddressPrefixes:[],sourcePortRange:"*",destinationAddressPrefix:"*",destinationPortRange:"*",destinationPortRanges:[],destPortRanges:"*",sourceIPCIDRRanges:"*"})},s.portUpdated=function(e,n){if(!_.isEmpty(e[n].destPortRanges)){const t=e[n].destPortRanges.split(",");t.length>1?(e[n].destinationPortRanges=[],t.forEach(t=>e[n].destinationPortRanges.push(t)),e[n].destinationPortRange=null):(e[n].destinationPortRange=e[n].destPortRanges,e[n].destinationPortRanges=[])}},s.sourceIPCIDRUpdated=function(e,n){if(!_.isEmpty(e[n].destPortRanges)){const t=e[n].sourceIPCIDRRanges.split(",");t.length>1?(e[n].sourceAddressPrefixes=[],t.forEach(t=>e[n].sourceAddressPrefixes.push(t)),e[n].sourceAddressPrefix=null):(e[n].sourceAddressPrefix=e[n].sourceIPCIDRRanges,e[n].sourceAddressPrefixes=[])}},s.protocolUpdated=function(e,n){e[n].protocol=e[n].protocolUI},s.removeRule=function(e,n){e.splice(n,1)},s.moveUp=function(e,n){0!==n&&c(e,n,n-1)},s.moveDown=function(e,n){n!==e.length-1&&c(e,n,n+1)},e.securityGroup.securityRules=[]}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupProperties.html",'<div class="modal-body">\n <div class="form-group">\n <div\n class="col-md-12 well"\n ng-class="{\'alert-danger\': form.securityGroupName.$error.validateUnique, \'alert-info\': !form.securityGroupName.$error.validateUnique}"\n >\n <strong>Your <firewall-label label="firewall"></firewall-label> will be named:</strong>\n <span ng-bind="namePreview"></span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Detail</div>\n <div class="col-md-4">\n <input\n type="text"\n class="form-control input-sm"\n required\n ng-model="securityGroup.detail"\n ng-change="ctrl.updateName()"\n />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Description</div>\n <div class="col-md-8">\n <input type="text" class="form-control input-sm" ng-model="securityGroup.description" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Account</div>\n <div class="col-md-8">\n <account-select-field\n required\n component="securityGroup"\n field="credentials"\n accounts="accounts"\n provider="\'azure\'"\n on-change="ctrl.accountUpdated()"\n ></account-select-field>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-12">\n <region-select-field\n label-columns="4"\n component="securityGroup"\n field="region"\n field-columns="8"\n account="securityGroup.credentials"\n provider="\'azure\'"\n on-change="ctrl.regionUpdated()"\n regions="regions"\n ></region-select-field>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedVnet"\n on-select="ctrl.selectedVnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">\n <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Subnet</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedSubnet"\n on-select="ctrl.selectedSubnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">\n <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupIngress.html",'<div class="modal-body">\n <div class="row"></div>\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 21%">Protocol</th>\n <th style="width: 32%">\n Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>\n </th>\n <th style="width: 32%">\n Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>\n </th>\n <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in securityGroup.securityRules">\n <td>\n <select class="form-control input-sm" ng-model="rule.protocolUI">\n <option value="tcp">TCP</option>\n <option value="udp">UDP</option>\n <option value="*">ANY</option>\n </select>\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="*"\n pattern="^*$|^((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?(,((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?)*$"\n ng-model="rule.sourceIPCIDRRanges"\n ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="80"\n pattern="^*$|^((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5]))(,((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])))*$"\n ng-model="rule.destPortRanges"\n ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-up"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-down"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-12">\n <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new\n <firewall-label label="Firewall"></firewall-label> Rule\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]);const Be="spinnaker.azure.securityGroup.azure.edit.controller";n(Be,[O,F,A,fe]).controller("azureEditSecurityGroupCtrl",["$scope","$uibModalInstance","$exceptionHandler","$state","securityGroupReader","cacheInitializer","application","securityGroup","azureSecurityGroupWriter",function(e,n,t,a,r,l,i,s,o){function c(){if(e.$$destroyed)return;n.close();const t={name:e.securityGroup.name,accountId:e.securityGroup.credentials||e.securityGroup.accountName,region:e.securityGroup.region,provider:"azure"};a.includes("**.firewallDetails")?a.go("^.firewallDetails",t):a.go(".firewallDetails",t)}function d(e,n,t){const a=e[t],r=e[n].priority,l=e[t].priority;e[t]=e[n],e[n]=a,e[n].priority=r,e[t].priority=l}e.pages={ingress:"azure/src/securityGroup/configure/createSecurityGroupIngress.html"},s.securityRules=_.map(s.securityRules,function(e){return _.isEmpty(e.protocol)||(e.protocolUI=e.protocol.toLowerCase()),e.destPortRanges=e.destinationPortRangeModel,e.sourceIPCIDRRanges=e.sourceAddressPrefixModel,e}),e.securityGroup=s,e.state={refreshingSecurityGroups:!1},e.taskMonitor=new m({application:i,title:`Updating your ${b.get("firewall")}`,modalInstance:n,onTaskComplete:function(){i.securityGroups.refresh(),i.securityGroups.onNextRefresh(e,c)}}),this.getSecurityGroupRefreshTime=function(){return I.get("securityGroups").getStats().ageMax},this.refreshSecurityGroups=function(){return e.state.refreshingSecurityGroups=!0,l.refreshCache("securityGroups").then(function(){r.getAllSecurityGroups().then(function(n){const t=s.accountName,a=s.region,r=_.filter(n[t].azure[a],{});e.availableSecurityGroups=_.map(r,"name")}).then(function(){e.state.refreshingSecurityGroups=!1})})},this.addRule=function(n){n.push({name:e.securityGroup.name+"-Rule"+n.length,priority:0===n.length?100:100*(n.length+1),protocolUI:"tcp",access:"Allow",direction:"InBound",sourceAddressPrefix:"*",sourceAddressPrefixes:[],sourcePortRange:"*",destinationAddressPrefix:"*",destinationPortRange:"*",destinationPortRanges:[],destPortRanges:"*",sourceIPCIDRRanges:"*"})},this.portUpdated=function(e,n){if(!_.isEmpty(e[n].sourceIPCIDRRanges)){const t=e[n].destPortRanges.split(",");t.length>1?(e[n].destinationPortRanges=[],t.forEach(t=>e[n].destinationPortRanges.push(t)),e[n].destinationPortRange=null):(e[n].destinationPortRange=e[n].destPortRanges,e[n].destinationPortRanges=[])}},this.sourceIPCIDRUpdated=function(e,n){if(!_.isEmpty(e[n].sourceIPCIDRRanges)){const t=e[n].sourceIPCIDRRanges.split(",");t.length>1?(e[n].sourceAddressPrefixes=[],t.forEach(t=>e[n].sourceAddressPrefixes.push(t)),e[n].sourceAddressPrefix=null):(e[n].sourceAddressPrefix=e[n].sourceIPCIDRRanges,e[n].sourceAddressPrefixes=[])}},this.removeRule=function(e,n){e.splice(n,1)},this.moveUp=function(e,n){0!==n&&d(e,n,n-1)},this.moveDown=function(e,n){n!==e.length-1&&d(e,n,n+1)},e.taskMonitor.onTaskComplete=n.dismiss,this.upsert=function(){e.taskMonitor.submit(function(){const n={cloudProvider:"azure",appName:i.name,region:e.securityGroup.region,subnet:null,vpcId:"null"};return e.securityGroup.type="upsertSecurityGroup",o.upsertSecurityGroup(e.securityGroup,i,"Update",n)})},this.cancel=function(){n.dismiss()}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupIngress.html",'<div class="modal-body">\n <div class="row"></div>\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 21%">Protocol</th>\n <th style="width: 32%">\n Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>\n </th>\n <th style="width: 32%">\n Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>\n </th>\n <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in securityGroup.securityRules">\n <td>\n <select class="form-control input-sm" ng-model="rule.protocolUI">\n <option value="tcp">TCP</option>\n <option value="udp">UDP</option>\n <option value="*">ANY</option>\n </select>\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="*"\n pattern="^*$|^((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?(,((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?)*$"\n ng-model="rule.sourceIPCIDRRanges"\n ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="80"\n pattern="^*$|^((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5]))(,((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])))*$"\n ng-model="rule.destPortRanges"\n ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-up"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-down"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-12">\n <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new\n <firewall-label label="Firewall"></firewall-label> Rule\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]);const Ae="spinnaker.azure.securityGroup.clone.controller";n(Ae,[fe,he]).controller("azureCloneSecurityGroupController",["$scope","$uibModalInstance","$controller","$state","azureSecurityGroupWriter","securityGroup","application",function(e,n,t,a,r,l,i){const s=this;function o(){if(e.$$destroyed)return;n.close();const t={name:e.securityGroup.name,accountId:e.securityGroup.credentials||e.securityGroup.accountName,region:e.securityGroup.region,provider:"azure"};a.includes("**.firewallDetails")?a.go("^.firewallDetails",t):a.go(".firewallDetails",t)}function c(e,n,t){const a=e[t],r=e[n].priority,l=e[t].priority;e[t]=e[n],e[n]=a,e[n].priority=r,e[t].priority=l}e.firewallLabel=b.get("Firewall"),e.pages={location:"azure/src/securityGroup/configure/createSecurityGroupProperties.html",ingress:"azure/src/securityGroup/configure/createSecurityGroupIngress.html"},l.securityRules=_.map(l.securityRules,function(e){const n=e.destinationPortRange.split("-");return e.startPort=Number(n[0]),e.endPort=Number(n[1]),e}),s.accountUpdated=function(){f.getRegionsForAccount(e.securityGroup.credentials).then(function(n){e.regions=n,e.securityGroup.regions=n,s.updateName()})},s.cancel=function(){n.dismiss()},s.updateName=function(){const n=e.securityGroup;let t=i.name;n.detail&&(t+="-"+n.detail),n.name=t,e.namePreview=t},e.securityGroup=l,e.state={refreshingSecurityGroups:!1},e.taskMonitor=new m({application:i,title:`Updating your ${b.get("firewall")}`,modalInstance:n,onTaskComplete:function(){i.securityGroups.refresh(),i.securityGroups.onNextRefresh(e,o)}}),f.listAccounts("azure").then(function(n){e.accounts=n,s.accountUpdated()}),s.addRule=function(n){n.push({name:e.securityGroup.name+"-Rule"+n.length,priority:0===n.length?100:100*(n.length+1),protocol:"tcp",access:"Allow",direction:"InBound",sourceAddressPrefix:"*",sourcePortRange:"*",destinationAddressPrefix:"*",destinationPortRange:"7001-7001",startPort:7001,endPort:7001})},s.portUpdated=function(e,n){e[n].destinationPortRange=e[n].startPort+"-"+e[n].endPort},s.removeRule=function(e,n){e.splice(n,1)},s.moveUp=function(e,n){0!==n&&c(e,n,n-1)},s.moveDown=function(e,n){n!==e.length-1&&c(e,n,n+1)},s.upsert=function(){e.taskMonitor.submit(function(){const n={cloudProvider:"azure",appName:i.name,region:e.securityGroup.region,subnet:"none",vpcId:"null"};return e.securityGroup.type="upsertSecurityGroup",r.upsertSecurityGroup(e.securityGroup,i,"Clone",n)})}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupProperties.html",'<div class="modal-body">\n <div class="form-group">\n <div\n class="col-md-12 well"\n ng-class="{\'alert-danger\': form.securityGroupName.$error.validateUnique, \'alert-info\': !form.securityGroupName.$error.validateUnique}"\n >\n <strong>Your <firewall-label label="firewall"></firewall-label> will be named:</strong>\n <span ng-bind="namePreview"></span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Detail</div>\n <div class="col-md-4">\n <input\n type="text"\n class="form-control input-sm"\n required\n ng-model="securityGroup.detail"\n ng-change="ctrl.updateName()"\n />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Description</div>\n <div class="col-md-8">\n <input type="text" class="form-control input-sm" ng-model="securityGroup.description" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Account</div>\n <div class="col-md-8">\n <account-select-field\n required\n component="securityGroup"\n field="credentials"\n accounts="accounts"\n provider="\'azure\'"\n on-change="ctrl.accountUpdated()"\n ></account-select-field>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-12">\n <region-select-field\n label-columns="4"\n component="securityGroup"\n field="region"\n field-columns="8"\n account="securityGroup.credentials"\n provider="\'azure\'"\n on-change="ctrl.regionUpdated()"\n regions="regions"\n ></region-select-field>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedVnet"\n on-select="ctrl.selectedVnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectVnet in ctrl.selectedVnets | filter: $select.search">\n <span ng-bind-html="selectVnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Subnet</div>\n <div class="col-md-7">\n <ui-select\n class="form-control input-sm"\n ng-model="securityGroup.selectedSubnet"\n on-select="ctrl.selectedSubnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing subnets">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectSubnet in ctrl.selectedSubnets | filter: $select.search">\n <span ng-bind-html="selectSubnet.name | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroupIngress.html",'<div class="modal-body">\n <div class="row"></div>\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-12">\n <table class="table table-condensed packed">\n <thead>\n <tr>\n <th style="width: 21%">Protocol</th>\n <th style="width: 32%">\n Source IP/CIDR ranges<help-field key="azure.securityGroup.ingress.sourceIPCIDRRanges"></help-field>\n </th>\n <th style="width: 32%">\n Destination port ranges<help-field key="azure.securityGroup.ingress.destPortRanges"></help-field>\n </th>\n <th style width="15%">Actions<help-field key="azure.securityGroup.ingress.actions"></help-field></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="rule in securityGroup.securityRules">\n <td>\n <select class="form-control input-sm" ng-model="rule.protocolUI">\n <option value="tcp">TCP</option>\n <option value="udp">UDP</option>\n <option value="*">ANY</option>\n </select>\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="*"\n pattern="^*$|^((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?(,((25[0-5]|2[0-4]d|[01]?dd?)[.]){3}(25[0-5]|2[0-4]d|[01]?dd?)(/([1-9]|[1-2]d|3[0-2]))?)*$"\n ng-model="rule.sourceIPCIDRRanges"\n ng-change="ctrl.sourceIPCIDRUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <input\n class="form-control input-sm"\n type="text"\n value="80"\n pattern="^*$|^((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5]))(,((d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])|(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])-(d|[1-9]d{1,3}|[1-5]d{4}|6[0-4]d{3}|65[0-4]d{2}|655[0-2]d|6553[0-5])))*$"\n ng-model="rule.destPortRanges"\n ng-change="ctrl.portUpdated(securityGroup.securityRules, $index)"\n required\n />\n </td>\n <td>\n <a class="btn-link sm-label" ng-click="ctrl.moveUp(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-up"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.moveDown(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-arrow-down"></span>\n </a>\n <a class="btn-link sm-label" ng-click="ctrl.removeRule(securityGroup.securityRules, $index)"\n ><span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-12">\n <button class="add-new col-md-12" ng-click="ctrl.addRule(securityGroup.securityRules)">\n <span class="glyphicon glyphicon-plus-sign"></span> Add new\n <firewall-label label="Firewall"></firewall-label> Rule\n </button>\n </div>\n </div>\n </div>\n</div>\n')}]);const ye="spinnaker.azure.securityGroup.azure.details.controller";e.module(ye,[O,A,fe,Ae]).controller("azureSecurityGroupDetailsCtrl",["$scope","$state","resolvedSecurityGroup","app","azureSecurityGroupWriter","securityGroupReader","$uibModal",function(n,t,a,r,i,s,o){const c=r,d=a;function u(){return s.getSecurityGroupDetails(c,d.accountId,d.provider,d.region,d.vpcId,d.name).then(function(e){n.state.loading=!1,!e||_.isEmpty(e)?p():n.securityGroup=e},function(){p()})}function p(){t.go("^")}n.state={loading:!0},n.firewallLabel=b.get("Firewall"),u().then(()=>{n.$$destroyed||r.securityGroups.onRefresh(n,u)}),this.editInboundRules=function(){o.open({templateUrl:"azure/src/securityGroup/configure/editSecurityGroup.html",controller:"azureEditSecurityGroupCtrl as ctrl",resolve:{securityGroup:function(){return e.copy(n.securityGroup)},application:function(){return c}}})},this.cloneSecurityGroup=function(){o.open({templateUrl:"azure/src/securityGroup/clone/cloneSecurityGroup.html",controller:"azureCloneSecurityGroupController as ctrl",resolve:{securityGroup:function(){const t=e.copy(n.securityGroup);return t.region&&(t.regions=[t.region]),t},application:function(){return c}}})},this.deleteSecurityGroup=function(){const e={application:c,title:"Deleting "+d.name};l.confirm({header:"Really delete "+d.name+"?",buttonText:"Delete "+d.name,account:d.accountId,taskMonitorConfig:e,submitMethod:function(){return n.securityGroup.type="deleteSecurityGroup",i.deleteSecurityGroup(d,c,{cloudProvider:"azure",vpcId:n.securityGroup.vpcId})}})},r.isStandalone&&(r.securityGroups={refresh:u})}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/editSecurityGroup.html",'<form name="form" novalidate validate-on-submit>\n <v2-modal-wizard\n heading="Edit {{securityGroup.name}}: {{securityGroup.region}}: {{securityGroup.credentials}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="Ingress" label="Ingress" done="true">\n <ng-include src="pages.ingress"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="taskMonitor.submitting"\n submitting="taskMonitor.submitting"\n on-click="form.$valid && ctrl.upsert()"\n ></submit-button>\n </div>\n</form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/clone/cloneSecurityGroup.html",'<v2-modal-wizard heading="Clone {{firewallLabel}}">\n <v2-wizard-page key="Location" label="Location">\n <ng-include src="pages.location"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Ingress" label="Ingress" done="true">\n <ng-include src="pages.ingress"></ng-include>\n </v2-wizard-page>\n</v2-modal-wizard>\n')}]);const be="spinnaker.azure.securityGroup.reader";n(be,[]).factory("azureSecurityGroupReader",function(){return{resolveIndexedSecurityGroup:function(e,n,t){const a=t.split("/");return e[n.account][n.region][a[a.length-1]]}}});const Se="spinnaker.azure.securityGroup.transformer";n(Se,[]).factory("azureSecurityGroupTransformer",function(){return{normalizeSecurityGroup:function(){}}});const De="spinnaker.azure.serverGroup.configure.instanceArchetype.controller";n(De,[]).controller("azureInstanceArchetypeCtrl",["$scope","instanceTypeService","modalWizardService",function(e,n,t){const a=t.getWizard();e.$watch("command.viewState.instanceProfile",function(){e.command.viewState.instanceProfile&&"custom"!==e.command.viewState.instanceProfile?(a.includePage("instance-type"),a.markClean("instance-profile"),a.markComplete("instance-profile")):a.excludePage("instance-type")}),e.$watch("command.viewState.instanceType",function(e){e&&(a.markClean("instance-profile"),a.markComplete("instance-profile"))})}]);const we="spinnaker.azure.serverGroup.configure.instanceType.controller";n(we,[]).controller("azureInstanceTypeCtrl",["$scope","modalWizardService",function(e,n){n.getWizard().markComplete("instance-type"),n.getWizard().markClean("instance-type")}]);const Ce="spinnaker.azure.serverGroup.configure.advancedSetting.controller";n(Ce,[]).controller("azureServerGroupAdvancedSettingsCtrl",["$scope","modalWizardService",function(e,n){n.getWizard().markComplete("advanced"),e.$watch("form.$valid",function(e){e?n.getWizard().markClean("advanced"):n.getWizard().markDirty("advanced")})}]);const ze="spinnaker.azure.serverGroup.configure.wizard.advancedSettings.selector.directive";e.module(ze,[]).directive("azureServerGroupAdvancedSettingsSelector",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"adv",controller:"azureServerGroupAdvancedSettingsSelectorCtrl"}}).controller("azureServerGroupAdvancedSettingsSelectorCtrl",function(){this.addDataDisk=()=>{const n=e.copy(this.command.dataDisks);this.command.dataDisks=n.concat([{lun:0,managedDisk:{storageAccountType:"Standard_LRS"},diskSizeGB:1,caching:"None",createOption:"Empty"}])},this.removeDataDisk=n=>{const t=e.copy(this.command.dataDisks);t.splice(n,1),this.command.dataDisks=t}}),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettingsSelector.directive.html",'<div class="container-fluid form-horizontal">\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-4 sm-label-right">Number of Instances</div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="adv.command.sku.capacity"\n min="0"\n max="100"\n required\n />\n </div>\n </div>\n <div></div>\n <div class="form-group">\n <div class="col-xs-4 sm-label-right">\n <b>Custom Data</b>\n <help-field key="azure.serverGroup.customData"></help-field>\n </div>\n <div class="col-md-7">\n <input type="text" class="form-control input-sm" ng-model="adv.command.osConfig.customData" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Custom Script</b>\n <help-field key="azure.serverGroup.scriptLocation"></help-field>\n </div>\n <div class="col-md-7">\n <input type="text" class="form-control input-sm" ng-model="adv.command.customScriptsSettings.fileUris" />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>Command To Execute</b>\n <help-field key="azure.serverGroup.commandToExecute"></help-field>\n </div>\n <div class="col-md-7">\n <input\n type="text"\n class="form-control input-sm"\n ng-model="adv.command.customScriptsSettings.commandToExecute"\n />\n </div>\n </div>\n <div class="form-group" ng-if="adv.command.loadBalancerType === \'Azure Application Gateway\'">\n <div class="col-md-4 sm-label-right">\n <input type="checkbox" ng-model="adv.command.enableInboundNAT" ng-disabled="adv.command.zonesEnabled" />\n </div>\n <div class="col-md-7">\n <b>Enable inbound NAT port-forwarding rules to connect to VM instances</b>\n <help-field key="azure.serverGroup.enableInboundNAT"></help-field>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-right">\n <b>User-Assigned Identities</b>\n <help-field key="azure.serverGroup.userAssignedIdentities"></help-field>\n </div>\n <div class="col-md-7">\n <input type="text" class="form-control input-sm" ng-model="adv.command.userAssignedIdentities" />\n </div>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-4 sm-label-left">Data Disks</div>\n <div class="col-md-11">\n <table class="table table-condensed packed tags">\n <thead>\n <tr>\n <th>\n LUN\n <help-field key="azure.serverGroup.lun"></help-field>\n </th>\n <th>\n Size (GB)\n <help-field key="azure.serverGroup.diskSizeGB"></help-field>\n </th>\n <th>\n Type\n <help-field key="azure.serverGroup.managedDisk.storageAccountType"></help-field>\n </th>\n <th>\n Caching\n <help-field key="azure.serverGroup.caching"></help-field>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="disk in adv.command.dataDisks">\n <td>\n <input type="number" class="form-control input-sm" ng-model="disk.lun" required min="0" />\n </td>\n <td>\n <input type="number" class="form-control input-sm" ng-model="disk.diskSizeGB" required min="1" />\n </td>\n <td>\n <ui-select ng-model="disk.managedDisk.storageAccountType" class="form-control input-sm" required>\n <ui-select-match placeholder="Select...">{{$select.selected}}</ui-select-match>\n <ui-select-choices\n repeat="dataDiskType in adv.command.backingData.dataDiskTypes | filter: $select.search"\n >\n <span ng-bind-html="dataDiskType | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </td>\n <td>\n <ui-select ng-model="disk.caching" class="form-control input-sm" required>\n <ui-select-match placeholder="Select...">{{$select.selected}}</ui-select-match>\n <ui-select-choices\n repeat="dataDiskCachingType in adv.command.backingData.dataDiskCachingTypes | filter: $select.search"\n >\n <span ng-bind-html="dataDiskCachingType | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </td>\n <td>\n <a class="btn btn-link sm-label" style="margin-top: 0" ng-click="adv.removeDataDisk($index)">\n <span class="glyphicon glyphicon-trash"></span>\n </a>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr>\n <td colspan="4">\n <button class="btn btn-block btn-sm add-new" ng-click="adv.addDataDisk()">\n <span class="glyphicon glyphicon-plus-sign"></span> Add New Data Disk\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n </div>\n</div>\n')}]);const ke="spinnaker.azure.serverGroup.configure.basicSettings.image.filter";n(ke,[]).filter("regional",function(){return function(e,n){return _.filter(e,function(e){return e.region===n||null===e.region})}});const Ge="spinnaker.azure.serverGroup.configure.basicSettings";e.module(Ge,[O,Q,ke,T]).controller("azureServerGroupBasicSettingsCtrl",["$scope","$controller","$uibModalStack","$state","imageReader",function(n,t,a,r,l){n.$watch("form.$valid",function(e){e?(E.markClean("basic-settings"),E.markComplete("basic-settings")):E.markIncomplete("basic-settings")}),this.imageChanged=e=>{n.command.imageName=e.imageName,n.command.selectedImage=e,E.markClean("basic-settings")},e.extend(this,t("BasicSettingsMixin",{$scope:n,imageReader:l,$uibModalStack:a,$state:r})),this.stackPattern={test:function(e){return(n.command.viewState.templatingEnabled?/^([a-zA-Z0-9]*(\${.+})*)*$/:/^[a-zA-Z0-9]*$/).test(e)}},this.detailPattern={test:function(e){return(n.command.viewState.templatingEnabled?/^([a-zA-Z0-9-]*(\${.+})*)*$/:/^[a-zA-Z0-9-]*$/).test(e)}}}]);const Ie="spinnaker.azure.serverGroup.configure.wizard.capacity.selector.directive";n(Ie,[]).directive("azureServerGroupCapacitySelector",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"cap",controller:"azureServerGroupCapacitySelectorCtrl"}}).controller("azureServerGroupCapacitySelectorCtrl",function(){}),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/capacity/capacitySelector.directive.html",'<div>\n <div class="form-group">\n <div class="col-md-12">\n <p>Sets desired instance count.</p>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Number of Instances</div>\n <div class="col-md-2">\n <input\n type="number"\n class="form-control input-sm"\n ng-model="cap.command.sku.capacity"\n min="0"\n max="100"\n required\n />\n </div>\n </div>\n</div>\n')}]);const Fe="spinnaker.azure.serverGroup.configure.healthSetting.controller";n(Fe,[]).controller("azureServerGroupHealthSettingsCtrl",["$scope",function(e){void 0===e.command.healthSettings&&(e.command.healthSettings={}),this.healthCheckProtocols=[{displayName:"N/A",name:null},{displayName:"HTTP",name:"http"},{displayName:"TCP",name:"tcp"}],this.requiresHealthCheckPath=function(){return"http"===e.command.healthSettings.protocol},this.changeHealthCheckProtocol=function(n){null==n?(e.command.healthSettings.protocol=null,e.command.healthSettings.port=null,e.command.healthSettings.requestPath=null):this.requiresHealthCheckPath()||(e.command.healthSettings.requestPath=null)}}]);const Te="spinnaker.azure.serverGroup.configure.wizard.healthSettings.selector.directive";n(Te,[]).directive("azureServerGroupHealthSettingsSelector",["azureServerGroupConfigurationService",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.html",scope:{command:"="}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/healthSettings/healthSettingsSelector.directive.html",'<div class="container-fluid form-horizontal" ng-controller="azureServerGroupHealthSettingsCtrl as healthCtrl">\n <div class="form-group">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Protocol</div>\n <div class="col-md-7">\n <select\n class="form-control input-sm"\n ng-model="command.healthSettings.protocol"\n ng-options="protocol.name as protocol.displayName for protocol in healthCtrl.healthCheckProtocols"\n ng-change="healthCtrl.changeHealthCheckProtocol(command.healthSettings.protocol)"\n ></select>\n </div>\n </div>\n <div class="form-group" ng-if="command.healthSettings.protocol">\n <div class="col-md-3 sm-label-right">Port</div>\n <div class="col-md-7">\n <input class="form-control input-sm" type="text" ng-model="command.healthSettings.port" required />\n </div>\n </div>\n <div class="form-group" ng-if="healthCtrl.requiresHealthCheckPath()">\n <div class="col-md-3 sm-label-right">Path</div>\n <div class="col-md-7">\n <input class="form-control input-sm" type="text" ng-model="command.healthSettings.requestPath" required />\n </div>\n </div>\n </div>\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-9 col-md-offset-3">\n <p>Health settings here will be applied directly to the VM Scale Set.</p>\n </div>\n </div>\n</div>\n')}]);const Ee="spinnaker.azure.serverGroup.configure.imageSettings.controller";n(Ee,[]).controller("azureServerGroupImageSettingsCtrl",["$scope",function(e){this.clearImage=function(){0==e.command.image.isCustom?e.command.image={isCustom:!1}:e.command.image.region=e.command.region},E.markComplete("image-settings"),e.$watch("form.$valid",function(e){e?E.markClean("image-settings"):E.markDirty("image-settings")})}]);const xe="spinnaker.azure.serverGroup.configure.wizard.imageSettingsSelector.directive";n(xe,[]).directive("azureServerGroupImageSettingsSelector",["azureServerGroupConfigurationService",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.html",scope:{command:"="}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/image/imageSettingsSelector.directive.html",'<div class="container-fluid form-horizontal" ng-controller="azureServerGroupImageSettingsCtrl as imageCtrl">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Use custom image?</div>\n <input type="checkbox" ng-model="command.image.isCustom" ng-change="imageCtrl.clearImage()" />\n </div>\n\n <div class="form-group" ng-if="command.image.isCustom === true">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Region</div>\n <div class="col-md-6">\n <span>{{command.image.region}}</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Image Name</div>\n <div class="col-md-6">\n <input type="text" class="input-sm" ng-model="command.image.imageName" required />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">OS Type</div>\n <div class="col-md-6">\n <input type="text" class="input-sm" ng-model="command.image.ostype" required />\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">URI</div>\n <div class="col-md-6">\n <input type="text" class="input-sm" ng-model="command.image.uri" required />\n </div>\n </div>\n </div>\n</div>\n')}]);const Ne="spinnaker.azure.serverGroup.configure.loadBalancer.controller";n(Ne,[y]).controller("azureServerGroupLoadBalancersCtrl",["$scope","loadBalancerReader",function(e,n){function t(t,a){n.getLoadBalancerDetails("azure",e.command.credentials,e.command.region,t).then(function(n){if(n&&0!==n.length){if(n&&1===n.length){const t=n[0],r=e.command.selectedVnet;e.command.selectedVnet=null,e.command.selectedVnetSubnets=[],e.command.allVnets=[],v.listNetworks().then(function(n){n.azure&&n.azure.forEach(n=>{n.account===e.command.credentials&&n.region===e.command.region&&e.command.allVnets.push(n),n.account===e.command.credentials&&n.region===e.command.region&&("Azure Application Gateway"===a&&n.name==t.vnet||"Azure Load Balancer"===a&&n.name===r.name)&&(e.command.selectedVnet=n,n.subnets.map(function(n){let t=!0;n.devices&&n.devices.map(function(e){e&&"applicationGateways"===e.type&&(t=!1)}),t&&e.command.selectedVnetSubnets.push(n.name)}))})})}}else{e.command.selectedVnet;const n=e.command.selectedSubnet;e.command.selectedVnetSubnets=[],e.command.allVnets=[],v.listNetworks().then(function(t){t.azure&&t.azure.forEach(t=>{t.account===e.command.credentials&&t.region===e.command.region&&(e.command.allVnets.push(t),t.subnets.map(function(t){let a=!0;t.devices&&t.devices.map(function(e){e&&"applicationGateways"===e.type&&(a=!1)}),a&&(e.command.selectedVnetSubnets.push(t.name),t.name===n&&(e.command.selectedSubnet=n))}))})})}})}E.markClean("load-balancers"),e.command.credentials&&e.command.region&&(e.command.viewState.networkSettingsConfigured=!0,e.command.selectedVnetSubnets=[],null!==e.command.loadBalancerName&&void 0!==e.command.loadBalancerName&&(e.useLoadBalancer=!0),t(e.command.loadBalancerName,e.command.loadBalancerType)),this.loadBalancerChanged=function(n){e.command.viewState.networkSettingsConfigured=!0,E.markComplete("load-balancers");const a=e.command.backingData.loadBalancers;let r=null;if(a){const e=a.find(e=>e.name===n);e&&(r=$.getLoadBalancerType(e.loadBalancerType).type)}null===n&&(e.command.loadBalancerName=null),e.command.selectedVnetSubnets=[],e.command.loadBalancerType=r,I.clearCache("networks"),t(n,r)}}]);const Pe="spinnaker.azure.serverGroup.configure.loadBalancer.directive";n(Pe,[]).directive("azureServerGroupLoadBalancersSelector",["azureServerGroupConfigurationService",function(){return{restrict:"E",scope:{command:"="},templateUrl:"azure/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.html"}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/loadBalancers/serverGroupLoadBalancersSelector.directive.html",'<h5 class="text-center" ng-if="!command.viewState.loadBalancersConfigured">Please select an account and region.</h5>\n<div\n ng-if="command.viewState.loadBalancersConfigured"\n ng-controller="azureServerGroupLoadBalancersCtrl as loadBalancerCtrl"\n>\n <div class="form-group">\n <div class="col-md-3 sm-label-right"><b>Load Balancers</b></div>\n <div class="col-md-7">\n <label for="useLoadBalancerCheckbox">\n <input\n type="checkbox"\n ng-model="useLoadBalancer"\n id="useLoadBalancerCheckbox"\n ng-change="loadBalancerCtrl.loadBalancerChanged(null)"\n />\n Use load balancer\n </label>\n <ui-select\n ng-model="command.loadBalancerName"\n class="form-control input-sm"\n ng-change="loadBalancerCtrl.loadBalancerChanged($select.selected)"\n ng-show="useLoadBalancer"\n >\n <ui-select-match placeholder="select a loadBalancer">{{$select.selected}}</ui-select-match>\n <ui-select-choices repeat="loadBalancer in command.loadBalancers | filter: $select.search">\n <span ng-bind-html="loadBalancer | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-show="command.loadBalancerName">\n <div class="col-md-12">\n <div class="well-compact" ng-class="well">\n <h5 class="text-center">\n <p>The load balancer {{command.loadBalancerName}} is an {{command.loadBalancerType}}</p>\n </h5>\n </div>\n </div>\n </div>\n</div>\n')}]);const Re="spinnaker.azure.serverGroup.configure.networkSettings.controller";n(Re,[]).controller("azureServerGroupNetworkSettingsCtrl",["$scope",function(e){E.markClean("network-settings"),e.command.selectedVnet={name:e.command.vnet},e.command.selectedSubnet=e.command.subnet,this.vnetChanged=function(n){e.command.vnet=n,e.command.subnet=e.command.selectedSubnet=null,e.command.selectedVnetSubnets=n.subnets.map(e=>e.name)},this.networkSettingsChanged=function(n){e.command.vnet=e.command.selectedVnet.name,e.command.subnet=n,E.markComplete("network-settings")},this.getVnetName=function(){return e.command.selectedVnet?e.command.selectedVnet.name:"Virtual network was not selected"}}]);const Le="spinnaker.azure.serverGroup.configure.networkSettings.directive";n(Le,[]).directive("azureServerGroupNetworkSettingsSelector",function(){return{restrict:"E",scope:{command:"="},templateUrl:"azure/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.html"}}),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/networkSettings/ServerGroupNetworkSettingsSelector.directive.html",'<h5 class="text-center" ng-if="!command.viewState.networkSettingsConfigured">\n Please select an account, a region and a load balancer first.\n</h5>\n<div\n ng-if="command.viewState.networkSettingsConfigured"\n ng-controller="azureServerGroupNetworkSettingsCtrl as networkSettingCtrl"\n>\n <div class="form-group" ng-if="command.loadBalancerType === \'Azure Load Balancer\' || !command.loadBalancerType">\n <div class="col-md-3 sm-label-right">Virtual Network</div>\n <div class="col-md-7">\n <ui-select\n required\n class="form-control input-sm"\n ng-model="command.selectedVnet"\n on-select="networkSettingCtrl.vnetChanged($item)"\n >\n <ui-select-match placeholder="Select from existing virtual networks">{{$select.selected.name}}</ui-select-match>\n <ui-select-choices repeat="selectVnet in command.allVnets">\n <span ng-bind-html="selectVnet.name"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group">\n <div class="col-md-3 sm-label-right"><b>Subnets</b></div>\n <div class="col-md-7">\n <ui-select\n required\n ng-model="command.selectedSubnet"\n class="form-control input-sm"\n on-select="networkSettingCtrl.networkSettingsChanged($item)"\n >\n <ui-select-match placeholder="Select from an existing subnet">{{$select.selected}}</ui-select-match>\n <ui-select-choices repeat="subnet in command.selectedVnetSubnets | filter: $select.search">\n <span ng-bind-html="subnet | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group" ng-if="!command.viewState.hideClusterNamePreview">\n <div class="col-md-12">\n <div class="well-compact" ng-class="well">\n <h5 class="text-center">\n <p>Your server group will be using a subnet in virtual network:</p>\n <p>\n <strong> {{networkSettingCtrl.getVnetName()}} </strong>\n </p>\n </h5>\n </div>\n </div>\n </div>\n</div>\n')}]);const Me="spinnaker.azure.serverGroup.configure.securityGroups.controller";n(Me,[]).controller("azureServerGroupSecurityGroupsCtrl",["$scope",function(e){E.markClean("security-groups"),E.markComplete("security-groups"),e.command.selectedSecurityGroup={id:e.command.securityGroupName},this.securityGroupChanged=function(n){e.command.securityGroupName=n.id,E.markComplete("security-groups")}}]);const Ue="spinnaker.azure.serverGroup.configure.securityGroupSelector.directive";n(Ue,[]).directive("azureServerGroupSecurityGroupsSelector",["azureServerGroupConfigurationService",function(e){return{restrict:"E",scope:{command:"="},templateUrl:"azure/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.html",link:function(n){n.firewallLabel=b.get("firewall"),n.getSecurityGroupRefreshTime=function(){return I.get("securityGroups").getStats().ageMax},n.refreshSecurityGroups=function(){n.refreshing=!0,e.refreshSecurityGroups(n.command).then(function(){n.refreshing=!1})}}}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/securityGroup/serverGroupSecurityGroupsSelector.directive.html",'<h5 class="text-center" ng-if="!command.viewState.securityGroupsConfigured">Please select an account and region.</h5>\n<div\n ng-if="command.viewState.securityGroupsConfigured"\n ng-controller="azureServerGroupSecurityGroupsCtrl as securityGroupCtrl"\n>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n <b><firewall-label label="Firewalls"></firewall-label></b>\n </div>\n <div class="col-md-7">\n <ui-select\n ng-model="command.selectedSecurityGroup"\n class="form-control input-sm"\n on-select="securityGroupCtrl.securityGroupChanged($item)"\n >\n <ui-select-match placeholder="select a {{firewallLabel}}">{{$select.selected.id}}</ui-select-match>\n <ui-select-choices\n repeat="securityGroup in command.backingData.filtered.securityGroups | anyFieldFilter: {name: $select.search, id: $select.search}"\n >\n <span ng-bind-html="securityGroup.id | highlight: $select.search"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n\n <div class="form-group small" style="margin-top: 20px">\n <div class="col-md-9 col-md-offset-3">\n <p>\n <span ng-if="refreshing"><span class="fa fa-sync-alt fa-spin"></span></span>\n <firewall-label label="Firewalls"></firewall-label>\n <span ng-if="!refreshing">last refreshed {{ getSecurityGroupRefreshTime() | timestamp }}</span>\n <span ng-if="refreshing"> refreshing...</span>\n </p>\n <p>\n If you\'re not finding a <firewall-label label="firewall"></firewall-label> that was recently added,\n <a href ng-click="refreshSecurityGroups()">click here</a> to refresh the list.\n </p>\n </div>\n </div>\n</div>\n')}]);const Ve="spinnaker.azure.serverGroup.configure.wizard.tags.directive";n(Ve,[]).directive("azureTagsSelector",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/tags/tagsSelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"tagsSelectorCtrl",controller:"TagsSelectorCtrl"}}).controller("TagsSelectorCtrl",["$scope",function(){this.getTagResult=function(){return $.checkTags(this.command.instanceTags)}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/tags/tagsSelector.directive.html",'<div class="form-group">\n <div class="col-md-12" style="color: red" ng-if="!tagsSelectorCtrl.getTagResult().isValid">\n {{ tagsSelectorCtrl.getTagResult().errorMessage }}\n </div>\n <div class="col-md-4 sm-label-left">\n <b>Custom Tags</b>\n <help-field key="azure.serverGroup.customTags"></help-field>\n </div>\n <div class="col-md-12">\n <map-editor\n model="tagsSelectorCtrl.command.instanceTags"\n add-button-label="Add New Tags"\n allow-empty="true"\n ></map-editor>\n </div>\n</div>\n')}]);const He="spinnaker.azure.serverGroup.configure.wizard.capacity.zone.directive";n(He,[]).directive("azureZoneSelector",function(){return{restrict:"E",templateUrl:"azure/src/serverGroup/configure/wizard/zones/zoneSelector.directive.html",scope:{},bindToController:{command:"="},controllerAs:"vm",controller:["$scope",function(e){this.updateEnableInboundNAT=()=>{e.vm.command.zonesEnabled&&(e.vm.command.enableInboundNAT=!1)}}]}}),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/zones/zoneSelector.directive.html",'<div class="form-group" ng-if="vm.command.region">\n <div class="col-md-10">\n <label ng-if="vm.command.backingData.filtered.zones && vm.command.backingData.filtered.zones.length !== 0">\n <input type="checkbox" ng-model="vm.command.zonesEnabled" ng-change="vm.updateEnableInboundNAT()" />\n Set availability zones\n </label>\n <ui-select multiple ng-if="vm.command.zonesEnabled" ng-model="vm.command.zones" class="form-control input-sm">\n <ui-select-match>{{ $item }}</ui-select-match>\n <ui-select-choices repeat="zone as zone in vm.command.backingData.filtered.zones">\n <span>{{ zone }}</span>\n </ui-select-choices>\n </ui-select>\n </div>\n</div>\n<h5 class="text-center" ng-if="!vm.command.region">Please select a region.</h5>\n<h5\n class="text-center"\n ng-if="vm.command.region && !(vm.command.backingData.filtered.zones && vm.command.backingData.filtered.zones.length !== 0)"\n>\n Current region does not support availability zones\n</h5>\n')}]);const _e="spinnaker.azure.serverGroup.configure";n(_e,[Ge,Ne,De,we,Me,Ce,Te,xe,Ee,Fe,Pe,Ie,Ue,ce,ze,Re,Le,He,Ve]);const Oe="spinnaker.azure.serverGroup.configure.service";e.module(Oe,[K,y,A,F,ee]).factory("azureServerGroupConfigurationService",["$q","azureImageReader","securityGroupReader","cacheInitializer","loadBalancerReader","azureInstanceTypeService",function(n,t,a,r,l,i){const s=["Standard_LRS","StandardSSD_LRS","Premium_LRS"],o=["None","ReadOnly","ReadWrite"],c=["EC2","ELB"],d=["OldestInstance","NewestInstance","OldestLaunchConfiguration","ClosestToNextInstanceHour","Default"];function u(n){const t={dirty:{}};if(n.region){const a=[t.dirty];a.push(function(e){const n=e,t={dirty:{}},a=[n.region],{credentialsKeyedByAccount:r}=n.backingData,{locationToInstanceTypesMap:l}=r[n.credentials];if(a.every(e=>!e))return t;const s=i.getAvailableTypesForRegions(l,a).map(e=>e.name),o=n.instanceType;_.every([o,!_.startsWith(o,"custom"),!_.includes(s,o)])&&(t.dirty.instanceType=n.instanceType,n.instanceType=null);return n.backingData.filtered.instanceTypes=s,t}(n).dirty),e.extend(...a)}else n.backingData.filtered.instanceTypes=[];return t}function p(e){const n={dirty:{}},t=e.backingData.filtered;if(!e.region)return n;let{regionsSupportZones:a,availabilityZones:r}=e.backingData.credentialsKeyedByAccount[e.credentials];return a=a||[],r=r||[],t.zones=a.includes(e.region)?r:[],n}function g(e){const n=e.backingData.securityGroups[e.credentials]||{azure:{}};return _.chain(n[e.region]).sortBy("name").value()}function m(e){const n={dirty:{}};let t;e.backingData.filtered.securityGroups&&(t=e.backingData.filtered.securityGroups);const a=g(e);return e.selectedSecurityGroup&&(e.selectedSecurityGroup=null,n.dirty.securityGroups=!0),t!=a&&(e.backingData.filtered.securityGroups=a,n.dirty.securityGroups=!0),0===e.backingData.filtered.securityGroups.length?e.viewState.securityGroupsConfigured=!1:e.viewState.securityGroupsConfigured=!0,n}function v(e){return _.chain(e).map("name").uniq().value().sort()}function h(e){const n={dirty:{}},t=e.loadBalancers,a=v(e.backingData.loadBalancers);if(t&&e.loadBalancers){const r=_.intersection(a,e.loadBalancers),l=_.xor(r,t);e.loadBalancers=r,l.length&&(n.dirty.loadBalancers=l)}return e.backingData.filtered.loadBalancers=a,n}function B(e){const n=e.backingData.loadBalancers,t=_.filter(n,function(n){return n.account===e.credentials&&n.region===e.region});return e.loadBalancers=v(t),e.viewState.loadBalancersConfigured=!0,{dirty:{}}}return{configureUpdateCommand:function(n){n.backingData={healthCheckTypes:e.copy(c),terminationPolicies:e.copy(d)}},configureCommand:function(t,r){return n.all([f.getCredentialsKeyedByAccount("azure"),a.loadSecurityGroups(),l.loadLoadBalancers(t.name)]).then(function([n,t,a]){var l;r.backingData={credentialsKeyedByAccount:n,securityGroups:t,loadBalancers:a,dataDiskTypes:e.copy(s),dataDiskCachingTypes:e.copy(o),accounts:_.keys(n),filtered:{}},(l=r).regionChanged=function(n,t=!1){const a={dirty:{}};return n.region&&n.credentials&&(e.extend(a.dirty,B(n).dirty),e.extend(a.dirty,m(n).dirty),e.extend(a.dirty,u(n).dirty),e.extend(a.dirty,p(n).dirty)),t||(n.loadBalancerName=null,n.loadBalancerType=null,n.vnet=null,n.vnetResourceGroup=null,n.subnet=null,n.selectedSubnet=null,n.selectedVnet=null,n.selectedVnetSubnets=[],n.viewState.networkSettingsConfigured=!1,n.selectedSecurityGroup=null,n.securityGroupName=null,n.zonesEnabled=!1,n.zones=[]),a},l.credentialsChanged=function(n,t){const a={dirty:{}},r=n.backingData;if(n.credentials){const l=r.credentialsKeyedByAccount[n.credentials]||{regions:[]};r.filtered.regions=l.regions,_.chain(r.filtered.regions).some({name:n.region}).value()?e.extend(a.dirty,n.regionChanged(n,t).dirty):(n.region=null,a.dirty.region=!0),n.region&&e.extend(a.dirty,B(n).dirty),e.extend(a.dirty,u(n).dirty)}else n.region=null;return a}})},configureImages:function(e){const n={dirty:{}};let t=null;return e.viewState.disableImageSelection||(e.region?(t=e.backingData.packageImages.filter(function(n){return n.amis&&n.amis[e.region]}).map(function(n){return{imageName:n.imageName,ami:n.amis?n.amis[e.region][0]:null}}),e.amiName&&!t.some(function(n){return n.imageName===e.amiName})&&(n.dirty.amiName=!0,e.amiName=null)):e.amiName=null,e.backingData.filtered.images=t),n},configureSecurityGroupOptions:m,configureLoadBalancerOptions:h,refreshLoadBalancers:function(e,n){return l.listLoadBalancers("azure").then(function(t){e.backingData.loadBalancers=t,n||h(e)})},refreshSecurityGroups:function(e,n){return r.refreshCache("securityGroups").then(function(){return a.getAllSecurityGroups().then(function(t){e.backingData.securityGroups=t,n||m(e)})})},getRegionalSecurityGroups:g,refreshInstanceTypes:function(e){return r.refreshCache("instanceTypes").then(function(){return i.getAllTypesByRegion().then(function(n){e.backingData.instanceTypes=n,u(e)})})},configureZones:p}}]);const Qe="spinnaker.azure.cloneServerGroup.controller";n(Qe,[O,Oe,ce,x]).controller("azureCloneServerGroupCtrl",["$scope","$uibModalInstance","$q","$state","serverGroupWriter","azureServerGroupConfigurationService","serverGroupCommand","application","title",function(e,n,t,a,r,l,i,s,o){function c(){if(e.$$destroyed)return;const n=e.taskMonitor.task.execution.stages.find(e=>"cloneServerGroup"===e.type);if(n&&n.context["deploy.server.groups"]){const t=n.context["deploy.server.groups"][e.command.region];if(t){const n={serverGroup:t,accountId:e.command.credentials,region:e.command.region,provider:"azure"};let r="^.^.^.clusters.serverGroup";a.includes("**.clusters.serverGroup")&&(r="^.serverGroup"),a.includes("**.clusters.cluster.serverGroup")&&(r="^.^.serverGroup"),a.includes("**.clusters")&&(r=".serverGroup"),a.go(r,n)}}}function d(){l.configureCommand(s,i).then(function(){const n=i.viewState.mode;"clone"!==n&&"create"!==n||(i.viewState.useAllImageSelection=!0),e.state.loaded=!0,function(){const e=i.viewState.mode;"clone"!==e&&"editPipeline"!==e||(E.markComplete("basic-settings"),E.markComplete("load-balancers"),E.markComplete("network-settings"),E.markComplete("security-groups"),E.markComplete("instance-type"),E.markComplete("zones"))}(),p(e.command.credentialsChanged(e.command,!0)),p(e.command.regionChanged(e.command,!0)),e.$watch("command.credentials",u(e.command.credentialsChanged)),e.$watch("command.region",u(e.command.regionChanged))})}function u(n){return function(t,a){t!==a&&p(n(e.command))}}function p(e){e.dirty.loadBalancers&&(E.markDirty("load-balancers"),E.markDirty("network-settings")),e.dirty.securityGroups&&E.markDirty("security-groups"),e.dirty.instanceType&&E.markDirty("instance-type"),(e.dirty.zoneEnabled||e.dirty.zones)&&E.markDirty("zones")}e.pages={templateSelection:"azure/src/serverGroup/configure/wizard/templateSelection.html",basicSettings:"azure/src/serverGroup/configure/wizard/basicSettings/basicSettings.html",imageSettings:"azure/src/serverGroup/configure/wizard/image/imageSettings.html",healthSettings:"azure/src/serverGroup/configure/wizard/healthSettings/healthSettings.html",loadBalancers:"azure/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html",networkSettings:"azure/src/serverGroup/configure/wizard/networkSettings/networkSettings.html",securityGroups:"azure/src/serverGroup/configure/wizard/securityGroup/securityGroups.html",instanceType:"azure/src/serverGroup/configure/wizard/instanceType/instanceType.html",zones:"azure/src/serverGroup/configure/wizard/capacity/zones.html",tags:"azure/src/serverGroup/configure/wizard/tags/tags.html",advancedSettings:"azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html"},e.firewallsLabel=b.get("Firewalls"),e.title=o,e.applicationName=s.name,e.application=s,e.command=i,e.command.backingData=e.command.backingData||{},e.command.backingData.filtered=e.command.backingData.filtered||{},e.command.backingData.filtered.regions=e.command.backingData.filtered.regions||[],e.state={loaded:!1,requiresTemplateSelection:!!i.viewState.requiresTemplateSelection},this.templateSelectionText={copied:["account, region, subnet, cluster name (stack, details)","load balancers",b.get("firewalls"),"instance type","all fields on the Advanced Settings page"],notCopied:[],additionalCopyText:"If a server group exists in this cluster at the time of deployment, its scaling policies will be copied over to the new server group."},e.command.viewState.disableStrategySelection||this.templateSelectionText.notCopied.push("the deployment strategy (if any) used to deploy the most recent server group"),e.taskMonitor=new m({application:s,title:"Creating your server group",modalInstance:n,onTaskComplete:function(){s.serverGroups.refresh(),s.serverGroups.onNextRefresh(e,c)}}),this.submit=function(){if("editPipeline"===e.command.viewState.mode||"createPipeline"===e.command.viewState.mode)return n.close(e.command);e.taskMonitor.submit(function(){return r.cloneServerGroup(e.command,s)})},this.cancel=function(){n.dismiss()},this.toggleSuspendedProcess=function(n){e.command.suspendedProcesses=e.command.suspendedProcesses||[];const t=e.command.suspendedProcesses.indexOf(n);-1===t?e.command.suspendedProcesses.push(n):e.command.suspendedProcesses.splice(t,1)},this.processIsSuspended=function(n){return e.command.suspendedProcesses.includes(n)},e.state.requiresTemplateSelection?e.state.loaded=!0:d(),this.templateSelected=()=>{e.state.requiresTemplateSelection=!1,d()},this.isValid=function(){return e.command&&e.command.application&&e.command.credentials&&e.command.instanceType&&e.command.region&&(!e.command.zonesEnabled||0!==e.command.zones.length)&&$.checkTags(e.command.instanceTags).isValid}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/templateSelection.html",'<deploy-initializer\n cloud-provider="azure"\n command="command"\n application="application"\n parent-state="state"\n dismiss="ctrl.cancel()"\n template-selection-text="ctrl.templateSelectionText"\n on-template-selected="ctrl.templateSelected()"\n></deploy-initializer>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/basicSettings/basicSettings.html",'<div class="container-fluid form-horizontal" ng-controller="azureServerGroupBasicSettingsCtrl as basicSettingsCtrl">\n <div class="modal-body">\n <ng-form name="basicSettings">\n <div class="form-group">\n <div class="col-md-3 sm-label-right">Account</div>\n <div class="col-md-7">\n <account-select-field\n required\n read-only="command.viewState.readOnlyFields.credentials"\n component="command"\n field="credentials"\n accounts="command.backingData.accounts"\n provider="\'azure\'"\n ></account-select-field>\n </div>\n </div>\n <region-select-field\n required\n read-only="command.viewState.readOnlyFields.region"\n label-columns="3"\n component="command"\n field="region"\n account="command.credentials"\n provider="\'azure\'"\n regions="command.backingData.filtered.regions"\n ></region-select-field>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n Stack\n <help-field key="azure.serverGroup.stack"></help-field>\n </div>\n <div class="col-md-7">\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-pattern="basicSettingsCtrl.stackPattern"\n name="stack"\n ng-model="command.stack"\n />\n </div>\n </div>\n <div class="form-group row slide-in" ng-if="basicSettings.stack.$error.pattern">\n <div class="col-sm-9 col-sm-offset-2 error-message">\n <span>Stack can only contain letters and numbers.</span>\n </div>\n </div>\n <div class="form-group">\n <div class="col-md-3 sm-label-right">\n Detail\n <help-field key="azure.serverGroup.detail"></help-field>\n </div>\n <div class="col-md-7">\n <input\n required\n type="text"\n class="form-control input-sm"\n ng-pattern="basicSettingsCtrl.detailPattern"\n name="details"\n ng-model="command.freeFormDetails"\n />\n </div>\n </div>\n <div class="form-group row slide-in" ng-if="basicSettings.details.$error.pattern">\n <div class="col-sm-9 col-sm-offset-2 error-message">\n <span>Detail can only contain letters, numbers, and dashes(-).</span>\n </div>\n </div>\n <div class="form-group" ng-if="!command.viewState.disableImageSelection">\n <div class="col-md-3 sm-label-right">\n Image\n <help-field key="azure.serverGroup.imageName"></help-field>\n </div>\n <div class="col-md-9">\n <ui-select\n class="form-control input-sm"\n required\n ng-model="command.selectedImage"\n on-select="basicSettingsCtrl.imageChanged($item)"\n >\n <ui-select-match placeholder="Pick an image">{{$select.selected.imageName}}</ui-select-match>\n <ui-select-choices repeat="image in command.images | regional:command.region | filter:$select.search">\n <span ng-bind-html="image.imageName"></span>\n </ui-select-choices>\n </ui-select>\n </div>\n </div>\n <deployment-strategy-selector\n ng-if="!command.viewState.disableStrategySelection && command.selectedProvider"\n command="command"\n ></deployment-strategy-selector>\n <div class="form-group" ng-if="!command.viewState.hideClusterNamePreview">\n <div class="col-md-12">\n <div\n class="well-compact"\n ng-class="basicSettingsCtrl.showPreviewAsWarning() ? \'alert alert-warning\' : \'well\'"\n >\n <h5 class="text-center">\n <p>Your server group will be in the cluster:</p>\n <p>\n <strong>\n {{basicSettingsCtrl.getNamePreview()}}\n <span ng-if="basicSettingsCtrl.createsNewCluster()"> (new cluster)</span>\n </strong>\n </p>\n <div\n class="text-left"\n ng-if="!basicSettingsCtrl.createsNewCluster() && command.viewState.mode === \'create\' && latestServerGroup"\n >\n <p>There is already a server group in this cluster. Do you want to clone it?</p>\n <p>\n Cloning copies the entire configuration from the selected server group, allowing you to modify\n whichever fields (e.g. image) you need to change in the new server group.\n </p>\n <p>\n To clone a server group, select "Clone" from the "Server Group Actions" menu in the details view of\n the server group.\n </p>\n <p>\n <a href ng-click="basicSettingsCtrl.navigateToLatestServerGroup()">\n Go to details for {{latestServerGroup.name}}\n </a>\n </p>\n </div>\n </h5>\n </div>\n </div>\n </div>\n </ng-form>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/image/imageSettings.html",'<div class="row">\n <div class="col-md-12">\n <azure-server-group-image-settings-selector command="command"></azure-server-group-image-settings-selector>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/healthSettings/healthSettings.html",'<div class="row">\n <div class="col-md-12">\n <azure-server-group-health-settings-selector command="command"></azure-server-group-health-settings-selector>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/loadBalancers/loadBalancers.html",'<div class="row">\n <azure-server-group-load-balancers-selector command="command"></azure-server-group-load-balancers-selector>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/networkSettings/networkSettings.html",'<div class="row">\n <azure-server-group-network-settings-selector command="command"></azure-server-group-network-settings-selector>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/securityGroup/securityGroups.html",'<div class="row">\n <azure-server-group-security-groups-selector command="command"></azure-server-group-security-groups-selector>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/instanceType/instanceType.html",'<div ng-show="!!(command.region)">\n <v2-instance-archetype-selector ng-if="command.region" command="command"></v2-instance-archetype-selector>\n <div style="padding: 0 15px">\n <v2-instance-type-selector\n ng-if="command.viewState.instanceProfile && !(command.viewState.instanceProfile === \'custom\' || command.viewState.instanceProfile === \'buildCustom\' )"\n command="command"\n ></v2-instance-type-selector>\n </div>\n</div>\n<h5 class="text-center" ng-if="!command.region">Please select a region.</h5>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/capacity/zones.html",'<ng-form name="zonesSubForm">\n <div class="container-fluid form-horizontal">\n <azure-zone-selector command="command"></azure-zone-selector>\n </div>\n</ng-form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/tags/tags.html",'<ng-form name="zonesSubForm">\n <div class="container-fluid form-horizontal">\n <azure-tags-selector command="command"></azure-tags-selector>\n </div>\n</ng-form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/advancedSettings/advancedSettings.html",'<div class="row">\n <div class="col-md-12">\n <azure-server-group-advanced-settings-selector command="command"></azure-server-group-advanced-settings-selector>\n </div>\n</div>\n')}]);class qe extends q.Component{constructor(e){super(e),this.state={verified:!1},this.handleVerification=e=>{this.setState({verified:e})}}render(){const{onSubmit:e,onCancel:n,isValid:t,account:a}=this.props,{verified:r}=this.state;return q.createElement("div",{className:"modal-footer"},q.createElement(N,{expectedValue:a,onValidChange:this.handleVerification}),q.createElement("button",{className:"btn btn-default",onClick:n},"Cancel"),q.createElement("button",{type:"submit",className:"btn btn-primary",onClick:e,disabled:!t||!r},"Submit"))}}const Xe=class e extends q.Component{constructor(e){super(e),this.close=e=>{this.props.dismissModal.apply(null,e)},this.submit=()=>{const{command:e,taskMonitor:n}=this.state,{serverGroup:t,application:a}=this.props;n.submit(()=>P.serverGroupWriter.rollbackServerGroup(t,a,e))},this.filterServerGroups=e=>e.filter(e=>0!==e.instanceCounts.total).sort((e,n)=>n.name.localeCompare(e.name)),this.isValid=()=>void 0!==this.state.command.rollbackContext.restoreServerGroupName,this.handleServerGroupChange=e=>{const{disabledServerGroups:n}=this.props,t={...this.state.command};t.rollbackContext.restoreServerGroupName=e.value;const a=this.filterServerGroups(n).find(function(n){return n.name===e.value});t.targetSize=a.capacity.max,this.setState({command:t})},this.handleTaskReasonChange=e=>{const n={...this.state.command};n.reason=e,this.setState({command:n})};const{application:n,serverGroup:t}=e;this.state={taskMonitor:new m({application:n,title:"Rolling back your server group",modalInstance:m.modalInstanceEmulation(()=>this.props.dismissModal())}),submitting:!0,command:{interestingHealthProviderNames:[],rollbackType:"EXPLICIT",rollbackContext:{rollbackServerGroupName:t.name,enableAndDisableOnly:!0}}}}static show(n){return d.show(e,n,{})}render(){const{command:e,taskMonitor:n,submitting:t}=this.state,{serverGroup:a,disabledServerGroups:r}=this.props,l=this.isValid(),i=this.filterServerGroups(r).map(e=>({label:e.name,value:e.name}));return q.createElement(X,{onHide:this.close},q.createElement(R,{monitor:n}),t&&q.createElement("form",{role:"form"},q.createElement(u,{dismiss:this.close}),q.createElement(X.Header,null,q.createElement(X.Title,null,"Rollback ",a.name)),q.createElement(X.Body,null,q.createElement("div",{className:"row"},q.createElement("div",{className:"col-sm-3 sm-label-right"},"Restore to"),q.createElement("div",{className:"col-sm-6"},q.createElement(j,{value:e.rollbackContext.restoreServerGroupName,onChange:this.handleServerGroupChange,options:i}))),q.createElement(L,{reason:e.taskReason,onChange:this.handleTaskReasonChange})),q.createElement(qe,{onSubmit:this.submit,onCancel:this.close,isValid:l,account:a.account})))}};Xe.defaultProps={closeModal:p,dismissModal:p};let We=Xe;const je="spinnaker.azure.serverGroup.details.controller";e.module(je,[O,de,x]).controller("azureServerGroupDetailsCtrl",["$scope","$state","$templateCache","app","serverGroup","azureServerGroupCommandBuilder","$uibModal","serverGroupWriter",function(n,t,a,r,i,s,o,c){function d(){const a=function(){let e=_.find(r.serverGroups.data,function(e){return e.name===i.name&&e.account===i.accountId&&e.region===i.region});return e||r.loadBalancers.data.some(function(n){if(n.account===i.accountId&&n.region===i.region)return n.serverGroups.some(function(n){if(n.name===i.name)return e=n,!0})}),e||t.go("^"),e}();return U.getServerGroup(r.name,i.accountId,i.region,i.name).then(function(l){if(n.state.loading=!1,e.extend(l,a),l.account=i.accountId,n.serverGroup=l,_.isEmpty(n.serverGroup))t.go("^");else{if(n.image=l.image?l.image:void 0,l.image&&l.image.description){l.image.description.split(", ").forEach(function(e){const n=e.split("=");2===n.length&&"ancestor_name"===n[0]&&(l.image.baseImage=n[1])})}l.launchConfig&&l.launchConfig.securityGroups&&(n.securityGroups=_.chain(l.launchConfig.securityGroups).map(function(e){return _.find(r.securityGroups.data,{accountName:i.accountId,region:i.region,id:e})||_.find(r.securityGroups.data,{accountName:i.accountId,region:i.region,name:e})}).compact().value())}})}n.state={loading:!0},n.firewallsLabel=b.get("Firewalls"),this.application=r,d().then(()=>{n.$$destroyed||r.serverGroups.onRefresh(n,d)}),this.destroyServerGroup=function(){const e=n.serverGroup,a={name:e.name,accountId:e.account,region:e.region},i={application:r,title:"Destroying "+e.name,onTaskComplete:function(){t.includes("**.serverGroup",a)&&t.go("^")}},s={header:"Really destroy "+e.name+"?",buttonText:"Destroy "+e.name,account:e.account,taskMonitorConfig:i,submitMethod:function(){return c.destroyServerGroup(e,r)}};M.addDestroyWarningMessage(r,e,s),l.confirm(s)},this.disableServerGroup=function(){const e=n.serverGroup,t={application:r,title:"Disabling "+e.name},a={header:"Really disable "+e.name+"?",buttonText:"Disable "+e.name,account:e.account,taskMonitorConfig:t,submitMethod:()=>c.disableServerGroup(e,r)};M.addDisableWarningMessage(r,e,a),l.confirm(a)},this.enableServerGroup=function(){const t=n.serverGroup,a={application:r,title:"Enabling "+t.name};l.confirm({header:"Really enable "+t.name+"?",buttonText:"Enable "+t.name,account:t.account,taskMonitorConfig:a,submitMethod:n=>c.enableServerGroup(t,r,e.extend(n,{interestingHealthProviderNames:[]}))})},this.rollbackServerGroup=()=>{const e=n.serverGroup,t=_.find(r.clusters,{name:e.cluster,account:e.account}),a=_.filter(t.serverGroups,{isDisabled:!0,region:e.region});We.show({application:r,serverGroup:e,disabledServerGroups:a})},this.cloneServerGroup=e=>{o.open({templateUrl:"azure/src/serverGroup/configure/wizard/serverGroupWizard.html",controller:"azureCloneServerGroupCtrl as ctrl",size:"lg",resolve:{title:()=>"Clone "+e.name,application:()=>r,serverGroupCommand:()=>s.buildServerGroupCommandFromExisting(r,e)}})},this.truncateCommitHash=function(){return n.serverGroup&&n.serverGroup.buildInfo&&n.serverGroup.buildInfo.commit?n.serverGroup.buildInfo.commit.substring(0,8):null}}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/serverGroupWizard.html",'<div>\n <div ng-if="state.requiresTemplateSelection">\n <ng-include src="pages.templateSelection"></ng-include>\n </div>\n <div ng-if="!state.loaded" style="height: 200px" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div>\n <form name="serverGroupWizardForm" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard\n ng-show="state.loaded && !state.requiresTemplateSelection"\n heading="{{title}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="basic-settings" label="Basic Settings" hide-subheading="true">\n <ng-include src="pages.basicSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="image-settings" label="Image">\n <ng-include src="pages.imageSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="load-balancers" label="Load Balancers" mark-complete-on-view="false">\n <ng-include src="pages.loadBalancers"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="network-settings" label="Network Settings" mark-complete-on-view="false">\n <ng-include src="pages.networkSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="health-settings" label="Health" mark-complete-on-view="false">\n <ng-include src="pages.healthSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="security-groups" label="{{firewallsLabel}}" mark-complete-on-view="false" done="true">\n <ng-include src="pages.securityGroups"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="instance-type" label="Instance Type" mark-complete-on-view="false" done="false">\n <ng-include src="pages.instanceType"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="zones" label="Zones" mark-complete-on-view="false" done="false">\n <ng-include src="pages.zones"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="tags" label="Tags" mark-complete-on-view="false" done="true">\n <ng-include src="pages.tags"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="advanced-settings" label="Advanced Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer" ng-if="state.loaded">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">\n Cancel\n </button>\n <submit-button\n is-disabled="taskMonitor.submitting || !ctrl.isValid()"\n label="command.viewState.submitButtonLabel"\n submitting="taskMonitor.submitting"\n on-click="serverGroupWizardForm.$valid && ctrl.submit()"\n is-new="true"\n ></submit-button>\n </div>\n </form>\n </div>\n</div>\n')}]);const Ye="spinnaker.azure.serverGroup.details.azure";n(Ye,[je]);const Ze="spinnaker.azure.validation.applicationName";n(Ze,[]).factory("azureApplicationNameValidator",function(){return{validate:function(e){const n=[];return e&&e.length&&function(e,n){/^([a-zA-Z][a-zA-Z0-9]*)?$/.test(e)||n.push("The application name must begin with a letter and must contain only letters or digits. No special characters are allowed.")}(e,n),{warnings:[],errors:n}}}}).run(["azureApplicationNameValidator",function(e){V.registerValidator("azure",e)}]);!function(e,n){void 0===n&&(n={});var t=n.insertAt;if("undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===t&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}('.cloud-provider-logo .icon-azure {\n -webkit-mask-image: url("data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 22.1.0%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg version%3D%221.1%22 id%3D%22Layer_1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22 x%3D%220px%22 y%3D%220px%22%09 viewBox%3D%220 0 48 48%22 style%3D%22enable-background%3Anew 0 0 48 48%3B%22 xml%3Aspace%3D%22preserve%22%3E%3Cstyle type%3D%22text%2Fcss%22%3E%09.st0%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2300A2D8%3B%7D%09.st1%7Bfill%3A%23F79E1C%3B%7D%09.st2%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232ABAEC%3B%7D%09.st3%7Bfill%3A%23F7B218%3B%7D%09.st4%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3Anone%3B%7D%09.st5%7Bfill%3A%2300A2D8%3B%7D%09.st6%7Bfill%3A%232ABAEC%3B%7D%09.st7%7Bfill%3A%23323A45%3B%7D%09.st8%7Bfill%3A%2388909B%3B%7D%09.st9%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st10%7Bfill%3A%23A3BF3A%3B%7D%09.st11%7Bfill%3A%2380A23E%3B%7D%09.st12%7Bfill%3A%237B4D87%3B%7D%09.st13%7Bfill%3A%232F75BB%3B%7D%09.st14%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2385C9D5%3B%7D%09.st15%7Bopacity%3A0.15%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st16%7Bfill%3A%23A5D9E2%3B%7D%09.st17%7Bfill%3A%2385C9D5%3B%7D%09.st18%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23323A45%3B%7D%09.st19%7Bfill%3A%23FFFFFF%3B%7D%09.st20%7Bfill%3A%23DAEFF3%3B%7D%09.st21%7Bfill%3A%232A65AF%3B%7D%09.st22%7Bfill%3A%23F6ECF4%3B%7D%09.st23%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232F75BB%3B%7D%09.st24%7Bfill%3Anone%3B%7D%09.st25%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9BA19%3B%7D%09.st26%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23A3BF3A%3B%7D%09.st27%7Bfill%3A%23F6931D%3B%7D%09.st28%7Bfill%3A%235E6D80%3B%7D%09.st29%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3B%7D%09.st30%7Bfill%3A%2300B8E2%3B%7D%09.st31%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%235E6D80%3B%7D%09.st32%7Bfill%3Anone%3Bstroke%3A%2385C9D5%3Bstroke-width%3A0%3Bstroke-linecap%3Around%3Bstroke-linejoin%3Around%3B%7D%09.st33%7Bfill%3A%232A89CA%3B%7D%09.st34%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237B4D87%3B%7D%09.st35%7Bopacity%3A0.3%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st36%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3B%7D%09.st37%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2378B843%3B%7D%09.st38%7Bfill%3A%2378B843%3B%7D%09.st39%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23EDF0F4%3B%7D%09.st40%7Bfill%3A%23005BA3%3B%7D%09.st41%7Bfill%3A%230F80B0%3B%7D%09.st42%7Bfill%3A%23005F87%3B%7D%09.st43%7Bfill%3A%23B7D332%3B%7D%09.st44%7Bfill%3A%237FB900%3B%7D%09.st45%7Bopacity%3A0.6%3Bfill%3A%23FFFFFF%3B%7D%09.st46%7Bopacity%3A0.4%3Bfill%3A%23FFFFFF%3B%7D%09.st47%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_13_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st48%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_64_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st49%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_65_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st50%7Bfill%3A%2373BDCD%3B%7D%09.st51%7Bopacity%3A0.6%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st52%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3Bstroke%3A%23FFFFFF%3Bstroke-width%3A4%3Bstroke-miterlimit%3A10%3B%7D%09.st53%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3B%7D%09.st54%7Bclip-path%3Aurl(%23XMLID_67_)%3Bfill%3Anone%3B%7D%09.st55%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F7B218%3B%7D%09.st56%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_69_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st57%7Bopacity%3A0.8%3Bfill%3A%23FFFFFF%3B%7D%09.st58%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_79_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st59%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23DB5B26%3B%7D%09.st60%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F58B1F%3B%7D%09.st61%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_84_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st62%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23404B59%3B%7D%09.st63%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_118_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st64%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23D1B0D3%3B%7D%09.st65%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_119_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st66%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2315B2E7%3B%7D%09.st67%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23E1F3F8%3B%7D%09.st68%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_120_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st69%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_124_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st70%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_125_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st71%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_126_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st72%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237C8737%3B%7D%09.st73%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_127_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st74%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_130_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st75%7Bfill%3A%23CCCBCB%3B%7D%09.st76%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2388909B%3B%7D%09.st77%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st78%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_131_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st79%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_133_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st80%7Bdisplay%3Anone%3B%7D%09.st81%7Bfill%3A%2345B6F4%3B%7D%09.st82%7Bfill%3A%2389919C%3B%7D%09.st83%7Bfill%3A%2361ADD1%3B%7D%09.st84%7Bfill%3A%233899C6%3B%7D%09.st85%7Bfill%3A%23F78F08%3B%7D%09.st86%7Bfill%3A%23C1BFBC%3B%7D%09.st87%7Bfill%3A%237A7A7A%3B%7D%09.st88%7Bfill%3A%23B3B4B5%3B%7D%09.st89%7Bopacity%3A0.48%3B%7D%09.st90%7Bfill%3A%23A0A1A2%3B%7D%09.st91%7Bfill%3A%23A1DEF0%3B%7D%09.st92%7Bfill%3A%23804998%3B%7D%09.st93%7Bfill%3A%230072C6%3B%7D%09.st94%7Bfill%3A%2359B4D9%3B%7D%09.st95%7Bfill%3A%233999C6%3B%7D%09.st96%7Bfill%3A%230078D7%3B%7D%09.st97%7Bfill%3A%23D1B972%3B%7D%09.st98%7Bfill%3A%23FEE087%3B%7D%09.st99%7Bfill%3A%23B1CE2D%3B%7D%09.st100%7Bfill%3A%237FBA00%3B%7D%09.st101%7Bfill%3A%23FCD116%3B%7D%09.st102%7Bfill%3A%23719904%3B%7D%09.st103%7Bfill%3A%23B8D432%3B%7D%09.st104%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23804898%3B%7D%09.st105%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%236B2980%3B%7D%09.st106%7Bfill%3A%236B2980%3B%7D%09.st107%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st108%7Bopacity%3A0.2%3Bfill%3A%231E1E1E%3Benable-background%3Anew %3B%7D%09.st109%7Bfill%3A%2333BCF0%3B%7D%09.st110%7Bopacity%3A0.2%3Bfill%3A%23636363%3B%7D%09.st111%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_134_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st112%7Bfill%3A%238B77B6%3B%7D%09.st113%7Bfill%3A%239B6CAC%3B%7D%09.st114%7Bfill%3A%23874B94%3B%7D%09.st115%7Bopacity%3A0.4%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st116%7Bopacity%3A0.8%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st117%7Bopacity%3A0.6%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st118%7Bopacity%3A0.25%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st119%7Bfill%3A%23DD5900%3B%7D%09.st120%7Bfill%3A%23FF8C00%3B%7D%09.st121%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%233E3E3E%3B%7D%09.st122%7Bfill%3Aurl(%23path3060_1_)%3B%7D%09.st123%7Bfill%3A%231870C5%3B%7D%09.st124%7Bfill%3A%2372BFDF%3B%7D%09.st125%7Bfill%3A%233C3938%3B%7D%09.st126%7Bfill%3A%230072AC%3B%7D%09.st127%7Bfill%3A%230079B6%3B%7D%09.st128%7Bfill%3A%2300A2D9%3B%7D%09.st129%7Bfill%3A%23BFDC34%3B%7D%09.st130%7Bfill%3A%23898989%3B%7D%09.st131%7Bfill%3A%23EDF0F5%3B%7D%09.st132%7Bfill%3A%23A3A4A7%3B%7D%09.st133%7Bfill%3A%23353535%3B%7D%09.st134%7Bfill%3A%23FF8C02%3B%7D%09.st135%7Bfill%3A%2300AC8C%3B%7D%09.st136%7Bfill%3A%236EC2E9%3B%7D%09.st137%7Bfill%3A%23442359%3B%7D%09.st138%7Bfill%3A%236DC0E6%3B%7D%09.st139%7Bfill%3A%23432056%3B%7D%09.st140%7Bfill%3A%2386CAD7%3B%7D%09.st141%7Bfill%3A%23009E48%3B%7D%09.st142%7Bopacity%3A0.2%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st143%7Bfill%3A%2368217A%3B%7D%09.st144%7Bfill%3A%23E5E5E5%3B%7D%09.st145%7Bopacity%3A0.15%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st146%7Bfill%3A%233898C6%3B%7D%09.st147%7Bfill%3A%2380BA42%3B%7D%09.st148%7Bfill%3A%23B3D234%3B%7D%09.st149%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9F9F9%3B%7D%09.st150%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23008EBE%3B%7D%09.st151%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F1F1F2%3B%7D%09.st152%7Bfill%3A%23BAD80A%3B%7D%09.st153%7Bclip-path%3Aurl(%23SVGID_2_)%3B%7D%09.st154%7Bfill%3A%2300BCF2%3B%7D%09.st155%7Bfill%3A%235AB4DA%3B%7D%09.st156%7Bfill%3Anone%3Bstroke%3A%235AB4DA%3Bstroke-width%3A0.75%3Bstroke-miterlimit%3A10%3B%7D%09.st157%7Bfill%3A%233898C5%3B%7D%09.st158%7Bfill%3A%237A7B7B%3B%7D%09.st159%7Bfill%3A%23545555%3B%7D%09.st160%7Bfill%3A%23D6EAF3%3B%7D%09.st161%7Bfill%3A%23009580%3B%7D%09.st162%7Bfill%3A%23BA141A%3B%7D%09.st163%7Bfill%3A%237AC3E1%3B%7D%09.st164%7Bfill%3A%23E27226%3B%7D%09.st165%7Bfill%3A%23FF9D26%3B%7D%09.st166%7Bopacity%3A0.12%3Bfill%3A%23BA141A%3B%7D%09.st167%7Bfill%3A%233C98C5%3B%7D%09.st168%7Bfill%3A%235AB3D8%3B%7D%09.st169%7Bfill%3A%23AAD8EB%3B%7D%09.st170%7Bfill%3A%23797979%3B%7D%09.st171%7Bfill%3A%23959595%3B%7D%09.st172%7Bfill%3A%23D1D1D1%3B%7D%09.st173%7Bclip-path%3Aurl(%23SVGID_4_)%3B%7D%09.st174%7Bfill%3A%2333A2E5%3B%7D%09.st175%7Bfill%3A%2371C2EA%3B%7D%09.st176%7Bfill%3A%23005091%3B%7D%09.st177%7Bclip-path%3Aurl(%23SVGID_6_)%3B%7D%09.st178%7Bfill%3A%23ACD64D%3B%7D%3C%2Fstyle%3E%3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cg%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2226.5%2C4.5 12.5%2C15.5 1.5%2C35.5 11.5%2C35.5 %09%09%09%09%22%2F%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2227.5%2C7.5 21.5%2C22.5 32.5%2C35.5 11.5%2C40.5 46.5%2C40.5 %09%09%09%09%22%2F%3E%09%09%09%3C%2Fg%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");\n mask-image: url("data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 22.1.0%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg version%3D%221.1%22 id%3D%22Layer_1%22 xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22 xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22 x%3D%220px%22 y%3D%220px%22%09 viewBox%3D%220 0 48 48%22 style%3D%22enable-background%3Anew 0 0 48 48%3B%22 xml%3Aspace%3D%22preserve%22%3E%3Cstyle type%3D%22text%2Fcss%22%3E%09.st0%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2300A2D8%3B%7D%09.st1%7Bfill%3A%23F79E1C%3B%7D%09.st2%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232ABAEC%3B%7D%09.st3%7Bfill%3A%23F7B218%3B%7D%09.st4%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3Anone%3B%7D%09.st5%7Bfill%3A%2300A2D8%3B%7D%09.st6%7Bfill%3A%232ABAEC%3B%7D%09.st7%7Bfill%3A%23323A45%3B%7D%09.st8%7Bfill%3A%2388909B%3B%7D%09.st9%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st10%7Bfill%3A%23A3BF3A%3B%7D%09.st11%7Bfill%3A%2380A23E%3B%7D%09.st12%7Bfill%3A%237B4D87%3B%7D%09.st13%7Bfill%3A%232F75BB%3B%7D%09.st14%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2385C9D5%3B%7D%09.st15%7Bopacity%3A0.15%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st16%7Bfill%3A%23A5D9E2%3B%7D%09.st17%7Bfill%3A%2385C9D5%3B%7D%09.st18%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23323A45%3B%7D%09.st19%7Bfill%3A%23FFFFFF%3B%7D%09.st20%7Bfill%3A%23DAEFF3%3B%7D%09.st21%7Bfill%3A%232A65AF%3B%7D%09.st22%7Bfill%3A%23F6ECF4%3B%7D%09.st23%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%232F75BB%3B%7D%09.st24%7Bfill%3Anone%3B%7D%09.st25%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9BA19%3B%7D%09.st26%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23A3BF3A%3B%7D%09.st27%7Bfill%3A%23F6931D%3B%7D%09.st28%7Bfill%3A%235E6D80%3B%7D%09.st29%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3B%7D%09.st30%7Bfill%3A%2300B8E2%3B%7D%09.st31%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%235E6D80%3B%7D%09.st32%7Bfill%3Anone%3Bstroke%3A%2385C9D5%3Bstroke-width%3A0%3Bstroke-linecap%3Around%3Bstroke-linejoin%3Around%3B%7D%09.st33%7Bfill%3A%232A89CA%3B%7D%09.st34%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237B4D87%3B%7D%09.st35%7Bopacity%3A0.3%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st36%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3B%7D%09.st37%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2378B843%3B%7D%09.st38%7Bfill%3A%2378B843%3B%7D%09.st39%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23EDF0F4%3B%7D%09.st40%7Bfill%3A%23005BA3%3B%7D%09.st41%7Bfill%3A%230F80B0%3B%7D%09.st42%7Bfill%3A%23005F87%3B%7D%09.st43%7Bfill%3A%23B7D332%3B%7D%09.st44%7Bfill%3A%237FB900%3B%7D%09.st45%7Bopacity%3A0.6%3Bfill%3A%23FFFFFF%3B%7D%09.st46%7Bopacity%3A0.4%3Bfill%3A%23FFFFFF%3B%7D%09.st47%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_13_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st48%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_64_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st49%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_65_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st50%7Bfill%3A%2373BDCD%3B%7D%09.st51%7Bopacity%3A0.6%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st52%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3Bstroke%3A%23FFFFFF%3Bstroke-width%3A4%3Bstroke-miterlimit%3A10%3B%7D%09.st53%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2380A23E%3B%7D%09.st54%7Bclip-path%3Aurl(%23XMLID_67_)%3Bfill%3Anone%3B%7D%09.st55%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F7B218%3B%7D%09.st56%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_69_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st57%7Bopacity%3A0.8%3Bfill%3A%23FFFFFF%3B%7D%09.st58%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_79_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st59%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23DB5B26%3B%7D%09.st60%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F58B1F%3B%7D%09.st61%7Bopacity%3A0.35%3Bclip-path%3Aurl(%23XMLID_84_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st62%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23404B59%3B%7D%09.st63%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_118_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st64%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23D1B0D3%3B%7D%09.st65%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_119_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st66%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2315B2E7%3B%7D%09.st67%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23E1F3F8%3B%7D%09.st68%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_120_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st69%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_124_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st70%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_125_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st71%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_126_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st72%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%237C8737%3B%7D%09.st73%7Bopacity%3A0.3%3Bclip-path%3Aurl(%23XMLID_127_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st74%7Bopacity%3A0.15%3Bclip-path%3Aurl(%23XMLID_130_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st75%7Bfill%3A%23CCCBCB%3B%7D%09.st76%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%2388909B%3B%7D%09.st77%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st78%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_131_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st79%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_133_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st80%7Bdisplay%3Anone%3B%7D%09.st81%7Bfill%3A%2345B6F4%3B%7D%09.st82%7Bfill%3A%2389919C%3B%7D%09.st83%7Bfill%3A%2361ADD1%3B%7D%09.st84%7Bfill%3A%233899C6%3B%7D%09.st85%7Bfill%3A%23F78F08%3B%7D%09.st86%7Bfill%3A%23C1BFBC%3B%7D%09.st87%7Bfill%3A%237A7A7A%3B%7D%09.st88%7Bfill%3A%23B3B4B5%3B%7D%09.st89%7Bopacity%3A0.48%3B%7D%09.st90%7Bfill%3A%23A0A1A2%3B%7D%09.st91%7Bfill%3A%23A1DEF0%3B%7D%09.st92%7Bfill%3A%23804998%3B%7D%09.st93%7Bfill%3A%230072C6%3B%7D%09.st94%7Bfill%3A%2359B4D9%3B%7D%09.st95%7Bfill%3A%233999C6%3B%7D%09.st96%7Bfill%3A%230078D7%3B%7D%09.st97%7Bfill%3A%23D1B972%3B%7D%09.st98%7Bfill%3A%23FEE087%3B%7D%09.st99%7Bfill%3A%23B1CE2D%3B%7D%09.st100%7Bfill%3A%237FBA00%3B%7D%09.st101%7Bfill%3A%23FCD116%3B%7D%09.st102%7Bfill%3A%23719904%3B%7D%09.st103%7Bfill%3A%23B8D432%3B%7D%09.st104%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23804898%3B%7D%09.st105%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%236B2980%3B%7D%09.st106%7Bfill%3A%236B2980%3B%7D%09.st107%7Bopacity%3A0.3%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st108%7Bopacity%3A0.2%3Bfill%3A%231E1E1E%3Benable-background%3Anew %3B%7D%09.st109%7Bfill%3A%2333BCF0%3B%7D%09.st110%7Bopacity%3A0.2%3Bfill%3A%23636363%3B%7D%09.st111%7Bopacity%3A0.1%3Bclip-path%3Aurl(%23XMLID_134_)%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23FFFFFF%3B%7D%09.st112%7Bfill%3A%238B77B6%3B%7D%09.st113%7Bfill%3A%239B6CAC%3B%7D%09.st114%7Bfill%3A%23874B94%3B%7D%09.st115%7Bopacity%3A0.4%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st116%7Bopacity%3A0.8%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st117%7Bopacity%3A0.6%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st118%7Bopacity%3A0.25%3Bfill%3A%237FBA00%3Benable-background%3Anew %3B%7D%09.st119%7Bfill%3A%23DD5900%3B%7D%09.st120%7Bfill%3A%23FF8C00%3B%7D%09.st121%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%233E3E3E%3B%7D%09.st122%7Bfill%3Aurl(%23path3060_1_)%3B%7D%09.st123%7Bfill%3A%231870C5%3B%7D%09.st124%7Bfill%3A%2372BFDF%3B%7D%09.st125%7Bfill%3A%233C3938%3B%7D%09.st126%7Bfill%3A%230072AC%3B%7D%09.st127%7Bfill%3A%230079B6%3B%7D%09.st128%7Bfill%3A%2300A2D9%3B%7D%09.st129%7Bfill%3A%23BFDC34%3B%7D%09.st130%7Bfill%3A%23898989%3B%7D%09.st131%7Bfill%3A%23EDF0F5%3B%7D%09.st132%7Bfill%3A%23A3A4A7%3B%7D%09.st133%7Bfill%3A%23353535%3B%7D%09.st134%7Bfill%3A%23FF8C02%3B%7D%09.st135%7Bfill%3A%2300AC8C%3B%7D%09.st136%7Bfill%3A%236EC2E9%3B%7D%09.st137%7Bfill%3A%23442359%3B%7D%09.st138%7Bfill%3A%236DC0E6%3B%7D%09.st139%7Bfill%3A%23432056%3B%7D%09.st140%7Bfill%3A%2386CAD7%3B%7D%09.st141%7Bfill%3A%23009E48%3B%7D%09.st142%7Bopacity%3A0.2%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st143%7Bfill%3A%2368217A%3B%7D%09.st144%7Bfill%3A%23E5E5E5%3B%7D%09.st145%7Bopacity%3A0.15%3Bfill%3A%23FFFFFF%3Benable-background%3Anew %3B%7D%09.st146%7Bfill%3A%233898C6%3B%7D%09.st147%7Bfill%3A%2380BA42%3B%7D%09.st148%7Bfill%3A%23B3D234%3B%7D%09.st149%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F9F9F9%3B%7D%09.st150%7Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23008EBE%3B%7D%09.st151%7Bopacity%3A0.1%3Bfill-rule%3Aevenodd%3Bclip-rule%3Aevenodd%3Bfill%3A%23F1F1F2%3B%7D%09.st152%7Bfill%3A%23BAD80A%3B%7D%09.st153%7Bclip-path%3Aurl(%23SVGID_2_)%3B%7D%09.st154%7Bfill%3A%2300BCF2%3B%7D%09.st155%7Bfill%3A%235AB4DA%3B%7D%09.st156%7Bfill%3Anone%3Bstroke%3A%235AB4DA%3Bstroke-width%3A0.75%3Bstroke-miterlimit%3A10%3B%7D%09.st157%7Bfill%3A%233898C5%3B%7D%09.st158%7Bfill%3A%237A7B7B%3B%7D%09.st159%7Bfill%3A%23545555%3B%7D%09.st160%7Bfill%3A%23D6EAF3%3B%7D%09.st161%7Bfill%3A%23009580%3B%7D%09.st162%7Bfill%3A%23BA141A%3B%7D%09.st163%7Bfill%3A%237AC3E1%3B%7D%09.st164%7Bfill%3A%23E27226%3B%7D%09.st165%7Bfill%3A%23FF9D26%3B%7D%09.st166%7Bopacity%3A0.12%3Bfill%3A%23BA141A%3B%7D%09.st167%7Bfill%3A%233C98C5%3B%7D%09.st168%7Bfill%3A%235AB3D8%3B%7D%09.st169%7Bfill%3A%23AAD8EB%3B%7D%09.st170%7Bfill%3A%23797979%3B%7D%09.st171%7Bfill%3A%23959595%3B%7D%09.st172%7Bfill%3A%23D1D1D1%3B%7D%09.st173%7Bclip-path%3Aurl(%23SVGID_4_)%3B%7D%09.st174%7Bfill%3A%2333A2E5%3B%7D%09.st175%7Bfill%3A%2371C2EA%3B%7D%09.st176%7Bfill%3A%23005091%3B%7D%09.st177%7Bclip-path%3Aurl(%23SVGID_6_)%3B%7D%09.st178%7Bfill%3A%23ACD64D%3B%7D%3C%2Fstyle%3E%3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cg%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2226.5%2C4.5 12.5%2C15.5 1.5%2C35.5 11.5%2C35.5 %09%09%09%09%22%2F%3E%09%09%09%09%3Cpolygon class%3D%22st93%22 points%3D%2227.5%2C7.5 21.5%2C22.5 32.5%2C35.5 11.5%2C40.5 46.5%2C40.5 %09%09%09%09%22%2F%3E%09%09%09%3C%2Fg%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E");\n background-color: #0078d4;\n}\n');const $e="spinnaker.azure";n($e,[pe,me,ge,ue,Ye,ce,Qe,_e,ee,le,se,ie,ne,ye,he,Be,Se,be,K,Ze]).config(function(){r.registerProvider("azure",{name:"Azure",logo:{path:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQYAAACrCAYAAACEwDK4AAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAABCZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI2MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTcxPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6QmFnLz4KICAgICAgICAgPC9kYzpzdWJqZWN0PgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxOS0wNS0wNlQxMjowNTozMTwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAzLjguMzwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4K8Qjg7wAAM9JJREFUeAHtnQeAFdX1/8/MvLa9L1tgF5Zl6UUUggoIggVLrCQYY42a/jPlb4rxr9EkvxhNIz9bEjUmllhRRFCxIKII0hVY2jaWLbC9vf5mft9z571lwd1lWfWXRM+FeW/ezJ07937uveeee+6ZWbIsazG2EpIgBITA554AywKWCSRC4XPfFgSAEDiCgMiEI3DIDyEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEh8B9DQPuPyWk0o+2WlRnyhYorW8O5++pb0irq2pIqu6y46uaAtau6tv6+L89Yf9akzF3/aeWS/AqBfycCjk8jM5ZljUa6FrZyTdPCvd0DcZJwvAhbLrZkbN158RMZXaGIsbcx4Cira3ej8ydWtoeza1u9haf8atXItkBkeER3pkYiRDpEm6FppBkaBci9zxHv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"},image:{reader:"azureImageReader"},serverGroup:{transformer:"azureServerGroupTransformer",detailsTemplateUrl:"azure/src/serverGroup/details/serverGroupDetails.html",detailsController:"azureServerGroupDetailsCtrl",cloneServerGroupTemplateUrl:"azure/src/serverGroup/configure/wizard/serverGroupWizard.html",cloneServerGroupController:"azureCloneServerGroupCtrl",commandBuilder:"azureServerGroupCommandBuilder",configurationService:"azureServerGroupConfigurationService"},instance:{instanceTypeService:"azureInstanceTypeService",detailsTemplateUrl:"azure/src/instance/details/instanceDetails.html",detailsController:"azureInstanceDetailsCtrl"},loadBalancer:{transformer:"azureLoadBalancerTransformer",detailsTemplateUrl:"azure/src/loadBalancer/details/loadBalancerDetail.html",detailsController:"azureLoadBalancerDetailsCtrl",createLoadBalancerTemplateUrl:"azure/src/loadBalancer/configure/createLoadBalancer.html",createLoadBalancerController:"azureCreateLoadBalancerCtrl",CreateLoadBalancerModal:ae},securityGroup:{transformer:"azureSecurityGroupTransformer",reader:"azureSecurityGroupReader",detailsTemplateUrl:"azure/src/securityGroup/details/securityGroupDetail.html",detailsController:"azureSecurityGroupDetailsCtrl",createSecurityGroupTemplateUrl:"azure/src/securityGroup/configure/createSecurityGroup.html",createSecurityGroupController:"azureCreateSecurityGroupCtrl"}})}),H.registerProvider("azure",["redblack"]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/details/serverGroupDetails.html",'<div class="details-panel" ng-class="{ disabled: serverGroup.isDisabled }">\n <div class="header" ng-if="state.loading">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n </div>\n\n <div class="header" ng-if="!state.loading">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="header-text horizontal middle">\n <span class="glyphicon glyphicon-th"></span>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>{{serverGroup.name}}</h3>\n </div>\n <div class="actions" ng-class="{ insights: serverGroup.insightActions.length > 0 }">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>\n Server Group Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li><a href ng-if="!serverGroup.isDisabled" ng-click="ctrl.rollbackServerGroup()">Rollback</a></li>\n <div ng-if="false">\n <li><a href ng-click="ctrl.resizeServerGroup()">Resize</a></li>\n </div>\n <li><a href ng-click="ctrl.disableServerGroup()">Disable</a></li>\n <li><a href ng-click="ctrl.enableServerGroup()">Enable</a></li>\n <li><a href ng-click="ctrl.destroyServerGroup()">Destroy</a></li>\n <li><a href ng-click="ctrl.cloneServerGroup(serverGroup)">Clone</a></li>\n </ul>\n </div>\n <div class="dropdown" ng-if="serverGroup.insightActions.length > 0" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>\n Insight <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li ng-repeat="action in serverGroup.insightActions">\n <a target="_blank" href="{{action.url}}">{{action.label}}</a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class="content" ng-if="!state.loading">\n <h4 class="text-center" ng-if="serverGroup.isDisabled">[SERVER GROUP IS DISABLED]</h4>\n\n <server-group-running-tasks-details\n server-group="serverGroup"\n application="ctrl.application"\n ></server-group-running-tasks-details>\n\n <collapsible-section heading="Server Group Information" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Created</dt>\n <dd>{{serverGroup.createdTime | timestamp}}</dd>\n <dt>Region</dt>\n <dd>\n <account-tag account="serverGroup.account" provider="serverGroup.type" pad="right"></account-tag>\n {{serverGroup.region}}\n </dd>\n <dt>Image</dt>\n <dd>{{serverGroup.image.imageName}}</dd>\n <dt>SKU</dt>\n <dd>{{serverGroup.sku.name}}</dd>\n </dl>\n </collapsible-section>\n\n <collapsible-section heading="Size" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Current</dt>\n <dd>{{serverGroup.instances.length}}</dd>\n </dl>\n </collapsible-section>\n\n <collapsible-section heading="Health" expanded="true">\n <dl class="dl-horizontal dl-narrow" ng-if="serverGroup">\n <dt>Instances</dt>\n <dd>\n <health-counts container="serverGroup.instanceCounts" class="pull-left"></health-counts>\n </dd>\n </dl>\n </collapsible-section>\n\n <collapsible-section heading="{{firewallsLabel}}">\n <dl class="dl-horizontal dl-narrow">\n <dt>Name</dt>\n <dd>{{serverGroup.securityGroupName}}</dd>\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/serverGroup/configure/wizard/serverGroupWizard.html",'<div>\n <div ng-if="state.requiresTemplateSelection">\n <ng-include src="pages.templateSelection"></ng-include>\n </div>\n <div ng-if="!state.loaded" style="height: 200px" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div>\n <form name="serverGroupWizardForm" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard\n ng-show="state.loaded && !state.requiresTemplateSelection"\n heading="{{title}}"\n task-monitor="taskMonitor"\n dismiss="$dismiss()"\n >\n <v2-wizard-page key="basic-settings" label="Basic Settings" hide-subheading="true">\n <ng-include src="pages.basicSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="image-settings" label="Image">\n <ng-include src="pages.imageSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="load-balancers" label="Load Balancers" mark-complete-on-view="false">\n <ng-include src="pages.loadBalancers"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="network-settings" label="Network Settings" mark-complete-on-view="false">\n <ng-include src="pages.networkSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="health-settings" label="Health" mark-complete-on-view="false">\n <ng-include src="pages.healthSettings"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="security-groups" label="{{firewallsLabel}}" mark-complete-on-view="false" done="true">\n <ng-include src="pages.securityGroups"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="instance-type" label="Instance Type" mark-complete-on-view="false" done="false">\n <ng-include src="pages.instanceType"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="zones" label="Zones" mark-complete-on-view="false" done="false">\n <ng-include src="pages.zones"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="tags" label="Tags" mark-complete-on-view="false" done="true">\n <ng-include src="pages.tags"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="advanced-settings" label="Advanced Settings" mark-complete-on-view="false" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer" ng-if="state.loaded">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default btn-cancel" ng-click="ctrl.cancel()">\n Cancel\n </button>\n <submit-button\n is-disabled="taskMonitor.submitting || !ctrl.isValid()"\n label="command.viewState.submitButtonLabel"\n submitting="taskMonitor.submitting"\n on-click="serverGroupWizardForm.$valid && ctrl.submit()"\n is-new="true"\n ></submit-button>\n </div>\n </form>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/instance/details/instanceDetails.html",'<div class="details-panel">\n <div class="header">\n <instance-details-header\n health-state="instance.healthState"\n instance-id="instance ? instance.instanceId : instanceIdNotFound"\n loading="state.loading"\n standalone="state.standalone"\n ></instance-details-header>\n </div>\n <div class="content" ng-if="!state.loading && instance">\n <collapsible-section heading="Instance Information" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Launched</dt>\n <dd ng-if="instance.launchTime">{{instance.launchTime | timestamp}}</dd>\n <dd ng-if="!instance.launchTime">(Unknown)</dd>\n <dt>In</dt>\n <dd>\n <account-tag account="instance.account" provider="instance.provider" pad="right"></account-tag>\n {{instance.region || \'(Unknown)\'}}\n </dd>\n <dt>Type</dt>\n <dd>{{instance.instanceType || \'(Unknown)\'}}</dd>\n <dt ng-if="instance.serverGroup">Server Group</dt>\n <dd ng-if="instance.serverGroup">\n <a\n ui-sref="^.serverGroup({region: instance.region,\n accountId: instance.account,\n serverGroup: instance.serverGroup,\n provider: instance.provider})"\n >{{instance.serverGroup}}</a\n >\n </dd>\n </dl>\n </collapsible-section>\n </div>\n <div class="content" ng-if="!state.loading && !instance">\n <div class="content-section">\n <div class="content-body text-center">\n <h3>Instance not found.</h3>\n </div>\n </div>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/details/loadBalancerDetail.html",'<div class="details-panel">\n <div ng-if="state.loading" class="header">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n </div>\n\n <div ng-if="!state.loading" class="header">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div class="header-text horizontal middle">\n <i class="fa icon-sitemap"></i>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>{{loadBalancer.name}}</h3>\n </div>\n <div>\n <div class="actions">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>\n Load Balancer Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li><a href ng-click="ctrl.editLoadBalancer()">Edit Load Balancer</a></li>\n <li ng-if="!loadBalancer.serverGroups.length">\n <a href ng-click="ctrl.deleteLoadBalancer()">Delete Load Balancer</a>\n </li>\n <li\n ng-if="loadBalancer.serverGroups.length"\n class="disabled"\n tooltip="You must detach all server groups before you can delete this load balancer."\n >\n <a href>Delete Load Balancer</a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div ng-if="!state.loading" class="content">\n <collapsible-section heading="Load Balancer Details" expanded="true">\n <dl class="dl-horizontal dl-narrow">\n <dt>Type</dt>\n <dd>{{loadBalancer.loadBalancerType}}</dd>\n <dt>Created</dt>\n <dd>{{loadBalancer.elb.createdTime | timestamp}}</dd>\n <dt>In</dt>\n <dd>\n <account-tag account="loadBalancer.account" pad="right" provider="loadBalancer.type"></account-tag>\n {{loadBalancer.region}}\n </dd>\n <dt ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">VNet</dt>\n <dd ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">{{loadBalancer.elb.vnet}}</dd>\n <dt ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">Subnet</dt>\n <dd ng-if="loadBalancer.loadBalancerType === \'Azure Application Gateway\'">{{loadBalancer.elb.subnet}}</dd>\n </dl>\n <dl class="horizontal-when-filters-collapsed">\n <dt ng-if="loadBalancer.serverGroups">Server Groups</dt>\n <dd ng-if="loadBalancer.serverGroups">\n <ul class="collapse-margin-on-filter-collapse">\n <li ng-repeat="serverGroup in loadBalancer.serverGroups | orderBy: [\'isDisabled\', \'-name\']">\n <a\n ui-sref="^.serverGroup({region: serverGroup.region,\n accountId: serverGroup.account,\n serverGroup: serverGroup.name,\n provider: \'azure\'})"\n >\n {{serverGroup.name}}\n </a>\n </li>\n </ul>\n </dd>\n </dl>\n <dl class="horizontal-when-filters-collapsed">\n <dt ng-if="loadBalancer.elb.dnsName">DNS Name:</dt>\n <dd>\n <a target="_blank" href="//{{loadBalancer.elb.dnsName}}">{{loadBalancer.elb.dnsName}}</a>\n <copy-to-clipboard\n class="copy-to-clipboard copy-to-clipboard-sm"\n text="loadBalancer.elb.dnsName"\n tool-tip="\'Copy DNS Name to clipboard\'"\n >\n </copy-to-clipboard>\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="Status" expanded="true">\n <health-counts class="pull-left" container="loadBalancer.instanceCounts"></health-counts>\n </collapsible-section>\n <collapsible-section heading="Listeners">\n <dl>\n <dt>Load Balancer → Instance</dt>\n <dd ng-repeat="loadBalancingRule in loadBalancer.elb.loadBalancingRules">\n {{loadBalancingRule.protocol}}:{{loadBalancingRule.externalPort}} → {{loadBalancingRule.backendPort}}\n </dd>\n </dl>\n </collapsible-section>\n <collapsible-section heading="{{firewallsLabel}}">\n <ul>\n <li ng-repeat="securityGroup in securityGroups | orderBy:\'name\'">\n <a\n ui-sref="^.firewallDetails({name:securityGroup.name, accountId: loadBalancer.account, region: loadBalancer.region, vpcId: loadBalancer.vpcId, provider: loadBalancer.provider})"\n >\n {{securityGroup.name}} ({{securityGroup.id}})\n </a>\n </li>\n </ul>\n </collapsible-section>\n <collapsible-section heading="Health Checks">\n <dl class="horizontal-when-filters-collapsed">\n <dt>Target</dt>\n <dd>{{loadBalancer.elb.probes[0].probeProtocol}}</dd>\n <dt>Interval</dt>\n <dd>{{loadBalancer.elb.probes[0].probeInterval}} seconds</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{{loadBalancer.elb.probes[0].unhealthyThreshold}}</dd>\n <dt>Timeout</dt>\n <dd>{{loadBalancer.elb.probes[0].timeout}} seconds</dd>\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/loadBalancer/configure/createLoadBalancer.html",'<form name="form" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard heading="Create New {{loadBalancerType}}" task-monitor="taskMonitor" dismiss="$dismiss()">\n <v2-wizard-page key="Location" label="Location">\n <ng-include src="pages.location"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Listeners" label="Listeners" done="true">\n <ng-include src="pages.listeners"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Health Check" label="Health Check" done="true" hide-subheading="true">\n <ng-include src="pages.healthCheck"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Advanced Settings" label="Advanced Settings" done="true">\n <ng-include src="pages.advancedSettings"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button ng-disabled="taskMonitor.submitting" class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="!state.accountsLoaded || taskMonitor.submitting"\n submitting="taskMonitor.submitting"\n on-click="form.$valid && ctrl.submit()"\n is-new="isNew"\n ></submit-button>\n </div>\n</form>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/details/securityGroupDetail.html",'<div class="details-panel">\n <div class="header">\n <div class="close-button">\n <a class="btn btn-link" ui-sref="^">\n <span class="glyphicon glyphicon-remove"></span>\n </a>\n </div>\n <div ng-if="state.loading" class="horizontal center middle">\n <loading-spinner size="\'small\'"></loading-spinner>\n </div>\n <div class="header-text horizontal middle" ng-if="!state.loading">\n <span class="glyphicon glyphicon-transfer"></span>\n <h3 class="horizontal middle space-between flex-1" select-on-dbl-click>\n {{securityGroup.name || \'(not found)\'}}\n </h3>\n </div>\n <div class="actions">\n <div class="dropdown" uib-dropdown dropdown-append-to-body>\n <button type="button" class="btn btn-sm btn-primary dropdown-toggle" ng-disabled="disabled" uib-dropdown-toggle>\n <firewall-label label="Firewall"></firewall-label> Actions <span class="caret"></span>\n </button>\n <ul class="dropdown-menu" uib-dropdown-menu role="menu">\n <li>\n <a href ng-click="ctrl.deleteSecurityGroup()">Delete <firewall-label label="Firewall"></firewall-label></a>\n </li>\n <li><a href ng-click="ctrl.editInboundRules()">Edit Inbound Rules</a></li>\n <li>\n <a href ng-click="ctrl.cloneSecurityGroup()">Clone <firewall-label label="Firewall"></firewall-label></a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class="content" ng-if="!state.loading">\n <collapsible-section heading="{{firewallLabel}} Details" expanded="true">\n <dl class="dl-horizontal dl-medium">\n <dt>ID</dt>\n <dd>{{securityGroup.id}}</dd>\n <dt>Account</dt>\n <dd><account-tag account="securityGroup.accountName"></account-tag></dd>\n <dt>Region</dt>\n <dd>{{securityGroup.region}}</dd>\n <dt>Description:</dt>\n <dd>{{securityGroup.description}}</dd>\n </dl>\n </collapsible-section>\n <collapsible-section\n heading="Security Rules ({{securityGroup.securityRules.length || 0}})"\n expanded="{{!!(securityGroup.securityRules && securityGroup.securityRules.length)}}"\n >\n <div ng-if="!securityGroup.securityRules.length">None</div>\n <dl\n ng-class="insightCtrl.vm.filtersExpanded ? \'\' : \'dl-horizontal dl-medium\'"\n ng-repeat="rule in securityGroup.securityRules | orderBy: \'rule.priority\'"\n >\n <dt>Name</dt>\n <dd>{{rule.name}}</dd>\n <dt>Priority</dt>\n <dd>{{rule.priority}}</dd>\n <dt>Direction</dt>\n <dd>{{rule.direction}}</dd>\n <dt>Access</dt>\n <dd>{{rule.access}}</dd>\n <dt>Protocol</dt>\n <dd>{{rule.protocol}}</dd>\n <dt>Src Addr Prefix</dt>\n <dd>{{rule.sourceAddressPrefixModel}}</dd>\n <dt>Src Port Range</dt>\n <dd>{{rule.sourcePortRange}}</dd>\n <dt>Dest Addr Prefix</dt>\n <dd>{{rule.destinationAddressPrefix}}</dd>\n <dt>Dest Port Range</dt>\n <dd>{{rule.destinationPortRangeModel}}</dd>\n <hr />\n </dl>\n </collapsible-section>\n </div>\n</div>\n')}]),window.angular.module("ng").run(["$templateCache",function(e){e.put("azure/src/securityGroup/configure/createSecurityGroup.html",'<form name="form" class="form-horizontal" novalidate validate-on-submit>\n <v2-modal-wizard heading="Create New {{firewallLabel}}" task-monitor="taskMonitor" dismiss="$dismiss()">\n <v2-wizard-page key="Location" label="Location">\n <ng-include src="pages.location"></ng-include>\n </v2-wizard-page>\n <v2-wizard-page key="Ingress" label="Ingress" done="true">\n <ng-include src="pages.ingress"></ng-include>\n </v2-wizard-page>\n </v2-modal-wizard>\n <div class="modal-footer">\n <button class="btn btn-default" ng-click="ctrl.cancel()">Cancel</button>\n <submit-button\n is-disabled="state.submitting"\n submitting="state.submitting"\n on-click="form.$valid && ctrl.upsert()"\n is-new="isNew"\n >\n </submit-button>\n </div>\n</form>\n')}]);export{$e as AZURE_MODULE};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|