@spinnaker/ecs 2025.4.0-rc1 → 2025.4.1

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/common/footer.component.ts","../src/common/common.module.ts","../src/ecs.help.ts","../src/ecs.settings.ts","../src/ecsCluster/ecsCluster.read.service.ts","../src/iamRoles/iamRole.read.service.ts","../src/instance/details/instance.details.controller.js","../src/loadBalancer/TargetGroup.tsx","../src/loadBalancer/EcsLoadBalancerClusterContainer.tsx","../src/loadBalancer/listener.tsx","../src/loadBalancer/details/loadBalancerDetails.tsx","../src/loadBalancer/details/targetGroupDetails.tsx","../src/loadBalancer/loadBalancer.transformer.ts","../src/loadBalancer/targetGroup.states.ts","../src/metricAlarm/metricAlarm.read.service.ts","../src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js","../src/pipeline/stages/disableAsg/ecsDisableAsgStage.js","../src/pipeline/stages/disableCluster/ecsDisableClusterStage.js","../src/pipeline/stages/enableAsg/ecsEnableAsgStage.js","../src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js","../src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js","../src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js","../src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js","../src/placementStrategy/placementStrategy.service.ts","../src/secrets/secret.read.service.ts","../src/securityGroup/details/securityGroupDetail.controller.js","../src/securityGroup/securityGroup.reader.ts","../src/securityGroup/securityGroup.transformer.js","../src/securityGroup/securityGroup.module.ts","../src/serviceDiscovery/serviceDiscovery.read.service.ts","../src/serverGroup/configure/serverGroupConfiguration.service.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.js","../src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.js","../src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx","../src/serverGroup/configure/wizard/container/Container.tsx","../src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.js","../src/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.js","../src/serverGroup/configure/wizard/logging/logging.component.ts","../src/serverGroup/configure/wizard/networking/Networking.tsx","../src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx","../src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx","../src/serverGroup/details/resize/resizeCapacity.component.ts","../src/serverGroup/details/resize/resizeServerGroup.controller.js","../src/serverGroup/details/rollback/rollbackServerGroup.controller.js","../src/serverGroup/serverGroup.transformer.ts","../src/serverGroup/details/serverGroupDetails.ecs.controller.js","../src/serverGroup/details/serverGroupDetails.module.ts","../src/serverGroup/events/serverGroupEventsReader.service.ts","../src/serverGroup/events/events.controller.ts","../src/serverGroup/events/events.component.ts","../src/serverGroup/serverGroup.module.ts","../../../node_modules/style-inject/dist/style-inject.es.js","../src/ecs.module.ts","../src/logo/ecs.logo.svg"],"sourcesContent":["import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst footerComponent: IComponentOptions = {\n bindings: {\n action: '&',\n isValid: '&',\n cancel: '&',\n account: '=?',\n verification: '=?',\n },\n template: `\n <div class=\"modal-footer\">\n <user-verification account=\"$ctrl.account\" verification=\"$ctrl.verification\"></user-verification>\n <button type=\"submit\" ng-click=\"$ctrl.action()\" style=\"display:none\"></button> <!-- Allows form submission via enter keypress-->\n <button class=\"btn btn-default\" ng-click=\"$ctrl.cancel()\">Cancel</button>\n <button type=\"submit\"\n class=\"btn btn-primary\"\n ng-click=\"$ctrl.action()\"\n ng-disabled=\"!$ctrl.isValid()\">\n Submit\n </button>\n </div>\n `,\n controller: () => {},\n};\n\nexport const ECS_FOOTER_COMPONENT = 'spinnaker.ecs.footer';\nmodule(ECS_FOOTER_COMPONENT, []).component('ecsFooter', footerComponent);\n","import { module } from 'angular';\n\nimport { ECS_FOOTER_COMPONENT } from './footer.component';\n\nexport const COMMON_MODULE = 'spinnaker.ecs.common';\nmodule(COMMON_MODULE, [ECS_FOOTER_COMPONENT]);\n","import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents: { [key: string]: string } = {\n 'ecs.loadBalancer.targetGroup':\n '<p>A <em>target group</em> is attached to an application / network load balancer and is a target for load balancer traffic.</p> <p> You need to create both the application load balancer and target groups prior to being able to use them in your pipeline.</p>',\n 'ecs.serverGroup.clusterName':\n '<p>The name of the ECS cluster (group of underlying EC2 hosts) onto which your application will be deployed.</p><p>Note that suggestions here are dependent on the selected account and region combination.</p>',\n 'ecs.stage.findImageByTags.labelOrSha':\n \"<p>As of now, only Amazon's ECR is supported as a source docker repository.</p>\",\n 'ecs.serverGroup.stack':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>staging</i>, <i>prod</i>, etc. Keep this parameter short!</p>',\n 'ecs.serverGroup.detail':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>app</i>, <i>worker</i>, <i>migrator</i>, etc. Keep this parameter short!</p>',\n 'ecs.capacity.overwrite':\n \"<p>Checking this box will have the previous server group's capacity overwrite the new <i>min</i>, <i>max</i> and <i>desired capacity</i> parameters if a previous server group exists.</p>\",\n 'ecs.capacity.desired': '<p>The starting number of containers, before any autoscaling happens.</p>',\n 'ecs.capacity.minimum':\n '<p>The minimum number of containers you can reach as a result of autoscaling.</p> <p>Typically, this represents the bare minimum you can afford to run without impacting your capacity to meet your SLA (Service Level Agreement) objectives</p>',\n 'ecs.capacity.maximum': '<p>The maximal number of containers you can reach as a result of autoscaling.</p>',\n 'ecs.capacity.reserved.computeUnits':\n '<p>The assured minimal amount of computing capacity your container will be able to use. 1024 units are equal to 1 AWS virtual CPU</p> <p>If other containers on your underlying host are not using their reserved compute capacity, this container will be able to use it.</p>',\n 'ecs.capacity.reserved.memory':\n '<p>The maximal amount of memory that your container can use, in megabytes. Exceeding this amount may result in termination of your container.</p><p>1024 mb = 1 gb</p>',\n 'ecs.loadbalancing.targetPort': '<p>The port on which your application is listening for incoming traffic</p>',\n 'ecs.iamrole':\n '<p>The IAM role that your container (task, in AWS wording) will inherit. </p><p>Define a role only if your application needs to access AWS APIs</p>',\n 'ecs.dockerimage': 'Docker image for your container, such as nginx:latest',\n 'ecs.dockerimagecredentials':\n '<p>The AWS Secrets Manager secret that contains private registry credentials.</p><p>Define credentials only for private registries other than Amazon ECR.</p>',\n 'ecs.placementConstraints':\n '<p>Rules for task placement. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.placementConstraintType':\n '<p>To ensure that each task in a particular group is running on a different container instance, use distinctInstance. To restrict the selection to a group of valid candidates, use memberOf. </p>',\n 'ecs.placementConstraintExpression':\n '<p>A cluster query language expression to apply to memberOf constraints. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\" target=\"_blank\">AWS documentation</a> for more details.</p>',\n 'ecs.placementStrategy':\n '<p>The strategy the container scheduler will be using. See <a href=\"http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html\" target=\"_blank\">AWS documentation</a> for more details. </p><p>You should at least balance across availability zones</p><p>Custom placement strategies have not been implemented yet.</p>',\n 'ecs.platformVersion': '<p>Defaults to the latest platform version.</p>',\n 'ecs.enableDeploymentCircuitBreaker': '<p>Enable circuit breaker for the ECS service.</p>',\n 'ecs.capacity.copySourceScalingPoliciesAndActions':\n '<p>Copy Application Autoscaling policies and their associated alarms from the previous ECS service.</p>',\n 'ecs.launchtype': '<p>Launch service tasks on your own EC2 instances or on Fargate.</p>',\n 'ecs.healthgraceperiod':\n '<p>How long a container will be kept alive despite the load balancer health checks, in seconds.</p>',\n 'ecs.publicip': '<p>Assign a public IP address to each task.</p>',\n 'ecs.networkMode':\n '<p>awsvpc is the only networking mode that allows you to use Elastic Network Interfaces (ENI). The default value converts to Bridge on Linux, and NAT on Windows.</p>',\n 'ecs.subnet':\n '<p>The subnet group(s) on which your server group will be deployed. All subnet groups selected must exist within the same VPC.</p>',\n 'ecs.securityGroups': '<p>The security group(s) name(s) your containers are deployed with.</p>',\n 'ecs.dockerLabels':\n '<p>Additional labels applied to your Docker container. This metadata can be used to identify your containers, or in conjunction with logging options. Maps directly to the <a href=\"https://docs.docker.com/engine/reference/commandline/run/#set-metadata-on-container--l---label---label-file\"><b>--label</b> Docker flag</a>.</p> <p>Spinnaker will automatically add the spinnaker.servergroup, spinnaker.stack, spinnaker.detail labels for non-null values.</p>',\n 'ecs.logDriver':\n '<p>The container\\'s logging driver. This directly maps to the <a href=\"https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver\"><b>--log-driver</b> Docker flag.</a></p>',\n 'ecs.logOptions':\n '<p>A map of log options. This directly maps with the <a href=\"https://docs.docker.com/config/containers/logging/log_tags/\"><b>--log-opt</b> Docker flag </a></p>',\n 'ecs.taskDefinition':\n '<p>The source of the ECS Task Definition. Task Definition contents can either be entered manually via input fields or from a selected JSON file artifact. Artifact file contents should be structured as an ECS \"RegisterTaskDefinition\" request.</p>',\n 'ecs.taskDefinitionArtifact': '<p>The artifact containing the ECS Task Definition.</p>',\n 'ecs.containerMappings':\n '<p>The list of expected containers within the Task Definition and which container image they should use. Containers in the Task Definition which are not specified here will be registered as they appear in the artifact.</p>',\n 'ecs.containerMappingName':\n '<p>The name of the container. Name should match the <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html#ECS-Type-ContainerDefinition-name\"><b>containerDefinition.name</b></a> field as it appears in the Task Definition.</p>',\n 'ecs.containerMappingImage': '<p>The container image the named container should run.</p>',\n 'ecs.targetGroupMappings':\n '<p>The list of target groups through which the ECS service will receive load balancer traffic. Each target group is mapped to a container name and port within the Task Definition to specify which container should be registered to the target group.</p>',\n 'ecs.loadBalancedContainer':\n '<p>The container in the Task Definition that should receive traffic from the load balancer. Required if a load balancer target group has been specified.</p>',\n 'ecs.tags': '<p>The tags to apply to the task definition and the service',\n 'ecs.environmentVariables':\n '<p>The environment variable(s) your container are deployed with. SERVER_GROUP, CLOUD_STACK and CLOUD_DETAIL environment variables are used during deployment to identify the task and cannot be set here.</p>',\n 'ecs.serviceDiscovery': '<p>The AWS Cloud Map service discovery registries to assign to this service</p>',\n 'ecs.serviceDiscoveryRegistry': '<p>The AWS Cloud Map service to use for service discovery registration</p>',\n 'ecs.serviceDiscoveryContainerPort':\n '<p>The port to be used for your service discovery service. Required only for services using bridge or host network mode, and for services using awsvpc network mode and a type SRV DNS record',\n 'ecs.serviceDiscoveryContainerName':\n '<p>The container name value, already specified in the task definition, to be used for your service discovery service.</p>',\n 'ecs.computeOptions':\n '<p>Specify either a <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\" target=\"_blank\">launch type</a> (default) or <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html\" target=\"_blank\">capacity providers</a> for running your ECS service.</p>',\n 'ecs.capacityProviderStrategy':\n '<p>A capacity provider strategy gives you control over how your tasks use one or more capacity providers. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html#capacity-providers-concepts\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.capacityProviderName': '<p>The short name of the capacity provider.</p>',\n 'ecs.capacityProviderBase':\n '<p>Designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a <em>base</em> defined.</p>',\n 'ecs.capacityProviderWeight':\n '<p>Designates the relative percentage of the total number of tasks launched that should use the specified capacity provider.</p>',\n 'ecs.evaluateExpression':\n '<p>Whether to evaluate <a href=\"https://spinnaker.io/guides/user/pipeline/expressions/\" target=\"_blank\"><b>pipeline expressions</b></a> within the task definition artifact in this stage. Checking this box let\\'s you evaluate your task definition artifact coming from external sources.(e.g. GitHub) </p>',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IECSProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n zone?: string;\n };\n}\n\nexport const IECSProviderSettings: IECSProviderSettings = (SETTINGS.providers.ecs as IECSProviderSettings) || {\n defaults: {},\n};\nif (IECSProviderSettings) {\n IECSProviderSettings.resetToOriginal = SETTINGS.resetProvider('ecs');\n}\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderDetails } from './IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from './IEcsCluster';\n\nexport class EcsClusterReader {\n public listClusters(): PromiseLike<IEcsClusterDescriptor[]> {\n return REST('/ecs/ecsClusters').get();\n }\n\n public describeClusters(account: string, region: string): PromiseLike<IEcsCapacityProviderDetails[]> {\n if (account != null && region != null) {\n return REST('/ecs/ecsClusterDescriptions').path(account).path(region).get();\n }\n return {} as PromiseLike<IEcsCapacityProviderDetails[]>;\n }\n}\n\nexport const ECS_CLUSTER_READ_SERVICE = 'spinnaker.ecs.ecsCluster.read.service';\n\nmodule(ECS_CLUSTER_READ_SERVICE, []).service('ecsClusterReader', EcsClusterReader);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { IRoleDescriptor } from './IRole';\n\nexport class IamRoleReader {\n public listRoles(provider: string): PromiseLike<IRoleDescriptor[]> {\n return REST('/roles').path(provider).get();\n }\n}\n\nexport const IAM_ROLE_READ_SERVICE = 'spinnaker.ecs.iamRole.read.service';\n\nmodule(IAM_ROLE_READ_SERVICE, []).service('iamRoleReader', IamRoleReader);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport { applyHealthCheckInfoToTargetGroups, getAllTargetGroups } from '@spinnaker/amazon';\nimport {\n CloudProviderRegistry,\n ConfirmationModalService,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n SETTINGS,\n} from '@spinnaker/core';\n\nexport const ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.ecs.instance.details.controller';\nexport const name = ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP]).controller(\n 'ecsInstanceDetailsCtrl',\n [\n '$scope',\n '$state',\n '$uibModal',\n 'instance',\n 'app',\n 'moniker',\n 'environment',\n '$q',\n 'overrides',\n function ($scope, $state, $uibModal, instance, app, moniker, environment, $q, overrides) {\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('ecs', 'instance.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n instancePort: _.get(app, 'attributes.instancePort') || SETTINGS.defaultInstancePort || 80,\n };\n\n $scope.application = app;\n $scope.moniker = moniker;\n $scope.environment = environment;\n\n const cloudProvider = 'ecs';\n const defaultRequestParams = { cloudProvider: cloudProvider };\n\n function extractHealthMetrics(instance, latest) {\n // do not backfill on standalone instances\n if (app.isStandalone) {\n instance.health = latest.health;\n }\n\n instance.health = instance.health || [];\n const displayableMetrics = instance.health.filter(function (metric) {\n return metric.type !== 'Ecs' || metric.state !== 'Unknown';\n });\n\n // augment with target group healthcheck data\n const targetGroups = getAllTargetGroups(app.loadBalancers.data);\n applyHealthCheckInfoToTargetGroups(displayableMetrics, targetGroups, instance.account);\n\n // backfill details where applicable\n if (latest.health) {\n displayableMetrics.forEach(function (metric) {\n const detailsMatch = latest.health.filter(function (latestHealth) {\n return latestHealth.type === metric.type;\n });\n if (detailsMatch.length) {\n _.defaults(metric, detailsMatch[0]);\n }\n });\n }\n $scope.healthMetrics = displayableMetrics;\n }\n\n function retrieveInstance() {\n const extraData = {};\n let instanceSummary, loadBalancers, targetGroup, account, region, vpcId;\n if (!app.serverGroups) {\n // standalone instance\n instanceSummary = {};\n loadBalancers = [];\n targetGroup = [];\n account = instance.account;\n region = instance.region;\n } else {\n app.serverGroups.data.some(function (serverGroup) {\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = serverGroup.loadBalancers;\n targetGroup = serverGroup.targetGroup;\n account = serverGroup.account;\n region = serverGroup.region;\n vpcId = serverGroup.vpcId;\n extraData.serverGroup = serverGroup.name;\n extraData.vpcId = serverGroup.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a server group that is part of another app\n app.loadBalancers.data.some(function (loadBalancer) {\n return (\n loadBalancer.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n }) ||\n loadBalancer.targetGroup.some(function (targetGroup) {\n return targetGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n targetGroup = targetGroup.name;\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n })\n );\n });\n if (!instanceSummary) {\n // perhaps it is in a disabled server group via a load balancer\n app.loadBalancers.data.some(function (loadBalancer) {\n return (\n loadBalancer.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n }) ||\n loadBalancer.targetGroup.some(function (targetGroup) {\n targetGroup.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n })\n );\n });\n }\n }\n }\n\n if (instanceSummary && account && region) {\n instanceSummary.account = account;\n extraData.account = account;\n extraData.region = region;\n RecentHistoryService.addExtraDataToLatest('instances', extraData);\n return InstanceReader.getInstanceDetails(account, region, instance.instanceId).then((details) => {\n if ($scope.$$destroyed) {\n return;\n }\n $scope.state.loading = false;\n extractHealthMetrics(instanceSummary, details);\n $scope.instance = _.defaults(details, instanceSummary);\n $scope.instance.account = account;\n $scope.instance.region = region;\n $scope.instance.vpcId = vpcId;\n $scope.instance.loadBalancers = loadBalancers;\n $scope.instance.targetGroup = targetGroup;\n if ($scope.instance.networkInterfaces) {\n const permanentNetworkInterfaces = $scope.instance.networkInterfaces.filter(\n (f) => f.attachment.deleteOnTermination === false,\n );\n if (permanentNetworkInterfaces.length) {\n $scope.instance.permanentIps = permanentNetworkInterfaces.map((f) => f.privateIpAddress);\n }\n }\n $scope.baseIpAddress = details.publicDnsName || details.privateIpAddress;\n if (overrides.instanceDetailsLoaded) {\n overrides.instanceDetailsLoaded();\n }\n }, autoClose);\n }\n\n if (!instanceSummary) {\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.loading = false;\n }\n\n return $q.when(null);\n }\n\n function autoClose() {\n if ($scope.$$destroyed) {\n return;\n }\n if (app.isStandalone) {\n $scope.state.loading = false;\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.notFoundStandalone = true;\n RecentHistoryService.removeLastItem('instances');\n } else {\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n }\n\n this.canRegisterWithDiscovery = function () {\n const instance = $scope.instance;\n const healthMetrics = instance.health || [];\n const discoveryHealth = healthMetrics.filter(function (health) {\n return health.type === 'Discovery';\n });\n return discoveryHealth.length ? discoveryHealth[0].state === 'OutOfService' : false;\n };\n\n this.terminateInstance = function terminateInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId,\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstance(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + '?',\n buttonText: 'Terminate ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.terminateInstanceAndShrinkServerGroup = function terminateInstanceAndShrinkServerGroup() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId + ' and shrinking server group',\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup + '?',\n buttonText: 'Terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.enableInstanceInDiscovery = function enableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.enableInstanceInDiscovery(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Enable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.disableInstanceInDiscovery = function disableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.disableInstanceInDiscovery(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really disable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Disable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.hasHealthState = function hasHealthState(healthProviderType, state) {\n const instance = $scope.instance;\n const healthMetrics = instance.health || [];\n return healthMetrics.some(function (health) {\n return health.type === healthProviderType && health.state === state;\n });\n };\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n // Two things to look out for here:\n // 1. If the retrieveInstance call completes *after* the user has navigated away from the view, there\n // is no point in subscribing to the refresh\n // 2. If this is a standalone instance, there is no application that will refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n $scope.account = instance.account;\n },\n ],\n);\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { IInstanceCounts } from '@spinnaker/core';\nimport { LoadBalancerServerGroup } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsTargetGroupProps {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n showServerGroups: boolean;\n showInstances: boolean;\n}\n\nexport class EcsTargetGroup extends React.Component<IEcsTargetGroupProps> {\n public render(): React.ReactElement<EcsTargetGroup> {\n const { targetGroup, loadBalancer, showServerGroups } = this.props;\n\n const params = {\n loadBalancerName: loadBalancer.name,\n region: targetGroup.region,\n accountId: targetGroup.account,\n name: targetGroup.targetGroupName,\n vpcId: targetGroup.vpcId,\n provider: targetGroup.cloudProvider,\n };\n\n // info not yet available; HealthCounts component requires it,\n // but will not render if no values are defined.\n const emptyInstanceCounts: IInstanceCounts = {\n up: undefined,\n down: undefined,\n starting: undefined,\n succeeded: undefined,\n failed: undefined,\n unknown: undefined,\n outOfService: undefined,\n };\n\n return (\n <div className=\"target-group-container container-fluid no-padding\">\n <UISrefActive class=\"active\">\n <UISref to=\".ecsTargetGroupDetails\" params={params}>\n <div className={`clickable clickable-row row no-margin-y target-group-header`}>\n <div className=\"col-md-8 target-group-title\">{targetGroup.targetGroupName}</div>\n </div>\n </UISref>\n </UISrefActive>\n {showServerGroups &&\n targetGroup.serverGroups.map((sgName) => {\n return (\n <LoadBalancerServerGroup\n key={sgName}\n account={targetGroup.account}\n region={targetGroup.region}\n serverGroup={{\n account: targetGroup.account,\n cloudProvider: targetGroup.cloudProvider,\n cluster: sgName,\n instanceCounts: emptyInstanceCounts,\n instances: targetGroup.instances,\n name: sgName,\n type: targetGroup.type,\n region: targetGroup.region,\n }}\n showInstances={false} // TODO: use prop when instanceCounts available\n />\n );\n })}\n </div>\n );\n }\n}\n","import { isEqual } from 'lodash';\nimport React from 'react';\n\nimport type { ILoadBalancerClusterContainerProps } from '@spinnaker/core';\n\nimport { EcsTargetGroup } from './TargetGroup';\nimport type { IEcsLoadBalancer } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerClusterContainer extends React.Component<ILoadBalancerClusterContainerProps> {\n public shouldComponentUpdate(nextProps: ILoadBalancerClusterContainerProps) {\n const serverGroupsDiffer = () =>\n !isEqual(\n (nextProps.serverGroups || []).map((g) => g.name),\n (this.props.serverGroups || []).map((g) => g.name),\n );\n const targetGroupsDiffer = () =>\n !isEqual(\n ((nextProps.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n ((this.props.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n );\n return (\n nextProps.showInstances !== this.props.showInstances ||\n nextProps.showServerGroups !== this.props.showServerGroups ||\n nextProps.loadBalancer !== this.props.loadBalancer ||\n serverGroupsDiffer() ||\n targetGroupsDiffer()\n );\n }\n\n public render(): React.ReactElement<EcsLoadBalancerClusterContainer> {\n const { loadBalancer, showInstances, showServerGroups } = this.props;\n const lb = loadBalancer as IEcsLoadBalancer;\n\n const TargetGroups = lb.targetGroups.map((targetGroup) => {\n return (\n <EcsTargetGroup\n key={targetGroup.targetGroupName}\n loadBalancer={loadBalancer as IEcsLoadBalancer}\n targetGroup={targetGroup}\n showInstances={showInstances}\n showServerGroups={showServerGroups}\n />\n );\n });\n\n return <div className=\"cluster-container\">{TargetGroups}</div>;\n }\n}\n","import React from 'react';\n\nimport type { IEcsListener } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsListenerProps {\n listener: IEcsListener;\n}\n\nexport class EcsListener extends React.Component<IEcsListenerProps> {\n constructor(props: IEcsListenerProps) {\n super(props);\n }\n\n private getTargetGroupNameFromArn(arn: string): string {\n const parts = arn.split('/');\n if (parts.length < 0) {\n return arn;\n }\n return parts[1];\n }\n\n public render(): React.ReactElement<EcsListener> {\n const { port, protocol, defaultActions } = this.props.listener;\n\n // TODO: retrieve and display 'rules' in addition to default actions\n return (\n <div>\n <h4>\n {protocol}:{port}\n </h4>\n <div style={{ paddingLeft: 10 }}>\n <i>default actions</i>\n <ul>\n {defaultActions.map((action, i) => {\n if (action.type == 'forward') {\n return (\n <li key={i}>\n &rarr;\n <i className=\"fa fa-fw fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <span>\n {action.targetGroupArn ||\n action.forwardConfig.targetGroups.map((tg) => {\n return this.getTargetGroupNameFromArn(tg.targetGroupArn);\n })}\n </span>\n </li>\n );\n } else {\n return (\n <li key={i}>\n {action.type}:{' '}\n {action.redirectConfig.statusCode ||\n action.fixedResponseConfig.statusCode ||\n action.authenticateOidcConfig.clientId ||\n action.authenticateCognitoActionConfig.userPoolDomain}\n </li>\n );\n }\n })}\n </ul>\n </div>\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner, timestamp } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer } from '../../domain/IEcsLoadBalancer';\nimport { EcsListener } from '../listener';\n\ninterface IEcsLoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n vpcId: string;\n}\n\ninterface IEcsLoadBalancerDetailsState {\n loadBalancer: IEcsLoadBalancer;\n loadBalancerNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsLoadBalancerDetailsProps {\n app: Application;\n accountId: string;\n loadBalancer: IEcsLoadBalancerFromStateParams;\n}\n\nexport class EcsLoadBalancerDetails extends React.Component<\n IEcsLoadBalancerDetailsProps,\n IEcsLoadBalancerDetailsState\n> {\n constructor(props: IEcsLoadBalancerDetailsProps) {\n super(props);\n this.state = {\n loading: true,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractLoadBalancer(): void {\n const { name, region } = this.props.loadBalancer;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === name && test.account === this.props.loadBalancer.accountId && test.region === region;\n });\n\n this.setState({\n loading: false,\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (loadBalancer) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(null, () => this.extractLoadBalancer()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n\n public render(): React.ReactElement<EcsLoadBalancerDetails> {\n const loadBalancerName = this.props.loadBalancer.name;\n const { loadBalancer, loading } = this.state;\n const { accountId } = this.props;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Load balancer not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const loadBalancerHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"header-text horizontal middle\">\n <i className=\"fa icon-sitemap\" />\n <h3 className=\"horizontal middle space-between flex-1\">{loadBalancerName}</h3>\n </div>\n </div>\n );\n\n const loadBalancerContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Load Balancer Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(loadBalancer.createdTime)}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId} />\n <br />\n {loadBalancer.region}\n </dd>\n <dt>VPC</dt>\n <dd>{loadBalancer.vpcId}</dd>\n <dt>Type</dt>\n <dd>{loadBalancer.loadBalancerType}</dd>\n <dt>IP Type</dt>\n <dd>{loadBalancer.ipAddressType}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Availability Zones</dt>\n <dd>\n <ul>\n {loadBalancer.availabilityZones.map((az) => {\n return <li key={az}>{az}</li>;\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target Groups</dt>\n <dd>\n <ul>\n {loadBalancer.targetGroups.map((tg) => {\n return (\n <li key={tg.targetGroupName}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.ecsTargetGroupDetails\"\n params={{\n loadBalancerName: loadBalancer.name,\n region: loadBalancer.region,\n accountId: loadBalancer.account,\n name: tg.targetGroupName,\n vpcId: tg.vpcId,\n provider: loadBalancer.cloudProvider,\n }}\n >\n <a>{tg.targetGroupName}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Status\" defaultExpanded={false}>\n <span>Select a target group to check the instance health status from the view of its server groups.</span>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Listeners\" defaultExpanded={false}>\n {loadBalancer.listeners ? (\n loadBalancer.listeners.map((listener, index) => {\n return (\n <div key={index}>\n <span>\n <EcsListener listener={listener}></EcsListener>\n </span>\n </div>\n );\n })\n ) : (\n <li>No listeners provided.</li>\n )}\n </CollapsibleSection>\n <CollapsibleSection heading=\"Firewalls\" defaultExpanded={false}>\n <ul>\n {loadBalancer.securityGroups ? (\n loadBalancer.securityGroups.map((sg) => {\n return <li key={sg}>{sg}</li>;\n })\n ) : (\n <li>No security groups provided.</li>\n )}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Subnets\" defaultExpanded={false}>\n <ul>\n {loadBalancer.subnets.map((subnet) => {\n return <li key={subnet}>{subnet}</li>;\n })}\n </ul>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && loadBalancerHeader()}\n {!loading && !loadBalancer && notFoundContent()}\n {!loading && loadBalancer && loadBalancerContent()}\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../../domain/IEcsLoadBalancer';\n\ninterface IEcsTargetGroupFromStateParams {\n loadBalancerName: string;\n targetGroupName: string;\n region: string;\n vpcId: string;\n}\n\ninterface IEcsTargetGroupDetailsState {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n targetGroupNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsTargetGroupProps {\n app: Application;\n accountId: string;\n name: string;\n targetGroup: IEcsTargetGroupFromStateParams;\n provider: string;\n}\n\nexport class EcsTargetGroupDetails extends React.Component<IEcsTargetGroupProps, IEcsTargetGroupDetailsState> {\n constructor(props: IEcsTargetGroupProps) {\n super(props);\n this.state = {\n loading: true,\n targetGroup: undefined,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractTargetGroup());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractTargetGroup(): void {\n const { loadBalancerName, region, targetGroupName } = this.props.targetGroup;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === loadBalancerName && test.account === this.props.accountId && test.region === region;\n });\n\n this.setState({\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (!loadBalancer) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n } else {\n const targetGroup: IEcsTargetGroup = loadBalancer.targetGroups.find(\n (tg) => tg.targetGroupName === targetGroupName,\n );\n if (!targetGroup) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n }\n\n if (targetGroup) {\n this.setState({\n loading: false,\n targetGroup,\n });\n\n if (targetGroup) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(null, () => this.extractTargetGroup()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n }\n }\n\n public render(): React.ReactElement<EcsTargetGroupDetails> {\n const { name, accountId } = this.props;\n const region = this.props.targetGroup.region;\n const { targetGroup, loadBalancer, loading } = this.state;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Target group not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const targetGroupHeader = () => (\n <div className=\"header\">\n <div className=\"header-text horizontal middle\">\n <i className=\"fa fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <h3 className=\"horizontal middle space-between flex-1\">{name}</h3>\n </div>\n </div>\n );\n\n const targetGroupContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Target Group Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId}></AccountTag>\n <br />\n {targetGroup.region}\n </dd>\n <dt>VPC</dt>\n <dd>{targetGroup.vpcId}</dd>\n <dt>Protocol</dt>\n <dd>{targetGroup.protocol}</dd>\n <dt>Port</dt>\n <dd>{targetGroup.port}</dd>\n <dt>Target Type</dt>\n <dd>{targetGroup.targetType.toUpperCase()}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancers</dt>\n <dd>\n {/* TODO: use UISref to display/highlight LBs in this app. See core/.../LoadBalancer.tsx */}\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.loadBalancerNames ? (\n targetGroup.loadBalancerNames.map((lb, i) => {\n return <li key={i}>{lb}</li>;\n })\n ) : (\n <li>No load balncers provided.</li>\n )}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancer DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Server Groups</dt>\n <dd>\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.serverGroups.map((sg, i) => {\n return (\n <li key={i}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: region,\n accountId: accountId,\n serverGroup: sg,\n provider: 'ecs',\n }}\n >\n <a>{sg}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Health Checks\" defaultExpanded={false}>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target</dt>\n <dd>\n {targetGroup.healthCheckProtocol}:{targetGroup.healthCheckPort}\n {targetGroup.healthCheckPath}\n </dd>\n <dt>Timeout</dt>\n <dd>{targetGroup.healthCheckTimeoutSeconds} seconds</dd>\n <dt>Interval</dt>\n <dd>{targetGroup.healthCheckIntervalSeconds} seconds</dd>\n <dt>Healthy Threshold</dt>\n <dd>{targetGroup.healthyThresholdCount}</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{targetGroup.unhealthyThresholdCount}</dd>\n <dt>Matcher</dt>\n <dd>HTTP Code(s): {targetGroup && targetGroup.matcher ? targetGroup.matcher.httpCode : 'None'}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Attributes\" defaultExpanded={false}>\n <dl>\n <dt>Deregistration Delay Timeout</dt>\n <dd>{targetGroup.attributes['deregistration_delay.timeout_seconds'] || 0} seconds</dd>\n <dt>Stickiness Enabled</dt>\n <dd>{targetGroup.attributes['stickiness.enabled'] || 'N/A'}</dd>\n </dl>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && targetGroupHeader()}\n {!loading && !targetGroup && notFoundContent()}\n {!loading && targetGroup && targetGroupContent()}\n </div>\n );\n }\n}\n","import type { IQService } from 'angular';\n\nimport type { IEcsLoadBalancer, IEcsLoadBalancerSourceData, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeLoadBalancer(loadBalancer: IEcsLoadBalancerSourceData): PromiseLike<IEcsLoadBalancer> {\n loadBalancer.targetGroups.forEach((tg: IEcsTargetGroup) => {\n tg.region = loadBalancer.region;\n tg.account = loadBalancer.account;\n tg.cloudProvider = loadBalancer.cloudProvider;\n if (loadBalancer.targetGroupServices) {\n const tgServiceMap = loadBalancer.targetGroupServices;\n tg.serverGroups = tgServiceMap[tg.targetGroupArn];\n }\n });\n return this.$q.resolve(loadBalancer);\n }\n}\n","import type { StateParams } from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\n\nimport { EcsTargetGroupDetails } from '../loadBalancer/details/targetGroupDetails';\n//import { IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport const ECS_TARGET_GROUP_STATES = 'spinnaker.ecs.loadBalancer.targetGroup.states';\nmodule(ECS_TARGET_GROUP_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const ecsTargetGroupDetails: INestedState = {\n name: 'ecsTargetGroupDetails',\n url: '/ecsTargetGroupDetails/:provider/:accountId/:region/:vpcId/:loadBalancerName/:name',\n params: {\n vpcId: {\n value: null,\n squash: true,\n },\n },\n views: {\n 'detail@../insight': {\n component: EcsTargetGroupDetails,\n $type: 'react',\n },\n },\n resolve: {\n accountId: ['$stateParams', ($stateParams: StateParams) => $stateParams.accountId],\n name: ['$stateParams', ($stateParams: StateParams) => $stateParams.name],\n provider: ['$stateParams', ($stateParams: StateParams) => $stateParams.provider],\n // resolve flat params into an IEcsTargetGroup\n targetGroup: [\n '$stateParams',\n ($stateParams: StateParams) => {\n return {\n loadBalancerName: $stateParams.loadBalancerName,\n targetGroupName: $stateParams.name,\n accountId: $stateParams.accountId,\n region: $stateParams.region,\n vpcId: $stateParams.vpcId,\n };\n },\n ],\n },\n data: {\n pageTitleDetails: {\n title: 'Target Group Details',\n nameParam: 'name',\n accountParam: 'accountId',\n regionParam: 'region',\n },\n },\n };\n\n applicationStateProvider.addInsightDetailState(ecsTargetGroupDetails);\n },\n]);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { IMetricAlarmDescriptor } from './MetricAlarm';\n\nexport class MetricAlarmReader {\n public listMetricAlarms(): PromiseLike<IMetricAlarmDescriptor[]> {\n return REST('/ecs/cloudMetrics/alarms').get();\n }\n}\n\nexport const METRIC_ALARM_READ_SERVICE = 'spinnaker.ecs.metricAlarm.read.service';\n\nmodule(METRIC_ALARM_READ_SERVICE, []).service('metricAlarmReader', MetricAlarmReader);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.destroyAsgStage';\nexport const name = ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n alias: 'destroyAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.regions = ['us-east-1', 'us-west-1', 'eu-west-1', 'us-west-2'];\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, PipelineTemplates, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE = 'spinnaker.ecs.pipeline.stage.disableAsgStage';\nexport const name = ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./disableAsgStage.html'),\n executionDetailsUrl: PipelineTemplates.disableAsgExecutionDetails,\n executionStepLabelUrl: require('./disableAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.disableClusterStage';\nexport const name = ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./disableClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingEnabledServerGroups',\n fieldLabel: 'Keep [X] enabled Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDisableClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.remainingEnabledServerGroups === undefined) {\n stage.remainingEnabledServerGroups = 1;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE = 'spinnaker.ecs.pipeline.stage.enableAsgStage';\nexport const name = ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./enableAsgStage.html'),\n executionStepLabelUrl: require('./enableAsgStepLabel.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsEnableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE =\n 'spinnaker.ecs.pipeline.stage.findImageFromTagsStage';\nexport const name = ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImageFromTags',\n cloudProvider: 'ecs',\n templateUrl: require('./findImageFromTagsStage.html'),\n executionDetailsUrl: require('./findImageFromTagsExecutionDetails.html'),\n executionConfigSections: ['findImageConfig', 'taskStatus'],\n validators: [{ type: 'requiredField', fieldName: 'imageLabelOrSha' }],\n });\n })\n .controller('ecsFindImageFromTagsStageCtrl', [\n '$scope',\n function ($scope) {\n $scope.stage.cloudProvider = $scope.stage.cloudProvider || 'ecs';\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.resizeAsgStage';\nexport const name = ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'resizeServerGroup',\n alias: 'resizeAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./resizeAsgStage.html'),\n executionConfigSections: ['resizeServerGroupConfig', 'taskStatus'],\n executionStepLabelUrl: require('./resizeAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to resize a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'action' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsResizeAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.viewState = {\n accountsLoaded: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.viewState.accountsLoaded = true;\n });\n\n $scope.resizeTargets = StageConstants.TARGET_LIST;\n\n $scope.scaleActions = [\n {\n label: 'Scale Up',\n val: 'scale_up',\n },\n {\n label: 'Scale Down',\n val: 'scale_down',\n },\n {\n label: 'Scale to Cluster Size',\n val: 'scale_to_cluster',\n },\n {\n label: 'Scale to Exact Size',\n val: 'scale_exact',\n },\n ];\n\n $scope.resizeTypes = [\n {\n label: 'Percentage',\n val: 'pct',\n },\n {\n label: 'Incremental',\n val: 'incr',\n },\n ];\n\n stage.capacity = stage.capacity || {};\n stage.regions = stage.regions || [];\n stage.target = stage.target || $scope.resizeTargets[0].val;\n stage.action = stage.action || $scope.scaleActions[0].val;\n stage.resizeType = stage.resizeType || $scope.resizeTypes[0].val;\n if (stage.targetHealthyDeployPercentage === undefined) {\n stage.targetHealthyDeployPercentage = 100;\n }\n if (!stage.action && stage.resizeType === 'exact') {\n stage.action = 'scale_exact';\n }\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n ctrl.updateResizeType = function () {\n if (stage.action === 'scale_exact') {\n stage.resizeType = 'exact';\n delete stage.scalePct;\n delete stage.scaleNum;\n } else {\n stage.capacity = {};\n if (stage.resizeType === 'pct') {\n delete stage.scaleNum;\n } else {\n stage.resizeType = 'incr';\n delete stage.scalePct;\n stage.scaleNum = stage.scaleNum || 0;\n }\n }\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.scaleDownClusterStage';\nexport const name = ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'scaleDownCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./scaleDownClusterStage.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingFullSizeServerGroups',\n fieldLabel: 'Keep [X] full size Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n strategy: true,\n });\n })\n .controller('ecsScaleDownClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.remainingFullSizeServerGroups === undefined) {\n stage.remainingFullSizeServerGroups = 1;\n }\n\n if (stage.allowScaleDownActive === undefined) {\n stage.allowScaleDownActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.ecs.shrinkClusterStage';\nexport const name = ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'shrinkCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./shrinkClusterStage.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsShrinkClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.shrinkToSize === undefined) {\n stage.shrinkToSize = 1;\n }\n\n if (stage.allowDeleteActive === undefined) {\n stage.allowDeleteActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.retainLargerOverNewer === undefined) {\n stage.retainLargerOverNewer = 'false';\n }\n stage.retainLargerOverNewer = stage.retainLargerOverNewer.toString();\n },\n ]);\n","import { module } from 'angular';\n\nimport type { IPlacementStrategy } from './IPlacementStrategy';\n\nexport class PlacementStrategyService {\n public getPredefinedStrategy(strategyName: string): IPlacementStrategy[] {\n if (strategyName === 'AZ Balanced Spread') {\n return this.getAzBalancedSpreadStrategy();\n } else if (strategyName === 'AZ Balanced BinPack' || strategyName === 'AZ Balanced BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getAzBalancedMemoryBinPackStrategy();\n } else if (strategyName === 'BinPack' || strategyName === 'BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getBinPackMemoryStrategy();\n } else if (strategyName === 'AZ Balanced BinPack CPU') {\n return this.getAzBalancedCpuBinPackStrategy();\n } else if (strategyName === 'BinPack CPU') {\n return this.getBinPackCpuStrategy();\n } else if (strategyName === 'One Task Per Host') {\n return this.getOneTaskPerHostStrategy();\n } else {\n // TODO: Add support for custom placement strategy.\n return [];\n }\n }\n\n public getAzBalancedSpreadStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'spread', field: 'instanceId' },\n ];\n }\n\n public getAzBalancedMemoryBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'memory' },\n ];\n }\n\n public getBinPackMemoryStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'memory' }];\n }\n\n public getAzBalancedCpuBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'cpu' },\n ];\n }\n\n public getBinPackCpuStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'cpu' }];\n }\n\n public getOneTaskPerHostStrategy(): IPlacementStrategy[] {\n return [{ type: 'spread', field: 'instanceId' }];\n }\n}\n\nexport const PLACEMENT_STRATEGY_SERVICE = 'spinnaker.ecs.placementStrategyService.service';\n\nmodule(PLACEMENT_STRATEGY_SERVICE, []).service('placementStrategyService', PlacementStrategyService);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { ISecretDescriptor } from './ISecret';\n\nexport class SecretReader {\n public listSecrets(): PromiseLike<ISecretDescriptor[]> {\n return REST('/ecs/secrets').get();\n }\n}\n\nexport const ECS_SECRET_READ_SERVICE = 'spinnaker.ecs.secret.read.service';\n\nmodule(ECS_SECRET_READ_SERVICE, []).service('secretReader', SecretReader);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { VpcReader } from '@spinnaker/amazon';\nimport {\n CloudProviderRegistry,\n FirewallLabels,\n MANAGED_RESOURCE_DETAILS_INDICATOR,\n RecentHistoryService,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\n\nexport const ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =\n 'spinnaker.ecs.securityGroup.details.controller';\nexport const name = ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n MANAGED_RESOURCE_DETAILS_INDICATOR,\n ])\n .controller('ecsSecurityGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'resolvedSecurityGroup',\n 'app',\n 'securityGroupReader',\n function ($scope, $state, resolvedSecurityGroup, app, securityGroupReader) {\n this.application = app;\n const application = app;\n const securityGroup = resolvedSecurityGroup;\n this.firewallLabel = FirewallLabels.get('Firewall');\n\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('ecs', 'securityGroup.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n };\n\n function extractSecurityGroup() {\n return securityGroupReader\n .getSecurityGroupDetails(\n application,\n securityGroup.accountId,\n securityGroup.provider,\n securityGroup.region,\n securityGroup.vpcId,\n securityGroup.name,\n )\n .then(function (details) {\n return VpcReader.getVpcName(details.vpcId).then((name) => {\n details.vpcName = name;\n return details;\n });\n })\n .then(function (details) {\n $scope.state.loading = false;\n\n if (!details || _.isEmpty(details)) {\n fourOhFour();\n } else {\n const applicationSecurityGroup = securityGroupReader.getApplicationSecurityGroup(\n application,\n securityGroup.accountId,\n securityGroup.region,\n securityGroup.name,\n );\n\n angular.extend(securityGroup, applicationSecurityGroup, details);\n $scope.securityGroup = securityGroup;\n $scope.ipRules = buildIpRulesModel(securityGroup);\n $scope.securityGroupRules = buildSecurityGroupRulesModel(securityGroup);\n }\n }, fourOhFour);\n }\n\n function buildIpRulesModel(details) {\n const groupedRangeRules = _.groupBy(details.ipRangeRules, (rule) => rule.range.ip + rule.range.cidr);\n return Object.keys(groupedRangeRules)\n .map((addr) => {\n return {\n address: addr,\n rules: buildRuleModel(groupedRangeRules, addr),\n };\n })\n .filter((rule) => rule.rules.length);\n }\n\n function buildSecurityGroupRulesModel(details) {\n const groupedRangeRules = _.groupBy(details.securityGroupRules, (rule) => rule.securityGroup.id);\n return Object.keys(groupedRangeRules)\n .map((addr) => {\n return {\n securityGroup: groupedRangeRules[addr][0].securityGroup,\n rules: buildRuleModel(groupedRangeRules, addr),\n };\n })\n .filter((rule) => rule.rules.length);\n }\n\n function buildRuleModel(groupedRangeRules, addr) {\n const rules = [];\n groupedRangeRules[addr].forEach((rule) => {\n (rule.portRanges || []).forEach((range) => {\n if (rule.protocol === '-1' || (range.startPort !== undefined && range.endPort !== undefined)) {\n rules.push({ startPort: range.startPort, endPort: range.endPort, protocol: rule.protocol });\n }\n });\n });\n return rules;\n }\n\n function fourOhFour() {\n if ($scope.$$destroyed) {\n return;\n }\n if (app.isStandalone) {\n $scope.group = securityGroup.name;\n $scope.state.notFound = true;\n $scope.state.loading = false;\n RecentHistoryService.removeLastItem('securityGroups');\n } else {\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n }\n\n extractSecurityGroup().then(() => {\n // If the user navigates away from the view before the initial extractSecurityGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.securityGroups.onRefresh($scope, extractSecurityGroup);\n }\n });\n\n if (app.isStandalone) {\n // we still want the edit to refresh the firewall details when the modal closes\n app.securityGroups = {\n refresh: extractSecurityGroup,\n };\n }\n },\n ]);\n","import { module } from 'angular';\n\nimport type { ISecurityGroup, ISecurityGroupsByAccount } from '@spinnaker/core';\n\nexport class EcsSecurityGroupReader {\n public resolveIndexedSecurityGroup(\n indexedSecurityGroups: ISecurityGroupsByAccount,\n container: ISecurityGroup,\n securityGroupId: string,\n ): ISecurityGroup {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n}\n\nexport const ECS_SECURITY_GROUP_READER = 'spinnaker.ecs.securityGroup.reader';\nmodule(ECS_SECURITY_GROUP_READER, []).service('ecsSecurityGroupReader', EcsSecurityGroupReader);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.ecs.securityGroup.transformer';\nexport const name = ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('ecsSecurityGroupTransformer', function () {\n function normalizeSecurityGroup() {}\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","import { module } from 'angular';\n\nimport { ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER } from './details/securityGroupDetail.controller';\nimport { ECS_SECURITY_GROUP_READER } from './securityGroup.reader';\nimport { ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup.transformer';\n\nexport const ECS_SECURITY_GROUP_MODULE = 'spinnaker.ecs.securityGroup';\nmodule(ECS_SECURITY_GROUP_MODULE, [\n ECS_SECURITY_GROUP_READER,\n ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER,\n]);\n","import { REST } from '@spinnaker/core';\nimport type { IServiceDiscoveryRegistryDescriptor } from './IServiceDiscovery';\n\nexport class ServiceDiscoveryReader {\n public static listServiceDiscoveryRegistries(): PromiseLike<IServiceDiscoveryRegistryDescriptor[]> {\n return REST('/ecs/serviceDiscoveryRegistries').get();\n }\n}\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\nimport { chain, clone, extend, find, flatten, has, intersection, keys, some, xor } from 'lodash';\n\nimport type { IAmazonLoadBalancer } from '@spinnaker/amazon';\nimport type {\n IAccountDetails,\n IArtifact,\n IDeploymentStrategy,\n IPipeline,\n IRegion,\n IServerGroupCommand,\n IServerGroupCommandBackingData,\n IServerGroupCommandBackingDataFiltered,\n IServerGroupCommandDirty,\n IServerGroupCommandResult,\n IServerGroupCommandViewState,\n IStage,\n ISubnet,\n LoadBalancerReader,\n SecurityGroupReader,\n ServerGroupCommandRegistry,\n} from '@spinnaker/core';\nimport {\n AccountService,\n CACHE_INITIALIZER_SERVICE,\n LOAD_BALANCER_READ_SERVICE,\n NameUtils,\n SECURITY_GROUP_READER,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n SubnetReader,\n} from '@spinnaker/core';\nimport type { IDockerImage } from '@spinnaker/docker';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport type { IEcsCapacityProviderDetails } from '../../ecsCluster/IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from '../../ecsCluster/IEcsCluster';\nimport type { EcsClusterReader } from '../../ecsCluster/ecsCluster.read.service';\nimport type { IRoleDescriptor } from '../../iamRoles/IRole';\nimport type { IamRoleReader } from '../../iamRoles/iamRole.read.service';\nimport type { IMetricAlarmDescriptor } from '../../metricAlarm/MetricAlarm';\nimport type { MetricAlarmReader } from '../../metricAlarm/metricAlarm.read.service';\nimport type { IPlacementStrategy } from '../../placementStrategy/IPlacementStrategy';\nimport type { PlacementStrategyService } from '../../placementStrategy/placementStrategy.service';\nimport type { ISecretDescriptor } from '../../secrets/ISecret';\nimport type { SecretReader } from '../../secrets/secret.read.service';\nimport type { IServiceDiscoveryRegistryDescriptor } from '../../serviceDiscovery/IServiceDiscovery';\nimport { ServiceDiscoveryReader } from '../../serviceDiscovery/serviceDiscovery.read.service';\n\nexport interface IEcsServerGroupCommandDirty extends IServerGroupCommandDirty {\n targetGroups?: string[];\n defaulCapacityProviders?: string[];\n customCapacityProviders?: string[];\n}\n\nexport interface IEcsServerGroupCommandResult extends IServerGroupCommandResult {\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsDockerImage extends IDockerImage {\n imageId: string;\n message: string;\n fromTrigger: boolean;\n fromContext: boolean;\n stageId: string;\n imageLabelOrSha: string;\n}\n\nexport interface IEcsServerGroupCommandViewState extends IServerGroupCommandViewState {\n contextImages: IEcsDockerImage[];\n pipeline: IPipeline;\n currentStage: IStage;\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsServerGroupCommandBackingDataFiltered extends IServerGroupCommandBackingDataFiltered {\n targetGroups: string[];\n iamRoles: string[];\n ecsClusters: string[];\n availableCapacityProviders: string[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n metricAlarms: IMetricAlarmDescriptor[];\n subnetTypes: ISubnet[];\n securityGroupNames: string[];\n secrets: string[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsServerGroupCommandBackingData extends IServerGroupCommandBackingData {\n filtered: IEcsServerGroupCommandBackingDataFiltered;\n targetGroups: string[];\n ecsClusters: IEcsClusterDescriptor[];\n capacityProviderDetails: IEcsCapacityProviderDetails[];\n iamRoles: IRoleDescriptor[];\n metricAlarms: IMetricAlarmDescriptor[];\n launchTypes: string[];\n networkModes: string[];\n secrets: ISecretDescriptor[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsTaskDefinitionArtifact {\n artifact?: IArtifact;\n artifactId?: string;\n}\n\nexport interface IEcsContainerMapping {\n containerName: string;\n imageDescription: IEcsDockerImage;\n}\n\nexport interface IEcsTargetGroupMapping {\n containerName: string;\n containerPort: number;\n targetGroup: string;\n}\n\nexport interface IEcsServiceDiscoveryRegistryAssociation {\n registry: IServiceDiscoveryRegistryDescriptor;\n containerPort: number;\n containerName: string;\n}\n\nexport interface IEcsCapacityProviderStrategyItem {\n capacityProvider: string;\n base: number;\n weight: number;\n}\n\nexport interface IEcsServerGroupCommand extends IServerGroupCommand {\n associatePublicIpAddress: boolean;\n backingData: IEcsServerGroupCommandBackingData;\n computeUnits: number;\n reservedMemory: number;\n targetHealthyDeployPercentage: number;\n targetGroup: string;\n containerPort: number;\n placementStrategyName: string;\n placementStrategySequence: IPlacementStrategy[];\n imageDescription: IEcsDockerImage;\n networkMode: string;\n subnetType: string;\n subnetTypes: string[];\n securityGroups: string[];\n securityGroupNames: string[];\n viewState: IEcsServerGroupCommandViewState;\n taskDefinitionArtifact: IEcsTaskDefinitionArtifact;\n taskDefinitionArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n loadBalancedContainer: string;\n targetGroupMappings: IEcsTargetGroupMapping[];\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n useTaskDefinitionArtifact: boolean;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n useDefaultCapacityProviders: boolean;\n ecsClusterName: string;\n subnetTypeChanged: (command: IEcsServerGroupCommand) => IServerGroupCommandResult;\n placementStrategyNameChanged: (command: IEcsServerGroupCommand) => IServerGroupCommandResult;\n regionIsDeprecated: (command: IEcsServerGroupCommand) => boolean;\n\n clusterChanged: (command: IServerGroupCommand) => void;\n}\n\nexport class EcsServerGroupConfigurationService {\n // private enabledMetrics = ['GroupMinSize', 'GroupMaxSize', 'GroupDesiredCapacity', 'GroupInServiceInstances', 'GroupPendingInstances', 'GroupStandbyInstances', 'GroupTerminatingInstances', 'GroupTotalInstances'];\n // private healthCheckTypes = ['EC2', 'ELB'];\n // private terminationPolicies = ['OldestInstance', 'NewestInstance', 'OldestLaunchConfiguration', 'ClosestToNextInstanceHour', 'Default'];\n private launchTypes = ['EC2', 'FARGATE'];\n private networkModes = ['bridge', 'host', 'awsvpc', 'none', 'default'];\n\n public static $inject = [\n '$q',\n 'loadBalancerReader',\n 'serverGroupCommandRegistry',\n 'iamRoleReader',\n 'ecsClusterReader',\n 'metricAlarmReader',\n 'placementStrategyService',\n 'securityGroupReader',\n 'secretReader',\n ];\n constructor(\n private $q: IQService,\n private loadBalancerReader: LoadBalancerReader,\n private serverGroupCommandRegistry: ServerGroupCommandRegistry,\n private iamRoleReader: IamRoleReader,\n private ecsClusterReader: EcsClusterReader,\n private metricAlarmReader: MetricAlarmReader,\n private placementStrategyService: PlacementStrategyService,\n private securityGroupReader: SecurityGroupReader,\n private secretReader: SecretReader,\n ) {}\n\n public configureUpdateCommand(command: IEcsServerGroupCommand): void {\n command.backingData = {\n // terminationPolicies: clone(this.terminationPolicies)\n launchTypes: clone(this.launchTypes),\n networkModes: clone(this.networkModes),\n } as IEcsServerGroupCommandBackingData;\n }\n\n // TODO (Bruno Carrier): Why do we need to inject an Application into this constructor so that the app works? This is strange, and needs investigating\n public configureCommand(cmd: IEcsServerGroupCommand, imageQuery = ''): PromiseLike<void> {\n this.applyOverrides('beforeConfiguration', cmd);\n cmd.toggleSuspendedProcess = (command: IEcsServerGroupCommand, process: string): void => {\n command.suspendedProcesses = command.suspendedProcesses || [];\n const processIndex = command.suspendedProcesses.indexOf(process);\n if (processIndex === -1) {\n command.suspendedProcesses.push(process);\n } else {\n command.suspendedProcesses.splice(processIndex, 1);\n }\n };\n\n cmd.processIsSuspended = (command: IEcsServerGroupCommand, process: string): boolean =>\n command.suspendedProcesses.includes(process);\n\n cmd.onStrategyChange = (command: IEcsServerGroupCommand, strategy: IDeploymentStrategy): void => {\n // Any strategy other than None or Custom should force traffic to be enabled\n if (strategy.key !== '' && strategy.key !== 'custom') {\n command.suspendedProcesses = (command.suspendedProcesses || []).filter((p) => p !== 'AddToLoadBalancer');\n }\n };\n\n cmd.regionIsDeprecated = (command: IEcsServerGroupCommand): boolean => {\n return (\n has(command, 'backingData.filtered.regions') &&\n command.backingData.filtered.regions.some((region) => region.name === command.region && region.deprecated)\n );\n };\n\n const imageQueries = cmd.imageDescription ? [this.grabImageAndTag(cmd.imageDescription.imageId)] : [];\n\n if (imageQuery) {\n imageQueries.push(imageQuery);\n }\n\n let imagesPromise;\n if (imageQueries.length) {\n imagesPromise = this.$q\n .all(\n imageQueries.map((q) =>\n DockerImageReader.findImages({\n provider: 'dockerRegistry',\n count: 50,\n q: q,\n }),\n ),\n )\n .then((promises) => flatten(promises));\n } else {\n imagesPromise = this.$q.when([]);\n }\n\n return this.$q\n .all({\n credentialsKeyedByAccount: AccountService.getCredentialsKeyedByAccount('ecs'),\n loadBalancers: this.loadBalancerReader.listLoadBalancers('ecs'),\n subnets: SubnetReader.listSubnetsByProvider('ecs'),\n iamRoles: this.iamRoleReader.listRoles('ecs'),\n ecsClusters: this.ecsClusterReader.listClusters(),\n capacityProviderDetails: this.ecsClusterReader.describeClusters(cmd.credentials, cmd.region),\n metricAlarms: this.metricAlarmReader.listMetricAlarms(),\n securityGroups: this.securityGroupReader.getAllSecurityGroups(),\n launchTypes: this.$q.when(clone(this.launchTypes)),\n networkModes: this.$q.when(clone(this.networkModes)),\n secrets: this.secretReader.listSecrets(),\n serviceDiscoveryRegistries: ServiceDiscoveryReader.listServiceDiscoveryRegistries(),\n images: imagesPromise,\n })\n .then((backingData: Partial<IEcsServerGroupCommandBackingData>) => {\n backingData.accounts = keys(backingData.credentialsKeyedByAccount);\n backingData.filtered = {} as IEcsServerGroupCommandBackingDataFiltered;\n\n if (cmd.viewState.contextImages) {\n backingData.images = backingData.images.concat(cmd.viewState.contextImages);\n }\n cmd.backingData = backingData as IEcsServerGroupCommandBackingData;\n this.configureVpcId(cmd);\n this.configureAvailableIamRoles(cmd);\n this.configureAvailableSubnetTypes(cmd);\n this.configureAvailableSecurityGroups(cmd);\n this.configureAvailableEcsClusters(cmd);\n this.setCapacityProviderDetails(cmd);\n this.configureAvailableSecrets(cmd);\n this.configureAvailableServiceDiscoveryRegistries(cmd);\n this.configureAvailableImages(cmd);\n this.configureAvailableRegions(cmd);\n this.configureLoadBalancerOptions(cmd);\n this.applyOverrides('afterConfiguration', cmd);\n this.attachEventHandlers(cmd);\n });\n }\n\n public setCapacityProviderDetails(command: IEcsServerGroupCommand): void {\n this.$q\n .all({\n capacityProviderDetails: this.ecsClusterReader.describeClusters(command.credentials, command.region),\n })\n .then((result: Partial<IEcsServerGroupCommandBackingData>) => {\n command.backingData.capacityProviderDetails = chain(result.capacityProviderDetails)\n .map((cluster) => this.mapCapacityProviderDetails(cluster))\n .value();\n });\n\n if (command.ecsClusterName != null && command.ecsClusterName.length > 0) {\n this.configureAvailableCapacityProviders(command);\n } else {\n command.backingData.filtered.availableCapacityProviders = [];\n command.backingData.filtered.defaultCapacityProviderStrategy = [];\n }\n this.checkDirtyCapacityProviders(command);\n }\n\n public configureAvailableCapacityProviders(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.availableCapacityProviders = chain(command.backingData.capacityProviderDetails)\n .filter({\n clusterName: command.ecsClusterName,\n })\n .map((availableCPs) => availableCPs.capacityProviders)\n .flattenDeep<string>()\n .value();\n\n command.backingData.filtered.defaultCapacityProviderStrategy = chain(command.backingData.capacityProviderDetails)\n .filter({\n clusterName: command.ecsClusterName,\n })\n .map((availableCPs) => availableCPs.defaultCapacityProviderStrategy)\n .flattenDeep<IEcsCapacityProviderStrategyItem>()\n .value();\n }\n\n public mapCapacityProviderDetails(describeClusters: IEcsCapacityProviderDetails): IEcsCapacityProviderDetails {\n return {\n capacityProviders: describeClusters.capacityProviders,\n clusterName: describeClusters.clusterName,\n defaultCapacityProviderStrategy: describeClusters.defaultCapacityProviderStrategy,\n };\n }\n\n public applyOverrides(phase: string, command: IEcsServerGroupCommand): void {\n this.serverGroupCommandRegistry.getCommandOverrides('ecs').forEach((override: any) => {\n if (override[phase]) {\n override[phase](command);\n }\n });\n }\n\n public grabImageAndTag(imageId: string): string {\n return imageId.split('/').pop();\n }\n\n public buildImageId(image: IEcsDockerImage): string {\n if (image.fromContext) {\n return `${image.imageLabelOrSha}`;\n } else if (image.fromTrigger && !image.tag) {\n return `${image.registry}/${image.repository} (Tag resolved at runtime)`;\n } else {\n return `${image.registry}/${image.repository}:${image.tag}`;\n }\n }\n\n public mapImage(image: IEcsDockerImage): IEcsDockerImage {\n if (image.message !== undefined) {\n return image;\n }\n\n return {\n repository: image.repository,\n tag: image.tag,\n imageId: this.buildImageId(image),\n registry: image.registry,\n fromContext: image.fromContext,\n fromTrigger: image.fromTrigger,\n account: image.account,\n imageLabelOrSha: image.imageLabelOrSha,\n stageId: image.stageId,\n message: image.message,\n };\n }\n\n public configureAvailableImages(command: IEcsServerGroupCommand): void {\n // No filtering required, but need to decorate with the displayable image ID\n command.backingData.filtered.images = command.backingData.images.map((image) => this.mapImage(image));\n }\n\n public configureAvailabilityZones(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.availabilityZones = find<IRegion>(\n command.backingData.credentialsKeyedByAccount[command.credentials].regions,\n { name: command.region },\n ).availabilityZones;\n command.availabilityZones = command.backingData.filtered.availabilityZones;\n }\n\n public configureAvailableSecurityGroups(command: IEcsServerGroupCommand): void {\n if (command.subnetType == null && (command.subnetTypes == null || command.subnetTypes.length == 0)) {\n command.backingData.filtered.securityGroups = [];\n return;\n }\n\n const vpcId = chain(command.backingData.subnets)\n .filter({\n account: command.credentials,\n region: command.region,\n purpose: command.subnetTypes ? command.subnetTypes[0] : command.subnetType,\n })\n .compact()\n .uniqBy('purpose')\n .map('vpcId')\n .value()[0];\n\n if (\n command.backingData.securityGroups[command.credentials] &&\n command.backingData.securityGroups[command.credentials]['ecs'] &&\n command.backingData.securityGroups[command.credentials]['ecs'][command.region]\n ) {\n const allSecurityGroups = command.backingData.securityGroups[command.credentials]['ecs'][command.region];\n command.backingData.filtered.securityGroupNames = chain(allSecurityGroups)\n .filter({ vpcId: vpcId })\n .map('name')\n .value() as string[];\n }\n }\n\n public configureAvailableSubnetTypes(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.subnetTypes = chain(command.backingData.subnets)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .compact()\n .uniqBy('purpose')\n .value()\n .filter(function (e: ISubnet) {\n return e.purpose && e.purpose.length > 0;\n });\n }\n\n public configureAvailableEcsClusters(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.ecsClusters = chain(command.backingData.ecsClusters)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map('name')\n .value();\n }\n\n public configureAvailableSecrets(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.secrets = chain(command.backingData.secrets)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map('name')\n .value();\n }\n\n public buildServiceRegistryDisplayName(registry: IServiceDiscoveryRegistryDescriptor): string {\n return `${registry.name} (${registry.id})`;\n }\n\n public mapServiceRegistry(registry: IServiceDiscoveryRegistryDescriptor): IServiceDiscoveryRegistryDescriptor {\n return {\n account: registry.account,\n region: registry.region,\n name: registry.name,\n id: registry.id,\n arn: registry.arn,\n displayName: this.buildServiceRegistryDisplayName(registry),\n };\n }\n\n public configureAvailableServiceDiscoveryRegistries(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.serviceDiscoveryRegistries = chain(command.backingData.serviceDiscoveryRegistries)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map((registry) => this.mapServiceRegistry(registry))\n .value();\n }\n\n public configureAvailableRegions(command: IEcsServerGroupCommand): void {\n const regionsForAccount: IAccountDetails =\n command.backingData.credentialsKeyedByAccount[command.credentials] || ({ regions: [] } as IAccountDetails);\n command.backingData.filtered.regions = regionsForAccount.regions;\n }\n\n public configureAvailableIamRoles(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.iamRoles = chain(command.backingData.iamRoles)\n .filter({ accountName: command.credentials })\n .map('name')\n .value();\n if (command.backingData.filtered.iamRoles.length > 0) {\n command.backingData.filtered.iamRoles.splice(0, 0, 'None (No IAM role)');\n }\n }\n\n public configureSubnetPurposes(command: IEcsServerGroupCommand): IServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (command.region === null) {\n return result;\n }\n filteredData.subnetPurposes = chain(command.backingData.subnets)\n .filter({ account: command.credentials, region: command.region })\n .reject({ target: 'elb' })\n .reject({ purpose: null })\n .uniqBy('purpose')\n .value();\n\n if (command.subnetTypes) {\n result.dirty.subnetType = !command.subnetTypes.every((subnetType) =>\n chain(filteredData.subnetPurposes).some({ purpose: subnetType }).value(),\n );\n } else if (!chain(filteredData.subnetPurposes).some({ purpose: command.subnetType }).value()) {\n result.dirty.subnetType = true;\n }\n\n if (result.dirty.subnetType) {\n command.subnetTypes = null;\n command.subnetType = null;\n }\n\n return result;\n }\n\n private getLoadBalancerMap(command: IEcsServerGroupCommand): IAmazonLoadBalancer[] {\n return chain(command.backingData.loadBalancers)\n .map('accounts')\n .flattenDeep()\n .filter({ name: command.credentials })\n .map('regions')\n .flattenDeep()\n .filter({ name: command.region })\n .map<IAmazonLoadBalancer>('loadBalancers')\n .flattenDeep<IAmazonLoadBalancer>()\n .value();\n }\n\n public getLoadBalancerNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancers = this.getLoadBalancerMap(command).filter(\n (lb) => (!lb.loadBalancerType || lb.loadBalancerType === 'classic') && lb.vpcId === command.vpcId,\n );\n return loadBalancers.map((lb) => lb.name).sort();\n }\n\n public getVpcLoadBalancerNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancersForVpc = this.getLoadBalancerMap(command).filter(\n (lb) => (!lb.loadBalancerType || lb.loadBalancerType === 'classic') && lb.vpcId,\n );\n return loadBalancersForVpc.map((lb) => lb.name).sort();\n }\n\n public getTargetGroupNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancersV2 = this.getLoadBalancerMap(command).filter((lb) => lb.loadBalancerType !== 'classic') as any[];\n const allTargetGroups = flatten(loadBalancersV2.map<string[]>((lb) => lb.targetGroups));\n return allTargetGroups.sort();\n }\n\n public configureLoadBalancerOptions(command: IEcsServerGroupCommand): IServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const currentLoadBalancers = (command.loadBalancers || []).concat(command.vpcLoadBalancers || []);\n const newLoadBalancers = this.getLoadBalancerNames(command);\n const vpcLoadBalancers = this.getVpcLoadBalancerNames(command);\n const allTargetGroups = this.getTargetGroupNames(command);\n const currentTargetGroups = command.targetGroupMappings.map((tg) => tg.targetGroup);\n if (currentLoadBalancers && command.loadBalancers) {\n const valid = command.vpcId ? newLoadBalancers : newLoadBalancers.concat(vpcLoadBalancers);\n const matched = intersection(valid, currentLoadBalancers);\n const removedLoadBalancers = xor(matched, currentLoadBalancers);\n command.loadBalancers = intersection(newLoadBalancers, matched);\n if (!command.vpcId) {\n command.vpcLoadBalancers = intersection(vpcLoadBalancers, matched);\n } else {\n delete command.vpcLoadBalancers;\n }\n if (removedLoadBalancers.length) {\n result.dirty.loadBalancers = removedLoadBalancers;\n }\n }\n\n if (currentTargetGroups) {\n const matched = intersection(allTargetGroups, currentTargetGroups);\n const removedTargetGroups = xor(matched, currentTargetGroups);\n if (removedTargetGroups && removedTargetGroups.length > 0) {\n command.viewState.dirty.targetGroups = removedTargetGroups;\n } else if (command.viewState.dirty && command.viewState.dirty.targetGroups) {\n command.viewState.dirty.targetGroups = [];\n }\n }\n\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n command.backingData.filtered.vpcLoadBalancers = vpcLoadBalancers;\n command.backingData.filtered.targetGroups = allTargetGroups;\n return result;\n }\n\n public refreshLoadBalancers(command: IEcsServerGroupCommand, skipCommandReconfiguration?: boolean) {\n return this.loadBalancerReader.listLoadBalancers('ecs').then((loadBalancers) => {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n this.configureLoadBalancerOptions(command);\n }\n });\n }\n\n public configureVpcId(command: IEcsServerGroupCommand): IEcsServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n if (command.subnetType == null && (command.subnetTypes == null || command.subnetTypes.length == 0)) {\n command.vpcId = null;\n result.dirty.vpcId = true;\n } else if (command.subnetTypes != null && command.subnetTypes.length > 0) {\n command.subnetTypes.forEach(function (subnetType) {\n const subnet = find<ISubnet>(command.backingData.subnets, {\n purpose: subnetType,\n account: command.credentials,\n region: command.region,\n });\n command.vpcId = subnet ? subnet.vpcId : null;\n });\n } else {\n const subnet = find<ISubnet>(command.backingData.subnets, {\n purpose: command.subnetType,\n account: command.credentials,\n region: command.region,\n });\n command.vpcId = subnet ? subnet.vpcId : null;\n }\n return result;\n }\n\n public checkDirtyCapacityProviders(command: IEcsServerGroupCommand): void {\n if (command.capacityProviderStrategy) {\n const availableCustomCapacityProviders = command.backingData.filtered.availableCapacityProviders;\n const currentCapacityProviders = command.capacityProviderStrategy.map((cp) => cp.capacityProvider);\n const matchedCustomCapacityProviders = intersection(availableCustomCapacityProviders, currentCapacityProviders);\n const removedCustomCapacityProviders = xor(matchedCustomCapacityProviders, currentCapacityProviders);\n\n if (removedCustomCapacityProviders && removedCustomCapacityProviders.length > 0) {\n command.viewState.dirty.customCapacityProviders = removedCustomCapacityProviders;\n } else if (command.viewState.dirty && command.viewState.dirty.customCapacityProviders) {\n command.viewState.dirty.customCapacityProviders = [];\n }\n\n if (command.useDefaultCapacityProviders) {\n const availableDefaultCapacityProvider = command.backingData.filtered.defaultCapacityProviderStrategy.map(\n (cp) => cp.capacityProvider,\n );\n const matchedDefaultCapacityProviders = intersection(\n availableDefaultCapacityProvider,\n currentCapacityProviders,\n );\n const removedDefaultCapacityProviders = xor(matchedDefaultCapacityProviders, currentCapacityProviders);\n\n if (removedDefaultCapacityProviders && removedDefaultCapacityProviders.length > 0) {\n command.viewState.dirty.defaulCapacityProviders = removedDefaultCapacityProviders;\n }\n }\n }\n }\n\n public attachEventHandlers(cmd: IEcsServerGroupCommand): void {\n cmd.subnetChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result = this.configureVpcId(command);\n extend(result.dirty, this.configureLoadBalancerOptions(command).dirty);\n command.viewState.dirty = command.viewState.dirty || {};\n extend(command.viewState.dirty, result.dirty);\n return result;\n };\n\n cmd.regionChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n extend(result.dirty, this.configureSubnetPurposes(command).dirty);\n if (command.region) {\n extend(result.dirty, command.subnetChanged(command).dirty);\n this.configureAvailabilityZones(command);\n this.configureAvailableEcsClusters(command);\n this.configureAvailableSubnetTypes(command);\n this.configureAvailableSecurityGroups(command);\n this.configureAvailableSecrets(command);\n this.configureAvailableServiceDiscoveryRegistries(command);\n this.setCapacityProviderDetails(command);\n }\n\n return result;\n };\n\n cmd.subnetTypeChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n this.configureAvailableSecurityGroups(command);\n return result;\n };\n\n cmd.clusterChanged = (command: IEcsServerGroupCommand): void => {\n command.moniker = NameUtils.getMoniker(command.application, command.stack, command.freeFormDetails);\n };\n\n cmd.credentialsChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const backingData = command.backingData;\n if (command.credentials) {\n this.configureAvailableIamRoles(command);\n this.configureAvailableEcsClusters(command);\n this.configureAvailableSubnetTypes(command);\n this.configureAvailableSecurityGroups(command);\n this.configureAvailableSecrets(command);\n this.configureAvailableServiceDiscoveryRegistries(command);\n this.configureAvailableRegions(command);\n this.setCapacityProviderDetails(command);\n\n if (!some(backingData.filtered.regions, { name: command.region })) {\n command.region = null;\n result.dirty.region = true;\n } else {\n extend(result.dirty, command.regionChanged(command).dirty);\n }\n } else {\n command.region = null;\n }\n return result;\n };\n\n cmd.placementStrategyNameChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n command.placementStrategySequence = this.placementStrategyService.getPredefinedStrategy(\n command.placementStrategyName,\n );\n return result;\n };\n\n this.applyOverrides('attachEventHandlers', cmd);\n }\n}\n\nexport const ECS_SERVER_GROUP_CONFIGURATION_SERVICE = 'spinnaker.ecs.serverGroup.configure.service';\nmodule(ECS_SERVER_GROUP_CONFIGURATION_SERVICE, [\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n CACHE_INITIALIZER_SERVICE,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n]).service('ecsServerGroupConfigurationService', EcsServerGroupConfigurationService);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, INSTANCE_TYPE_SERVICE } from '@spinnaker/core';\n\nimport { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from './serverGroupConfiguration.service';\n\nexport const ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.ecs.serverGroupCommandBuilder.service';\nexport const name = ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [\n INSTANCE_TYPE_SERVICE,\n ECS_SERVER_GROUP_CONFIGURATION_SERVICE,\n ])\n .factory('ecsServerGroupCommandBuilder', [\n '$q',\n 'instanceTypeService',\n 'ecsServerGroupConfigurationService',\n function ($q, instanceTypeService, ecsServerGroupConfigurationService) {\n function reconcileUpstreamImages(image, upstreamImages) {\n if (image.fromContext) {\n const matchingImage = upstreamImages.find((otherImage) => image.stageId === otherImage.stageId);\n\n if (matchingImage) {\n image.cluster = matchingImage.cluster;\n image.pattern = matchingImage.pattern;\n image.repository = matchingImage.repository;\n return image;\n } else {\n return null;\n }\n } else if (image.fromTrigger) {\n const matchingImage = upstreamImages.find((otherImage) => {\n return (\n image.registry === otherImage.registry &&\n image.repository === otherImage.repository &&\n image.tag === otherImage.tag\n );\n });\n\n if (matchingImage) {\n return image;\n } else {\n return null;\n }\n } else {\n return image;\n }\n }\n\n function findUpstreamImages(current, all, visited = {}) {\n // This actually indicates a loop in the stage dependencies.\n if (visited[current.refId]) {\n return [];\n } else {\n visited[current.refId] = true;\n }\n let result = [];\n if (current.type === 'findImageFromTags') {\n result.push({\n fromContext: true,\n imageLabelOrSha: current.imageLabelOrSha,\n stageId: current.refId,\n });\n }\n current.requisiteStageRefIds.forEach(function (id) {\n const next = all.find((stage) => stage.refId === id);\n if (next) {\n result = result.concat(findUpstreamImages(next, all, visited));\n }\n });\n\n return result;\n }\n\n function findTriggerImages(triggers) {\n const result = triggers\n .filter((trigger) => {\n return trigger.type === 'docker';\n })\n .map((trigger) => {\n return {\n fromTrigger: true,\n repository: trigger.repository,\n account: trigger.account,\n organization: trigger.organization,\n registry: trigger.registry,\n tag: trigger.tag,\n };\n });\n\n return result;\n }\n\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n const credentialsLoader = AccountService.getCredentialsKeyedByAccount('ecs');\n\n const defaultCredentials = defaults.account || application.defaultCredentials.ecs;\n const defaultRegion = defaults.region || application.defaultRegions.ecs;\n\n const preferredZonesLoader = AccountService.getAvailabilityZonesForAccountAndRegion(\n 'ecs',\n defaultCredentials,\n defaultRegion,\n );\n\n return $q\n .all({\n preferredZones: preferredZonesLoader,\n credentialsKeyedByAccount: credentialsLoader,\n })\n .then(function (asyncData) {\n const availabilityZones = asyncData.preferredZones;\n\n let defaultIamRole = 'None (No IAM role)';\n defaultIamRole = defaultIamRole.replace('{{application}}', application.name);\n\n const defaultImageCredentials = 'None (No registry credentials)';\n\n const command = {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n strategy: '',\n capacity: {\n min: 1,\n max: 1,\n desired: 1,\n },\n launchType: 'EC2',\n healthCheckType: 'EC2',\n selectedProvider: 'ecs',\n iamRole: defaultIamRole,\n dockerImageCredentialsSecret: defaultImageCredentials,\n availabilityZones: availabilityZones,\n subnetType: '',\n securityGroupNames: [],\n healthCheckGracePeriodSeconds: '',\n placementConstraints: [],\n placementStrategyName: '',\n taskDefinitionArtifact: {},\n useTaskDefinitionArtifact: false,\n placementStrategySequence: [],\n serviceDiscoveryAssociations: [],\n ecsClusterName: '',\n targetGroup: '',\n copySourceScalingPoliciesAndActions: true,\n preferSourceCapacity: true,\n useSourceCapacity: true,\n enableDeploymentCircuitBreaker: false,\n viewState: {\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n dirty: {},\n },\n };\n\n if (\n application.attributes &&\n application.attributes.platformHealthOnlyShowOverride &&\n application.attributes.platformHealthOnly\n ) {\n command.interestingHealthProviderNames = ['ecs'];\n }\n\n return command;\n });\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster, current, pipeline) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = Object.keys(pipelineCluster.availabilityZones)[0];\n // var instanceTypeCategoryLoader = instanceTypeService.getCategoryForInstanceType('ecs', pipelineCluster.instanceType);\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const zones = pipelineCluster.availabilityZones[region];\n const usePreferredZones = zones.join(',') === command.availabilityZones.join(',');\n\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n if (command.docker && command.docker.image) {\n command.docker.image = reconcileUpstreamImages(command.docker.image, contextImages);\n }\n\n const viewState = {\n instanceProfile: undefined,\n disableImageSelection: true,\n useSimpleCapacity:\n pipelineCluster.capacity.min === pipelineCluster.capacity.max &&\n pipelineCluster.useSourceCapacity !== true,\n usePreferredZones: usePreferredZones,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n templatingEnabled: true,\n existingPipelineCluster: true,\n dirty: {},\n contextImages: contextImages,\n pipeline: pipeline,\n currentStage: current,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n availabilityZones: pipelineCluster.availabilityZones[region],\n viewState: viewState,\n };\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n return angular.extend({}, command, pipelineCluster, viewOverrides);\n });\n }\n\n // Only used to prepare view requiring template selecting\n function buildNewServerGroupCommandForPipeline(current, pipeline) {\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n // applies viewState overrides after template selection\n overrides: {\n viewState: {\n mode: 'editPipeline',\n contextImages: contextImages,\n pipeline: pipeline,\n currentStage: current,\n },\n },\n },\n });\n }\n\n function buildUpdateServerGroupCommand(serverGroup) {\n const command = {\n type: 'modifyAsg',\n asgs: [{ asgName: serverGroup.name, region: serverGroup.region }],\n healthCheckType: serverGroup.asg.healthCheckType,\n credentials: serverGroup.account,\n };\n ecsServerGroupConfigurationService.configureUpdateCommand(command);\n return command;\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode = 'clone') {\n // do NOT copy: deployment strategy. DO copy: account, region, cluster name, stack\n // TODO: query for & pull in ECS-specific data that would be useful, e.g, network mode, launch type\n const commandOptions = { account: serverGroup.account, region: serverGroup.region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n command.credentials = serverGroup.account;\n command.app = serverGroup.moniker.app;\n command.stack = serverGroup.moniker.stack;\n command.region = serverGroup.region;\n command.ecsClusterName = serverGroup.ecsCluster;\n command.capacity = serverGroup.capacity;\n command.viewState.mode = mode;\n\n return command;\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n buildUpdateServerGroupCommand: buildUpdateServerGroupCommand,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport {\n ModalWizard,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n SERVER_GROUP_WRITER,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n TaskMonitor,\n} from '@spinnaker/core';\n\nimport { ECS_CLUSTER_READ_SERVICE } from '../../../ecsCluster/ecsCluster.read.service';\nimport { IAM_ROLE_READ_SERVICE } from '../../../iamRoles/iamRole.read.service';\nimport { ECS_SECRET_READ_SERVICE } from '../../../secrets/secret.read.service';\nimport { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from '../serverGroupConfiguration.service';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER =\n 'spinnaker.ecs.cloneServerGroup.controller';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ECS_SERVER_GROUP_CONFIGURATION_SERVICE,\n SERVER_GROUP_WRITER,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n IAM_ROLE_READ_SERVICE,\n ECS_CLUSTER_READ_SERVICE,\n ECS_SECRET_READ_SERVICE,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n]).controller('ecsCloneServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$q',\n '$state',\n 'serverGroupWriter',\n 'overrideRegistry',\n 'ecsServerGroupConfigurationService',\n 'serverGroupCommandRegistry',\n 'serverGroupCommand',\n 'iamRoleReader',\n 'ecsClusterReader',\n 'secretReader',\n 'application',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n $state,\n serverGroupWriter,\n overrideRegistry,\n ecsServerGroupConfigurationService,\n serverGroupCommandRegistry,\n serverGroupCommand,\n iamRoleReader,\n ecsClusterReader,\n secretReader,\n application,\n title,\n ) {\n $scope.pages = {\n templateSelection: overrideRegistry.getTemplate(\n 'ecs.serverGroup.templateSelection',\n require('./templateSelection/templateSelection.html'),\n ),\n basicSettings: overrideRegistry.getTemplate(\n 'ecs.serverGroup.basicSettings',\n require('./location/basicSettings.html'),\n ),\n container: overrideRegistry.getTemplate('ecs.serverGroup.container', require('./container/container.html')),\n horizontalScaling: overrideRegistry.getTemplate(\n 'ecs.serverGroup.horizontalScaling',\n require('./horizontalScaling/horizontalScaling.html'),\n ),\n networking: overrideRegistry.getTemplate('ecs.serverGroup.networking', require('./networking/networking.html')),\n logging: overrideRegistry.getTemplate('ecs.serverGroup.logging', require('./logging/logging.html')),\n serviceDiscovery: overrideRegistry.getTemplate(\n 'ecs.serverGroup.serviceDiscovery',\n require('./serviceDiscovery/serviceDiscovery.html'),\n ),\n advancedSettings: overrideRegistry.getTemplate(\n 'ecs.serverGroup.advancedSettings',\n require('./advancedSettings/advancedSettings.html'),\n ),\n taskDefinition: overrideRegistry.getTemplate(\n 'ecs.taskDefinition',\n require('./taskDefinition/taskDefinition.html'),\n ),\n };\n\n $scope.title = title;\n\n $scope.applicationName = application.name;\n $scope.application = application;\n\n $scope.command = serverGroupCommand;\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n this.templateSelectionText = {\n copied: ['account, region, ecs cluster, stack', 'capacity'],\n notCopied: ['launch type, target group, network mode'],\n };\n if (!$scope.command.viewState.disableStrategySelection) {\n this.templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: $scope.command.credentials,\n region: $scope.command.region,\n provider: 'ecs',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if ($state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if ($state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if ($state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n $state.go(transitionTo, newStateParams);\n }\n }\n }\n\n function onTaskComplete() {\n application.serverGroups.refresh();\n application.serverGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function configureCommand() {\n ecsServerGroupConfigurationService.configureCommand($scope.command).then(function () {\n $scope.state.loaded = true;\n initializeCommand();\n initializeSelectOptions();\n initializeWatches();\n });\n }\n\n function initializeWatches() {\n $scope.$watch('command.subnetType', createResultProcessor($scope.command.subnetTypeChanged));\n $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged));\n $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged));\n $scope.$watch(\n 'command.placementStrategyName',\n createResultProcessor($scope.command.placementStrategyNameChanged),\n );\n $scope.$watch('command.stack', () => $scope.command.clusterChanged($scope.command));\n $scope.$watch('command.freeFormDetails', () => $scope.command.clusterChanged($scope.command));\n }\n\n function initializeSelectOptions() {\n processCommandUpdateResult($scope.command.credentialsChanged(serverGroupCommand));\n processCommandUpdateResult($scope.command.regionChanged(serverGroupCommand));\n }\n\n function createResultProcessor(method) {\n return function () {\n processCommandUpdateResult(method(serverGroupCommand));\n };\n }\n\n function processCommandUpdateResult() {\n // TODO(Bruno Carrier) - Implement marking sections either dirty or complete\n }\n\n function initializeCommand() {}\n\n this.isValid = function () {\n return true; // TODO(Bruno Carrier) - Implement validation of the form\n };\n\n this.showSubmitButton = function () {\n return ModalWizard.allPagesVisited();\n };\n\n this.submit = function () {\n if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') {\n return $uibModalInstance.close($scope.command);\n }\n $scope.taskMonitor.submit(function () {\n return serverGroupWriter.cloneServerGroup($scope.command, application);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n if (!$scope.state.requiresTemplateSelection) {\n configureCommand();\n } else {\n $scope.state.loaded = true;\n }\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n\n // used by react components to update command fields in parent (angular) scope\n $scope.notifyAngular = function (commandKey, value) {\n if (commandKey == 'pipeline') {\n $scope.command.viewState.pipeline = value;\n } else {\n $scope.command[commandKey] = value;\n }\n };\n\n // used by react components to configure command for image queries\n $scope.configureCommand = function (query) {\n return ecsServerGroupConfigurationService.configureCommand($scope.command, query);\n };\n\n // TODO: Migrate horizontalScaling component to react and move this logic there\n $scope.capacityProviderState = {\n useCapacityProviders:\n $scope.command.capacityProviderStrategy && $scope.command.capacityProviderStrategy.length > 0,\n updateComputeOption: function (chosenOption) {\n if (chosenOption == 'launchType') {\n $scope.command.capacityProviderStrategy = [];\n } else if (chosenOption == 'capacityProviders') {\n $scope.command.launchType = '';\n $scope.command.capacityProviderStrategy = $scope.command.capacityProviderStrategy || [];\n }\n },\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT =\n 'spinnaker.ecs.serverGroup.configure.wizard.advancedSettings.component';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT, []).component(\n 'ecsServerGroupAdvancedSettings',\n {\n bindings: {\n command: '=',\n application: '=',\n },\n templateUrl: require('./advancedSettings.component.html'),\n },\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderStrategyItem, IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsCapacityProviderProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IEcsCapacityProviderState {\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n availableCapacityProviders: string[];\n ecsClusterName: string;\n useDefaultCapacityProviders: boolean;\n capacityProviderLoadedFlag: boolean;\n}\n\nclass EcsCapacityProvider extends React.Component<IEcsCapacityProviderProps, IEcsCapacityProviderState> {\n constructor(props: IEcsCapacityProviderProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n ecsClusterName: cmd.ecsClusterName,\n useDefaultCapacityProviders:\n cmd.useDefaultCapacityProviders || (cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length == 0),\n capacityProviderStrategy:\n cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length > 0 ? cmd.capacityProviderStrategy : [],\n capacityProviderLoadedFlag: false,\n };\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n const cmd = this.props.command;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n this.setState({\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n capacityProviderStrategy: this.getCapacityProviderStrategy(useDefaultCapacityProviders, cmd),\n capacityProviderLoadedFlag: true,\n });\n this.props.notifyAngular('useDefaultCapacityProviders', this.state.useDefaultCapacityProviders);\n this.props.notifyAngular('capacityProviderStrategy', this.state.capacityProviderStrategy);\n });\n }\n\n private getAvailableCapacityProviders = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.availableCapacityProviders\n ? cmd.backingData.filtered.availableCapacityProviders\n : [];\n };\n\n private getDefaultCapacityProviderStrategy = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : [];\n };\n\n private getCapacityProviderStrategy = (useDefaultCapacityProviders: boolean, cmd: IEcsServerGroupCommand) => {\n return useDefaultCapacityProviders &&\n cmd.backingData &&\n cmd.backingData.filtered &&\n cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : this.state.capacityProviderStrategy;\n };\n\n private addCapacityProviderStrategy = () => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.push({ capacityProvider: '', base: null, weight: null });\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private removeCapacityProviderStrategy = (index: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.splice(index, 1);\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderName = (index: number, targetCapacityProviderName: string) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.capacityProvider = targetCapacityProviderName;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.command.viewState.dirty.customCapacityProviders = [];\n };\n\n private updateCapacityProviderBase = (index: number, targetCapacityProviderBase: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.base = targetCapacityProviderBase;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderWeight = (index: number, targetCapacityProviderWeight: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.weight = targetCapacityProviderWeight;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderType = (targetCapacityProviderType: boolean) => {\n this.setState({ useDefaultCapacityProviders: targetCapacityProviderType });\n this.props.notifyAngular('useDefaultCapacityProviders', targetCapacityProviderType);\n this.props.command.viewState.dirty.customCapacityProviders = [];\n\n const capacityProviderStrategy =\n targetCapacityProviderType && this.state.defaultCapacityProviderStrategy.length > 0\n ? this.state.defaultCapacityProviderStrategy\n : [];\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n };\n\n render(): React.ReactElement<EcsCapacityProvider> {\n const updateCapacityProviderName = this.updateCapacityProviderName;\n const updateCapacityProviderBase = this.updateCapacityProviderBase;\n const updateCapacityProviderWeight = this.updateCapacityProviderWeight;\n const addCapacityProviderStrategy = this.addCapacityProviderStrategy;\n const removeCapacityProviderStrategy = this.removeCapacityProviderStrategy;\n const updateCapacityProviderType = this.updateCapacityProviderType;\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n const capacityProviderLoadedFlag = this.state.capacityProviderLoadedFlag;\n const customDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.customCapacityProviders\n ? this.props.command.viewState.dirty.customCapacityProviders\n : [];\n const defaultDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.defaulCapacityProviders\n ? this.props.command.viewState.dirty.defaulCapacityProviders\n : [];\n\n const capacityProviderNames =\n this.state.availableCapacityProviders && this.state.availableCapacityProviders.length > 0\n ? this.state.availableCapacityProviders.map((capacityProviderNames) => {\n return { label: `${capacityProviderNames}`, value: capacityProviderNames };\n })\n : [];\n\n const defaultCPError =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p className=\"text-left\">\n <i className=\"fa fa-exclamation-triangle\"></i>\n Invalid capacity providers are a part of default capacity provider strategy.\n <br />\n Please click 'Done' to use current default capacity provider strategy (shown below) or switch to using a\n custom strategy.\n </p>\n </div>\n ) : (\n ''\n );\n\n const dirtyCapacityProviderList = customDirtyCapacityProviders\n ? customDirtyCapacityProviders.map(function (capacityProvider, index) {\n return <li key={index}>{capacityProvider}</li>;\n })\n : '';\n\n const dirtyCapacityProviderSection =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders.length > 0 ? (\n defaultCPError\n ) : customDirtyCapacityProviders.length > 0 && !useDefaultCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following capacity providers could not be found in the selected account/region/cluster and were removed:\n </p>\n <ul>{dirtyCapacityProviderList}</ul>\n <br />\n <p className=\"text-left\">Please select the capacity provider(s) from the dropdown to resolve this error.</p>\n </div>\n ) : (\n ''\n );\n\n const capacityProviderInputs =\n capacityProviderStrategy.length > 0 ? (\n capacityProviderStrategy.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useDefaultCapacityProviders ? (\n <td>\n <input\n data-test-id={'ServerGroup.defaultCapacityProvider.name.' + index}\n type=\"string\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.capacityProvider}\n disabled={true}\n />\n </td>\n ) : (\n <td data-test-id={'ServerGroup.customCapacityProvider.name.' + index}>\n <TetheredSelect\n placeholder=\"Select capacity provider\"\n options={capacityProviderNames}\n value={mapping.capacityProvider}\n onChange={(e: Option) => {\n updateCapacityProviderName(index, e.label as string);\n }}\n clearable={false}\n />\n </td>\n )}\n <td>\n <input\n data-test-id={'ServerGroup.capacityProvider.base.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n value={mapping.base}\n onChange={(e) => updateCapacityProviderBase(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <input\n data-test-id={'ServerGroup.capacityProvider.weight.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.weight}\n onChange={(e) => updateCapacityProviderWeight(index, e.target.valueAsNumber)}\n />\n </td>\n {!useDefaultCapacityProviders ? (\n <td>\n <div className=\"form-control-static\">\n <a className=\"btn-link sm-label\" onClick={() => removeCapacityProviderStrategy(index)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n ) : (\n ''\n )}\n </tr>\n );\n })\n ) : useDefaultCapacityProviders && this.state.capacityProviderStrategy.length == 0 ? (\n <tr>\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\">\n {' '}\n The cluster does not have a default capacity provider strategy defined. Set a default capacity provider\n strategy or use a custom strategy.\n </Alert>\n </div>\n </tr>\n ) : (\n ''\n );\n\n const newCapacityProviderStrategy =\n this.state.ecsClusterName &&\n this.props.command.credentials &&\n this.props.command.region &&\n !useDefaultCapacityProviders &&\n capacityProviderNames.length > 0 ? (\n <button\n data-test-id=\"ServerGroup.addCapacityProvider\"\n className=\"btn btn-block btn-sm add-new\"\n onClick={addCapacityProviderStrategy}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Capacity Provider\n </button>\n ) : !useDefaultCapacityProviders && capacityProviderLoadedFlag && capacityProviderNames.length == 0 ? (\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\"> The cluster does not have capacity providers defined. </Alert>\n </div>\n ) : (\n ''\n );\n\n return (\n <div>\n {(customDirtyCapacityProviders.length > 0 || defaultDirtyCapacityProviders.length > 0) &&\n capacityProviderLoadedFlag ? (\n <div>{dirtyCapacityProviderSection}</div>\n ) : (\n ''\n )}\n <div className=\"sm-label-left\">\n <b>Capacity Provider Strategy</b>\n <HelpField id=\"ecs.capacityProviderStrategy\" /> <br />\n <span>({this.state.ecsClusterName})</span>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.default\"\n type=\"radio\"\n checked={useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(true)}\n id=\"computeOptionsLaunchType1\"\n />\n Use cluster default\n </label>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.custom\"\n type=\"radio\"\n checked={!useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(false)}\n id=\"computeOptionsCapacityProviders2\"\n />\n Use custom (Advanced)\n </label>\n </div>\n {capacityProviderLoadedFlag ? (\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th style={{ width: '50%' }}>\n Provider name\n <HelpField id=\"ecs.capacityProviderName\" />\n </th>\n <th style={{ width: '25%' }}>\n Base\n <HelpField id=\"ecs.capacityProviderBase\" />\n </th>\n <th style={{ width: '25%' }}>\n Weight\n <HelpField id=\"ecs.capacityProviderWeight\" />\n </th>\n </tr>\n </thead>\n <tbody>{capacityProviderInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newCapacityProviderStrategy}</td>\n </tr>\n </tfoot>\n </table>\n ) : (\n <div className=\"load medium\">\n <div className=\"message\">Loading capacity providers...</div>\n <div className=\"bars\">\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport const ECS_CAPACITY_PROVIDER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.capacityProvider.react';\nmodule(ECS_CAPACITY_PROVIDER_REACT, []).component(\n 'ecsCapacityProviderReact',\n react2angular(withErrorBoundary(EcsCapacityProvider, 'ecsCapacityProviderReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type {\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IContainerProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IContainerState {\n imageDescription: IEcsDockerImage;\n computeUnits: number;\n reservedMemory: number;\n dockerImages: IEcsDockerImage[];\n targetGroupsAvailable: string[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n}\n\nexport class Container extends React.Component<IContainerProps, IContainerState> {\n constructor(props: IContainerProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n cmd.containerMappings = null;\n\n this.state = {\n imageDescription: cmd.imageDescription ? cmd.imageDescription : this.getEmptyImageDescription(),\n computeUnits: cmd.computeUnits,\n reservedMemory: cmd.reservedMemory,\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],\n };\n\n this.state.targetGroupMappings.forEach((targetGroupMapping) => {\n targetGroupMapping.containerName = '';\n });\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,\n });\n });\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingImage = (newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n\n this.props.notifyAngular('imageDescription', newImageDescription);\n this.setState({ imageDescription: newImageDescription });\n };\n\n private updateComputeUnits = (newComputeUnits: number) => {\n this.props.notifyAngular('computeUnits', newComputeUnits);\n this.setState({ computeUnits: newComputeUnits });\n };\n\n private updateReservedMemory = (newReservedMemory: number) => {\n this.props.notifyAngular('reservedMemory', newReservedMemory);\n this.setState({ reservedMemory: newReservedMemory });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n this.updateDirtyTargetGroups();\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateDirtyTargetGroups = () => {\n this.props.command.viewState.dirty.targetGroups = [];\n };\n\n public render(): React.ReactElement<Container> {\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateComputeUnits = this.updateComputeUnits;\n const updateReservedMemory = this.updateReservedMemory;\n const dirtyTagetGroups =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.targetGroups\n ? this.props.command.viewState.dirty.targetGroups\n : [];\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const dirtyTargetGroupList = dirtyTagetGroups\n ? dirtyTagetGroups.map(function (targetGroup, index) {\n return <li key={index}>{targetGroup}</li>;\n })\n : '';\n\n const dirtyTargetGroupSection = (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following target groups could not be found in the selected account/region/VPC and were removed:\n </p>\n <ul>{dirtyTargetGroupList}</ul>\n <br />\n <p className=\"text-left\">Please select the target group(s) from the dropdown to resolve this error.</p>\n </div>\n );\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"ContainerInputs.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td data-test-id=\"ContainerInputs.targetGroup\">\n <TetheredSelect\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n data-test-id=\"ContainerInputs.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"ContainerInputs.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n return (\n <div className=\"container-fluid form-horizontal\">\n {dirtyTagetGroups.length > 0 ? <div>{dirtyTargetGroupSection}</div> : ''}\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Container Image</b>\n <HelpField id=\"ecs.containerMappingImage\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"ContainerInputs.containerImage\">\n <TetheredSelect\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={this.state.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(e as Option<string>);\n }}\n clearable={false}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Compute Units</b>\n <HelpField id=\"ecs.capacity.reserved.computeUnits\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n data-test-id=\"ContainerInputs.computeUnits\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.computeUnits}\n onChange={(e) => updateComputeUnits(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Reserved Memory</b>\n <HelpField id=\"ecs.capacity.reserved.memory\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n data-test-id=\"ContainerInputs.reservedMemory\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.reservedMemory}\n onChange={(e) => updateReservedMemory(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsContainerTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '80%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '20%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const CONTAINER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.container.react';\nmodule(CONTAINER_REACT, []).component(\n 'containerReact',\n react2angular(withErrorBoundary(Container, 'containerReact'), ['command', 'notifyAngular', 'configureCommand']),\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT =\n 'spinnaker.ecs.serverGroup.configure.wizard.horizontalScaling.component';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT, []).component(\n 'ecsServerGroupHorizontalScaling',\n {\n bindings: {\n command: '=',\n application: '=',\n capacityProviderState: '=',\n notifyAngular: '=',\n configureCommand: '=',\n },\n templateUrl: require('./horizontalScaling.component.html'),\n },\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER =\n 'spinnaker.ecs.serverGroup.configure.basicSettings';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n ])\n .controller('ecsServerGroupBasicSettingsCtrl', [\n '$scope',\n '$controller',\n '$uibModalStack',\n '$state',\n function ($scope, $controller, $uibModalStack, $state) {\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('basicSettings');\n ModalWizard.markComplete('basicSettings');\n } else {\n ModalWizard.markIncomplete('basicSettings');\n }\n });\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVER_GROUP_LOGGING = 'spinnaker.ecs.serverGroup.configure.wizard.logging.component';\nmodule(ECS_SERVER_GROUP_LOGGING, []).component('ecsServerGroupLogging', {\n bindings: {\n command: '=',\n application: '=',\n },\n templateUrl: require('./logging.component.html'),\n});\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { ISubnet } from '@spinnaker/core';\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsNetworkingProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IEcsNetworkingState {\n associatePublicIpAddress: boolean;\n networkMode: string;\n networkModesAvailable: string[];\n securityGroupNames: string[];\n securityGroupsAvailable: string[];\n subnetTypes: string[];\n subnetTypesAvailable: ISubnet[];\n}\n\nexport class EcsNetworking extends React.Component<IEcsNetworkingProps, IEcsNetworkingState> {\n constructor(props: IEcsNetworkingProps) {\n super(props);\n const cmd = this.props.command;\n\n let defaultSubnetTypes: string[] = [];\n if (cmd.subnetTypes && cmd.subnetTypes.length > 0) {\n defaultSubnetTypes = cmd.subnetTypes;\n }\n\n if (cmd.subnetType && cmd.subnetType.length > 0) {\n defaultSubnetTypes.push(cmd.subnetType);\n cmd.subnetType = '';\n }\n\n cmd.subnetTypes = uniqWith(defaultSubnetTypes, isEqual);\n\n this.state = {\n associatePublicIpAddress: cmd.associatePublicIpAddress,\n networkMode: cmd.networkMode,\n networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],\n securityGroupNames: cmd.securityGroupNames,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n subnetTypes: cmd.subnetTypes,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n };\n }\n\n public componentDidMount() {\n const cmd = this.props.command;\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n });\n }\n\n private updateNetworkMode = (newNetworkMode: Option<string>) => {\n const updatedNetworkMode = newNetworkMode.value;\n const cmd = this.props.command;\n this.props.notifyAngular('networkMode', updatedNetworkMode);\n this.setState({\n networkMode: updatedNetworkMode,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n };\n\n private updateSecurityGroups = (newSecurityGroups: Option<string>) => {\n const updatedSecurityGroups = Array.isArray(newSecurityGroups)\n ? newSecurityGroups.map((securityGroups) => securityGroups.value)\n : [];\n this.props.notifyAngular('securityGroupNames', updatedSecurityGroups);\n this.setState({ securityGroupNames: updatedSecurityGroups });\n };\n\n private updateSubnetTypes = (newSubnetTypes: Option<string>) => {\n const cmd = this.props.command;\n const updatedSubnetTypes = Array.isArray(newSubnetTypes)\n ? newSubnetTypes.map((subnetType) => subnetType.value)\n : [];\n this.props.notifyAngular('subnetTypes', updatedSubnetTypes);\n cmd.subnetTypeChanged(cmd);\n this.setState({\n subnetTypes: updatedSubnetTypes,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n });\n };\n\n private updateAssociatePublicIpAddress = (usePublicIp: boolean) => {\n this.props.notifyAngular('associatePublicIpAddress', usePublicIp);\n this.setState({ associatePublicIpAddress: usePublicIp });\n };\n\n public render(): React.ReactElement<EcsNetworking> {\n const updateAssociatePublicIpAddress = this.updateAssociatePublicIpAddress;\n const updateNetworkMode = this.updateNetworkMode;\n const updateSecurityGroups = this.updateSecurityGroups;\n const updateSubnetTypes = this.updateSubnetTypes;\n\n const networkModesAvailable = this.state.networkModesAvailable.map(function (networkMode) {\n return { label: `${networkMode}`, value: networkMode };\n });\n\n const securityGroupsAvailable = this.state.securityGroupsAvailable.map(function (securityGroup) {\n return { label: `${securityGroup}`, value: securityGroup };\n });\n\n const subnetTypesAvailable = this.state.subnetTypesAvailable.map(function (subnetType) {\n return { label: `${subnetType.purpose} (${subnetType.vpcId})`, value: subnetType.purpose };\n });\n\n const subnetTypeOptions = this.state.subnetTypesAvailable.length ? (\n <TetheredSelect\n multi={true}\n options={subnetTypesAvailable}\n value={this.state.subnetTypes}\n onChange={(e: Option) => {\n updateSubnetTypes(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No account was selected, or no subnet types are available for this account</Alert>\n );\n\n const securityGroupsOptions = this.state.securityGroupsAvailable.length ? (\n <TetheredSelect\n multi={true}\n options={securityGroupsAvailable}\n value={this.state.securityGroupNames}\n onChange={(e: Option) => {\n updateSecurityGroups(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No security groups found in the selected account/region</Alert>\n );\n\n const awsVpcOptions =\n this.state.networkMode === 'awsvpc' ? (\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>VPC Subnet</b>\n <HelpField key=\"ecs.subnet\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.subnetType\">\n {subnetTypeOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Security Groups</b>\n <HelpField key=\"ecs.securityGroups\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.securityGroups\">\n {securityGroupsOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Associate Public IP Address</b>\n <HelpField key=\"ecs.publicip\" />\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressTrue\"\n type=\"radio\"\n value=\"true\"\n id=\"associatePublicIpAddressTrue\"\n checked={this.state.associatePublicIpAddress === true}\n onChange={() => updateAssociatePublicIpAddress(true)}\n />\n Yes\n </label>\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressFalse\"\n type=\"radio\"\n value=\"false\"\n id=\"associatePublicIpAddressFalse\"\n checked={this.state.associatePublicIpAddress === false}\n onChange={() => updateAssociatePublicIpAddress(false)}\n />\n No\n </label>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"col-md-3 sm-label-right\"></div>\n );\n\n return (\n <div className=\"networking-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Network Mode</b>\n <HelpField id=\"ecs.networkMode\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.networkMode\">\n <TetheredSelect\n placeholder=\"Select a network mode to use ...\"\n options={networkModesAvailable}\n value={this.state.networkMode}\n onChange={(e: Option) => {\n updateNetworkMode(e as Option<string>);\n }}\n />\n </div>\n </div>\n </div>\n {awsVpcOptions}\n </div>\n );\n }\n}\n\nexport const ECS_NETWORKING_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.networking.react';\nmodule(ECS_NETWORKING_REACT, []).component(\n 'ecsNetworkingReact',\n react2angular(withErrorBoundary(EcsNetworking, 'ecsNetworkingReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type {\n IEcsServerGroupCommand,\n IEcsServiceDiscoveryRegistryAssociation,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IServiceDiscoveryProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\nexport interface IEcsServiceDiscoveryRegistry {\n account: string;\n region: string;\n name: string;\n id: string;\n arn: string;\n displayName: string;\n}\n\ninterface IServiceDiscoveryState {\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n serviceDiscoveryRegistriesAvailable: IEcsServiceDiscoveryRegistry[];\n useTaskDefinitionArtifact: boolean;\n}\n\nexport class ServiceDiscovery extends React.Component<IServiceDiscoveryProps, IServiceDiscoveryState> {\n constructor(props: IServiceDiscoveryProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n serviceDiscoveryAssociations: cmd.serviceDiscoveryAssociations,\n serviceDiscoveryRegistriesAvailable:\n cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.serviceDiscoveryRegistries : [],\n useTaskDefinitionArtifact: cmd.useTaskDefinitionArtifact,\n };\n\n if (!this.state.useTaskDefinitionArtifact) {\n this.state.serviceDiscoveryAssociations.forEach((serviceDiscoveryRegistryAssociation) => {\n serviceDiscoveryRegistryAssociation.containerName = null;\n });\n }\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n serviceDiscoveryRegistriesAvailable: this.props.command.backingData.filtered.serviceDiscoveryRegistries,\n });\n });\n }\n\n private getNameToRegistryMap = (): Map<string, IEcsServiceDiscoveryRegistry> => {\n const displayNameToRegistry = new Map<string, IEcsServiceDiscoveryRegistry>();\n this.props.command.backingData.filtered.serviceDiscoveryRegistries.forEach((e) => {\n displayNameToRegistry.set(e.displayName, e);\n });\n\n return displayNameToRegistry;\n };\n\n private getEmptyRegistry = (): IEcsServiceDiscoveryRegistry => {\n return {\n account: '',\n region: '',\n name: '',\n id: '',\n arn: '',\n displayName: '',\n };\n };\n\n private updateServiceDiscoveryRegistry = (index: number, newRegistry: Option<string>) => {\n const registryMap = this.getNameToRegistryMap();\n let newServiceDiscoveryRegistry = registryMap.get(newRegistry.value);\n\n if (!newServiceDiscoveryRegistry) {\n newServiceDiscoveryRegistry = this.getEmptyRegistry();\n }\n\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociation = currentAssociations[index];\n targetAssociation.registry = newServiceDiscoveryRegistry;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryPort = (index: number, targetPort: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerPort = targetPort;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryContainerName = (index: number, targetContainerName: string) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerName = targetContainerName;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private pushServiceDiscoveryAssociation = () => {\n const registryAssociations = this.state.serviceDiscoveryAssociations;\n registryAssociations.push({ registry: this.getEmptyRegistry(), containerPort: 80, containerName: '' });\n this.setState({ serviceDiscoveryAssociations: registryAssociations });\n };\n\n private removeServiceDiscoveryAssociations = (index: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n currentAssociations.splice(index, 1);\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n public render(): React.ReactElement<ServiceDiscovery> {\n const removeServiceDiscoveryAssociation = this.removeServiceDiscoveryAssociations;\n const updateServiceDiscoveryRegistry = this.updateServiceDiscoveryRegistry;\n const updateServiceDiscoveryPort = this.updateServiceDiscoveryPort;\n const updateServiceDiscoveryContainerName = this.updateServiceDiscoveryContainerName;\n\n const registriesAvailable = this.state.serviceDiscoveryRegistriesAvailable.map(function (registry) {\n return { label: `${registry.displayName}`, value: registry.displayName };\n });\n\n const useTaskDefinitionArtifact = this.state.useTaskDefinitionArtifact;\n const serviceDiscoveryInputs = this.state.serviceDiscoveryAssociations.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useTaskDefinitionArtifact && (\n <td>\n <input\n className=\"form-control input-sm\"\n placeholder=\"Enter a container name ...\"\n required={true}\n value={mapping.containerName}\n onChange={(e) => updateServiceDiscoveryContainerName(index, e.target.value)}\n />\n </td>\n )}\n <td>\n <TetheredSelect\n placeholder=\"Select a registry...\"\n options={registriesAvailable}\n value={mapping.registry.displayName.toString()}\n onChange={(e: Option) => updateServiceDiscoveryRegistry(index, e as Option<string>)}\n clearable={false}\n required={true}\n />\n </td>\n <td>\n <input\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort}\n onChange={(e) => updateServiceDiscoveryPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a className=\"btn-link sm-label\" onClick={() => removeServiceDiscoveryAssociation(index)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const newServiceDiscoveryAssociation = this.state.serviceDiscoveryRegistriesAvailable.length ? (\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.pushServiceDiscoveryAssociation}>\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Service Registry\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No registries found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Service Registries (optional)</b>\n <HelpField id=\"ecs.serviceDiscovery\" />\n </div>\n <form name=\"ecsServiceDiscoveryRegistryMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n {useTaskDefinitionArtifact && (\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.serviceDiscoveryContainerName\" />\n </th>\n )}\n {useTaskDefinitionArtifact ? (\n <th style={{ width: '55%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n ) : (\n <th style={{ width: '80%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n )}\n <th style={{ width: '15%' }}>\n Port\n <HelpField id=\"ecs.serviceDiscoveryContainerPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{serviceDiscoveryInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newServiceDiscoveryAssociation}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const SERVICE_DISCOVERY_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.serviceDiscovery.react';\nmodule(SERVICE_DISCOVERY_REACT, []).component(\n 'serviceDiscoveryReact',\n react2angular(withErrorBoundary(ServiceDiscovery, 'serviceDiscoveryReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { IArtifact, IExpectedArtifact } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n HelpField,\n StageArtifactSelectorDelegate,\n StageConfigField,\n TetheredSelect,\n withErrorBoundary,\n} from '@spinnaker/core';\n\nimport type {\n IEcsContainerMapping,\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n IEcsTaskDefinitionArtifact,\n} from '../../serverGroupConfiguration.service';\n\nexport interface ITaskDefinitionProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface ITaskDefinitionState {\n taskDefArtifact: IEcsTaskDefinitionArtifact;\n taskDefArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n dockerImages: IEcsDockerImage[];\n targetGroupsAvailable: string[];\n loadBalancedContainer: string;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n}\n\nexport class TaskDefinition extends React.Component<ITaskDefinitionProps, ITaskDefinitionState> {\n constructor(props: ITaskDefinitionProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n\n this.state = {\n taskDefArtifact: cmd.taskDefinitionArtifact,\n containerMappings: cmd.containerMappings ? cmd.containerMappings : [],\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n loadBalancedContainer: cmd.loadBalancedContainer || defaultContainer,\n taskDefArtifactAccount: cmd.taskDefinitionArtifactAccount,\n evaluateTaskDefinitionArtifactExpressions: cmd.evaluateTaskDefinitionArtifactExpressions,\n };\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,\n });\n });\n }\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private excludedArtifactTypePatterns = [\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ];\n\n private onExpectedArtifactSelected = (expectedArtifactId: string): void => {\n const selectedArtifact = { artifactId: expectedArtifactId };\n this.props.notifyAngular('taskDefinitionArtifact', selectedArtifact);\n this.setState({ taskDefArtifact: selectedArtifact });\n };\n\n private onArtifactEdited = (artifact: IArtifact): void => {\n const newArtifact = { artifact: artifact };\n this.props.notifyAngular('taskDefinitionArtifact', newArtifact);\n this.setState({ taskDefArtifact: newArtifact });\n };\n\n private pushMapping = () => {\n const conMaps = this.state.containerMappings;\n conMaps.push({ containerName: '', imageDescription: this.getEmptyImageDescription() });\n this.setState({ containerMappings: conMaps });\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingName = (index: number, newName: string) => {\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = newName;\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateContainerMappingImage = (index: number, newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.imageDescription = newImageDescription;\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingContainer = (index: number, targetContainer: string) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = targetContainer;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeMapping = (index: number) => {\n const currentMappings = this.state.containerMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateEvaluateTaskDefArtifactFlag = () => {\n this.props.notifyAngular(\n 'evaluateTaskDefinitionArtifactExpressions',\n !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n );\n this.setState({\n evaluateTaskDefinitionArtifactExpressions: !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n });\n };\n\n public render(): React.ReactElement<TaskDefinition> {\n const { command } = this.props;\n const removeMapping = this.removeMapping;\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingName = this.updateContainerMappingName;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingContainer = this.updateTargetGroupMappingContainer;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateEvaluateTaskDefArtifactFlag = this.updateEvaluateTaskDefArtifactFlag;\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const mappingInputs = this.state.containerMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n data-test-id=\"Artifacts.containerName\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"enter container name...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateContainerMappingName(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.containerImage\">\n <TetheredSelect\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={mapping.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(index, e as Option<string>);\n }}\n clearable={false}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.containerRemove\"\n onClick={() => removeMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n data-test-id=\"Artifacts.targetGroupContainer\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"Enter a container name ...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateTargetGroupMappingContainer(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.targetGroup\">\n <TetheredSelect\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n data-test-id=\"Artifacts.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-12\">\n <StageArtifactSelectorDelegate\n artifact={this.state.taskDefArtifact.artifact}\n excludedArtifactTypePatterns={this.excludedArtifactTypePatterns}\n expectedArtifactId={this.state.taskDefArtifact.artifactId}\n label=\"Artifact\"\n helpKey=\"ecs.taskDefinitionArtifact\"\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onExpectedArtifactSelected(artifact.id)}\n onArtifactEdited={this.onArtifactEdited}\n pipeline={command.viewState.pipeline}\n stage={command.viewState.currentStage}\n />\n </div>\n </div>\n\n <StageConfigField\n groupClassName=\"form-group evaluateTaskDef\"\n label=\"Expression Evaluation\"\n helpKey=\"ecs.evaluateExpression\"\n labelColumns={5}\n fieldColumns={7}\n >\n <CheckboxInput\n checked={command.evaluateTaskDefinitionArtifactExpressions === true}\n onChange={() => {\n updateEvaluateTaskDefArtifactFlag();\n }}\n text=\"Evaluate SpEL expressions in artifact\"\n />\n </StageConfigField>\n\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Container Mappings</b>\n <HelpField id=\"ecs.containerMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionContainerMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.containerMappingName\" />\n </th>\n <th style={{ width: '70%' }}>\n Container image\n <HelpField id=\"ecs.containerMappingImage\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{mappingInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={3}>\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.containerAdd\"\n onClick={this.pushMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Container Mapping\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.loadBalancedContainer\" />\n </th>\n <th style={{ width: '55%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '15%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const TASK_DEFINITION_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.taskDefinition.react';\nmodule(TASK_DEFINITION_REACT, []).component(\n 'taskDefinitionReact',\n react2angular(withErrorBoundary(TaskDefinition, 'taskDefinitionReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst resizeCapacityComponent: IComponentOptions = {\n bindings: {\n command: '=',\n currentSize: '=',\n },\n templateUrl: require('./resizeCapacity.component.html'),\n controller: () => {},\n};\n\nexport const ECS_RESIZE_CAPACITY_COMPONENT = 'spinnaker.ecs.serverGroup.resize';\nmodule(ECS_RESIZE_CAPACITY_COMPONENT, []).component('ecsResizeCapacity', resizeCapacityComponent);\n","'use strict';\n\nimport * as angular from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nimport { ECS_RESIZE_CAPACITY_COMPONENT } from './resizeCapacity.component';\n\nexport const ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER =\n 'spinnaker.ecs.serverGroup.details.resize.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER, [\n SERVER_GROUP_WRITER,\n ECS_RESIZE_CAPACITY_COMPONENT,\n ])\n .controller('ecsResizeServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n function ($scope, $uibModalInstance, serverGroupWriter, application, serverGroup) {\n $scope.serverGroup = serverGroup;\n $scope.currentSize = {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n newSize: null,\n };\n\n $scope.verification = {};\n\n $scope.command = angular.copy($scope.currentSize);\n $scope.command.advancedMode = serverGroup.capacity.min !== serverGroup.capacity.max;\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Ecs'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n return command.advancedMode\n ? command.min <= command.max && command.desired >= command.min && command.desired <= command.max\n : command.newSize !== null;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Resizing ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.resize = function () {\n if (!this.isValid()) {\n return;\n }\n let capacity = { min: $scope.command.min, max: $scope.command.max, desired: $scope.command.desired };\n if (!$scope.command.advancedMode) {\n capacity = { min: $scope.command.newSize, max: $scope.command.newSize, desired: $scope.command.newSize };\n }\n\n const submitMethod = function () {\n return serverGroupWriter.resizeServerGroup(serverGroup, application, {\n capacity: capacity,\n interestingHealthProviderNames: $scope.command.interestingHealthProviderNames,\n reason: $scope.command.reason,\n });\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nexport const ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER =\n 'spinnaker.ecs.serverGroup.details.rollback.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER, [SERVER_GROUP_WRITER]).controller(\n 'ecsRollbackServerGroupCtrl',\n [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n 'disabledServerGroups',\n 'allServerGroups',\n function (\n $scope,\n $uibModalInstance,\n serverGroupWriter,\n application,\n serverGroup,\n disabledServerGroups,\n allServerGroups,\n ) {\n $scope.serverGroup = serverGroup;\n $scope.disabledServerGroups = disabledServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.allServerGroups = allServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.verification = {};\n\n $scope.command = {\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n },\n };\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Ecs'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n\n return command.rollbackContext.restoreServerGroupName !== undefined;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Rollback ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.rollback = function () {\n if (!this.isValid()) {\n return;\n }\n\n const submitMethod = function () {\n return serverGroupWriter.rollbackServerGroup(serverGroup, application, $scope.command);\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n this.label = function (serverGroup) {\n if (!serverGroup) {\n return '';\n }\n\n if (!serverGroup.buildInfo || !serverGroup.buildInfo.jenkins || !serverGroup.buildInfo.jenkins.number) {\n return serverGroup.name;\n }\n\n return serverGroup.name + ' (build #' + serverGroup.buildInfo.jenkins.number + ')';\n };\n\n this.group = function (serverGroup) {\n return serverGroup.isDisabled ? 'Disabled Server Groups' : 'Enabled Server Groups';\n };\n },\n ],\n);\n","import { module } from 'angular';\nimport { defaults } from 'lodash';\n\nimport type {\n IAmazonServerGroup,\n IAmazonServerGroupView,\n IScalingAdjustmentView,\n IScalingPolicyAlarmView,\n IScalingPolicyView,\n IStepAdjustment,\n IStepAdjustmentView,\n} from '@spinnaker/amazon';\nimport { VpcReader } from '@spinnaker/amazon';\nimport type { IInstance, IVpc } from '@spinnaker/core';\n\nexport class EcsServerGroupTransformer {\n private addComparator(alarm: IScalingPolicyAlarmView): void {\n if (!alarm.comparisonOperator) {\n return;\n }\n\n switch (alarm.comparisonOperator) {\n case 'LessThanThreshold':\n alarm.comparator = '&lt;';\n break;\n case 'GreaterThanThreshold':\n alarm.comparator = '&gt;';\n break;\n case 'LessThanOrEqualToThreshold':\n alarm.comparator = '&le;';\n break;\n case 'GreaterThanOrEqualToThreshold':\n alarm.comparator = '&ge;';\n break;\n }\n }\n\n private addAdjustmentAttributes(policyOrStepAdjustment: IScalingAdjustmentView): void {\n policyOrStepAdjustment.operator = policyOrStepAdjustment.scalingAdjustment < 0 ? 'decrease' : 'increase';\n policyOrStepAdjustment.absAdjustment = Math.abs(policyOrStepAdjustment.scalingAdjustment);\n }\n\n private transformScalingPolicy(policy: IScalingPolicyView): IScalingPolicyView {\n const view: IScalingPolicyView = { ...policy };\n const upperBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n b.metricIntervalUpperBound - a.metricIntervalUpperBound;\n const lowerBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n a.metricIntervalLowerBound - b.metricIntervalLowerBound;\n\n view.alarms = policy.alarms || [];\n view.alarms.forEach((alarm: IScalingPolicyAlarmView) => this.addComparator(alarm));\n this.addAdjustmentAttributes(view); // simple policies\n if (view.stepAdjustments && view.stepAdjustments.length) {\n view.stepAdjustments.forEach((sa: IStepAdjustmentView) => this.addAdjustmentAttributes(sa)); // step policies\n const sorter = policy.stepAdjustments.every((a: IStepAdjustment) => a.metricIntervalUpperBound !== undefined)\n ? upperBoundSorter\n : lowerBoundSorter;\n view.stepAdjustments.sort((a: IStepAdjustmentView, b: IStepAdjustmentView) => sorter(a, b));\n }\n return view;\n }\n\n public normalizeServerGroupDetails(serverGroup: IAmazonServerGroup): IAmazonServerGroupView {\n const view: IAmazonServerGroupView = { ...serverGroup } as IAmazonServerGroupView;\n if (serverGroup.scalingPolicies) {\n view.scalingPolicies = serverGroup.scalingPolicies.map((policy: IScalingPolicyView) =>\n this.transformScalingPolicy(policy),\n );\n }\n return view;\n }\n\n public normalizeServerGroup(serverGroup: IAmazonServerGroup): PromiseLike<IAmazonServerGroup> {\n serverGroup.instances.forEach((instance: IInstance) => {\n instance.vpcId = serverGroup.vpcId;\n });\n return VpcReader.listVpcs().then(\n (vpc: IVpc[]): IAmazonServerGroup => this.addVpcNameToServerGroup(serverGroup)(vpc),\n );\n }\n\n private addVpcNameToServerGroup(serverGroup: IAmazonServerGroup): (vpc: IVpc[]) => IAmazonServerGroup {\n return (vpcs: IVpc[]) => {\n const match = vpcs.find((test) => test.id === serverGroup.vpcId);\n serverGroup.vpcName = match ? match.name : '';\n return serverGroup;\n };\n }\n\n public convertServerGroupCommandToDeployConfiguration(base: any): any {\n // use _.defaults to avoid copying the backingData, which is huge and expensive to copy over\n const command = defaults({ backingData: [], viewState: [] }, base);\n command.cloudProvider = 'ecs';\n command.availabilityZones = {};\n command.availabilityZones[command.region] = base.availabilityZones;\n command.loadBalancers = (base.loadBalancers || []).concat(base.vpcLoadBalancers || []);\n command.targetGroup = base.targetGroup || '';\n command.account = command.credentials;\n command.subnetType = command.subnetType || '';\n\n if (base.viewState.mode !== 'clone') {\n delete command.source;\n }\n\n delete command.region;\n delete command.viewState;\n delete command.backingData;\n delete command.selectedProvider;\n delete command.instanceProfile;\n delete command.vpcId;\n\n return command;\n }\n}\n\nexport const ECS_SERVER_GROUP_TRANSFORMER = 'spinnaker.ecs.serverGroup.transformer';\nmodule(ECS_SERVER_GROUP_TRANSFORMER, []).service('ecsServerGroupTransformer', EcsServerGroupTransformer);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport { chain, filter, find, has, isEmpty } from 'lodash';\n\nimport {\n AccountService,\n ConfirmationModalService,\n FirewallLabels,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n SubnetReader,\n} from '@spinnaker/core';\n\nimport { ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';\nimport { ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER } from './resize/resizeServerGroup.controller';\nimport { ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER } from './rollback/rollbackServerGroup.controller';\nimport { ECS_SERVER_GROUP_TRANSFORMER } from '../serverGroup.transformer';\n\nexport const ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER = 'spinnaker.ecs.serverGroup.details.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ECS_SERVER_GROUP_TRANSFORMER,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_WRITER,\n ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER,\n ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER,\n ])\n .controller('ecsServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'app',\n 'serverGroup',\n 'ecsServerGroupCommandBuilder',\n '$uibModal',\n 'serverGroupWriter',\n 'ecsServerGroupTransformer',\n 'overrideRegistry',\n function (\n $scope,\n $state,\n app,\n serverGroup,\n ecsServerGroupCommandBuilder,\n $uibModal,\n serverGroupWriter,\n ecsServerGroupTransformer,\n overrideRegistry,\n ) {\n this.state = {\n loading: true,\n };\n\n this.firewallsLabel = FirewallLabels.get('Firewalls');\n\n this.application = app;\n\n const extractServerGroupSummary = () => {\n return app.ready().then(() => {\n let summary = find(app.serverGroups.data, (toCheck) => {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n if (!summary) {\n app.loadBalancers.data.some((loadBalancer) => {\n if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {\n return loadBalancer.serverGroups.some((possibleServerGroup) => {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n });\n }\n });\n }\n return summary;\n });\n };\n\n const autoClose = () => {\n if ($scope.$$destroyed) {\n return;\n }\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n };\n\n const cancelLoader = () => {\n this.state.loading = false;\n };\n\n const retrieveServerGroup = () => {\n return extractServerGroupSummary()\n .then((summary) => {\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then((details) => {\n cancelLoader();\n\n // it's possible the summary was not found because the clusters are still loading\n angular.extend(details, summary, { account: serverGroup.accountId });\n\n this.serverGroup = ecsServerGroupTransformer.normalizeServerGroupDetails(details);\n this.applyAccountDetails(this.serverGroup);\n\n if (!isEmpty(this.serverGroup)) {\n this.image = details.image ? details.image : undefined;\n\n const vpc = this.serverGroup.asg ? this.serverGroup.asg.vpczoneIdentifier : '';\n\n if (vpc !== '') {\n const subnetId = vpc.split(',')[0];\n SubnetReader.listSubnets().then((subnets) => {\n const subnet = chain(subnets).find({ id: subnetId }).value();\n this.serverGroup.subnetType = subnet.purpose;\n });\n }\n\n if (details.image && details.image.description) {\n const tags = details.image.description.split(', ');\n tags.forEach((tag) => {\n const keyVal = tag.split('=');\n if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {\n details.image.baseImage = keyVal[1];\n }\n });\n }\n\n if (details.image && details.image.tags) {\n const baseAmiVersionTag = details.image.tags.find((tag) => tag.key === 'base_ami_version');\n if (baseAmiVersionTag) {\n details.baseAmiVersion = baseAmiVersionTag.value;\n }\n }\n\n this.scalingPolicies = this.serverGroup.scalingPolicies;\n // TODO - figure out whether we need the commented out block below, or not. IF we do, then we need to make it stop crashing\n\n if (has(this.serverGroup, 'buildInfo.jenkins')) {\n this.changeConfig.buildInfo = {\n jenkins: this.serverGroup.buildInfo.jenkins,\n };\n }\n\n /*this.scalingPoliciesDisabled = this.scalingPolicies.length && this.autoScalingProcesses\n .filter(p => !p.enabled)\n .some(p => ['Launch','Terminate','AlarmNotification'].includes(p.name));\n this.scheduledActionsDisabled = this.serverGroup.scheduledActions.length && this.autoScalingProcesses\n .filter(p => !p.enabled)\n .some(p => ['Launch','Terminate','ScheduledAction'].includes(p.name));\n configureEntityTagTargets();\n\n this.changeConfig = {\n metadata: get(this.serverGroup.entityTags, 'creationMetadata')\n };\n */\n } else {\n autoClose();\n }\n });\n })\n .catch(autoClose);\n };\n\n retrieveServerGroup().then(() => {\n // If the user navigates away from the view before the initial retrieveServerGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n\n this.destroyServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Destroying ' + serverGroup.name,\n onTaskComplete: () => {\n if ($state.includes('**.serverGroup', stateParams)) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = (params) => serverGroupWriter.destroyServerGroup(serverGroup, app, params);\n\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const confirmationModalParams = {\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n askForReason: true,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.disableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.disableServerGroup(serverGroup, app, params);\n };\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.enableServerGroup(serverGroup, app, params);\n };\n\n const confirmationModalParams = {\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.rollbackServerGroup = () => {\n $uibModal.open({\n templateUrl: overrideRegistry.getTemplate(\n 'ecs.rollback.modal',\n require('./rollback/rollbackServerGroup.html'),\n ),\n windowClass: 'modal-z-index',\n controller: 'ecsRollbackServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => this.serverGroup,\n disabledServerGroups: () => {\n const cluster = find(app.clusters, { name: this.serverGroup.cluster, account: this.serverGroup.account });\n return filter(cluster.serverGroups, { isDisabled: true, region: this.serverGroup.region });\n },\n allServerGroups: () =>\n app\n .getDataSource('serverGroups')\n .data.filter(\n (g) =>\n g.cluster === this.serverGroup.cluster &&\n g.region === this.serverGroup.region &&\n g.account === this.serverGroup.account &&\n g.name !== this.serverGroup.name,\n ),\n application: () => app,\n },\n });\n };\n\n this.resizeServerGroup = () => {\n $uibModal.open({\n templateUrl: overrideRegistry.getTemplate('ecs.resize.modal', require('./resize/resizeServerGroup.html')),\n controller: 'ecsResizeServerGroupCtrl as ctrl',\n windowClass: 'modal-z-index',\n resolve: {\n serverGroup: () => this.serverGroup,\n application: () => app,\n },\n });\n };\n\n this.cloneServerGroup = (serverGroup) => {\n $uibModal.open({\n templateUrl: require('../configure/wizard/serverGroupWizard.html'),\n controller: 'ecsCloneServerGroupCtrl as ctrl',\n size: 'lg',\n windowClass: 'modal-z-index',\n resolve: {\n title: () => 'Clone ' + serverGroup.name,\n application: () => app,\n serverGroupCommand: () =>\n ecsServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),\n },\n });\n };\n\n this.buildJenkinsLink = () => {\n if (has(this, 'serverGroup.buildInfo.buildInfoUrl')) {\n return this.serverGroup.buildInfo.buildInfoUrl;\n } else if (has(this, 'serverGroup.buildInfo.jenkins')) {\n const jenkins = this.serverGroup.buildInfo.jenkins;\n return jenkins.host + 'job/' + jenkins.name + '/' + jenkins.number;\n }\n return null;\n };\n\n this.truncateCommitHash = () => {\n if (this.serverGroup && this.serverGroup.buildInfo && this.serverGroup.buildInfo.commit) {\n return this.serverGroup.buildInfo.commit.substring(0, 8);\n }\n return null;\n };\n\n this.applyAccountDetails = (serverGroup) => {\n return AccountService.getAccountDetails(serverGroup.account).then((details) => {\n serverGroup.accountDetails = details;\n });\n };\n },\n ]);\n","import { module } from 'angular';\nimport { ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER } from './serverGroupDetails.ecs.controller';\n\nexport const SERVER_GROUP_DETAILS_MODULE = 'spinnaker.ecs.serverGroup.details';\nmodule(SERVER_GROUP_DETAILS_MODULE, [ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER]);\n","import { $log } from 'ngimport';\n\nimport type { IServerGroup } from '@spinnaker/core';\nimport { REST } from '@spinnaker/core';\n\nexport interface IEventDescription {\n createdAt: number;\n message: string;\n id: string;\n status: string;\n}\n\nexport class ServerGroupEventsReader {\n public static getEvents(serverGroup: IServerGroup): PromiseLike<IEventDescription[]> {\n return REST('/applications')\n .path(serverGroup.app, 'serverGroups', serverGroup.account, serverGroup.name, 'events')\n .query({\n region: serverGroup.region,\n provider: serverGroup.cloudProvider,\n })\n .get()\n .catch((error: any): any[] => {\n $log.error(error, 'error retrieving events');\n return [];\n });\n }\n}\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { IServerGroup } from '@spinnaker/core';\n\nimport type { IEventDescription } from './serverGroupEventsReader.service';\nimport { ServerGroupEventsReader } from './serverGroupEventsReader.service';\n\nexport interface IScalingActivitiesViewState {\n loading: boolean;\n error: boolean;\n}\n\nexport class EventsController implements IController {\n public viewState: IScalingActivitiesViewState;\n public events: IEventDescription[] = [];\n\n public static $inject = ['$uibModalInstance', 'serverGroup'];\n public constructor(private $uibModalInstance: IModalServiceInstance, public serverGroup: IServerGroup) {}\n\n public $onInit(): void {\n this.viewState = {\n loading: true,\n error: false,\n };\n\n ServerGroupEventsReader.getEvents(this.serverGroup).then(\n (rawEvents: IEventDescription[]) => {\n this.viewState.loading = false;\n this.events = rawEvents;\n },\n () => {\n this.viewState.error = true;\n },\n );\n }\n\n public close(): void {\n this.$uibModalInstance.close();\n }\n}\n\nexport const EVENTS_CTRL = 'spinnaker.ecs.serverGroup.events.controller';\nmodule(EVENTS_CTRL, []).controller('EventsController', EventsController);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport { EVENTS_CTRL, EventsController } from './events.controller';\n\nclass ViewEventsLinkCtrl implements IController {\n public serverGroup: any;\n\n public static $inject = ['$uibModal'];\n public constructor(private $uibModal: IModalService) {}\n\n public showEvents(): void {\n this.$uibModal.open({\n templateUrl: require('./events.html'),\n controller: EventsController,\n controllerAs: '$ctrl',\n windowClass: 'modal-z-index',\n resolve: {\n serverGroup: () => this.serverGroup,\n },\n });\n }\n}\n\nexport const viewEventsLink: IComponentOptions = {\n bindings: {\n serverGroup: '<',\n },\n controller: ViewEventsLinkCtrl,\n template: `<a href ng-click=\"$ctrl.showEvents()\">View Events</a>`,\n};\n\nexport const VIEW_EVENTS_LINK_COMPONENT = 'spinnaker.ecs.serverGroup.details.viewEvents.link';\nmodule(VIEW_EVENTS_LINK_COMPONENT, [EVENTS_CTRL]).component('viewEventsLink', viewEventsLink);\n","import { module } from 'angular';\n\nimport { VIEW_EVENTS_LINK_COMPONENT } from './events/events.component';\n\nexport const ECS_SERVERGROUP_MODULE = 'spinnaker.ecs.serverGroup';\nmodule(ECS_SERVERGROUP_MODULE, [VIEW_EVENTS_LINK_COMPONENT]);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport { COMMON_MODULE } from './common/common.module';\nimport './ecs.help';\nimport './ecs.settings';\nimport { ECS_CLUSTER_READ_SERVICE } from './ecsCluster/ecsCluster.read.service';\nimport { IAM_ROLE_READ_SERVICE } from './iamRoles/iamRole.read.service';\nimport { ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { EcsLoadBalancerClusterContainer } from './loadBalancer/EcsLoadBalancerClusterContainer';\nimport { EcsLoadBalancerDetails } from './loadBalancer/details/loadBalancerDetails';\nimport { EcsTargetGroupDetails } from './loadBalancer/details/targetGroupDetails';\nimport { EcsLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';\nimport { ECS_TARGET_GROUP_STATES } from './loadBalancer/targetGroup.states';\nimport ecsLogo from './logo/ecs.logo.svg';\nimport { METRIC_ALARM_READ_SERVICE } from './metricAlarm/metricAlarm.read.service';\nimport { ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE } from './pipeline/stages/destroyAsg/ecsDestroyAsgStage';\nimport { ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE } from './pipeline/stages/disableAsg/ecsDisableAsgStage';\nimport { ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE } from './pipeline/stages/disableCluster/ecsDisableClusterStage';\nimport { ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE } from './pipeline/stages/enableAsg/ecsEnableAsgStage';\nimport { ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE } from './pipeline/stages/findImageFromTags/ecsFindImageFromTagStage';\nimport { ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE } from './pipeline/stages/resizeAsg/ecsResizeAsgStage';\nimport { ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE } from './pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage';\nimport { ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE } from './pipeline/stages/shrinkCluster/ecsShrinkClusterStage';\nimport { PLACEMENT_STRATEGY_SERVICE } from './placementStrategy/placementStrategy.service';\nimport { ECS_SECRET_READ_SERVICE } from './secrets/secret.read.service';\nimport { ECS_SECURITY_GROUP_MODULE } from './securityGroup/securityGroup.module';\nimport { ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER } from './serverGroup/configure/wizard/CloneServerGroup.ecs.controller';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT } from './serverGroup/configure/wizard/advancedSettings/advancedSettings.component';\nimport { ECS_CAPACITY_PROVIDER_REACT } from './serverGroup/configure/wizard/capacityProvider/CapacityProvider';\nimport { CONTAINER_REACT } from './serverGroup/configure/wizard/container/Container';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT } from './serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER } from './serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller';\nimport { ECS_SERVER_GROUP_LOGGING } from './serverGroup/configure/wizard/logging/logging.component';\nimport { ECS_NETWORKING_REACT } from './serverGroup/configure/wizard/networking/Networking';\nimport { SERVICE_DISCOVERY_REACT } from './serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery';\nimport { TASK_DEFINITION_REACT } from './serverGroup/configure/wizard/taskDefinition/TaskDefinition';\nimport { SERVER_GROUP_DETAILS_MODULE } from './serverGroup/details/serverGroupDetails.module';\nimport { ECS_SERVERGROUP_MODULE } from './serverGroup/serverGroup.module';\nimport { ECS_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\n\nimport './logo/ecs.logo.less';\n\nexport const ECS_MODULE = 'spinnaker.ecs';\nmodule(ECS_MODULE, [\n ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER,\n SERVER_GROUP_DETAILS_MODULE,\n IAM_ROLE_READ_SERVICE,\n ECS_SERVER_GROUP_TRANSFORMER,\n // require('./pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage').name, // TODO(Bruno Carrier): We should enable this on Clouddriver before revealing this stage\n ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT,\n ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT,\n TASK_DEFINITION_REACT,\n CONTAINER_REACT,\n ECS_NETWORKING_REACT,\n SERVICE_DISCOVERY_REACT,\n ECS_CAPACITY_PROVIDER_REACT,\n ECS_SERVER_GROUP_LOGGING,\n ECS_CLUSTER_READ_SERVICE,\n ECS_SECRET_READ_SERVICE,\n METRIC_ALARM_READ_SERVICE,\n PLACEMENT_STRATEGY_SERVICE,\n COMMON_MODULE,\n ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER,\n ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE,\n ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE,\n ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE,\n ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE,\n ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE,\n ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE,\n ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE,\n ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE,\n ECS_SECURITY_GROUP_MODULE,\n ECS_SERVERGROUP_MODULE,\n ECS_TARGET_GROUP_STATES,\n]).config(function () {\n CloudProviderRegistry.registerProvider('ecs', {\n name: 'EC2 Container Service',\n logo: { path: ecsLogo },\n serverGroup: {\n transformer: 'ecsServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'ecsServerGroupDetailsCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n cloneServerGroupController: 'ecsCloneServerGroupCtrl',\n commandBuilder: 'ecsServerGroupCommandBuilder',\n // configurationService: 'ecsServerGroupConfigurationService',\n scalingActivitiesEnabled: false,\n skipUpstreamStageCheck: true,\n },\n loadBalancer: {\n transformer: EcsLoadBalancerTransformer,\n ClusterContainer: EcsLoadBalancerClusterContainer,\n targetGroupDetails: EcsTargetGroupDetails,\n details: EcsLoadBalancerDetails,\n },\n instance: {\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n detailsController: 'ecsInstanceDetailsCtrl',\n },\n securityGroup: {\n transformer: 'ecsSecurityGroupTransformer',\n reader: 'ecsSecurityGroupReader',\n detailsTemplateUrl: require('./securityGroup/details/securityGroupDetail.html'),\n detailsController: 'ecsSecurityGroupDetailsCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('ecs', ['redblack']);\n","export default \"data:image/svg+xml,%3Csvg%20id%3D%22Layer_1%22%20data-name%3D%22Layer%201%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20100%20100%22%3E%20%20%3Ctitle%3ECompute%3C%2Ftitle%3E%20%20%3Cg%3E%20%20%20%20%3Cpolygon%20points%3D%2219.64%2022.51%2016%2024.32%2016%2075.68%2019.64%2077.49%2033.98%2051.07%2019.64%2022.51%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2230.72%2031.78%2036.08%2024.19%2060.1%2034.87%2054.5%2035.76%2030.72%2031.78%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2226.56%2068.77%2032.46%2076.88%2060.1%2064.95%2054.76%2064.12%2026.56%2068.77%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2228.12%2075.5%2019.64%2077.49%2019.64%2022.51%2028.12%2024.44%2028.12%2075.5%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2223.66%2020.5%2028.12%2018.27%2036.52%2053.56%2028.12%2081.73%2023.66%2079.5%2023.66%2020.5%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2254.46%2064.08%2060.1%2064.95%2065.26%2050.58%2060.1%2034.87%2054.46%2035.76%2054.46%2064.08%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2236.8%2079.28%2028.12%2081.73%2028.12%2018.27%2036.8%2020.73%2036.8%2079.28%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.01%2063.84%2028.12%2070.88%2028.12%2081.73%2066.01%2071.03%2066.01%2063.84%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.08%2036%2028.12%2028.79%2028.12%2018.27%2066.08%2029.04%2066.08%2036%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2260.1%2027.34%2066.19%2029.02%2066.19%2071.03%2060.1%2072.7%2060.1%2027.34%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2044.45%2067.7%2045.22%2061.94%2044.83%2078.42%2031.55%2084%2044.45%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2044.83%2078.42%2043.9%2078.42%2031.55%2061.94%2034.22%2061.94%2044.83%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2026.96%2071.62%2043.22%2054.31%2044.32%2046.43%2043.79%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2042.37%2063.13%2026.96%2046.43%2030.87%2046.43%2043.79%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2055.39%2084%2055.77%2078.42%2068.67%2061.94%2066%2061.94%2055.39%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2071.62%2057.01%2063.13%2073.26%2046.43%2069.36%2046.43%2056.43%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2063.13%2057.86%2071.62%2057.01%2054.31%2055.9%2046.43%2056.43%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2055.77%2067.7%2055.01%2061.94%2055.39%2078.42%2056.33%2084%2055.77%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2043.9%2084%2044.45%2084%2033.22%2078.42%2031.55%2078.42%2043.9%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2043.22%2063.13%2042.37%2063.13%2026.96%2071.62%2029.51%2071.62%2043.22%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2056.33%2084%2055.77%2084%2067%2078.42%2068.67%2078.42%2056.33%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2057.01%2063.13%2057.86%2063.13%2073.26%2071.62%2070.72%2071.62%2057.01%22%20fill%3D%22%23f58536%22%2F%3E%20%20%3C%2Fg%3E%3C%2Fsvg%3E\""],"names":["footerComponent","bindings","action","isValid","cancel","account","verification","template","controller","ECS_FOOTER_COMPONENT","module","component","COMMON_MODULE","helpContents","Object","keys","forEach","key","HelpContentsRegistry","register","IECSProviderSettings","SETTINGS","providers","ecs","defaults","resetToOriginal","resetProvider","ECS_CLUSTER_READ_SERVICE","service","listClusters","REST","get","describeClusters","region","path","IAM_ROLE_READ_SERVICE","listRoles","provider","ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER","UIROUTER_ANGULARJS","ANGULAR_UI_BOOTSTRAP","$scope","$state","$uibModal","instance","app","moniker","environment","$q","overrides","detailsTemplateUrl","CloudProviderRegistry","getValue","state","loading","standalone","isStandalone","instancePort","_","defaultInstancePort","application","defaultRequestParams","cloudProvider","retrieveInstance","extraData","instanceSummary","loadBalancers","targetGroup","vpcId","serverGroups","data","some","serverGroup","instances","possibleInstance","id","instanceId","name","loadBalancer","targetGroup2","isDisabled","RecentHistoryService","addExtraDataToLatest","InstanceReader","getInstanceDetails","then","details","$$destroyed","instance2","latest","health","displayableMetrics","filter","metric","type","targetGroups","getAllTargetGroups","applyHealthCheckInfoToTargetGroups","detailsMatch","latestHealth","length","healthMetrics","extractHealthMetrics","networkInterfaces","permanentNetworkInterfaces","f","attachment","deleteOnTermination","permanentIps","map","privateIpAddress","baseIpAddress","publicDnsName","instanceDetailsLoaded","autoClose","instanceIdNotFound","when","notFoundStandalone","removeLastItem","go","allowModalToStayOpen","location","this","canRegisterWithDiscovery","discoveryHealth","terminateInstance","taskMonitor","title","onTaskComplete","includes","ConfirmationModalService","confirm","header","buttonText","taskMonitorConfig","submitMethod","InstanceWriter","terminateInstanceAndShrinkServerGroup","enableInstanceInDiscovery","disableInstanceInDiscovery","hasHealthState","healthProviderType","all","ready","onRefresh","EcsTargetGroup","React","Component","render","showServerGroups","props","params","loadBalancerName","accountId","targetGroupName","emptyInstanceCounts","up","down","starting","succeeded","failed","unknown","outOfService","className","UISrefActive","class","UISref","to","sgName","LoadBalancerServerGroup","cluster","instanceCounts","showInstances","EcsLoadBalancerClusterContainer","shouldComponentUpdate","nextProps","isEqual","g","serverGroupsDiffer","t","targetGroupsDiffer","TargetGroups","EcsListener","constructor","super","getTargetGroupNameFromArn","arn","parts","split","port","protocol","defaultActions","listener","createElement","style","paddingLeft","i","targetGroupArn","forwardConfig","tg","redirectConfig","statusCode","fixedResponseConfig","authenticateOidcConfig","clientId","authenticateCognitoActionConfig","userPoolDomain","EcsLoadBalancerDetails","refreshListenerUnsubscribe","getDataSource","extractLoadBalancer","componentWillUnmount","find","test","setState","CloseButton","Spinner","size","CollapsibleSection","heading","defaultExpanded","timestamp","createdTime","AccountTag","loadBalancerType","ipAddressType","availabilityZones","az","target","href","dnsname","listeners","index","securityGroups","sg","subnets","subnet","EcsTargetGroupDetails","extractTargetGroup","targetType","toUpperCase","loadBalancerNames","lb","healthCheckProtocol","healthCheckPort","healthCheckPath","healthCheckTimeoutSeconds","healthCheckIntervalSeconds","healthyThresholdCount","unhealthyThresholdCount","matcher","httpCode","attributes","EcsLoadBalancerTransformer","normalizeLoadBalancer","targetGroupServices","tgServiceMap","resolve","$inject","ECS_TARGET_GROUP_STATES","APPLICATION_STATE_PROVIDER","config","applicationStateProvider","ecsTargetGroupDetails","url","value","squash","views","$type","$stateParams","pageTitleDetails","nameParam","accountParam","regionParam","addInsightDetailState","METRIC_ALARM_READ_SERVICE","listMetricAlarms","ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE","Registry","pipeline","registerStage","provides","alias","templateUrl","executionStepLabelUrl","accountExtractor","stage","context","credentials","configAccountExtractor","validators","message","fieldName","fieldLabel","accounts","regionsLoaded","AccountService","listAccounts","regions","targets","StageConstants","TARGET_LIST","defaultCredentials","defaultRegions","push","val","ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE","executionDetailsUrl","PipelineTemplates","disableAsgExecutionDetails","isNew","platformHealthOnlyShowOverride","platformHealthOnly","interestingHealthProviderNames","ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE","ctrl","reset","accountUpdated","resetSelectedCluster","remainingEnabledServerGroups","pluralize","str","preferLargerOverNewer","toString","ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE","$watch","ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE","executionConfigSections","ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE","viewState","accountsLoaded","resizeTargets","scaleActions","label","resizeTypes","capacity","resizeType","targetHealthyDeployPercentage","updateResizeType","scalePct","scaleNum","ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE","strategy","remainingFullSizeServerGroups","allowScaleDownActive","ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE","shrinkToSize","allowDeleteActive","retainLargerOverNewer","PLACEMENT_STRATEGY_SERVICE","getPredefinedStrategy","strategyName","getAzBalancedSpreadStrategy","getAzBalancedMemoryBinPackStrategy","getBinPackMemoryStrategy","getAzBalancedCpuBinPackStrategy","getBinPackCpuStrategy","getOneTaskPerHostStrategy","field","ECS_SECRET_READ_SERVICE","listSecrets","ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER","angular","SECURITY_GROUP_READER","MANAGED_RESOURCE_DETAILS_INDICATOR","resolvedSecurityGroup","securityGroupReader","securityGroup","extractSecurityGroup","getSecurityGroupDetails","VpcReader","getVpcName","name2","vpcName","isEmpty","fourOhFour","applicationSecurityGroup","getApplicationSecurityGroup","extend","ipRules","groupedRangeRules","groupBy","ipRangeRules","rule","range","ip","cidr","addr","address","rules","buildRuleModel","buildIpRulesModel","securityGroupRules","buildSecurityGroupRulesModel","portRanges","startPort","endPort","group","notFound","firewallLabel","FirewallLabels","refresh","ECS_SECURITY_GROUP_READER","resolveIndexedSecurityGroup","indexedSecurityGroups","container","securityGroupId","ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER","factory","normalizeSecurityGroup","ECS_SECURITY_GROUP_MODULE","ServiceDiscoveryReader","listServiceDiscoveryRegistries","EcsServerGroupConfigurationService","loadBalancerReader","serverGroupCommandRegistry","iamRoleReader","ecsClusterReader","metricAlarmReader","placementStrategyService","secretReader","launchTypes","networkModes","configureUpdateCommand","command","backingData","clone","configureCommand","cmd","imageQuery","applyOverrides","toggleSuspendedProcess","process","suspendedProcesses","processIndex","indexOf","splice","processIsSuspended","onStrategyChange","p","regionIsDeprecated","has","filtered","deprecated","imageQueries","imageDescription","grabImageAndTag","imageId","imagesPromise","q","DockerImageReader","findImages","count","promises","flatten","credentialsKeyedByAccount","getCredentialsKeyedByAccount","listLoadBalancers","SubnetReader","listSubnetsByProvider","iamRoles","ecsClusters","capacityProviderDetails","metricAlarms","getAllSecurityGroups","secrets","serviceDiscoveryRegistries","images","contextImages","concat","configureVpcId","configureAvailableIamRoles","configureAvailableSubnetTypes","configureAvailableSecurityGroups","configureAvailableEcsClusters","setCapacityProviderDetails","configureAvailableSecrets","configureAvailableServiceDiscoveryRegistries","configureAvailableImages","configureAvailableRegions","configureLoadBalancerOptions","attachEventHandlers","result","chain","mapCapacityProviderDetails","ecsClusterName","configureAvailableCapacityProviders","availableCapacityProviders","defaultCapacityProviderStrategy","checkDirtyCapacityProviders","clusterName","availableCPs","capacityProviders","flattenDeep","phase","getCommandOverrides","override","pop","buildImageId","image","fromContext","imageLabelOrSha","fromTrigger","tag","registry","repository","mapImage","stageId","configureAvailabilityZones","subnetType","subnetTypes","purpose","compact","uniqBy","allSecurityGroups","securityGroupNames","e","buildServiceRegistryDisplayName","mapServiceRegistry","displayName","regionsForAccount","accountName","configureSubnetPurposes","dirty","filteredData","subnetPurposes","reject","every","getLoadBalancerMap","getLoadBalancerNames","sort","getVpcLoadBalancerNames","getTargetGroupNames","loadBalancersV2","currentLoadBalancers","vpcLoadBalancers","newLoadBalancers","allTargetGroups","currentTargetGroups","targetGroupMappings","valid","matched","intersection","removedLoadBalancers","xor","removedTargetGroups","refreshLoadBalancers","skipCommandReconfiguration","capacityProviderStrategy","availableCustomCapacityProviders","currentCapacityProviders","cp","capacityProvider","matchedCustomCapacityProviders","removedCustomCapacityProviders","customCapacityProviders","useDefaultCapacityProviders","availableDefaultCapacityProvider","matchedDefaultCapacityProviders","removedDefaultCapacityProviders","defaulCapacityProviders","subnetChanged","regionChanged","subnetTypeChanged","clusterChanged","NameUtils","getMoniker","stack","freeFormDetails","credentialsChanged","placementStrategyNameChanged","placementStrategySequence","placementStrategyName","ECS_SERVER_GROUP_CONFIGURATION_SERVICE","LOAD_BALANCER_READ_SERVICE","CACHE_INITIALIZER_SERVICE","SERVER_GROUP_COMMAND_REGISTRY_PROVIDER","ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE","INSTANCE_TYPE_SERVICE","instanceTypeService","ecsServerGroupConfigurationService","findUpstreamImages","current","visited","refId","requisiteStageRefIds","next","findTriggerImages","triggers","trigger","organization","buildNewServerGroupCommand","credentialsLoader","defaultRegion","preferredZonesLoader","getAvailabilityZonesForAccountAndRegion","preferredZones","asyncData","defaultIamRole","replace","min","max","desired","launchType","healthCheckType","selectedProvider","iamRole","dockerImageCredentialsSecret","healthCheckGracePeriodSeconds","placementConstraints","taskDefinitionArtifact","useTaskDefinitionArtifact","serviceDiscoveryAssociations","copySourceScalingPoliciesAndActions","preferSourceCapacity","useSourceCapacity","enableDeploymentCircuitBreaker","useAllImageSelection","useSimpleCapacity","usePreferredZones","mode","disableStrategySelection","buildServerGroupCommandFromExisting","ecsCluster","buildNewServerGroupCommandForPipeline","stages","requiresTemplateSelection","currentStage","buildServerGroupCommandFromPipeline","originalCluster","pipelineCluster","cloneDeep","join","docker","upstreamImages","matchingImage","otherImage","pattern","reconcileUpstreamImages","instanceProfile","disableImageSelection","submitButtonLabel","templatingEnabled","existingPipelineCluster","viewOverrides","buildUpdateServerGroupCommand","asgs","asgName","asg","ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER","SERVER_GROUP_WRITER","OVERRIDE_REGISTRY","STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT","$uibModalInstance","serverGroupWriter","overrideRegistry","serverGroupCommand","onApplicationRefresh","cloneStage","task","execution","newServerGroupName","newStateParams","transitionTo","loaded","createResultProcessor","method","pages","templateSelection","getTemplate","basicSettings","horizontalScaling","networking","logging","serviceDiscovery","advancedSettings","taskDefinition","applicationName","templateSelectionText","copied","notCopied","TaskMonitor","modalInstance","onNextRefresh","showSubmitButton","ModalWizard","allPagesVisited","submit","close","cloneServerGroup","dismiss","templateSelected","notifyAngular","commandKey","query","capacityProviderState","useCapacityProviders","updateComputeOption","chosenOption","ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT","EcsCapacityProvider","getAvailableCapacityProviders","getDefaultCapacityProviderStrategy","getCapacityProviderStrategy","addCapacityProviderStrategy","base","weight","removeCapacityProviderStrategy","updateCapacityProviderName","targetCapacityProviderName","updateCapacityProviderBase","targetCapacityProviderBase","updateCapacityProviderWeight","targetCapacityProviderWeight","updateCapacityProviderType","targetCapacityProviderType","capacityProviderLoadedFlag","componentDidMount","customDirtyCapacityProviders","defaultDirtyCapacityProviders","capacityProviderNames","capacityProviderNames2","defaultCPError","dirtyCapacityProviderList","dirtyCapacityProviderSection","capacityProviderInputs","mapping","required","disabled","TetheredSelect","placeholder","options","onChange","clearable","valueAsNumber","onClick","width","Alert","color","newCapacityProviderStrategy","HelpField","checked","colSpan","ECS_CAPACITY_PROVIDER_REACT","react2angular","withErrorBoundary","Container","getIdToImageMap","imageIdToDescription","Map","set","getEmptyImageDescription","pushTargetGroupMapping","targetMaps","containerName","containerPort","updateContainerMappingImage","newImage","newImageDescription","updateComputeUnits","newComputeUnits","computeUnits","updateReservedMemory","newReservedMemory","reservedMemory","updateTargetGroupMappingTargetGroup","newTargetGroup","currentMappings","updateDirtyTargetGroups","updateTargetGroupMappingPort","targetPort","removeTargetGroupMapping","defaultContainer","containerMappings","defaultTargetGroup","loadBalancedContainer","uniqWith","dockerImages","targetGroupsAvailable","targetGroupMapping","dirtyTagetGroups","dockerImageOptions","msg","dirtyTargetGroupList","dirtyTargetGroupSection","newTargetGroupMapping","targetGroupInputs","CONTAINER_REACT","ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT","ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER","$controller","$uibModalStack","newVal","markClean","markComplete","markIncomplete","ECS_SERVER_GROUP_LOGGING","EcsNetworking","updateNetworkMode","newNetworkMode","updatedNetworkMode","networkMode","subnetTypesAvailable","updateSecurityGroups","newSecurityGroups","updatedSecurityGroups","Array","isArray","updateSubnetTypes","newSubnetTypes","updatedSubnetTypes","securityGroupsAvailable","updateAssociatePublicIpAddress","usePublicIp","associatePublicIpAddress","defaultSubnetTypes","networkModesAvailable","subnetTypeOptions","multi","securityGroupsOptions","awsVpcOptions","ECS_NETWORKING_REACT","ServiceDiscovery","getNameToRegistryMap","displayNameToRegistry","getEmptyRegistry","updateServiceDiscoveryRegistry","newRegistry","newServiceDiscoveryRegistry","currentAssociations","updateServiceDiscoveryPort","updateServiceDiscoveryContainerName","targetContainerName","pushServiceDiscoveryAssociation","registryAssociations","removeServiceDiscoveryAssociations","serviceDiscoveryRegistriesAvailable","serviceDiscoveryRegistryAssociation","removeServiceDiscoveryAssociation","registriesAvailable","serviceDiscoveryInputs","newServiceDiscoveryAssociation","SERVICE_DISCOVERY_REACT","TaskDefinition","excludedArtifactTypePatterns","ArtifactTypePatterns","KUBERNETES","DOCKER_IMAGE","FRONT50_PIPELINE_TEMPLATE","onExpectedArtifactSelected","expectedArtifactId","selectedArtifact","artifactId","taskDefArtifact","onArtifactEdited","artifact","newArtifact","pushMapping","conMaps","updateContainerMappingName","newName","updateTargetGroupMappingContainer","targetContainer","removeMapping","updateEvaluateTaskDefArtifactFlag","evaluateTaskDefinitionArtifactExpressions","taskDefArtifactAccount","taskDefinitionArtifactAccount","mappingInputs","StageArtifactSelectorDelegate","helpKey","StageConfigField","groupClassName","labelColumns","fieldColumns","CheckboxInput","text","TASK_DEFINITION_REACT","ECS_RESIZE_CAPACITY_COMPONENT","currentSize","ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER","newSize","copy","advancedMode","verified","resize","resizeServerGroup","reason","ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER","disabledServerGroups","allServerGroups","a","b","localeCompare","rollbackType","rollbackContext","rollbackServerGroupName","restoreServerGroupName","rollback","rollbackServerGroup","serverGroup2","buildInfo","jenkins","number","ECS_SERVER_GROUP_TRANSFORMER","addComparator","alarm","comparisonOperator","comparator","addAdjustmentAttributes","policyOrStepAdjustment","operator","scalingAdjustment","absAdjustment","Math","abs","transformScalingPolicy","policy","view","upperBoundSorter","metricIntervalUpperBound","lowerBoundSorter","metricIntervalLowerBound","alarms","stepAdjustments","sa","sorter","normalizeServerGroupDetails","scalingPolicies","normalizeServerGroup","listVpcs","vpc","addVpcNameToServerGroup","vpcs","match","convertServerGroupCommandToDeployConfiguration","source","ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER","ecsServerGroupCommandBuilder","ecsServerGroupTransformer","firewallsLabel","cancelLoader","retrieveServerGroup","summary","toCheck","possibleServerGroup","ServerGroupReader","getServerGroup","applyAccountDetails","vpczoneIdentifier","subnetId","listSubnets","description","keyVal","baseImage","tags","baseAmiVersionTag","baseAmiVersion","changeConfig","catch","destroyServerGroup","stateParams","confirmationModalParams","askForReason","platformHealthType","ServerGroupWarningMessageService","addDestroyWarningMessage","disableServerGroup","addDisableWarningMessage","enableServerGroup","open","windowClass","clusters","buildJenkinsLink","buildInfoUrl","host","truncateCommitHash","commit","substring","getAccountDetails","accountDetails","SERVER_GROUP_DETAILS_MODULE","ServerGroupEventsReader","getEvents","error","$log","EventsController","events","$onInit","rawEvents","EVENTS_CTRL","ViewEventsLinkCtrl","showEvents","controllerAs","viewEventsLink","VIEW_EVENTS_LINK_COMPONENT","ECS_SERVERGROUP_MODULE","css","ref","insertAt","document","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","ECS_MODULE","registerProvider","logo","transformer","detailsController","cloneServerGroupTemplateUrl","cloneServerGroupController","commandBuilder","scalingActivitiesEnabled","skipUpstreamStageCheck","ClusterContainer","targetGroupDetails","reader","DeploymentStrategyRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/common/footer.component.ts","../src/common/common.module.ts","../src/ecs.help.ts","../src/ecs.settings.ts","../src/ecsCluster/ecsCluster.read.service.ts","../src/iamRoles/iamRole.read.service.ts","../src/instance/details/instance.details.controller.js","../src/loadBalancer/TargetGroup.tsx","../src/loadBalancer/EcsLoadBalancerClusterContainer.tsx","../src/loadBalancer/listener.tsx","../src/loadBalancer/details/loadBalancerDetails.tsx","../src/loadBalancer/details/targetGroupDetails.tsx","../src/loadBalancer/loadBalancer.transformer.ts","../src/loadBalancer/targetGroup.states.ts","../src/logo/ecs.logo.svg","../src/metricAlarm/metricAlarm.read.service.ts","../src/pipeline/stages/destroyAsg/ecsDestroyAsgStage.js","../src/pipeline/stages/disableAsg/ecsDisableAsgStage.js","../src/pipeline/stages/disableCluster/ecsDisableClusterStage.js","../src/pipeline/stages/enableAsg/ecsEnableAsgStage.js","../src/pipeline/stages/findImageFromTags/ecsFindImageFromTagStage.js","../src/pipeline/stages/resizeAsg/ecsResizeAsgStage.js","../src/pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage.js","../src/pipeline/stages/shrinkCluster/ecsShrinkClusterStage.js","../src/placementStrategy/placementStrategy.service.ts","../src/secrets/secret.read.service.ts","../src/securityGroup/details/securityGroupDetail.controller.js","../src/securityGroup/securityGroup.reader.ts","../src/securityGroup/securityGroup.transformer.js","../src/securityGroup/securityGroup.module.ts","../src/serviceDiscovery/serviceDiscovery.read.service.ts","../src/serverGroup/configure/serverGroupConfiguration.service.ts","../src/serverGroup/configure/serverGroupCommandBuilder.service.js","../src/serverGroup/configure/wizard/CloneServerGroup.ecs.controller.js","../src/serverGroup/configure/wizard/advancedSettings/advancedSettings.component.js","../src/serverGroup/configure/wizard/capacityProvider/CapacityProvider.tsx","../src/serverGroup/configure/wizard/container/Container.tsx","../src/serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component.js","../src/serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller.js","../src/serverGroup/configure/wizard/logging/logging.component.ts","../src/serverGroup/configure/wizard/networking/Networking.tsx","../src/serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery.tsx","../src/serverGroup/configure/wizard/taskDefinition/TaskDefinition.tsx","../src/serverGroup/details/resize/resizeCapacity.component.ts","../src/serverGroup/details/resize/resizeServerGroup.controller.js","../src/serverGroup/details/rollback/rollbackServerGroup.controller.js","../src/serverGroup/serverGroup.transformer.ts","../src/serverGroup/details/serverGroupDetails.ecs.controller.js","../src/serverGroup/details/serverGroupDetails.module.ts","../src/serverGroup/events/serverGroupEventsReader.service.ts","../src/serverGroup/events/events.controller.ts","../src/serverGroup/events/events.component.ts","../src/serverGroup/serverGroup.module.ts","../../../node_modules/style-inject/dist/style-inject.es.js","../src/ecs.module.ts"],"sourcesContent":["import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst footerComponent: IComponentOptions = {\n bindings: {\n action: '&',\n isValid: '&',\n cancel: '&',\n account: '=?',\n verification: '=?',\n },\n template: `\n <div class=\"modal-footer\">\n <user-verification account=\"$ctrl.account\" verification=\"$ctrl.verification\"></user-verification>\n <button type=\"submit\" ng-click=\"$ctrl.action()\" style=\"display:none\"></button> <!-- Allows form submission via enter keypress-->\n <button class=\"btn btn-default\" ng-click=\"$ctrl.cancel()\">Cancel</button>\n <button type=\"submit\"\n class=\"btn btn-primary\"\n ng-click=\"$ctrl.action()\"\n ng-disabled=\"!$ctrl.isValid()\">\n Submit\n </button>\n </div>\n `,\n controller: () => {},\n};\n\nexport const ECS_FOOTER_COMPONENT = 'spinnaker.ecs.footer';\nmodule(ECS_FOOTER_COMPONENT, []).component('ecsFooter', footerComponent);\n","import { module } from 'angular';\n\nimport { ECS_FOOTER_COMPONENT } from './footer.component';\n\nexport const COMMON_MODULE = 'spinnaker.ecs.common';\nmodule(COMMON_MODULE, [ECS_FOOTER_COMPONENT]);\n","import { HelpContentsRegistry } from '@spinnaker/core';\n\nconst helpContents: { [key: string]: string } = {\n 'ecs.loadBalancer.targetGroup':\n '<p>A <em>target group</em> is attached to an application / network load balancer and is a target for load balancer traffic.</p> <p> You need to create both the application load balancer and target groups prior to being able to use them in your pipeline.</p>',\n 'ecs.serverGroup.clusterName':\n '<p>The name of the ECS cluster (group of underlying EC2 hosts) onto which your application will be deployed.</p><p>Note that suggestions here are dependent on the selected account and region combination.</p>',\n 'ecs.stage.findImageByTags.labelOrSha':\n \"<p>As of now, only Amazon's ECR is supported as a source docker repository.</p>\",\n 'ecs.serverGroup.stack':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>staging</i>, <i>prod</i>, etc. Keep this parameter short!</p>',\n 'ecs.serverGroup.detail':\n '<p>An environment variable available within your container, and on which you should base your application configuration at runtime.</p> <p>Typical values for this parameter are <i>app</i>, <i>worker</i>, <i>migrator</i>, etc. Keep this parameter short!</p>',\n 'ecs.capacity.overwrite':\n \"<p>Checking this box will have the previous server group's capacity overwrite the new <i>min</i>, <i>max</i> and <i>desired capacity</i> parameters if a previous server group exists.</p>\",\n 'ecs.capacity.desired': '<p>The starting number of containers, before any autoscaling happens.</p>',\n 'ecs.capacity.minimum':\n '<p>The minimum number of containers you can reach as a result of autoscaling.</p> <p>Typically, this represents the bare minimum you can afford to run without impacting your capacity to meet your SLA (Service Level Agreement) objectives</p>',\n 'ecs.capacity.maximum': '<p>The maximal number of containers you can reach as a result of autoscaling.</p>',\n 'ecs.capacity.reserved.computeUnits':\n '<p>The assured minimal amount of computing capacity your container will be able to use. 1024 units are equal to 1 AWS virtual CPU</p> <p>If other containers on your underlying host are not using their reserved compute capacity, this container will be able to use it.</p>',\n 'ecs.capacity.reserved.memory':\n '<p>The maximal amount of memory that your container can use, in megabytes. Exceeding this amount may result in termination of your container.</p><p>1024 mb = 1 gb</p>',\n 'ecs.loadbalancing.targetPort': '<p>The port on which your application is listening for incoming traffic</p>',\n 'ecs.iamrole':\n '<p>The IAM role that your container (task, in AWS wording) will inherit. </p><p>Define a role only if your application needs to access AWS APIs</p>',\n 'ecs.dockerimage': 'Docker image for your container, such as nginx:latest',\n 'ecs.dockerimagecredentials':\n '<p>The AWS Secrets Manager secret that contains private registry credentials.</p><p>Define credentials only for private registries other than Amazon ECR.</p>',\n 'ecs.placementConstraints':\n '<p>Rules for task placement. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.placementConstraintType':\n '<p>To ensure that each task in a particular group is running on a different container instance, use distinctInstance. To restrict the selection to a group of valid candidates, use memberOf. </p>',\n 'ecs.placementConstraintExpression':\n '<p>A cluster query language expression to apply to memberOf constraints. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\" target=\"_blank\">AWS documentation</a> for more details.</p>',\n 'ecs.placementStrategy':\n '<p>The strategy the container scheduler will be using. See <a href=\"http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html\" target=\"_blank\">AWS documentation</a> for more details. </p><p>You should at least balance across availability zones</p><p>Custom placement strategies have not been implemented yet.</p>',\n 'ecs.platformVersion': '<p>Defaults to the latest platform version.</p>',\n 'ecs.enableDeploymentCircuitBreaker': '<p>Enable circuit breaker for the ECS service.</p>',\n 'ecs.capacity.copySourceScalingPoliciesAndActions':\n '<p>Copy Application Autoscaling policies and their associated alarms from the previous ECS service.</p>',\n 'ecs.launchtype': '<p>Launch service tasks on your own EC2 instances or on Fargate.</p>',\n 'ecs.healthgraceperiod':\n '<p>How long a container will be kept alive despite the load balancer health checks, in seconds.</p>',\n 'ecs.publicip': '<p>Assign a public IP address to each task.</p>',\n 'ecs.networkMode':\n '<p>awsvpc is the only networking mode that allows you to use Elastic Network Interfaces (ENI). The default value converts to Bridge on Linux, and NAT on Windows.</p>',\n 'ecs.subnet':\n '<p>The subnet group(s) on which your server group will be deployed. All subnet groups selected must exist within the same VPC.</p>',\n 'ecs.securityGroups': '<p>The security group(s) name(s) your containers are deployed with.</p>',\n 'ecs.dockerLabels':\n '<p>Additional labels applied to your Docker container. This metadata can be used to identify your containers, or in conjunction with logging options. Maps directly to the <a href=\"https://docs.docker.com/engine/reference/commandline/run/#set-metadata-on-container--l---label---label-file\"><b>--label</b> Docker flag</a>.</p> <p>Spinnaker will automatically add the spinnaker.servergroup, spinnaker.stack, spinnaker.detail labels for non-null values.</p>',\n 'ecs.logDriver':\n '<p>The container\\'s logging driver. This directly maps to the <a href=\"https://docs.docker.com/config/containers/logging/configure/#configure-the-default-logging-driver\"><b>--log-driver</b> Docker flag.</a></p>',\n 'ecs.logOptions':\n '<p>A map of log options. This directly maps with the <a href=\"https://docs.docker.com/config/containers/logging/log_tags/\"><b>--log-opt</b> Docker flag </a></p>',\n 'ecs.taskDefinition':\n '<p>The source of the ECS Task Definition. Task Definition contents can either be entered manually via input fields or from a selected JSON file artifact. Artifact file contents should be structured as an ECS \"RegisterTaskDefinition\" request.</p>',\n 'ecs.taskDefinitionArtifact': '<p>The artifact containing the ECS Task Definition.</p>',\n 'ecs.containerMappings':\n '<p>The list of expected containers within the Task Definition and which container image they should use. Containers in the Task Definition which are not specified here will be registered as they appear in the artifact.</p>',\n 'ecs.containerMappingName':\n '<p>The name of the container. Name should match the <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html#ECS-Type-ContainerDefinition-name\"><b>containerDefinition.name</b></a> field as it appears in the Task Definition.</p>',\n 'ecs.containerMappingImage': '<p>The container image the named container should run.</p>',\n 'ecs.targetGroupMappings':\n '<p>The list of target groups through which the ECS service will receive load balancer traffic. Each target group is mapped to a container name and port within the Task Definition to specify which container should be registered to the target group.</p>',\n 'ecs.loadBalancedContainer':\n '<p>The container in the Task Definition that should receive traffic from the load balancer. Required if a load balancer target group has been specified.</p>',\n 'ecs.tags': '<p>The tags to apply to the task definition and the service',\n 'ecs.environmentVariables':\n '<p>The environment variable(s) your container are deployed with. SERVER_GROUP, CLOUD_STACK and CLOUD_DETAIL environment variables are used during deployment to identify the task and cannot be set here.</p>',\n 'ecs.serviceDiscovery': '<p>The AWS Cloud Map service discovery registries to assign to this service</p>',\n 'ecs.serviceDiscoveryRegistry': '<p>The AWS Cloud Map service to use for service discovery registration</p>',\n 'ecs.serviceDiscoveryContainerPort':\n '<p>The port to be used for your service discovery service. Required only for services using bridge or host network mode, and for services using awsvpc network mode and a type SRV DNS record',\n 'ecs.serviceDiscoveryContainerName':\n '<p>The container name value, already specified in the task definition, to be used for your service discovery service.</p>',\n 'ecs.computeOptions':\n '<p>Specify either a <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\" target=\"_blank\">launch type</a> (default) or <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html\" target=\"_blank\">capacity providers</a> for running your ECS service.</p>',\n 'ecs.capacityProviderStrategy':\n '<p>A capacity provider strategy gives you control over how your tasks use one or more capacity providers. See <a href=\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html#capacity-providers-concepts\" target=\"_blank\">AWS documentation</a> for more details. </p>',\n 'ecs.capacityProviderName': '<p>The short name of the capacity provider.</p>',\n 'ecs.capacityProviderBase':\n '<p>Designates how many tasks, at a minimum, to run on the specified capacity provider. Only one capacity provider in a capacity provider strategy can have a <em>base</em> defined.</p>',\n 'ecs.capacityProviderWeight':\n '<p>Designates the relative percentage of the total number of tasks launched that should use the specified capacity provider.</p>',\n 'ecs.evaluateExpression':\n '<p>Whether to evaluate <a href=\"https://spinnaker.io/guides/user/pipeline/expressions/\" target=\"_blank\"><b>pipeline expressions</b></a> within the task definition artifact in this stage. Checking this box let\\'s you evaluate your task definition artifact coming from external sources.(e.g. GitHub) </p>',\n};\n\nObject.keys(helpContents).forEach((key) => HelpContentsRegistry.register(key, helpContents[key]));\n","import type { IProviderSettings } from '@spinnaker/core';\nimport { SETTINGS } from '@spinnaker/core';\n\nexport interface IECSProviderSettings extends IProviderSettings {\n defaults: {\n account?: string;\n region?: string;\n zone?: string;\n };\n}\n\nexport const IECSProviderSettings: IECSProviderSettings = (SETTINGS.providers.ecs as IECSProviderSettings) || {\n defaults: {},\n};\nif (IECSProviderSettings) {\n IECSProviderSettings.resetToOriginal = SETTINGS.resetProvider('ecs');\n}\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderDetails } from './IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from './IEcsCluster';\n\nexport class EcsClusterReader {\n public listClusters(): PromiseLike<IEcsClusterDescriptor[]> {\n return REST('/ecs/ecsClusters').get();\n }\n\n public describeClusters(account: string, region: string): PromiseLike<IEcsCapacityProviderDetails[]> {\n if (account != null && region != null) {\n return REST('/ecs/ecsClusterDescriptions').path(account).path(region).get();\n }\n return {} as PromiseLike<IEcsCapacityProviderDetails[]>;\n }\n}\n\nexport const ECS_CLUSTER_READ_SERVICE = 'spinnaker.ecs.ecsCluster.read.service';\n\nmodule(ECS_CLUSTER_READ_SERVICE, []).service('ecsClusterReader', EcsClusterReader);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { IRoleDescriptor } from './IRole';\n\nexport class IamRoleReader {\n public listRoles(provider: string): PromiseLike<IRoleDescriptor[]> {\n return REST('/roles').path(provider).get();\n }\n}\n\nexport const IAM_ROLE_READ_SERVICE = 'spinnaker.ecs.iamRole.read.service';\n\nmodule(IAM_ROLE_READ_SERVICE, []).service('iamRoleReader', IamRoleReader);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\nimport _ from 'lodash';\n\nimport { applyHealthCheckInfoToTargetGroups, getAllTargetGroups } from '@spinnaker/amazon';\nimport {\n CloudProviderRegistry,\n ConfirmationModalService,\n InstanceReader,\n InstanceWriter,\n RecentHistoryService,\n SETTINGS,\n} from '@spinnaker/core';\n\nexport const ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER = 'spinnaker.ecs.instance.details.controller';\nexport const name = ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER; // for backwards compatibility\nmodule(ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER, [UIROUTER_ANGULARJS, ANGULAR_UI_BOOTSTRAP]).controller(\n 'ecsInstanceDetailsCtrl',\n [\n '$scope',\n '$state',\n '$uibModal',\n 'instance',\n 'app',\n 'moniker',\n 'environment',\n '$q',\n 'overrides',\n function ($scope, $state, $uibModal, instance, app, moniker, environment, $q, overrides) {\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('ecs', 'instance.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n instancePort: _.get(app, 'attributes.instancePort') || SETTINGS.defaultInstancePort || 80,\n };\n\n $scope.application = app;\n $scope.moniker = moniker;\n $scope.environment = environment;\n\n const cloudProvider = 'ecs';\n const defaultRequestParams = { cloudProvider: cloudProvider };\n\n function extractHealthMetrics(instance, latest) {\n // do not backfill on standalone instances\n if (app.isStandalone) {\n instance.health = latest.health;\n }\n\n instance.health = instance.health || [];\n const displayableMetrics = instance.health.filter(function (metric) {\n return metric.type !== 'Ecs' || metric.state !== 'Unknown';\n });\n\n // augment with target group healthcheck data\n const targetGroups = getAllTargetGroups(app.loadBalancers.data);\n applyHealthCheckInfoToTargetGroups(displayableMetrics, targetGroups, instance.account);\n\n // backfill details where applicable\n if (latest.health) {\n displayableMetrics.forEach(function (metric) {\n const detailsMatch = latest.health.filter(function (latestHealth) {\n return latestHealth.type === metric.type;\n });\n if (detailsMatch.length) {\n _.defaults(metric, detailsMatch[0]);\n }\n });\n }\n $scope.healthMetrics = displayableMetrics;\n }\n\n function retrieveInstance() {\n const extraData = {};\n let instanceSummary, loadBalancers, targetGroup, account, region, vpcId;\n if (!app.serverGroups) {\n // standalone instance\n instanceSummary = {};\n loadBalancers = [];\n targetGroup = [];\n account = instance.account;\n region = instance.region;\n } else {\n app.serverGroups.data.some(function (serverGroup) {\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = serverGroup.loadBalancers;\n targetGroup = serverGroup.targetGroup;\n account = serverGroup.account;\n region = serverGroup.region;\n vpcId = serverGroup.vpcId;\n extraData.serverGroup = serverGroup.name;\n extraData.vpcId = serverGroup.vpcId;\n return true;\n }\n });\n });\n if (!instanceSummary) {\n // perhaps it is in a server group that is part of another app\n app.loadBalancers.data.some(function (loadBalancer) {\n return (\n loadBalancer.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n }) ||\n loadBalancer.targetGroup.some(function (targetGroup) {\n return targetGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n targetGroup = targetGroup.name;\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n })\n );\n });\n if (!instanceSummary) {\n // perhaps it is in a disabled server group via a load balancer\n app.loadBalancers.data.some(function (loadBalancer) {\n return (\n loadBalancer.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n }) ||\n loadBalancer.targetGroup.some(function (targetGroup) {\n targetGroup.serverGroups.some(function (serverGroup) {\n if (!serverGroup.isDisabled) {\n return false;\n }\n return serverGroup.instances.some(function (possibleInstance) {\n if (possibleInstance.id === instance.instanceId) {\n instanceSummary = possibleInstance;\n loadBalancers = [loadBalancer.name];\n account = loadBalancer.account;\n region = loadBalancer.region;\n vpcId = loadBalancer.vpcId;\n return true;\n }\n });\n });\n })\n );\n });\n }\n }\n }\n\n if (instanceSummary && account && region) {\n instanceSummary.account = account;\n extraData.account = account;\n extraData.region = region;\n RecentHistoryService.addExtraDataToLatest('instances', extraData);\n return InstanceReader.getInstanceDetails(account, region, instance.instanceId).then((details) => {\n if ($scope.$$destroyed) {\n return;\n }\n $scope.state.loading = false;\n extractHealthMetrics(instanceSummary, details);\n $scope.instance = _.defaults(details, instanceSummary);\n $scope.instance.account = account;\n $scope.instance.region = region;\n $scope.instance.vpcId = vpcId;\n $scope.instance.loadBalancers = loadBalancers;\n $scope.instance.targetGroup = targetGroup;\n if ($scope.instance.networkInterfaces) {\n const permanentNetworkInterfaces = $scope.instance.networkInterfaces.filter(\n (f) => f.attachment.deleteOnTermination === false,\n );\n if (permanentNetworkInterfaces.length) {\n $scope.instance.permanentIps = permanentNetworkInterfaces.map((f) => f.privateIpAddress);\n }\n }\n $scope.baseIpAddress = details.publicDnsName || details.privateIpAddress;\n if (overrides.instanceDetailsLoaded) {\n overrides.instanceDetailsLoaded();\n }\n }, autoClose);\n }\n\n if (!instanceSummary) {\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.loading = false;\n }\n\n return $q.when(null);\n }\n\n function autoClose() {\n if ($scope.$$destroyed) {\n return;\n }\n if (app.isStandalone) {\n $scope.state.loading = false;\n $scope.instanceIdNotFound = instance.instanceId;\n $scope.state.notFoundStandalone = true;\n RecentHistoryService.removeLastItem('instances');\n } else {\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n }\n\n this.canRegisterWithDiscovery = function () {\n const instance = $scope.instance;\n const healthMetrics = instance.health || [];\n const discoveryHealth = healthMetrics.filter(function (health) {\n return health.type === 'Discovery';\n });\n return discoveryHealth.length ? discoveryHealth[0].state === 'OutOfService' : false;\n };\n\n this.terminateInstance = function terminateInstance() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId,\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstance(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + '?',\n buttonText: 'Terminate ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.terminateInstanceAndShrinkServerGroup = function terminateInstanceAndShrinkServerGroup() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Terminating ' + instance.instanceId + ' and shrinking server group',\n onTaskComplete: function () {\n if ($state.includes('**.instanceDetails', { instanceId: instance.instanceId })) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = function () {\n return InstanceWriter.terminateInstanceAndShrinkServerGroup(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup + '?',\n buttonText: 'Terminate ' + instance.instanceId + ' and shrink ' + instance.serverGroup,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.enableInstanceInDiscovery = function enableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.enableInstanceInDiscovery(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really enable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Enable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.disableInstanceInDiscovery = function disableInstanceInDiscovery() {\n const instance = $scope.instance;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + instance.instanceId + ' in discovery',\n };\n\n const submitMethod = function () {\n return InstanceWriter.disableInstanceInDiscovery(instance, app, defaultRequestParams);\n };\n\n ConfirmationModalService.confirm({\n header: 'Really disable ' + instance.instanceId + ' in discovery?',\n buttonText: 'Disable ' + instance.instanceId,\n account: instance.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n });\n };\n\n this.hasHealthState = function hasHealthState(healthProviderType, state) {\n const instance = $scope.instance;\n const healthMetrics = instance.health || [];\n return healthMetrics.some(function (health) {\n return health.type === healthProviderType && health.state === state;\n });\n };\n\n const initialize = app.isStandalone\n ? retrieveInstance()\n : $q.all([app.serverGroups.ready(), app.loadBalancers.ready()]).then(retrieveInstance);\n\n initialize.then(() => {\n // Two things to look out for here:\n // 1. If the retrieveInstance call completes *after* the user has navigated away from the view, there\n // is no point in subscribing to the refresh\n // 2. If this is a standalone instance, there is no application that will refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.serverGroups.onRefresh($scope, retrieveInstance);\n }\n });\n\n $scope.account = instance.account;\n },\n ],\n);\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { IInstanceCounts } from '@spinnaker/core';\nimport { LoadBalancerServerGroup } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsTargetGroupProps {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n showServerGroups: boolean;\n showInstances: boolean;\n}\n\nexport class EcsTargetGroup extends React.Component<IEcsTargetGroupProps> {\n public render(): React.ReactElement<EcsTargetGroup> {\n const { targetGroup, loadBalancer, showServerGroups } = this.props;\n\n const params = {\n loadBalancerName: loadBalancer.name,\n region: targetGroup.region,\n accountId: targetGroup.account,\n name: targetGroup.targetGroupName,\n vpcId: targetGroup.vpcId,\n provider: targetGroup.cloudProvider,\n };\n\n // info not yet available; HealthCounts component requires it,\n // but will not render if no values are defined.\n const emptyInstanceCounts: IInstanceCounts = {\n up: undefined,\n down: undefined,\n starting: undefined,\n succeeded: undefined,\n failed: undefined,\n unknown: undefined,\n outOfService: undefined,\n };\n\n return (\n <div className=\"target-group-container container-fluid no-padding\">\n <UISrefActive class=\"active\">\n <UISref to=\".ecsTargetGroupDetails\" params={params}>\n <div className={`clickable clickable-row row no-margin-y target-group-header`}>\n <div className=\"col-md-8 target-group-title\">{targetGroup.targetGroupName}</div>\n </div>\n </UISref>\n </UISrefActive>\n {showServerGroups &&\n targetGroup.serverGroups.map((sgName) => {\n return (\n <LoadBalancerServerGroup\n key={sgName}\n account={targetGroup.account}\n region={targetGroup.region}\n serverGroup={{\n account: targetGroup.account,\n cloudProvider: targetGroup.cloudProvider,\n cluster: sgName,\n instanceCounts: emptyInstanceCounts,\n instances: targetGroup.instances,\n name: sgName,\n type: targetGroup.type,\n region: targetGroup.region,\n }}\n showInstances={false} // TODO: use prop when instanceCounts available\n />\n );\n })}\n </div>\n );\n }\n}\n","import { isEqual } from 'lodash';\nimport React from 'react';\n\nimport type { ILoadBalancerClusterContainerProps } from '@spinnaker/core';\n\nimport { EcsTargetGroup } from './TargetGroup';\nimport type { IEcsLoadBalancer } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerClusterContainer extends React.Component<ILoadBalancerClusterContainerProps> {\n public shouldComponentUpdate(nextProps: ILoadBalancerClusterContainerProps) {\n const serverGroupsDiffer = () =>\n !isEqual(\n (nextProps.serverGroups || []).map((g) => g.name),\n (this.props.serverGroups || []).map((g) => g.name),\n );\n const targetGroupsDiffer = () =>\n !isEqual(\n ((nextProps.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n ((this.props.loadBalancer as IEcsLoadBalancer).targetGroups || []).map((t) => t.targetGroupName),\n );\n return (\n nextProps.showInstances !== this.props.showInstances ||\n nextProps.showServerGroups !== this.props.showServerGroups ||\n nextProps.loadBalancer !== this.props.loadBalancer ||\n serverGroupsDiffer() ||\n targetGroupsDiffer()\n );\n }\n\n public render(): React.ReactElement<EcsLoadBalancerClusterContainer> {\n const { loadBalancer, showInstances, showServerGroups } = this.props;\n const lb = loadBalancer as IEcsLoadBalancer;\n\n const TargetGroups = lb.targetGroups.map((targetGroup) => {\n return (\n <EcsTargetGroup\n key={targetGroup.targetGroupName}\n loadBalancer={loadBalancer as IEcsLoadBalancer}\n targetGroup={targetGroup}\n showInstances={showInstances}\n showServerGroups={showServerGroups}\n />\n );\n });\n\n return <div className=\"cluster-container\">{TargetGroups}</div>;\n }\n}\n","import React from 'react';\n\nimport type { IEcsListener } from '../domain/IEcsLoadBalancer';\n\nexport interface IEcsListenerProps {\n listener: IEcsListener;\n}\n\nexport class EcsListener extends React.Component<IEcsListenerProps> {\n constructor(props: IEcsListenerProps) {\n super(props);\n }\n\n private getTargetGroupNameFromArn(arn: string): string {\n const parts = arn.split('/');\n if (parts.length < 0) {\n return arn;\n }\n return parts[1];\n }\n\n public render(): React.ReactElement<EcsListener> {\n const { port, protocol, defaultActions } = this.props.listener;\n\n // TODO: retrieve and display 'rules' in addition to default actions\n return (\n <div>\n <h4>\n {protocol}:{port}\n </h4>\n <div style={{ paddingLeft: 10 }}>\n <i>default actions</i>\n <ul>\n {defaultActions.map((action, i) => {\n if (action.type == 'forward') {\n return (\n <li key={i}>\n &rarr;\n <i className=\"fa fa-fw fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <span>\n {action.targetGroupArn ||\n action.forwardConfig.targetGroups.map((tg) => {\n return this.getTargetGroupNameFromArn(tg.targetGroupArn);\n })}\n </span>\n </li>\n );\n } else {\n return (\n <li key={i}>\n {action.type}:{' '}\n {action.redirectConfig.statusCode ||\n action.fixedResponseConfig.statusCode ||\n action.authenticateOidcConfig.clientId ||\n action.authenticateCognitoActionConfig.userPoolDomain}\n </li>\n );\n }\n })}\n </ul>\n </div>\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner, timestamp } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer } from '../../domain/IEcsLoadBalancer';\nimport { EcsListener } from '../listener';\n\ninterface IEcsLoadBalancerFromStateParams {\n accountId: string;\n region: string;\n name: string;\n vpcId: string;\n}\n\ninterface IEcsLoadBalancerDetailsState {\n loadBalancer: IEcsLoadBalancer;\n loadBalancerNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsLoadBalancerDetailsProps {\n app: Application;\n accountId: string;\n loadBalancer: IEcsLoadBalancerFromStateParams;\n}\n\nexport class EcsLoadBalancerDetails extends React.Component<\n IEcsLoadBalancerDetailsProps,\n IEcsLoadBalancerDetailsState\n> {\n constructor(props: IEcsLoadBalancerDetailsProps) {\n super(props);\n this.state = {\n loading: true,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractLoadBalancer());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractLoadBalancer(): void {\n const { name, region } = this.props.loadBalancer;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === name && test.account === this.props.loadBalancer.accountId && test.region === region;\n });\n\n this.setState({\n loading: false,\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (loadBalancer) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(null, () => this.extractLoadBalancer()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n\n public render(): React.ReactElement<EcsLoadBalancerDetails> {\n const loadBalancerName = this.props.loadBalancer.name;\n const { loadBalancer, loading } = this.state;\n const { accountId } = this.props;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Load balancer not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const loadBalancerHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"header-text horizontal middle\">\n <i className=\"fa icon-sitemap\" />\n <h3 className=\"horizontal middle space-between flex-1\">{loadBalancerName}</h3>\n </div>\n </div>\n );\n\n const loadBalancerContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Load Balancer Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>Created</dt>\n <dd>{timestamp(loadBalancer.createdTime)}</dd>\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId} />\n <br />\n {loadBalancer.region}\n </dd>\n <dt>VPC</dt>\n <dd>{loadBalancer.vpcId}</dd>\n <dt>Type</dt>\n <dd>{loadBalancer.loadBalancerType}</dd>\n <dt>IP Type</dt>\n <dd>{loadBalancer.ipAddressType}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Availability Zones</dt>\n <dd>\n <ul>\n {loadBalancer.availabilityZones.map((az) => {\n return <li key={az}>{az}</li>;\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target Groups</dt>\n <dd>\n <ul>\n {loadBalancer.targetGroups.map((tg) => {\n return (\n <li key={tg.targetGroupName}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.ecsTargetGroupDetails\"\n params={{\n loadBalancerName: loadBalancer.name,\n region: loadBalancer.region,\n accountId: loadBalancer.account,\n name: tg.targetGroupName,\n vpcId: tg.vpcId,\n provider: loadBalancer.cloudProvider,\n }}\n >\n <a>{tg.targetGroupName}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Status\" defaultExpanded={false}>\n <span>Select a target group to check the instance health status from the view of its server groups.</span>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Listeners\" defaultExpanded={false}>\n {loadBalancer.listeners ? (\n loadBalancer.listeners.map((listener, index) => {\n return (\n <div key={index}>\n <span>\n <EcsListener listener={listener}></EcsListener>\n </span>\n </div>\n );\n })\n ) : (\n <li>No listeners provided.</li>\n )}\n </CollapsibleSection>\n <CollapsibleSection heading=\"Firewalls\" defaultExpanded={false}>\n <ul>\n {loadBalancer.securityGroups ? (\n loadBalancer.securityGroups.map((sg) => {\n return <li key={sg}>{sg}</li>;\n })\n ) : (\n <li>No security groups provided.</li>\n )}\n </ul>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Subnets\" defaultExpanded={false}>\n <ul>\n {loadBalancer.subnets.map((subnet) => {\n return <li key={subnet}>{subnet}</li>;\n })}\n </ul>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && loadBalancerHeader()}\n {!loading && !loadBalancer && notFoundContent()}\n {!loading && loadBalancer && loadBalancerContent()}\n </div>\n );\n }\n}\n","import { UISref, UISrefActive } from '@uirouter/react';\nimport React from 'react';\n\nimport type { Application } from '@spinnaker/core';\nimport { AccountTag, CollapsibleSection, Spinner } from '@spinnaker/core';\n\nimport type { IEcsLoadBalancer, IEcsTargetGroup } from '../../domain/IEcsLoadBalancer';\n\ninterface IEcsTargetGroupFromStateParams {\n loadBalancerName: string;\n targetGroupName: string;\n region: string;\n vpcId: string;\n}\n\ninterface IEcsTargetGroupDetailsState {\n loadBalancer: IEcsLoadBalancer;\n targetGroup: IEcsTargetGroup;\n targetGroupNotFound?: string;\n loading: boolean;\n refreshListenerUnsubscribe: () => void;\n}\n\nexport interface IEcsTargetGroupProps {\n app: Application;\n accountId: string;\n name: string;\n targetGroup: IEcsTargetGroupFromStateParams;\n provider: string;\n}\n\nexport class EcsTargetGroupDetails extends React.Component<IEcsTargetGroupProps, IEcsTargetGroupDetailsState> {\n constructor(props: IEcsTargetGroupProps) {\n super(props);\n this.state = {\n loading: true,\n targetGroup: undefined,\n loadBalancer: undefined,\n refreshListenerUnsubscribe: () => {},\n };\n\n props.app\n .getDataSource('loadBalancers')\n .ready()\n .then(() => this.extractTargetGroup());\n }\n\n public componentWillUnmount(): void {\n this.state.refreshListenerUnsubscribe();\n }\n\n private extractTargetGroup(): void {\n const { loadBalancerName, region, targetGroupName } = this.props.targetGroup;\n const loadBalancer: IEcsLoadBalancer = this.props.app\n .getDataSource('loadBalancers')\n .data.find((test: IEcsLoadBalancer) => {\n return test.name === loadBalancerName && test.account === this.props.accountId && test.region === region;\n });\n\n this.setState({\n loadBalancer,\n });\n this.state.refreshListenerUnsubscribe();\n\n if (!loadBalancer) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n } else {\n const targetGroup: IEcsTargetGroup = loadBalancer.targetGroups.find(\n (tg) => tg.targetGroupName === targetGroupName,\n );\n if (!targetGroup) {\n this.setState({\n loading: false,\n targetGroup: null,\n });\n }\n\n if (targetGroup) {\n this.setState({\n loading: false,\n targetGroup,\n });\n\n if (targetGroup) {\n this.setState({\n refreshListenerUnsubscribe: this.props.app\n .getDataSource('loadBalancers')\n .onRefresh(null, () => this.extractTargetGroup()),\n });\n } else {\n this.setState({\n refreshListenerUnsubscribe: () => {},\n });\n }\n }\n }\n }\n\n public render(): React.ReactElement<EcsTargetGroupDetails> {\n const { name, accountId } = this.props;\n const region = this.props.targetGroup.region;\n const { targetGroup, loadBalancer, loading } = this.state;\n\n const CloseButton = (\n <div className=\"close-button\">\n <UISref to=\"^\">\n <span className=\"glyphicon glyphicon-remove\" />\n </UISref>\n </div>\n );\n\n const loadingHeader = () => (\n <div className=\"header\">\n {CloseButton}\n <div className=\"horizontal center middle\">\n <Spinner size=\"small\" />\n </div>\n </div>\n );\n\n const notFoundContent = () => (\n <div className=\"content\">\n <div className=\"content-section\">\n <div className=\"content-body text-center\">\n <h3>Target group not found.</h3>\n </div>\n </div>\n </div>\n );\n\n const targetGroupHeader = () => (\n <div className=\"header\">\n <div className=\"header-text horizontal middle\">\n <i className=\"fa fa-crosshairs icon\" aria-hidden=\"true\"></i>\n <h3 className=\"horizontal middle space-between flex-1\">{name}</h3>\n </div>\n </div>\n );\n\n const targetGroupContent = () => (\n <div className=\"content\">\n <CollapsibleSection heading=\"Target Group Details\" defaultExpanded={true}>\n <dl className=\"dl-horizontal dl-narrow\">\n <dt>In</dt>\n <dd>\n <AccountTag account={accountId}></AccountTag>\n <br />\n {targetGroup.region}\n </dd>\n <dt>VPC</dt>\n <dd>{targetGroup.vpcId}</dd>\n <dt>Protocol</dt>\n <dd>{targetGroup.protocol}</dd>\n <dt>Port</dt>\n <dd>{targetGroup.port}</dd>\n <dt>Target Type</dt>\n <dd>{targetGroup.targetType.toUpperCase()}</dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancers</dt>\n <dd>\n {/* TODO: use UISref to display/highlight LBs in this app. See core/.../LoadBalancer.tsx */}\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.loadBalancerNames ? (\n targetGroup.loadBalancerNames.map((lb, i) => {\n return <li key={i}>{lb}</li>;\n })\n ) : (\n <li>No load balncers provided.</li>\n )}\n </ul>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Load Balancer DNS Name</dt>\n <dd>\n <a target=\"_blank\" href={'http://' + loadBalancer.dnsname}>\n {loadBalancer.dnsname}\n </a>\n </dd>\n </dl>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Server Groups</dt>\n <dd>\n <ul className=\"collapse-margin-on-filter-collapse\">\n {targetGroup.serverGroups.map((sg, i) => {\n return (\n <li key={i}>\n <UISrefActive class=\"active\">\n <UISref\n to=\"^.serverGroup\"\n params={{\n region: region,\n accountId: accountId,\n serverGroup: sg,\n provider: 'ecs',\n }}\n >\n <a>{sg}</a>\n </UISref>\n </UISrefActive>\n </li>\n );\n })}\n </ul>\n </dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Health Checks\" defaultExpanded={false}>\n <dl className=\"horizontal-when-filters-collapsed\">\n <dt>Target</dt>\n <dd>\n {targetGroup.healthCheckProtocol}:{targetGroup.healthCheckPort}\n {targetGroup.healthCheckPath}\n </dd>\n <dt>Timeout</dt>\n <dd>{targetGroup.healthCheckTimeoutSeconds} seconds</dd>\n <dt>Interval</dt>\n <dd>{targetGroup.healthCheckIntervalSeconds} seconds</dd>\n <dt>Healthy Threshold</dt>\n <dd>{targetGroup.healthyThresholdCount}</dd>\n <dt>Unhealthy Threshold</dt>\n <dd>{targetGroup.unhealthyThresholdCount}</dd>\n <dt>Matcher</dt>\n <dd>HTTP Code(s): {targetGroup && targetGroup.matcher ? targetGroup.matcher.httpCode : 'None'}</dd>\n </dl>\n </CollapsibleSection>\n <CollapsibleSection heading=\"Attributes\" defaultExpanded={false}>\n <dl>\n <dt>Deregistration Delay Timeout</dt>\n <dd>{targetGroup.attributes['deregistration_delay.timeout_seconds'] || 0} seconds</dd>\n <dt>Stickiness Enabled</dt>\n <dd>{targetGroup.attributes['stickiness.enabled'] || 'N/A'}</dd>\n </dl>\n </CollapsibleSection>\n </div>\n );\n\n return (\n <div className=\"details-panel\">\n {loading && loadingHeader()}\n {!loading && targetGroupHeader()}\n {!loading && !targetGroup && notFoundContent()}\n {!loading && targetGroup && targetGroupContent()}\n </div>\n );\n }\n}\n","import type { IQService } from 'angular';\n\nimport type { IEcsLoadBalancer, IEcsLoadBalancerSourceData, IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport class EcsLoadBalancerTransformer {\n public static $inject = ['$q'];\n constructor(private $q: IQService) {}\n\n public normalizeLoadBalancer(loadBalancer: IEcsLoadBalancerSourceData): PromiseLike<IEcsLoadBalancer> {\n loadBalancer.targetGroups.forEach((tg: IEcsTargetGroup) => {\n tg.region = loadBalancer.region;\n tg.account = loadBalancer.account;\n tg.cloudProvider = loadBalancer.cloudProvider;\n if (loadBalancer.targetGroupServices) {\n const tgServiceMap = loadBalancer.targetGroupServices;\n tg.serverGroups = tgServiceMap[tg.targetGroupArn];\n }\n });\n return this.$q.resolve(loadBalancer);\n }\n}\n","import type { StateParams } from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport type { ApplicationStateProvider, INestedState } from '@spinnaker/core';\nimport { APPLICATION_STATE_PROVIDER } from '@spinnaker/core';\n\nimport { EcsTargetGroupDetails } from '../loadBalancer/details/targetGroupDetails';\n//import { IEcsTargetGroup } from '../domain/IEcsLoadBalancer';\n\nexport const ECS_TARGET_GROUP_STATES = 'spinnaker.ecs.loadBalancer.targetGroup.states';\nmodule(ECS_TARGET_GROUP_STATES, [APPLICATION_STATE_PROVIDER]).config([\n 'applicationStateProvider',\n (applicationStateProvider: ApplicationStateProvider) => {\n const ecsTargetGroupDetails: INestedState = {\n name: 'ecsTargetGroupDetails',\n url: '/ecsTargetGroupDetails/:provider/:accountId/:region/:vpcId/:loadBalancerName/:name',\n params: {\n vpcId: {\n value: null,\n squash: true,\n },\n },\n views: {\n 'detail@../insight': {\n component: EcsTargetGroupDetails,\n $type: 'react',\n },\n },\n resolve: {\n accountId: ['$stateParams', ($stateParams: StateParams) => $stateParams.accountId],\n name: ['$stateParams', ($stateParams: StateParams) => $stateParams.name],\n provider: ['$stateParams', ($stateParams: StateParams) => $stateParams.provider],\n // resolve flat params into an IEcsTargetGroup\n targetGroup: [\n '$stateParams',\n ($stateParams: StateParams) => {\n return {\n loadBalancerName: $stateParams.loadBalancerName,\n targetGroupName: $stateParams.name,\n accountId: $stateParams.accountId,\n region: $stateParams.region,\n vpcId: $stateParams.vpcId,\n };\n },\n ],\n },\n data: {\n pageTitleDetails: {\n title: 'Target Group Details',\n nameParam: 'name',\n accountParam: 'accountId',\n regionParam: 'region',\n },\n },\n };\n\n applicationStateProvider.addInsightDetailState(ecsTargetGroupDetails);\n },\n]);\n","export default \"data:image/svg+xml,%3Csvg%20id%3D%22Layer_1%22%20data-name%3D%22Layer%201%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20100%20100%22%3E%20%20%3Ctitle%3ECompute%3C%2Ftitle%3E%20%20%3Cg%3E%20%20%20%20%3Cpolygon%20points%3D%2219.64%2022.51%2016%2024.32%2016%2075.68%2019.64%2077.49%2033.98%2051.07%2019.64%2022.51%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2230.72%2031.78%2036.08%2024.19%2060.1%2034.87%2054.5%2035.76%2030.72%2031.78%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2226.56%2068.77%2032.46%2076.88%2060.1%2064.95%2054.76%2064.12%2026.56%2068.77%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2228.12%2075.5%2019.64%2077.49%2019.64%2022.51%2028.12%2024.44%2028.12%2075.5%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2223.66%2020.5%2028.12%2018.27%2036.52%2053.56%2028.12%2081.73%2023.66%2079.5%2023.66%2020.5%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2254.46%2064.08%2060.1%2064.95%2065.26%2050.58%2060.1%2034.87%2054.46%2035.76%2054.46%2064.08%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2236.8%2079.28%2028.12%2081.73%2028.12%2018.27%2036.8%2020.73%2036.8%2079.28%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.01%2063.84%2028.12%2070.88%2028.12%2081.73%2066.01%2071.03%2066.01%2063.84%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2266.08%2036%2028.12%2028.79%2028.12%2018.27%2066.08%2029.04%2066.08%2036%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2260.1%2027.34%2066.19%2029.02%2066.19%2071.03%2060.1%2072.7%2060.1%2027.34%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2044.45%2067.7%2045.22%2061.94%2044.83%2078.42%2031.55%2084%2044.45%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2044.83%2078.42%2043.9%2078.42%2031.55%2061.94%2034.22%2061.94%2044.83%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2026.96%2071.62%2043.22%2054.31%2044.32%2046.43%2043.79%22%20fill%3D%22%236b3a19%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2043.79%2063.13%2042.37%2063.13%2026.96%2046.43%2030.87%2046.43%2043.79%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2261.94%2055.39%2084%2055.77%2078.42%2068.67%2061.94%2066%2061.94%2055.39%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2071.62%2057.01%2063.13%2073.26%2046.43%2069.36%2046.43%2056.43%22%20fill%3D%22%239d5025%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2246.43%2056.43%2063.13%2057.86%2071.62%2057.01%2054.31%2055.9%2046.43%2056.43%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2284%2055.77%2067.7%2055.01%2061.94%2055.39%2078.42%2056.33%2084%2055.77%22%20fill%3D%22%23fbbf93%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2043.9%2084%2044.45%2084%2033.22%2078.42%2031.55%2078.42%2043.9%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2043.22%2063.13%2042.37%2063.13%2026.96%2071.62%2029.51%2071.62%2043.22%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2278.42%2056.33%2084%2055.77%2084%2067%2078.42%2068.67%2078.42%2056.33%22%20fill%3D%22%23f58536%22%2F%3E%20%20%20%20%3Cpolygon%20points%3D%2271.62%2057.01%2063.13%2057.86%2063.13%2073.26%2071.62%2070.72%2071.62%2057.01%22%20fill%3D%22%23f58536%22%2F%3E%20%20%3C%2Fg%3E%3C%2Fsvg%3E\"","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { IMetricAlarmDescriptor } from './MetricAlarm';\n\nexport class MetricAlarmReader {\n public listMetricAlarms(): PromiseLike<IMetricAlarmDescriptor[]> {\n return REST('/ecs/cloudMetrics/alarms').get();\n }\n}\n\nexport const METRIC_ALARM_READ_SERVICE = 'spinnaker.ecs.metricAlarm.read.service';\n\nmodule(METRIC_ALARM_READ_SERVICE, []).service('metricAlarmReader', MetricAlarmReader);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.destroyAsgStage';\nexport const name = ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'destroyServerGroup',\n alias: 'destroyAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./destroyAsgStage.html'),\n executionStepLabelUrl: require('./destroyAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to destroy a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDestroyAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.regions = ['us-east-1', 'us-west-1', 'eu-west-1', 'us-west-2'];\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, PipelineTemplates, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE = 'spinnaker.ecs.pipeline.stage.disableAsgStage';\nexport const name = ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableServerGroup',\n alias: 'disableAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./disableAsgStage.html'),\n executionDetailsUrl: PipelineTemplates.disableAsgExecutionDetails,\n executionStepLabelUrl: require('./disableAsgStepLabel.html'),\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to disable a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDisableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.disableClusterStage';\nexport const name = ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'disableCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./disableClusterStage.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingEnabledServerGroups',\n fieldLabel: 'Keep [X] enabled Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsDisableClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.remainingEnabledServerGroups === undefined) {\n stage.remainingEnabledServerGroups = 1;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE = 'spinnaker.ecs.pipeline.stage.enableAsgStage';\nexport const name = ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'enableServerGroup',\n alias: 'enableAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./enableAsgStage.html'),\n executionStepLabelUrl: require('./enableAsgStepLabel.html'),\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsEnableAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n ctrl.reset = () => {\n ctrl.accountUpdated();\n ctrl.resetSelectedCluster();\n };\n\n $scope.targets = StageConstants.TARGET_LIST;\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (!stage.target) {\n stage.target = $scope.targets[0].val;\n }\n\n $scope.$watch('stage.credentials', $scope.accountUpdated);\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE =\n 'spinnaker.ecs.pipeline.stage.findImageFromTagsStage';\nexport const name = ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'findImageFromTags',\n cloudProvider: 'ecs',\n templateUrl: require('./findImageFromTagsStage.html'),\n executionDetailsUrl: require('./findImageFromTagsExecutionDetails.html'),\n executionConfigSections: ['findImageConfig', 'taskStatus'],\n validators: [{ type: 'requiredField', fieldName: 'imageLabelOrSha' }],\n });\n })\n .controller('ecsFindImageFromTagsStageCtrl', [\n '$scope',\n function ($scope) {\n $scope.stage.cloudProvider = $scope.stage.cloudProvider || 'ecs';\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry, StageConstants } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE = 'spinnaker.ecs.pipeline.stage.ecs.resizeAsgStage';\nexport const name = ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'resizeServerGroup',\n alias: 'resizeAsg',\n cloudProvider: 'ecs',\n templateUrl: require('./resizeAsgStage.html'),\n executionConfigSections: ['resizeServerGroupConfig', 'taskStatus'],\n executionStepLabelUrl: require('./resizeAsgStepLabel.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n {\n type: 'targetImpedance',\n message:\n 'This pipeline will attempt to resize a server group without deploying a new version into the same cluster.',\n },\n { type: 'requiredField', fieldName: 'target' },\n { type: 'requiredField', fieldName: 'action' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsResizeAsgStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.viewState = {\n accountsLoaded: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.viewState.accountsLoaded = true;\n });\n\n $scope.resizeTargets = StageConstants.TARGET_LIST;\n\n $scope.scaleActions = [\n {\n label: 'Scale Up',\n val: 'scale_up',\n },\n {\n label: 'Scale Down',\n val: 'scale_down',\n },\n {\n label: 'Scale to Cluster Size',\n val: 'scale_to_cluster',\n },\n {\n label: 'Scale to Exact Size',\n val: 'scale_exact',\n },\n ];\n\n $scope.resizeTypes = [\n {\n label: 'Percentage',\n val: 'pct',\n },\n {\n label: 'Incremental',\n val: 'incr',\n },\n ];\n\n stage.capacity = stage.capacity || {};\n stage.regions = stage.regions || [];\n stage.target = stage.target || $scope.resizeTargets[0].val;\n stage.action = stage.action || $scope.scaleActions[0].val;\n stage.resizeType = stage.resizeType || $scope.resizeTypes[0].val;\n if (stage.targetHealthyDeployPercentage === undefined) {\n stage.targetHealthyDeployPercentage = 100;\n }\n if (!stage.action && stage.resizeType === 'exact') {\n stage.action = 'scale_exact';\n }\n stage.cloudProvider = 'ecs';\n\n if (\n stage.isNew &&\n $scope.application.attributes.platformHealthOnlyShowOverride &&\n $scope.application.attributes.platformHealthOnly\n ) {\n stage.interestingHealthProviderNames = ['Ecs'];\n }\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n ctrl.updateResizeType = function () {\n if (stage.action === 'scale_exact') {\n stage.resizeType = 'exact';\n delete stage.scalePct;\n delete stage.scaleNum;\n } else {\n stage.capacity = {};\n if (stage.resizeType === 'pct') {\n delete stage.scaleNum;\n } else {\n stage.resizeType = 'incr';\n delete stage.scalePct;\n stage.scaleNum = stage.scaleNum || 0;\n }\n }\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.scaleDownClusterStage';\nexport const name = ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'scaleDownCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./scaleDownClusterStage.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n {\n type: 'requiredField',\n fieldName: 'remainingFullSizeServerGroups',\n fieldLabel: 'Keep [X] full size Server Groups',\n },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n strategy: true,\n });\n })\n .controller('ecsScaleDownClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.remainingFullSizeServerGroups === undefined) {\n stage.remainingFullSizeServerGroups = 1;\n }\n\n if (stage.allowScaleDownActive === undefined) {\n stage.allowScaleDownActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.preferLargerOverNewer === undefined) {\n stage.preferLargerOverNewer = 'false';\n }\n stage.preferLargerOverNewer = stage.preferLargerOverNewer.toString();\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { AccountService, Registry } from '@spinnaker/core';\n\nexport const ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE =\n 'spinnaker.ecs.pipeline.stage.ecs.shrinkClusterStage';\nexport const name = ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE; // for backwards compatibility\nmodule(ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE, [])\n .config(function () {\n Registry.pipeline.registerStage({\n provides: 'shrinkCluster',\n cloudProvider: 'ecs',\n templateUrl: require('./shrinkClusterStage.html'),\n accountExtractor: (stage) => [stage.context.credentials],\n configAccountExtractor: (stage) => [stage.credentials],\n validators: [\n { type: 'requiredField', fieldName: 'cluster' },\n { type: 'requiredField', fieldName: 'shrinkToSize', fieldLabel: 'shrink to [X] Server Groups' },\n { type: 'requiredField', fieldName: 'regions' },\n { type: 'requiredField', fieldName: 'credentials', fieldLabel: 'account' },\n ],\n });\n })\n .controller('ecsShrinkClusterStageCtrl', [\n '$scope',\n function ($scope) {\n const ctrl = this;\n\n const stage = $scope.stage;\n\n $scope.state = {\n accounts: false,\n regionsLoaded: false,\n };\n\n AccountService.listAccounts('ecs').then(function (accounts) {\n $scope.accounts = accounts;\n $scope.state.accounts = true;\n });\n\n stage.regions = stage.regions || [];\n stage.cloudProvider = 'ecs';\n\n if (!stage.credentials && $scope.application.defaultCredentials.ecs) {\n stage.credentials = $scope.application.defaultCredentials.ecs;\n }\n if (!stage.regions.length && $scope.application.defaultRegions.ecs) {\n stage.regions.push($scope.application.defaultRegions.ecs);\n }\n\n if (stage.shrinkToSize === undefined) {\n stage.shrinkToSize = 1;\n }\n\n if (stage.allowDeleteActive === undefined) {\n stage.allowDeleteActive = false;\n }\n\n ctrl.pluralize = function (str, val) {\n if (val === 1) {\n return str;\n }\n return str + 's';\n };\n\n if (stage.retainLargerOverNewer === undefined) {\n stage.retainLargerOverNewer = 'false';\n }\n stage.retainLargerOverNewer = stage.retainLargerOverNewer.toString();\n },\n ]);\n","import { module } from 'angular';\n\nimport type { IPlacementStrategy } from './IPlacementStrategy';\n\nexport class PlacementStrategyService {\n public getPredefinedStrategy(strategyName: string): IPlacementStrategy[] {\n if (strategyName === 'AZ Balanced Spread') {\n return this.getAzBalancedSpreadStrategy();\n } else if (strategyName === 'AZ Balanced BinPack' || strategyName === 'AZ Balanced BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getAzBalancedMemoryBinPackStrategy();\n } else if (strategyName === 'BinPack' || strategyName === 'BinPack Memory') {\n // Note: 'BinPack' is a misleading term which was replaced later by 'BinPack Memory' as it was more clear\n return this.getBinPackMemoryStrategy();\n } else if (strategyName === 'AZ Balanced BinPack CPU') {\n return this.getAzBalancedCpuBinPackStrategy();\n } else if (strategyName === 'BinPack CPU') {\n return this.getBinPackCpuStrategy();\n } else if (strategyName === 'One Task Per Host') {\n return this.getOneTaskPerHostStrategy();\n } else {\n // TODO: Add support for custom placement strategy.\n return [];\n }\n }\n\n public getAzBalancedSpreadStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'spread', field: 'instanceId' },\n ];\n }\n\n public getAzBalancedMemoryBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'memory' },\n ];\n }\n\n public getBinPackMemoryStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'memory' }];\n }\n\n public getAzBalancedCpuBinPackStrategy(): IPlacementStrategy[] {\n return [\n { type: 'spread', field: 'attribute:ecs.availability-zone' },\n { type: 'binpack', field: 'cpu' },\n ];\n }\n\n public getBinPackCpuStrategy(): IPlacementStrategy[] {\n return [{ type: 'binpack', field: 'cpu' }];\n }\n\n public getOneTaskPerHostStrategy(): IPlacementStrategy[] {\n return [{ type: 'spread', field: 'instanceId' }];\n }\n}\n\nexport const PLACEMENT_STRATEGY_SERVICE = 'spinnaker.ecs.placementStrategyService.service';\n\nmodule(PLACEMENT_STRATEGY_SERVICE, []).service('placementStrategyService', PlacementStrategyService);\n","import { module } from 'angular';\n\nimport { REST } from '@spinnaker/core';\nimport type { ISecretDescriptor } from './ISecret';\n\nexport class SecretReader {\n public listSecrets(): PromiseLike<ISecretDescriptor[]> {\n return REST('/ecs/secrets').get();\n }\n}\n\nexport const ECS_SECRET_READ_SERVICE = 'spinnaker.ecs.secret.read.service';\n\nmodule(ECS_SECRET_READ_SERVICE, []).service('secretReader', SecretReader);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { VpcReader } from '@spinnaker/amazon';\nimport {\n CloudProviderRegistry,\n FirewallLabels,\n MANAGED_RESOURCE_DETAILS_INDICATOR,\n RecentHistoryService,\n SECURITY_GROUP_READER,\n} from '@spinnaker/core';\n\nexport const ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER =\n 'spinnaker.ecs.securityGroup.details.controller';\nexport const name = ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER, [\n UIROUTER_ANGULARJS,\n SECURITY_GROUP_READER,\n MANAGED_RESOURCE_DETAILS_INDICATOR,\n ])\n .controller('ecsSecurityGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'resolvedSecurityGroup',\n 'app',\n 'securityGroupReader',\n function ($scope, $state, resolvedSecurityGroup, app, securityGroupReader) {\n this.application = app;\n const application = app;\n const securityGroup = resolvedSecurityGroup;\n this.firewallLabel = FirewallLabels.get('Firewall');\n\n // needed for standalone instances\n $scope.detailsTemplateUrl = CloudProviderRegistry.getValue('ecs', 'securityGroup.detailsTemplateUrl');\n\n $scope.state = {\n loading: true,\n standalone: app.isStandalone,\n };\n\n function extractSecurityGroup() {\n return securityGroupReader\n .getSecurityGroupDetails(\n application,\n securityGroup.accountId,\n securityGroup.provider,\n securityGroup.region,\n securityGroup.vpcId,\n securityGroup.name,\n )\n .then(function (details) {\n return VpcReader.getVpcName(details.vpcId).then((name) => {\n details.vpcName = name;\n return details;\n });\n })\n .then(function (details) {\n $scope.state.loading = false;\n\n if (!details || _.isEmpty(details)) {\n fourOhFour();\n } else {\n const applicationSecurityGroup = securityGroupReader.getApplicationSecurityGroup(\n application,\n securityGroup.accountId,\n securityGroup.region,\n securityGroup.name,\n );\n\n angular.extend(securityGroup, applicationSecurityGroup, details);\n $scope.securityGroup = securityGroup;\n $scope.ipRules = buildIpRulesModel(securityGroup);\n $scope.securityGroupRules = buildSecurityGroupRulesModel(securityGroup);\n }\n }, fourOhFour);\n }\n\n function buildIpRulesModel(details) {\n const groupedRangeRules = _.groupBy(details.ipRangeRules, (rule) => rule.range.ip + rule.range.cidr);\n return Object.keys(groupedRangeRules)\n .map((addr) => {\n return {\n address: addr,\n rules: buildRuleModel(groupedRangeRules, addr),\n };\n })\n .filter((rule) => rule.rules.length);\n }\n\n function buildSecurityGroupRulesModel(details) {\n const groupedRangeRules = _.groupBy(details.securityGroupRules, (rule) => rule.securityGroup.id);\n return Object.keys(groupedRangeRules)\n .map((addr) => {\n return {\n securityGroup: groupedRangeRules[addr][0].securityGroup,\n rules: buildRuleModel(groupedRangeRules, addr),\n };\n })\n .filter((rule) => rule.rules.length);\n }\n\n function buildRuleModel(groupedRangeRules, addr) {\n const rules = [];\n groupedRangeRules[addr].forEach((rule) => {\n (rule.portRanges || []).forEach((range) => {\n if (rule.protocol === '-1' || (range.startPort !== undefined && range.endPort !== undefined)) {\n rules.push({ startPort: range.startPort, endPort: range.endPort, protocol: rule.protocol });\n }\n });\n });\n return rules;\n }\n\n function fourOhFour() {\n if ($scope.$$destroyed) {\n return;\n }\n if (app.isStandalone) {\n $scope.group = securityGroup.name;\n $scope.state.notFound = true;\n $scope.state.loading = false;\n RecentHistoryService.removeLastItem('securityGroups');\n } else {\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n }\n }\n\n extractSecurityGroup().then(() => {\n // If the user navigates away from the view before the initial extractSecurityGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed && !app.isStandalone) {\n app.securityGroups.onRefresh($scope, extractSecurityGroup);\n }\n });\n\n if (app.isStandalone) {\n // we still want the edit to refresh the firewall details when the modal closes\n app.securityGroups = {\n refresh: extractSecurityGroup,\n };\n }\n },\n ]);\n","import { module } from 'angular';\n\nimport type { ISecurityGroup, ISecurityGroupsByAccount } from '@spinnaker/core';\n\nexport class EcsSecurityGroupReader {\n public resolveIndexedSecurityGroup(\n indexedSecurityGroups: ISecurityGroupsByAccount,\n container: ISecurityGroup,\n securityGroupId: string,\n ): ISecurityGroup {\n return indexedSecurityGroups[container.account][container.region][securityGroupId];\n }\n}\n\nexport const ECS_SECURITY_GROUP_READER = 'spinnaker.ecs.securityGroup.reader';\nmodule(ECS_SECURITY_GROUP_READER, []).service('ecsSecurityGroupReader', EcsSecurityGroupReader);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER = 'spinnaker.ecs.securityGroup.transformer';\nexport const name = ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER; // for backwards compatibility\nmodule(ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER, []).factory('ecsSecurityGroupTransformer', function () {\n function normalizeSecurityGroup() {}\n\n return {\n normalizeSecurityGroup: normalizeSecurityGroup,\n };\n});\n","import { module } from 'angular';\n\nimport { ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER } from './details/securityGroupDetail.controller';\nimport { ECS_SECURITY_GROUP_READER } from './securityGroup.reader';\nimport { ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER } from './securityGroup.transformer';\n\nexport const ECS_SECURITY_GROUP_MODULE = 'spinnaker.ecs.securityGroup';\nmodule(ECS_SECURITY_GROUP_MODULE, [\n ECS_SECURITY_GROUP_READER,\n ECS_SECURITYGROUP_SECURITYGROUP_TRANSFORMER,\n ECS_SECURITYGROUP_DETAILS_SECURITYGROUPDETAIL_CONTROLLER,\n]);\n","import { REST } from '@spinnaker/core';\nimport type { IServiceDiscoveryRegistryDescriptor } from './IServiceDiscovery';\n\nexport class ServiceDiscoveryReader {\n public static listServiceDiscoveryRegistries(): PromiseLike<IServiceDiscoveryRegistryDescriptor[]> {\n return REST('/ecs/serviceDiscoveryRegistries').get();\n }\n}\n","import type { IQService } from 'angular';\nimport { module } from 'angular';\nimport { chain, clone, extend, find, flatten, has, intersection, keys, some, xor } from 'lodash';\n\nimport type { IAmazonLoadBalancer } from '@spinnaker/amazon';\nimport type {\n IAccountDetails,\n IArtifact,\n IDeploymentStrategy,\n IPipeline,\n IRegion,\n IServerGroupCommand,\n IServerGroupCommandBackingData,\n IServerGroupCommandBackingDataFiltered,\n IServerGroupCommandDirty,\n IServerGroupCommandResult,\n IServerGroupCommandViewState,\n IStage,\n ISubnet,\n LoadBalancerReader,\n SecurityGroupReader,\n ServerGroupCommandRegistry,\n} from '@spinnaker/core';\nimport {\n AccountService,\n CACHE_INITIALIZER_SERVICE,\n LOAD_BALANCER_READ_SERVICE,\n NameUtils,\n SECURITY_GROUP_READER,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n SubnetReader,\n} from '@spinnaker/core';\nimport type { IDockerImage } from '@spinnaker/docker';\nimport { DockerImageReader } from '@spinnaker/docker';\n\nimport type { IEcsCapacityProviderDetails } from '../../ecsCluster/IEcsCapacityProviderDetails';\nimport type { IEcsClusterDescriptor } from '../../ecsCluster/IEcsCluster';\nimport type { EcsClusterReader } from '../../ecsCluster/ecsCluster.read.service';\nimport type { IRoleDescriptor } from '../../iamRoles/IRole';\nimport type { IamRoleReader } from '../../iamRoles/iamRole.read.service';\nimport type { IMetricAlarmDescriptor } from '../../metricAlarm/MetricAlarm';\nimport type { MetricAlarmReader } from '../../metricAlarm/metricAlarm.read.service';\nimport type { IPlacementStrategy } from '../../placementStrategy/IPlacementStrategy';\nimport type { PlacementStrategyService } from '../../placementStrategy/placementStrategy.service';\nimport type { ISecretDescriptor } from '../../secrets/ISecret';\nimport type { SecretReader } from '../../secrets/secret.read.service';\nimport type { IServiceDiscoveryRegistryDescriptor } from '../../serviceDiscovery/IServiceDiscovery';\nimport { ServiceDiscoveryReader } from '../../serviceDiscovery/serviceDiscovery.read.service';\n\nexport interface IEcsServerGroupCommandDirty extends IServerGroupCommandDirty {\n targetGroups?: string[];\n defaulCapacityProviders?: string[];\n customCapacityProviders?: string[];\n}\n\nexport interface IEcsServerGroupCommandResult extends IServerGroupCommandResult {\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsDockerImage extends IDockerImage {\n imageId: string;\n message: string;\n fromTrigger: boolean;\n fromContext: boolean;\n stageId: string;\n imageLabelOrSha: string;\n}\n\nexport interface IEcsServerGroupCommandViewState extends IServerGroupCommandViewState {\n contextImages: IEcsDockerImage[];\n pipeline: IPipeline;\n currentStage: IStage;\n dirty: IEcsServerGroupCommandDirty;\n}\n\nexport interface IEcsServerGroupCommandBackingDataFiltered extends IServerGroupCommandBackingDataFiltered {\n targetGroups: string[];\n iamRoles: string[];\n ecsClusters: string[];\n availableCapacityProviders: string[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n metricAlarms: IMetricAlarmDescriptor[];\n subnetTypes: ISubnet[];\n securityGroupNames: string[];\n secrets: string[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsServerGroupCommandBackingData extends IServerGroupCommandBackingData {\n filtered: IEcsServerGroupCommandBackingDataFiltered;\n targetGroups: string[];\n ecsClusters: IEcsClusterDescriptor[];\n capacityProviderDetails: IEcsCapacityProviderDetails[];\n iamRoles: IRoleDescriptor[];\n metricAlarms: IMetricAlarmDescriptor[];\n launchTypes: string[];\n networkModes: string[];\n secrets: ISecretDescriptor[];\n serviceDiscoveryRegistries: IServiceDiscoveryRegistryDescriptor[];\n images: IEcsDockerImage[];\n}\n\nexport interface IEcsTaskDefinitionArtifact {\n artifact?: IArtifact;\n artifactId?: string;\n}\n\nexport interface IEcsContainerMapping {\n containerName: string;\n imageDescription: IEcsDockerImage;\n}\n\nexport interface IEcsTargetGroupMapping {\n containerName: string;\n containerPort: number;\n targetGroup: string;\n}\n\nexport interface IEcsServiceDiscoveryRegistryAssociation {\n registry: IServiceDiscoveryRegistryDescriptor;\n containerPort: number;\n containerName: string;\n}\n\nexport interface IEcsCapacityProviderStrategyItem {\n capacityProvider: string;\n base: number;\n weight: number;\n}\n\nexport interface IEcsServerGroupCommand extends IServerGroupCommand {\n associatePublicIpAddress: boolean;\n backingData: IEcsServerGroupCommandBackingData;\n computeUnits: number;\n reservedMemory: number;\n targetHealthyDeployPercentage: number;\n targetGroup: string;\n containerPort: number;\n placementStrategyName: string;\n placementStrategySequence: IPlacementStrategy[];\n imageDescription: IEcsDockerImage;\n networkMode: string;\n subnetType: string;\n subnetTypes: string[];\n securityGroups: string[];\n securityGroupNames: string[];\n viewState: IEcsServerGroupCommandViewState;\n taskDefinitionArtifact: IEcsTaskDefinitionArtifact;\n taskDefinitionArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n loadBalancedContainer: string;\n targetGroupMappings: IEcsTargetGroupMapping[];\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n useTaskDefinitionArtifact: boolean;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n useDefaultCapacityProviders: boolean;\n ecsClusterName: string;\n subnetTypeChanged: (command: IEcsServerGroupCommand) => IServerGroupCommandResult;\n placementStrategyNameChanged: (command: IEcsServerGroupCommand) => IServerGroupCommandResult;\n regionIsDeprecated: (command: IEcsServerGroupCommand) => boolean;\n\n clusterChanged: (command: IServerGroupCommand) => void;\n}\n\nexport class EcsServerGroupConfigurationService {\n // private enabledMetrics = ['GroupMinSize', 'GroupMaxSize', 'GroupDesiredCapacity', 'GroupInServiceInstances', 'GroupPendingInstances', 'GroupStandbyInstances', 'GroupTerminatingInstances', 'GroupTotalInstances'];\n // private healthCheckTypes = ['EC2', 'ELB'];\n // private terminationPolicies = ['OldestInstance', 'NewestInstance', 'OldestLaunchConfiguration', 'ClosestToNextInstanceHour', 'Default'];\n private launchTypes = ['EC2', 'FARGATE'];\n private networkModes = ['bridge', 'host', 'awsvpc', 'none', 'default'];\n\n public static $inject = [\n '$q',\n 'loadBalancerReader',\n 'serverGroupCommandRegistry',\n 'iamRoleReader',\n 'ecsClusterReader',\n 'metricAlarmReader',\n 'placementStrategyService',\n 'securityGroupReader',\n 'secretReader',\n ];\n constructor(\n private $q: IQService,\n private loadBalancerReader: LoadBalancerReader,\n private serverGroupCommandRegistry: ServerGroupCommandRegistry,\n private iamRoleReader: IamRoleReader,\n private ecsClusterReader: EcsClusterReader,\n private metricAlarmReader: MetricAlarmReader,\n private placementStrategyService: PlacementStrategyService,\n private securityGroupReader: SecurityGroupReader,\n private secretReader: SecretReader,\n ) {}\n\n public configureUpdateCommand(command: IEcsServerGroupCommand): void {\n command.backingData = {\n // terminationPolicies: clone(this.terminationPolicies)\n launchTypes: clone(this.launchTypes),\n networkModes: clone(this.networkModes),\n } as IEcsServerGroupCommandBackingData;\n }\n\n // TODO (Bruno Carrier): Why do we need to inject an Application into this constructor so that the app works? This is strange, and needs investigating\n public configureCommand(cmd: IEcsServerGroupCommand, imageQuery = ''): PromiseLike<void> {\n this.applyOverrides('beforeConfiguration', cmd);\n cmd.toggleSuspendedProcess = (command: IEcsServerGroupCommand, process: string): void => {\n command.suspendedProcesses = command.suspendedProcesses || [];\n const processIndex = command.suspendedProcesses.indexOf(process);\n if (processIndex === -1) {\n command.suspendedProcesses.push(process);\n } else {\n command.suspendedProcesses.splice(processIndex, 1);\n }\n };\n\n cmd.processIsSuspended = (command: IEcsServerGroupCommand, process: string): boolean =>\n command.suspendedProcesses.includes(process);\n\n cmd.onStrategyChange = (command: IEcsServerGroupCommand, strategy: IDeploymentStrategy): void => {\n // Any strategy other than None or Custom should force traffic to be enabled\n if (strategy.key !== '' && strategy.key !== 'custom') {\n command.suspendedProcesses = (command.suspendedProcesses || []).filter((p) => p !== 'AddToLoadBalancer');\n }\n };\n\n cmd.regionIsDeprecated = (command: IEcsServerGroupCommand): boolean => {\n return (\n has(command, 'backingData.filtered.regions') &&\n command.backingData.filtered.regions.some((region) => region.name === command.region && region.deprecated)\n );\n };\n\n const imageQueries = cmd.imageDescription ? [this.grabImageAndTag(cmd.imageDescription.imageId)] : [];\n\n if (imageQuery) {\n imageQueries.push(imageQuery);\n }\n\n let imagesPromise;\n if (imageQueries.length) {\n imagesPromise = this.$q\n .all(\n imageQueries.map((q) =>\n DockerImageReader.findImages({\n provider: 'dockerRegistry',\n count: 50,\n q: q,\n }),\n ),\n )\n .then((promises) => flatten(promises));\n } else {\n imagesPromise = this.$q.when([]);\n }\n\n return this.$q\n .all({\n credentialsKeyedByAccount: AccountService.getCredentialsKeyedByAccount('ecs'),\n loadBalancers: this.loadBalancerReader.listLoadBalancers('ecs'),\n subnets: SubnetReader.listSubnetsByProvider('ecs'),\n iamRoles: this.iamRoleReader.listRoles('ecs'),\n ecsClusters: this.ecsClusterReader.listClusters(),\n capacityProviderDetails: this.ecsClusterReader.describeClusters(cmd.credentials, cmd.region),\n metricAlarms: this.metricAlarmReader.listMetricAlarms(),\n securityGroups: this.securityGroupReader.getAllSecurityGroups(),\n launchTypes: this.$q.when(clone(this.launchTypes)),\n networkModes: this.$q.when(clone(this.networkModes)),\n secrets: this.secretReader.listSecrets(),\n serviceDiscoveryRegistries: ServiceDiscoveryReader.listServiceDiscoveryRegistries(),\n images: imagesPromise,\n })\n .then((backingData: Partial<IEcsServerGroupCommandBackingData>) => {\n backingData.accounts = keys(backingData.credentialsKeyedByAccount);\n backingData.filtered = {} as IEcsServerGroupCommandBackingDataFiltered;\n\n if (cmd.viewState.contextImages) {\n backingData.images = backingData.images.concat(cmd.viewState.contextImages);\n }\n cmd.backingData = backingData as IEcsServerGroupCommandBackingData;\n this.configureVpcId(cmd);\n this.configureAvailableIamRoles(cmd);\n this.configureAvailableSubnetTypes(cmd);\n this.configureAvailableSecurityGroups(cmd);\n this.configureAvailableEcsClusters(cmd);\n this.setCapacityProviderDetails(cmd);\n this.configureAvailableSecrets(cmd);\n this.configureAvailableServiceDiscoveryRegistries(cmd);\n this.configureAvailableImages(cmd);\n this.configureAvailableRegions(cmd);\n this.configureLoadBalancerOptions(cmd);\n this.applyOverrides('afterConfiguration', cmd);\n this.attachEventHandlers(cmd);\n });\n }\n\n public setCapacityProviderDetails(command: IEcsServerGroupCommand): void {\n this.$q\n .all({\n capacityProviderDetails: this.ecsClusterReader.describeClusters(command.credentials, command.region),\n })\n .then((result: Partial<IEcsServerGroupCommandBackingData>) => {\n command.backingData.capacityProviderDetails = chain(result.capacityProviderDetails)\n .map((cluster) => this.mapCapacityProviderDetails(cluster))\n .value();\n });\n\n if (command.ecsClusterName != null && command.ecsClusterName.length > 0) {\n this.configureAvailableCapacityProviders(command);\n } else {\n command.backingData.filtered.availableCapacityProviders = [];\n command.backingData.filtered.defaultCapacityProviderStrategy = [];\n }\n this.checkDirtyCapacityProviders(command);\n }\n\n public configureAvailableCapacityProviders(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.availableCapacityProviders = chain(command.backingData.capacityProviderDetails)\n .filter({\n clusterName: command.ecsClusterName,\n })\n .map((availableCPs) => availableCPs.capacityProviders)\n .flattenDeep<string>()\n .value();\n\n command.backingData.filtered.defaultCapacityProviderStrategy = chain(command.backingData.capacityProviderDetails)\n .filter({\n clusterName: command.ecsClusterName,\n })\n .map((availableCPs) => availableCPs.defaultCapacityProviderStrategy)\n .flattenDeep<IEcsCapacityProviderStrategyItem>()\n .value();\n }\n\n public mapCapacityProviderDetails(describeClusters: IEcsCapacityProviderDetails): IEcsCapacityProviderDetails {\n return {\n capacityProviders: describeClusters.capacityProviders,\n clusterName: describeClusters.clusterName,\n defaultCapacityProviderStrategy: describeClusters.defaultCapacityProviderStrategy,\n };\n }\n\n public applyOverrides(phase: string, command: IEcsServerGroupCommand): void {\n this.serverGroupCommandRegistry.getCommandOverrides('ecs').forEach((override: any) => {\n if (override[phase]) {\n override[phase](command);\n }\n });\n }\n\n public grabImageAndTag(imageId: string): string {\n return imageId.split('/').pop();\n }\n\n public buildImageId(image: IEcsDockerImage): string {\n if (image.fromContext) {\n return `${image.imageLabelOrSha}`;\n } else if (image.fromTrigger && !image.tag) {\n return `${image.registry}/${image.repository} (Tag resolved at runtime)`;\n } else {\n return `${image.registry}/${image.repository}:${image.tag}`;\n }\n }\n\n public mapImage(image: IEcsDockerImage): IEcsDockerImage {\n if (image.message !== undefined) {\n return image;\n }\n\n return {\n repository: image.repository,\n tag: image.tag,\n imageId: this.buildImageId(image),\n registry: image.registry,\n fromContext: image.fromContext,\n fromTrigger: image.fromTrigger,\n account: image.account,\n imageLabelOrSha: image.imageLabelOrSha,\n stageId: image.stageId,\n message: image.message,\n };\n }\n\n public configureAvailableImages(command: IEcsServerGroupCommand): void {\n // No filtering required, but need to decorate with the displayable image ID\n command.backingData.filtered.images = command.backingData.images.map((image) => this.mapImage(image));\n }\n\n public configureAvailabilityZones(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.availabilityZones = find<IRegion>(\n command.backingData.credentialsKeyedByAccount[command.credentials].regions,\n { name: command.region },\n ).availabilityZones;\n command.availabilityZones = command.backingData.filtered.availabilityZones;\n }\n\n public configureAvailableSecurityGroups(command: IEcsServerGroupCommand): void {\n if (command.subnetType == null && (command.subnetTypes == null || command.subnetTypes.length == 0)) {\n command.backingData.filtered.securityGroups = [];\n return;\n }\n\n const vpcId = chain(command.backingData.subnets)\n .filter({\n account: command.credentials,\n region: command.region,\n purpose: command.subnetTypes ? command.subnetTypes[0] : command.subnetType,\n })\n .compact()\n .uniqBy('purpose')\n .map('vpcId')\n .value()[0];\n\n if (\n command.backingData.securityGroups[command.credentials] &&\n command.backingData.securityGroups[command.credentials]['ecs'] &&\n command.backingData.securityGroups[command.credentials]['ecs'][command.region]\n ) {\n const allSecurityGroups = command.backingData.securityGroups[command.credentials]['ecs'][command.region];\n command.backingData.filtered.securityGroupNames = chain(allSecurityGroups)\n .filter({ vpcId: vpcId })\n .map('name')\n .value() as string[];\n }\n }\n\n public configureAvailableSubnetTypes(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.subnetTypes = chain(command.backingData.subnets)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .compact()\n .uniqBy('purpose')\n .value()\n .filter(function (e: ISubnet) {\n return e.purpose && e.purpose.length > 0;\n });\n }\n\n public configureAvailableEcsClusters(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.ecsClusters = chain(command.backingData.ecsClusters)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map('name')\n .value();\n }\n\n public configureAvailableSecrets(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.secrets = chain(command.backingData.secrets)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map('name')\n .value();\n }\n\n public buildServiceRegistryDisplayName(registry: IServiceDiscoveryRegistryDescriptor): string {\n return `${registry.name} (${registry.id})`;\n }\n\n public mapServiceRegistry(registry: IServiceDiscoveryRegistryDescriptor): IServiceDiscoveryRegistryDescriptor {\n return {\n account: registry.account,\n region: registry.region,\n name: registry.name,\n id: registry.id,\n arn: registry.arn,\n displayName: this.buildServiceRegistryDisplayName(registry),\n };\n }\n\n public configureAvailableServiceDiscoveryRegistries(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.serviceDiscoveryRegistries = chain(command.backingData.serviceDiscoveryRegistries)\n .filter({\n account: command.credentials,\n region: command.region,\n })\n .map((registry) => this.mapServiceRegistry(registry))\n .value();\n }\n\n public configureAvailableRegions(command: IEcsServerGroupCommand): void {\n const regionsForAccount: IAccountDetails =\n command.backingData.credentialsKeyedByAccount[command.credentials] || ({ regions: [] } as IAccountDetails);\n command.backingData.filtered.regions = regionsForAccount.regions;\n }\n\n public configureAvailableIamRoles(command: IEcsServerGroupCommand): void {\n command.backingData.filtered.iamRoles = chain(command.backingData.iamRoles)\n .filter({ accountName: command.credentials })\n .map('name')\n .value();\n if (command.backingData.filtered.iamRoles.length > 0) {\n command.backingData.filtered.iamRoles.splice(0, 0, 'None (No IAM role)');\n }\n }\n\n public configureSubnetPurposes(command: IEcsServerGroupCommand): IServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const filteredData = command.backingData.filtered;\n if (command.region === null) {\n return result;\n }\n filteredData.subnetPurposes = chain(command.backingData.subnets)\n .filter({ account: command.credentials, region: command.region })\n .reject({ target: 'elb' })\n .reject({ purpose: null })\n .uniqBy('purpose')\n .value();\n\n if (command.subnetTypes) {\n result.dirty.subnetType = !command.subnetTypes.every((subnetType) =>\n chain(filteredData.subnetPurposes).some({ purpose: subnetType }).value(),\n );\n } else if (!chain(filteredData.subnetPurposes).some({ purpose: command.subnetType }).value()) {\n result.dirty.subnetType = true;\n }\n\n if (result.dirty.subnetType) {\n command.subnetTypes = null;\n command.subnetType = null;\n }\n\n return result;\n }\n\n private getLoadBalancerMap(command: IEcsServerGroupCommand): IAmazonLoadBalancer[] {\n return chain(command.backingData.loadBalancers)\n .map('accounts')\n .flattenDeep()\n .filter({ name: command.credentials })\n .map('regions')\n .flattenDeep()\n .filter({ name: command.region })\n .map<IAmazonLoadBalancer>('loadBalancers')\n .flattenDeep<IAmazonLoadBalancer>()\n .value();\n }\n\n public getLoadBalancerNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancers = this.getLoadBalancerMap(command).filter(\n (lb) => (!lb.loadBalancerType || lb.loadBalancerType === 'classic') && lb.vpcId === command.vpcId,\n );\n return loadBalancers.map((lb) => lb.name).sort();\n }\n\n public getVpcLoadBalancerNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancersForVpc = this.getLoadBalancerMap(command).filter(\n (lb) => (!lb.loadBalancerType || lb.loadBalancerType === 'classic') && lb.vpcId,\n );\n return loadBalancersForVpc.map((lb) => lb.name).sort();\n }\n\n public getTargetGroupNames(command: IEcsServerGroupCommand): string[] {\n const loadBalancersV2 = this.getLoadBalancerMap(command).filter((lb) => lb.loadBalancerType !== 'classic') as any[];\n const allTargetGroups = flatten(loadBalancersV2.map<string[]>((lb) => lb.targetGroups));\n return allTargetGroups.sort();\n }\n\n public configureLoadBalancerOptions(command: IEcsServerGroupCommand): IServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const currentLoadBalancers = (command.loadBalancers || []).concat(command.vpcLoadBalancers || []);\n const newLoadBalancers = this.getLoadBalancerNames(command);\n const vpcLoadBalancers = this.getVpcLoadBalancerNames(command);\n const allTargetGroups = this.getTargetGroupNames(command);\n const currentTargetGroups = command.targetGroupMappings.map((tg) => tg.targetGroup);\n if (currentLoadBalancers && command.loadBalancers) {\n const valid = command.vpcId ? newLoadBalancers : newLoadBalancers.concat(vpcLoadBalancers);\n const matched = intersection(valid, currentLoadBalancers);\n const removedLoadBalancers = xor(matched, currentLoadBalancers);\n command.loadBalancers = intersection(newLoadBalancers, matched);\n if (!command.vpcId) {\n command.vpcLoadBalancers = intersection(vpcLoadBalancers, matched);\n } else {\n delete command.vpcLoadBalancers;\n }\n if (removedLoadBalancers.length) {\n result.dirty.loadBalancers = removedLoadBalancers;\n }\n }\n\n if (currentTargetGroups) {\n const matched = intersection(allTargetGroups, currentTargetGroups);\n const removedTargetGroups = xor(matched, currentTargetGroups);\n if (removedTargetGroups && removedTargetGroups.length > 0) {\n command.viewState.dirty.targetGroups = removedTargetGroups;\n } else if (command.viewState.dirty && command.viewState.dirty.targetGroups) {\n command.viewState.dirty.targetGroups = [];\n }\n }\n\n command.backingData.filtered.loadBalancers = newLoadBalancers;\n command.backingData.filtered.vpcLoadBalancers = vpcLoadBalancers;\n command.backingData.filtered.targetGroups = allTargetGroups;\n return result;\n }\n\n public refreshLoadBalancers(command: IEcsServerGroupCommand, skipCommandReconfiguration?: boolean) {\n return this.loadBalancerReader.listLoadBalancers('ecs').then((loadBalancers) => {\n command.backingData.loadBalancers = loadBalancers;\n if (!skipCommandReconfiguration) {\n this.configureLoadBalancerOptions(command);\n }\n });\n }\n\n public configureVpcId(command: IEcsServerGroupCommand): IEcsServerGroupCommandResult {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n if (command.subnetType == null && (command.subnetTypes == null || command.subnetTypes.length == 0)) {\n command.vpcId = null;\n result.dirty.vpcId = true;\n } else if (command.subnetTypes != null && command.subnetTypes.length > 0) {\n command.subnetTypes.forEach(function (subnetType) {\n const subnet = find<ISubnet>(command.backingData.subnets, {\n purpose: subnetType,\n account: command.credentials,\n region: command.region,\n });\n command.vpcId = subnet ? subnet.vpcId : null;\n });\n } else {\n const subnet = find<ISubnet>(command.backingData.subnets, {\n purpose: command.subnetType,\n account: command.credentials,\n region: command.region,\n });\n command.vpcId = subnet ? subnet.vpcId : null;\n }\n return result;\n }\n\n public checkDirtyCapacityProviders(command: IEcsServerGroupCommand): void {\n if (command.capacityProviderStrategy) {\n const availableCustomCapacityProviders = command.backingData.filtered.availableCapacityProviders;\n const currentCapacityProviders = command.capacityProviderStrategy.map((cp) => cp.capacityProvider);\n const matchedCustomCapacityProviders = intersection(availableCustomCapacityProviders, currentCapacityProviders);\n const removedCustomCapacityProviders = xor(matchedCustomCapacityProviders, currentCapacityProviders);\n\n if (removedCustomCapacityProviders && removedCustomCapacityProviders.length > 0) {\n command.viewState.dirty.customCapacityProviders = removedCustomCapacityProviders;\n } else if (command.viewState.dirty && command.viewState.dirty.customCapacityProviders) {\n command.viewState.dirty.customCapacityProviders = [];\n }\n\n if (command.useDefaultCapacityProviders) {\n const availableDefaultCapacityProvider = command.backingData.filtered.defaultCapacityProviderStrategy.map(\n (cp) => cp.capacityProvider,\n );\n const matchedDefaultCapacityProviders = intersection(\n availableDefaultCapacityProvider,\n currentCapacityProviders,\n );\n const removedDefaultCapacityProviders = xor(matchedDefaultCapacityProviders, currentCapacityProviders);\n\n if (removedDefaultCapacityProviders && removedDefaultCapacityProviders.length > 0) {\n command.viewState.dirty.defaulCapacityProviders = removedDefaultCapacityProviders;\n }\n }\n }\n }\n\n public attachEventHandlers(cmd: IEcsServerGroupCommand): void {\n cmd.subnetChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result = this.configureVpcId(command);\n extend(result.dirty, this.configureLoadBalancerOptions(command).dirty);\n command.viewState.dirty = command.viewState.dirty || {};\n extend(command.viewState.dirty, result.dirty);\n return result;\n };\n\n cmd.regionChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n extend(result.dirty, this.configureSubnetPurposes(command).dirty);\n if (command.region) {\n extend(result.dirty, command.subnetChanged(command).dirty);\n this.configureAvailabilityZones(command);\n this.configureAvailableEcsClusters(command);\n this.configureAvailableSubnetTypes(command);\n this.configureAvailableSecurityGroups(command);\n this.configureAvailableSecrets(command);\n this.configureAvailableServiceDiscoveryRegistries(command);\n this.setCapacityProviderDetails(command);\n }\n\n return result;\n };\n\n cmd.subnetTypeChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n this.configureAvailableSecurityGroups(command);\n return result;\n };\n\n cmd.clusterChanged = (command: IEcsServerGroupCommand): void => {\n command.moniker = NameUtils.getMoniker(command.application, command.stack, command.freeFormDetails);\n };\n\n cmd.credentialsChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n const backingData = command.backingData;\n if (command.credentials) {\n this.configureAvailableIamRoles(command);\n this.configureAvailableEcsClusters(command);\n this.configureAvailableSubnetTypes(command);\n this.configureAvailableSecurityGroups(command);\n this.configureAvailableSecrets(command);\n this.configureAvailableServiceDiscoveryRegistries(command);\n this.configureAvailableRegions(command);\n this.setCapacityProviderDetails(command);\n\n if (!some(backingData.filtered.regions, { name: command.region })) {\n command.region = null;\n result.dirty.region = true;\n } else {\n extend(result.dirty, command.regionChanged(command).dirty);\n }\n } else {\n command.region = null;\n }\n return result;\n };\n\n cmd.placementStrategyNameChanged = (command: IEcsServerGroupCommand): IServerGroupCommandResult => {\n const result: IEcsServerGroupCommandResult = { dirty: {} };\n command.placementStrategySequence = this.placementStrategyService.getPredefinedStrategy(\n command.placementStrategyName,\n );\n return result;\n };\n\n this.applyOverrides('attachEventHandlers', cmd);\n }\n}\n\nexport const ECS_SERVER_GROUP_CONFIGURATION_SERVICE = 'spinnaker.ecs.serverGroup.configure.service';\nmodule(ECS_SERVER_GROUP_CONFIGURATION_SERVICE, [\n LOAD_BALANCER_READ_SERVICE,\n SECURITY_GROUP_READER,\n CACHE_INITIALIZER_SERVICE,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n]).service('ecsServerGroupConfigurationService', EcsServerGroupConfigurationService);\n","'use strict';\n\nimport * as angular from 'angular';\nimport _ from 'lodash';\n\nimport { AccountService, INSTANCE_TYPE_SERVICE } from '@spinnaker/core';\n\nimport { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from './serverGroupConfiguration.service';\n\nexport const ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE =\n 'spinnaker.ecs.serverGroupCommandBuilder.service';\nexport const name = ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE, [\n INSTANCE_TYPE_SERVICE,\n ECS_SERVER_GROUP_CONFIGURATION_SERVICE,\n ])\n .factory('ecsServerGroupCommandBuilder', [\n '$q',\n 'instanceTypeService',\n 'ecsServerGroupConfigurationService',\n function ($q, instanceTypeService, ecsServerGroupConfigurationService) {\n function reconcileUpstreamImages(image, upstreamImages) {\n if (image.fromContext) {\n const matchingImage = upstreamImages.find((otherImage) => image.stageId === otherImage.stageId);\n\n if (matchingImage) {\n image.cluster = matchingImage.cluster;\n image.pattern = matchingImage.pattern;\n image.repository = matchingImage.repository;\n return image;\n } else {\n return null;\n }\n } else if (image.fromTrigger) {\n const matchingImage = upstreamImages.find((otherImage) => {\n return (\n image.registry === otherImage.registry &&\n image.repository === otherImage.repository &&\n image.tag === otherImage.tag\n );\n });\n\n if (matchingImage) {\n return image;\n } else {\n return null;\n }\n } else {\n return image;\n }\n }\n\n function findUpstreamImages(current, all, visited = {}) {\n // This actually indicates a loop in the stage dependencies.\n if (visited[current.refId]) {\n return [];\n } else {\n visited[current.refId] = true;\n }\n let result = [];\n if (current.type === 'findImageFromTags') {\n result.push({\n fromContext: true,\n imageLabelOrSha: current.imageLabelOrSha,\n stageId: current.refId,\n });\n }\n current.requisiteStageRefIds.forEach(function (id) {\n const next = all.find((stage) => stage.refId === id);\n if (next) {\n result = result.concat(findUpstreamImages(next, all, visited));\n }\n });\n\n return result;\n }\n\n function findTriggerImages(triggers) {\n const result = triggers\n .filter((trigger) => {\n return trigger.type === 'docker';\n })\n .map((trigger) => {\n return {\n fromTrigger: true,\n repository: trigger.repository,\n account: trigger.account,\n organization: trigger.organization,\n registry: trigger.registry,\n tag: trigger.tag,\n };\n });\n\n return result;\n }\n\n function buildNewServerGroupCommand(application, defaults) {\n defaults = defaults || {};\n const credentialsLoader = AccountService.getCredentialsKeyedByAccount('ecs');\n\n const defaultCredentials = defaults.account || application.defaultCredentials.ecs;\n const defaultRegion = defaults.region || application.defaultRegions.ecs;\n\n const preferredZonesLoader = AccountService.getAvailabilityZonesForAccountAndRegion(\n 'ecs',\n defaultCredentials,\n defaultRegion,\n );\n\n return $q\n .all({\n preferredZones: preferredZonesLoader,\n credentialsKeyedByAccount: credentialsLoader,\n })\n .then(function (asyncData) {\n const availabilityZones = asyncData.preferredZones;\n\n let defaultIamRole = 'None (No IAM role)';\n defaultIamRole = defaultIamRole.replace('{{application}}', application.name);\n\n const defaultImageCredentials = 'None (No registry credentials)';\n\n const command = {\n application: application.name,\n credentials: defaultCredentials,\n region: defaultRegion,\n strategy: '',\n capacity: {\n min: 1,\n max: 1,\n desired: 1,\n },\n launchType: 'EC2',\n healthCheckType: 'EC2',\n selectedProvider: 'ecs',\n iamRole: defaultIamRole,\n dockerImageCredentialsSecret: defaultImageCredentials,\n availabilityZones: availabilityZones,\n subnetType: '',\n securityGroupNames: [],\n healthCheckGracePeriodSeconds: '',\n placementConstraints: [],\n placementStrategyName: '',\n taskDefinitionArtifact: {},\n useTaskDefinitionArtifact: false,\n placementStrategySequence: [],\n serviceDiscoveryAssociations: [],\n ecsClusterName: '',\n targetGroup: '',\n copySourceScalingPoliciesAndActions: true,\n preferSourceCapacity: true,\n useSourceCapacity: true,\n enableDeploymentCircuitBreaker: false,\n viewState: {\n useAllImageSelection: false,\n useSimpleCapacity: true,\n usePreferredZones: true,\n mode: defaults.mode || 'create',\n disableStrategySelection: true,\n dirty: {},\n },\n };\n\n if (\n application.attributes &&\n application.attributes.platformHealthOnlyShowOverride &&\n application.attributes.platformHealthOnly\n ) {\n command.interestingHealthProviderNames = ['ecs'];\n }\n\n return command;\n });\n }\n\n function buildServerGroupCommandFromPipeline(application, originalCluster, current, pipeline) {\n const pipelineCluster = _.cloneDeep(originalCluster);\n const region = Object.keys(pipelineCluster.availabilityZones)[0];\n // var instanceTypeCategoryLoader = instanceTypeService.getCategoryForInstanceType('ecs', pipelineCluster.instanceType);\n\n const commandOptions = { account: pipelineCluster.account, region: region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n const zones = pipelineCluster.availabilityZones[region];\n const usePreferredZones = zones.join(',') === command.availabilityZones.join(',');\n\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n if (command.docker && command.docker.image) {\n command.docker.image = reconcileUpstreamImages(command.docker.image, contextImages);\n }\n\n const viewState = {\n instanceProfile: undefined,\n disableImageSelection: true,\n useSimpleCapacity:\n pipelineCluster.capacity.min === pipelineCluster.capacity.max &&\n pipelineCluster.useSourceCapacity !== true,\n usePreferredZones: usePreferredZones,\n mode: 'editPipeline',\n submitButtonLabel: 'Done',\n templatingEnabled: true,\n existingPipelineCluster: true,\n dirty: {},\n contextImages: contextImages,\n pipeline: pipeline,\n currentStage: current,\n };\n\n const viewOverrides = {\n region: region,\n credentials: pipelineCluster.account,\n availabilityZones: pipelineCluster.availabilityZones[region],\n viewState: viewState,\n };\n\n pipelineCluster.strategy = pipelineCluster.strategy || '';\n\n return angular.extend({}, command, pipelineCluster, viewOverrides);\n });\n }\n\n // Only used to prepare view requiring template selecting\n function buildNewServerGroupCommandForPipeline(current, pipeline) {\n let contextImages = findUpstreamImages(current, pipeline.stages) || [];\n contextImages = contextImages.concat(findTriggerImages(pipeline.triggers));\n\n return $q.when({\n viewState: {\n requiresTemplateSelection: true,\n // applies viewState overrides after template selection\n overrides: {\n viewState: {\n mode: 'editPipeline',\n contextImages: contextImages,\n pipeline: pipeline,\n currentStage: current,\n },\n },\n },\n });\n }\n\n function buildUpdateServerGroupCommand(serverGroup) {\n const command = {\n type: 'modifyAsg',\n asgs: [{ asgName: serverGroup.name, region: serverGroup.region }],\n healthCheckType: serverGroup.asg.healthCheckType,\n credentials: serverGroup.account,\n };\n ecsServerGroupConfigurationService.configureUpdateCommand(command);\n return command;\n }\n\n function buildServerGroupCommandFromExisting(application, serverGroup, mode = 'clone') {\n // do NOT copy: deployment strategy. DO copy: account, region, cluster name, stack\n // TODO: query for & pull in ECS-specific data that would be useful, e.g, network mode, launch type\n const commandOptions = { account: serverGroup.account, region: serverGroup.region };\n return buildNewServerGroupCommand(application, commandOptions).then(function (command) {\n command.credentials = serverGroup.account;\n command.app = serverGroup.moniker.app;\n command.stack = serverGroup.moniker.stack;\n command.region = serverGroup.region;\n command.ecsClusterName = serverGroup.ecsCluster;\n command.capacity = serverGroup.capacity;\n command.viewState.mode = mode;\n\n return command;\n });\n }\n\n return {\n buildNewServerGroupCommand: buildNewServerGroupCommand,\n buildServerGroupCommandFromExisting: buildServerGroupCommandFromExisting,\n buildNewServerGroupCommandForPipeline: buildNewServerGroupCommandForPipeline,\n buildServerGroupCommandFromPipeline: buildServerGroupCommandFromPipeline,\n buildUpdateServerGroupCommand: buildUpdateServerGroupCommand,\n };\n },\n ]);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport { module } from 'angular';\n\nimport {\n ModalWizard,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n SERVER_GROUP_WRITER,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n TaskMonitor,\n} from '@spinnaker/core';\n\nimport { ECS_CLUSTER_READ_SERVICE } from '../../../ecsCluster/ecsCluster.read.service';\nimport { IAM_ROLE_READ_SERVICE } from '../../../iamRoles/iamRole.read.service';\nimport { ECS_SECRET_READ_SERVICE } from '../../../secrets/secret.read.service';\nimport { ECS_SERVER_GROUP_CONFIGURATION_SERVICE } from '../serverGroupConfiguration.service';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER =\n 'spinnaker.ecs.cloneServerGroup.controller';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ECS_SERVER_GROUP_CONFIGURATION_SERVICE,\n SERVER_GROUP_WRITER,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_COMMAND_REGISTRY_PROVIDER,\n IAM_ROLE_READ_SERVICE,\n ECS_CLUSTER_READ_SERVICE,\n ECS_SECRET_READ_SERVICE,\n STAGE_ARTIFACT_SELECTOR_COMPONENT_REACT,\n]).controller('ecsCloneServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n '$q',\n '$state',\n 'serverGroupWriter',\n 'overrideRegistry',\n 'ecsServerGroupConfigurationService',\n 'serverGroupCommandRegistry',\n 'serverGroupCommand',\n 'iamRoleReader',\n 'ecsClusterReader',\n 'secretReader',\n 'application',\n 'title',\n function (\n $scope,\n $uibModalInstance,\n $q,\n $state,\n serverGroupWriter,\n overrideRegistry,\n ecsServerGroupConfigurationService,\n serverGroupCommandRegistry,\n serverGroupCommand,\n iamRoleReader,\n ecsClusterReader,\n secretReader,\n application,\n title,\n ) {\n $scope.pages = {\n templateSelection: overrideRegistry.getTemplate(\n 'ecs.serverGroup.templateSelection',\n require('./templateSelection/templateSelection.html'),\n ),\n basicSettings: overrideRegistry.getTemplate(\n 'ecs.serverGroup.basicSettings',\n require('./location/basicSettings.html'),\n ),\n container: overrideRegistry.getTemplate('ecs.serverGroup.container', require('./container/container.html')),\n horizontalScaling: overrideRegistry.getTemplate(\n 'ecs.serverGroup.horizontalScaling',\n require('./horizontalScaling/horizontalScaling.html'),\n ),\n networking: overrideRegistry.getTemplate('ecs.serverGroup.networking', require('./networking/networking.html')),\n logging: overrideRegistry.getTemplate('ecs.serverGroup.logging', require('./logging/logging.html')),\n serviceDiscovery: overrideRegistry.getTemplate(\n 'ecs.serverGroup.serviceDiscovery',\n require('./serviceDiscovery/serviceDiscovery.html'),\n ),\n advancedSettings: overrideRegistry.getTemplate(\n 'ecs.serverGroup.advancedSettings',\n require('./advancedSettings/advancedSettings.html'),\n ),\n taskDefinition: overrideRegistry.getTemplate(\n 'ecs.taskDefinition',\n require('./taskDefinition/taskDefinition.html'),\n ),\n };\n\n $scope.title = title;\n\n $scope.applicationName = application.name;\n $scope.application = application;\n\n $scope.command = serverGroupCommand;\n\n $scope.state = {\n loaded: false,\n requiresTemplateSelection: !!serverGroupCommand.viewState.requiresTemplateSelection,\n };\n\n this.templateSelectionText = {\n copied: ['account, region, ecs cluster, stack', 'capacity'],\n notCopied: ['launch type, target group, network mode'],\n };\n if (!$scope.command.viewState.disableStrategySelection) {\n this.templateSelectionText.notCopied.push(\n 'the deployment strategy (if any) used to deploy the most recent server group',\n );\n }\n\n function onApplicationRefresh() {\n // If the user has already closed the modal, do not navigate to the new details view\n if ($scope.$$destroyed) {\n return;\n }\n const cloneStage = $scope.taskMonitor.task.execution.stages.find((stage) => stage.type === 'cloneServerGroup');\n if (cloneStage && cloneStage.context['deploy.server.groups']) {\n const newServerGroupName = cloneStage.context['deploy.server.groups'][$scope.command.region];\n if (newServerGroupName) {\n const newStateParams = {\n serverGroup: newServerGroupName,\n accountId: $scope.command.credentials,\n region: $scope.command.region,\n provider: 'ecs',\n };\n let transitionTo = '^.^.^.clusters.serverGroup';\n if ($state.includes('**.clusters.serverGroup')) {\n // clone via details, all view\n transitionTo = '^.serverGroup';\n }\n if ($state.includes('**.clusters.cluster.serverGroup')) {\n // clone or create with details open\n transitionTo = '^.^.serverGroup';\n }\n if ($state.includes('**.clusters')) {\n // create new, no details open\n transitionTo = '.serverGroup';\n }\n $state.go(transitionTo, newStateParams);\n }\n }\n }\n\n function onTaskComplete() {\n application.serverGroups.refresh();\n application.serverGroups.onNextRefresh($scope, onApplicationRefresh);\n }\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Creating your server group',\n modalInstance: $uibModalInstance,\n onTaskComplete: onTaskComplete,\n });\n\n function configureCommand() {\n ecsServerGroupConfigurationService.configureCommand($scope.command).then(function () {\n $scope.state.loaded = true;\n initializeCommand();\n initializeSelectOptions();\n initializeWatches();\n });\n }\n\n function initializeWatches() {\n $scope.$watch('command.subnetType', createResultProcessor($scope.command.subnetTypeChanged));\n $scope.$watch('command.credentials', createResultProcessor($scope.command.credentialsChanged));\n $scope.$watch('command.region', createResultProcessor($scope.command.regionChanged));\n $scope.$watch(\n 'command.placementStrategyName',\n createResultProcessor($scope.command.placementStrategyNameChanged),\n );\n $scope.$watch('command.stack', () => $scope.command.clusterChanged($scope.command));\n $scope.$watch('command.freeFormDetails', () => $scope.command.clusterChanged($scope.command));\n }\n\n function initializeSelectOptions() {\n processCommandUpdateResult($scope.command.credentialsChanged(serverGroupCommand));\n processCommandUpdateResult($scope.command.regionChanged(serverGroupCommand));\n }\n\n function createResultProcessor(method) {\n return function () {\n processCommandUpdateResult(method(serverGroupCommand));\n };\n }\n\n function processCommandUpdateResult() {\n // TODO(Bruno Carrier) - Implement marking sections either dirty or complete\n }\n\n function initializeCommand() {}\n\n this.isValid = function () {\n return true; // TODO(Bruno Carrier) - Implement validation of the form\n };\n\n this.showSubmitButton = function () {\n return ModalWizard.allPagesVisited();\n };\n\n this.submit = function () {\n if ($scope.command.viewState.mode === 'editPipeline' || $scope.command.viewState.mode === 'createPipeline') {\n return $uibModalInstance.close($scope.command);\n }\n $scope.taskMonitor.submit(function () {\n return serverGroupWriter.cloneServerGroup($scope.command, application);\n });\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n if (!$scope.state.requiresTemplateSelection) {\n configureCommand();\n } else {\n $scope.state.loaded = true;\n }\n\n this.templateSelected = () => {\n $scope.state.requiresTemplateSelection = false;\n configureCommand();\n };\n\n // used by react components to update command fields in parent (angular) scope\n $scope.notifyAngular = function (commandKey, value) {\n if (commandKey == 'pipeline') {\n $scope.command.viewState.pipeline = value;\n } else {\n $scope.command[commandKey] = value;\n }\n };\n\n // used by react components to configure command for image queries\n $scope.configureCommand = function (query) {\n return ecsServerGroupConfigurationService.configureCommand($scope.command, query);\n };\n\n // TODO: Migrate horizontalScaling component to react and move this logic there\n $scope.capacityProviderState = {\n useCapacityProviders:\n $scope.command.capacityProviderStrategy && $scope.command.capacityProviderStrategy.length > 0,\n updateComputeOption: function (chosenOption) {\n if (chosenOption == 'launchType') {\n $scope.command.capacityProviderStrategy = [];\n } else if (chosenOption == 'capacityProviders') {\n $scope.command.launchType = '';\n $scope.command.capacityProviderStrategy = $scope.command.capacityProviderStrategy || [];\n }\n },\n };\n },\n]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT =\n 'spinnaker.ecs.serverGroup.configure.wizard.advancedSettings.component';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT, []).component(\n 'ecsServerGroupAdvancedSettings',\n {\n bindings: {\n command: '=',\n application: '=',\n },\n templateUrl: require('./advancedSettings.component.html'),\n },\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IEcsCapacityProviderStrategyItem, IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsCapacityProviderProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IEcsCapacityProviderState {\n capacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n defaultCapacityProviderStrategy: IEcsCapacityProviderStrategyItem[];\n availableCapacityProviders: string[];\n ecsClusterName: string;\n useDefaultCapacityProviders: boolean;\n capacityProviderLoadedFlag: boolean;\n}\n\nclass EcsCapacityProvider extends React.Component<IEcsCapacityProviderProps, IEcsCapacityProviderState> {\n constructor(props: IEcsCapacityProviderProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n ecsClusterName: cmd.ecsClusterName,\n useDefaultCapacityProviders:\n cmd.useDefaultCapacityProviders || (cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length == 0),\n capacityProviderStrategy:\n cmd.capacityProviderStrategy && cmd.capacityProviderStrategy.length > 0 ? cmd.capacityProviderStrategy : [],\n capacityProviderLoadedFlag: false,\n };\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n const cmd = this.props.command;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n this.setState({\n availableCapacityProviders: this.getAvailableCapacityProviders(cmd),\n defaultCapacityProviderStrategy: this.getDefaultCapacityProviderStrategy(cmd),\n capacityProviderStrategy: this.getCapacityProviderStrategy(useDefaultCapacityProviders, cmd),\n capacityProviderLoadedFlag: true,\n });\n this.props.notifyAngular('useDefaultCapacityProviders', this.state.useDefaultCapacityProviders);\n this.props.notifyAngular('capacityProviderStrategy', this.state.capacityProviderStrategy);\n });\n }\n\n private getAvailableCapacityProviders = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.availableCapacityProviders\n ? cmd.backingData.filtered.availableCapacityProviders\n : [];\n };\n\n private getDefaultCapacityProviderStrategy = (cmd: IEcsServerGroupCommand) => {\n return cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : [];\n };\n\n private getCapacityProviderStrategy = (useDefaultCapacityProviders: boolean, cmd: IEcsServerGroupCommand) => {\n return useDefaultCapacityProviders &&\n cmd.backingData &&\n cmd.backingData.filtered &&\n cmd.backingData.filtered.defaultCapacityProviderStrategy\n ? cmd.backingData.filtered.defaultCapacityProviderStrategy\n : this.state.capacityProviderStrategy;\n };\n\n private addCapacityProviderStrategy = () => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.push({ capacityProvider: '', base: null, weight: null });\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private removeCapacityProviderStrategy = (index: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n capacityProviderStrategy.splice(index, 1);\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderName = (index: number, targetCapacityProviderName: string) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.capacityProvider = targetCapacityProviderName;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.command.viewState.dirty.customCapacityProviders = [];\n };\n\n private updateCapacityProviderBase = (index: number, targetCapacityProviderBase: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.base = targetCapacityProviderBase;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderWeight = (index: number, targetCapacityProviderWeight: number) => {\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const targetCapacityProviderStrategy = capacityProviderStrategy[index];\n targetCapacityProviderStrategy.weight = targetCapacityProviderWeight;\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n };\n\n private updateCapacityProviderType = (targetCapacityProviderType: boolean) => {\n this.setState({ useDefaultCapacityProviders: targetCapacityProviderType });\n this.props.notifyAngular('useDefaultCapacityProviders', targetCapacityProviderType);\n this.props.command.viewState.dirty.customCapacityProviders = [];\n\n const capacityProviderStrategy =\n targetCapacityProviderType && this.state.defaultCapacityProviderStrategy.length > 0\n ? this.state.defaultCapacityProviderStrategy\n : [];\n this.setState({ capacityProviderStrategy: capacityProviderStrategy });\n this.props.notifyAngular('capacityProviderStrategy', capacityProviderStrategy);\n };\n\n render(): React.ReactElement<EcsCapacityProvider> {\n const updateCapacityProviderName = this.updateCapacityProviderName;\n const updateCapacityProviderBase = this.updateCapacityProviderBase;\n const updateCapacityProviderWeight = this.updateCapacityProviderWeight;\n const addCapacityProviderStrategy = this.addCapacityProviderStrategy;\n const removeCapacityProviderStrategy = this.removeCapacityProviderStrategy;\n const updateCapacityProviderType = this.updateCapacityProviderType;\n const capacityProviderStrategy = this.state.capacityProviderStrategy;\n const useDefaultCapacityProviders = this.state.useDefaultCapacityProviders;\n const capacityProviderLoadedFlag = this.state.capacityProviderLoadedFlag;\n const customDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.customCapacityProviders\n ? this.props.command.viewState.dirty.customCapacityProviders\n : [];\n const defaultDirtyCapacityProviders =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.defaulCapacityProviders\n ? this.props.command.viewState.dirty.defaulCapacityProviders\n : [];\n\n const capacityProviderNames =\n this.state.availableCapacityProviders && this.state.availableCapacityProviders.length > 0\n ? this.state.availableCapacityProviders.map((capacityProviderNames) => {\n return { label: `${capacityProviderNames}`, value: capacityProviderNames };\n })\n : [];\n\n const defaultCPError =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p className=\"text-left\">\n <i className=\"fa fa-exclamation-triangle\"></i>\n Invalid capacity providers are a part of default capacity provider strategy.\n <br />\n Please click 'Done' to use current default capacity provider strategy (shown below) or switch to using a\n custom strategy.\n </p>\n </div>\n ) : (\n ''\n );\n\n const dirtyCapacityProviderList = customDirtyCapacityProviders\n ? customDirtyCapacityProviders.map(function (capacityProvider, index) {\n return <li key={index}>{capacityProvider}</li>;\n })\n : '';\n\n const dirtyCapacityProviderSection =\n useDefaultCapacityProviders && defaultDirtyCapacityProviders.length > 0 ? (\n defaultCPError\n ) : customDirtyCapacityProviders.length > 0 && !useDefaultCapacityProviders ? (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following capacity providers could not be found in the selected account/region/cluster and were removed:\n </p>\n <ul>{dirtyCapacityProviderList}</ul>\n <br />\n <p className=\"text-left\">Please select the capacity provider(s) from the dropdown to resolve this error.</p>\n </div>\n ) : (\n ''\n );\n\n const capacityProviderInputs =\n capacityProviderStrategy.length > 0 ? (\n capacityProviderStrategy.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useDefaultCapacityProviders ? (\n <td>\n <input\n data-test-id={'ServerGroup.defaultCapacityProvider.name.' + index}\n type=\"string\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.capacityProvider}\n disabled={true}\n />\n </td>\n ) : (\n <td data-test-id={'ServerGroup.customCapacityProvider.name.' + index}>\n <TetheredSelect\n placeholder=\"Select capacity provider\"\n options={capacityProviderNames}\n value={mapping.capacityProvider}\n onChange={(e: Option) => {\n updateCapacityProviderName(index, e.label as string);\n }}\n clearable={false}\n />\n </td>\n )}\n <td>\n <input\n data-test-id={'ServerGroup.capacityProvider.base.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n value={mapping.base}\n onChange={(e) => updateCapacityProviderBase(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <input\n data-test-id={'ServerGroup.capacityProvider.weight.' + index}\n disabled={useDefaultCapacityProviders}\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.weight}\n onChange={(e) => updateCapacityProviderWeight(index, e.target.valueAsNumber)}\n />\n </td>\n {!useDefaultCapacityProviders ? (\n <td>\n <div className=\"form-control-static\">\n <a className=\"btn-link sm-label\" onClick={() => removeCapacityProviderStrategy(index)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n ) : (\n ''\n )}\n </tr>\n );\n })\n ) : useDefaultCapacityProviders && this.state.capacityProviderStrategy.length == 0 ? (\n <tr>\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\">\n {' '}\n The cluster does not have a default capacity provider strategy defined. Set a default capacity provider\n strategy or use a custom strategy.\n </Alert>\n </div>\n </tr>\n ) : (\n ''\n );\n\n const newCapacityProviderStrategy =\n this.state.ecsClusterName &&\n this.props.command.credentials &&\n this.props.command.region &&\n !useDefaultCapacityProviders &&\n capacityProviderNames.length > 0 ? (\n <button\n data-test-id=\"ServerGroup.addCapacityProvider\"\n className=\"btn btn-block btn-sm add-new\"\n onClick={addCapacityProviderStrategy}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Capacity Provider\n </button>\n ) : !useDefaultCapacityProviders && capacityProviderLoadedFlag && capacityProviderNames.length == 0 ? (\n <div className=\"sm-label-left\" style={{ width: '200%' }}>\n <Alert color=\"warning\"> The cluster does not have capacity providers defined. </Alert>\n </div>\n ) : (\n ''\n );\n\n return (\n <div>\n {(customDirtyCapacityProviders.length > 0 || defaultDirtyCapacityProviders.length > 0) &&\n capacityProviderLoadedFlag ? (\n <div>{dirtyCapacityProviderSection}</div>\n ) : (\n ''\n )}\n <div className=\"sm-label-left\">\n <b>Capacity Provider Strategy</b>\n <HelpField id=\"ecs.capacityProviderStrategy\" /> <br />\n <span>({this.state.ecsClusterName})</span>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.default\"\n type=\"radio\"\n checked={useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(true)}\n id=\"computeOptionsLaunchType1\"\n />\n Use cluster default\n </label>\n </div>\n <div className=\"radio\">\n <label>\n <input\n data-test-id=\"ServerGroup.capacityProviders.custom\"\n type=\"radio\"\n checked={!useDefaultCapacityProviders}\n onClick={() => updateCapacityProviderType(false)}\n id=\"computeOptionsCapacityProviders2\"\n />\n Use custom (Advanced)\n </label>\n </div>\n {capacityProviderLoadedFlag ? (\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n <th style={{ width: '50%' }}>\n Provider name\n <HelpField id=\"ecs.capacityProviderName\" />\n </th>\n <th style={{ width: '25%' }}>\n Base\n <HelpField id=\"ecs.capacityProviderBase\" />\n </th>\n <th style={{ width: '25%' }}>\n Weight\n <HelpField id=\"ecs.capacityProviderWeight\" />\n </th>\n </tr>\n </thead>\n <tbody>{capacityProviderInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newCapacityProviderStrategy}</td>\n </tr>\n </tfoot>\n </table>\n ) : (\n <div className=\"load medium\">\n <div className=\"message\">Loading capacity providers...</div>\n <div className=\"bars\">\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n <div className=\"bar\"></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport const ECS_CAPACITY_PROVIDER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.capacityProvider.react';\nmodule(ECS_CAPACITY_PROVIDER_REACT, []).component(\n 'ecsCapacityProviderReact',\n react2angular(withErrorBoundary(EcsCapacityProvider, 'ecsCapacityProviderReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type {\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IContainerProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IContainerState {\n imageDescription: IEcsDockerImage;\n computeUnits: number;\n reservedMemory: number;\n dockerImages: IEcsDockerImage[];\n targetGroupsAvailable: string[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n}\n\nexport class Container extends React.Component<IContainerProps, IContainerState> {\n constructor(props: IContainerProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n cmd.containerMappings = null;\n\n this.state = {\n imageDescription: cmd.imageDescription ? cmd.imageDescription : this.getEmptyImageDescription(),\n computeUnits: cmd.computeUnits,\n reservedMemory: cmd.reservedMemory,\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],\n };\n\n this.state.targetGroupMappings.forEach((targetGroupMapping) => {\n targetGroupMapping.containerName = '';\n });\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,\n });\n });\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingImage = (newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n\n this.props.notifyAngular('imageDescription', newImageDescription);\n this.setState({ imageDescription: newImageDescription });\n };\n\n private updateComputeUnits = (newComputeUnits: number) => {\n this.props.notifyAngular('computeUnits', newComputeUnits);\n this.setState({ computeUnits: newComputeUnits });\n };\n\n private updateReservedMemory = (newReservedMemory: number) => {\n this.props.notifyAngular('reservedMemory', newReservedMemory);\n this.setState({ reservedMemory: newReservedMemory });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n this.updateDirtyTargetGroups();\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateDirtyTargetGroups = () => {\n this.props.command.viewState.dirty.targetGroups = [];\n };\n\n public render(): React.ReactElement<Container> {\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateComputeUnits = this.updateComputeUnits;\n const updateReservedMemory = this.updateReservedMemory;\n const dirtyTagetGroups =\n this.props.command.viewState.dirty && this.props.command.viewState.dirty.targetGroups\n ? this.props.command.viewState.dirty.targetGroups\n : [];\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const dirtyTargetGroupList = dirtyTagetGroups\n ? dirtyTagetGroups.map(function (targetGroup, index) {\n return <li key={index}>{targetGroup}</li>;\n })\n : '';\n\n const dirtyTargetGroupSection = (\n <div className=\"alert alert-warning\">\n <p>\n <i className=\"fa fa-exclamation-triangle\"></i>\n The following target groups could not be found in the selected account/region/VPC and were removed:\n </p>\n <ul>{dirtyTargetGroupList}</ul>\n <br />\n <p className=\"text-left\">Please select the target group(s) from the dropdown to resolve this error.</p>\n </div>\n );\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"ContainerInputs.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td data-test-id=\"ContainerInputs.targetGroup\">\n <TetheredSelect\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n data-test-id=\"ContainerInputs.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"ContainerInputs.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n return (\n <div className=\"container-fluid form-horizontal\">\n {dirtyTagetGroups.length > 0 ? <div>{dirtyTargetGroupSection}</div> : ''}\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Container Image</b>\n <HelpField id=\"ecs.containerMappingImage\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"ContainerInputs.containerImage\">\n <TetheredSelect\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={this.state.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(e as Option<string>);\n }}\n clearable={false}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Compute Units</b>\n <HelpField id=\"ecs.capacity.reserved.computeUnits\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n data-test-id=\"ContainerInputs.computeUnits\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.computeUnits}\n onChange={(e) => updateComputeUnits(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Reserved Memory</b>\n <HelpField id=\"ecs.capacity.reserved.memory\" />\n </div>\n <div className=\"col-md-9\" style={{ width: '100px' }}>\n <input\n data-test-id=\"ContainerInputs.reservedMemory\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={false}\n value={this.state.reservedMemory}\n onChange={(e) => updateReservedMemory(e.target.valueAsNumber)}\n />\n </div>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsContainerTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '80%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '20%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const CONTAINER_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.container.react';\nmodule(CONTAINER_REACT, []).component(\n 'containerReact',\n react2angular(withErrorBoundary(Container, 'containerReact'), ['command', 'notifyAngular', 'configureCommand']),\n);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT =\n 'spinnaker.ecs.serverGroup.configure.wizard.horizontalScaling.component';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT; // for backwards compatibility\nmodule(ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT, []).component(\n 'ecsServerGroupHorizontalScaling',\n {\n bindings: {\n command: '=',\n application: '=',\n capacityProviderState: '=',\n notifyAngular: '=',\n configureCommand: '=',\n },\n templateUrl: require('./horizontalScaling.component.html'),\n },\n);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport ANGULAR_UI_BOOTSTRAP from 'angular-ui-bootstrap';\n\nimport { ModalWizard } from '@spinnaker/core';\n\nexport const ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER =\n 'spinnaker.ecs.serverGroup.configure.basicSettings';\nexport const name = ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ANGULAR_UI_BOOTSTRAP,\n ])\n .controller('ecsServerGroupBasicSettingsCtrl', [\n '$scope',\n '$controller',\n '$uibModalStack',\n '$state',\n function ($scope, $controller, $uibModalStack, $state) {\n angular.extend(\n this,\n $controller('BasicSettingsMixin', {\n $scope: $scope,\n $uibModalStack: $uibModalStack,\n $state: $state,\n }),\n );\n\n $scope.$watch('form.$valid', function (newVal) {\n if (newVal) {\n ModalWizard.markClean('basicSettings');\n ModalWizard.markComplete('basicSettings');\n } else {\n ModalWizard.markIncomplete('basicSettings');\n }\n });\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nexport const ECS_SERVER_GROUP_LOGGING = 'spinnaker.ecs.serverGroup.configure.wizard.logging.component';\nmodule(ECS_SERVER_GROUP_LOGGING, []).component('ecsServerGroupLogging', {\n bindings: {\n command: '=',\n application: '=',\n },\n templateUrl: require('./logging.component.html'),\n});\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport * as React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { ISubnet } from '@spinnaker/core';\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type { IEcsServerGroupCommand } from '../../serverGroupConfiguration.service';\n\nexport interface IEcsNetworkingProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface IEcsNetworkingState {\n associatePublicIpAddress: boolean;\n networkMode: string;\n networkModesAvailable: string[];\n securityGroupNames: string[];\n securityGroupsAvailable: string[];\n subnetTypes: string[];\n subnetTypesAvailable: ISubnet[];\n}\n\nexport class EcsNetworking extends React.Component<IEcsNetworkingProps, IEcsNetworkingState> {\n constructor(props: IEcsNetworkingProps) {\n super(props);\n const cmd = this.props.command;\n\n let defaultSubnetTypes: string[] = [];\n if (cmd.subnetTypes && cmd.subnetTypes.length > 0) {\n defaultSubnetTypes = cmd.subnetTypes;\n }\n\n if (cmd.subnetType && cmd.subnetType.length > 0) {\n defaultSubnetTypes.push(cmd.subnetType);\n cmd.subnetType = '';\n }\n\n cmd.subnetTypes = uniqWith(defaultSubnetTypes, isEqual);\n\n this.state = {\n associatePublicIpAddress: cmd.associatePublicIpAddress,\n networkMode: cmd.networkMode,\n networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],\n securityGroupNames: cmd.securityGroupNames,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n subnetTypes: cmd.subnetTypes,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n };\n }\n\n public componentDidMount() {\n const cmd = this.props.command;\n\n this.props.configureCommand('1').then(() => {\n this.setState({\n networkModesAvailable: cmd.backingData && cmd.backingData.networkModes ? cmd.backingData.networkModes : [],\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n });\n }\n\n private updateNetworkMode = (newNetworkMode: Option<string>) => {\n const updatedNetworkMode = newNetworkMode.value;\n const cmd = this.props.command;\n this.props.notifyAngular('networkMode', updatedNetworkMode);\n this.setState({\n networkMode: updatedNetworkMode,\n subnetTypesAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.subnetTypes\n ? cmd.backingData.filtered.subnetTypes\n : [],\n });\n };\n\n private updateSecurityGroups = (newSecurityGroups: Option<string>) => {\n const updatedSecurityGroups = Array.isArray(newSecurityGroups)\n ? newSecurityGroups.map((securityGroups) => securityGroups.value)\n : [];\n this.props.notifyAngular('securityGroupNames', updatedSecurityGroups);\n this.setState({ securityGroupNames: updatedSecurityGroups });\n };\n\n private updateSubnetTypes = (newSubnetTypes: Option<string>) => {\n const cmd = this.props.command;\n const updatedSubnetTypes = Array.isArray(newSubnetTypes)\n ? newSubnetTypes.map((subnetType) => subnetType.value)\n : [];\n this.props.notifyAngular('subnetTypes', updatedSubnetTypes);\n cmd.subnetTypeChanged(cmd);\n this.setState({\n subnetTypes: updatedSubnetTypes,\n securityGroupsAvailable:\n cmd.backingData && cmd.backingData.filtered && cmd.backingData.filtered.securityGroupNames\n ? cmd.backingData.filtered.securityGroupNames\n : [],\n });\n };\n\n private updateAssociatePublicIpAddress = (usePublicIp: boolean) => {\n this.props.notifyAngular('associatePublicIpAddress', usePublicIp);\n this.setState({ associatePublicIpAddress: usePublicIp });\n };\n\n public render(): React.ReactElement<EcsNetworking> {\n const updateAssociatePublicIpAddress = this.updateAssociatePublicIpAddress;\n const updateNetworkMode = this.updateNetworkMode;\n const updateSecurityGroups = this.updateSecurityGroups;\n const updateSubnetTypes = this.updateSubnetTypes;\n\n const networkModesAvailable = this.state.networkModesAvailable.map(function (networkMode) {\n return { label: `${networkMode}`, value: networkMode };\n });\n\n const securityGroupsAvailable = this.state.securityGroupsAvailable.map(function (securityGroup) {\n return { label: `${securityGroup}`, value: securityGroup };\n });\n\n const subnetTypesAvailable = this.state.subnetTypesAvailable.map(function (subnetType) {\n return { label: `${subnetType.purpose} (${subnetType.vpcId})`, value: subnetType.purpose };\n });\n\n const subnetTypeOptions = this.state.subnetTypesAvailable.length ? (\n <TetheredSelect\n multi={true}\n options={subnetTypesAvailable}\n value={this.state.subnetTypes}\n onChange={(e: Option) => {\n updateSubnetTypes(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No account was selected, or no subnet types are available for this account</Alert>\n );\n\n const securityGroupsOptions = this.state.securityGroupsAvailable.length ? (\n <TetheredSelect\n multi={true}\n options={securityGroupsAvailable}\n value={this.state.securityGroupNames}\n onChange={(e: Option) => {\n updateSecurityGroups(e as Option<string>);\n }}\n />\n ) : (\n <Alert color=\"warning\">No security groups found in the selected account/region</Alert>\n );\n\n const awsVpcOptions =\n this.state.networkMode === 'awsvpc' ? (\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>VPC Subnet</b>\n <HelpField key=\"ecs.subnet\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.subnetType\">\n {subnetTypeOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Security Groups</b>\n <HelpField key=\"ecs.securityGroups\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.securityGroups\">\n {securityGroupsOptions}\n </div>\n </div>\n\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Associate Public IP Address</b>\n <HelpField key=\"ecs.publicip\" />\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressTrue\"\n type=\"radio\"\n value=\"true\"\n id=\"associatePublicIpAddressTrue\"\n checked={this.state.associatePublicIpAddress === true}\n onChange={() => updateAssociatePublicIpAddress(true)}\n />\n Yes\n </label>\n </div>\n <div className=\"col-md-1 radio\">\n <label>\n <input\n data-test-id=\"Networking.associatePublicIpAddressFalse\"\n type=\"radio\"\n value=\"false\"\n id=\"associatePublicIpAddressFalse\"\n checked={this.state.associatePublicIpAddress === false}\n onChange={() => updateAssociatePublicIpAddress(false)}\n />\n No\n </label>\n </div>\n </div>\n </div>\n ) : (\n <div className=\"col-md-3 sm-label-right\"></div>\n );\n\n return (\n <div className=\"networking-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"form-group\">\n <div className=\"col-md-3 sm-label-right\">\n <b>Network Mode</b>\n <HelpField id=\"ecs.networkMode\" />\n </div>\n <div className=\"col-md-9\" data-test-id=\"Networking.networkMode\">\n <TetheredSelect\n placeholder=\"Select a network mode to use ...\"\n options={networkModesAvailable}\n value={this.state.networkMode}\n onChange={(e: Option) => {\n updateNetworkMode(e as Option<string>);\n }}\n />\n </div>\n </div>\n </div>\n {awsVpcOptions}\n </div>\n );\n }\n}\n\nexport const ECS_NETWORKING_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.networking.react';\nmodule(ECS_NETWORKING_REACT, []).component(\n 'ecsNetworkingReact',\n react2angular(withErrorBoundary(EcsNetworking, 'ecsNetworkingReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport { HelpField, TetheredSelect, withErrorBoundary } from '@spinnaker/core';\n\nimport type {\n IEcsServerGroupCommand,\n IEcsServiceDiscoveryRegistryAssociation,\n} from '../../serverGroupConfiguration.service';\n\nexport interface IServiceDiscoveryProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\nexport interface IEcsServiceDiscoveryRegistry {\n account: string;\n region: string;\n name: string;\n id: string;\n arn: string;\n displayName: string;\n}\n\ninterface IServiceDiscoveryState {\n serviceDiscoveryAssociations: IEcsServiceDiscoveryRegistryAssociation[];\n serviceDiscoveryRegistriesAvailable: IEcsServiceDiscoveryRegistry[];\n useTaskDefinitionArtifact: boolean;\n}\n\nexport class ServiceDiscovery extends React.Component<IServiceDiscoveryProps, IServiceDiscoveryState> {\n constructor(props: IServiceDiscoveryProps) {\n super(props);\n const cmd = this.props.command;\n\n this.state = {\n serviceDiscoveryAssociations: cmd.serviceDiscoveryAssociations,\n serviceDiscoveryRegistriesAvailable:\n cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.serviceDiscoveryRegistries : [],\n useTaskDefinitionArtifact: cmd.useTaskDefinitionArtifact,\n };\n\n if (!this.state.useTaskDefinitionArtifact) {\n this.state.serviceDiscoveryAssociations.forEach((serviceDiscoveryRegistryAssociation) => {\n serviceDiscoveryRegistryAssociation.containerName = null;\n });\n }\n }\n\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n serviceDiscoveryRegistriesAvailable: this.props.command.backingData.filtered.serviceDiscoveryRegistries,\n });\n });\n }\n\n private getNameToRegistryMap = (): Map<string, IEcsServiceDiscoveryRegistry> => {\n const displayNameToRegistry = new Map<string, IEcsServiceDiscoveryRegistry>();\n this.props.command.backingData.filtered.serviceDiscoveryRegistries.forEach((e) => {\n displayNameToRegistry.set(e.displayName, e);\n });\n\n return displayNameToRegistry;\n };\n\n private getEmptyRegistry = (): IEcsServiceDiscoveryRegistry => {\n return {\n account: '',\n region: '',\n name: '',\n id: '',\n arn: '',\n displayName: '',\n };\n };\n\n private updateServiceDiscoveryRegistry = (index: number, newRegistry: Option<string>) => {\n const registryMap = this.getNameToRegistryMap();\n let newServiceDiscoveryRegistry = registryMap.get(newRegistry.value);\n\n if (!newServiceDiscoveryRegistry) {\n newServiceDiscoveryRegistry = this.getEmptyRegistry();\n }\n\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociation = currentAssociations[index];\n targetAssociation.registry = newServiceDiscoveryRegistry;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryPort = (index: number, targetPort: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerPort = targetPort;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private updateServiceDiscoveryContainerName = (index: number, targetContainerName: string) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n const targetAssociations = currentAssociations[index];\n targetAssociations.containerName = targetContainerName;\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n private pushServiceDiscoveryAssociation = () => {\n const registryAssociations = this.state.serviceDiscoveryAssociations;\n registryAssociations.push({ registry: this.getEmptyRegistry(), containerPort: 80, containerName: '' });\n this.setState({ serviceDiscoveryAssociations: registryAssociations });\n };\n\n private removeServiceDiscoveryAssociations = (index: number) => {\n const currentAssociations = this.state.serviceDiscoveryAssociations;\n currentAssociations.splice(index, 1);\n this.props.notifyAngular('serviceDiscoveryAssociations', currentAssociations);\n this.setState({ serviceDiscoveryAssociations: currentAssociations });\n };\n\n public render(): React.ReactElement<ServiceDiscovery> {\n const removeServiceDiscoveryAssociation = this.removeServiceDiscoveryAssociations;\n const updateServiceDiscoveryRegistry = this.updateServiceDiscoveryRegistry;\n const updateServiceDiscoveryPort = this.updateServiceDiscoveryPort;\n const updateServiceDiscoveryContainerName = this.updateServiceDiscoveryContainerName;\n\n const registriesAvailable = this.state.serviceDiscoveryRegistriesAvailable.map(function (registry) {\n return { label: `${registry.displayName}`, value: registry.displayName };\n });\n\n const useTaskDefinitionArtifact = this.state.useTaskDefinitionArtifact;\n const serviceDiscoveryInputs = this.state.serviceDiscoveryAssociations.map(function (mapping, index) {\n return (\n <tr key={index}>\n {useTaskDefinitionArtifact && (\n <td>\n <input\n className=\"form-control input-sm\"\n placeholder=\"Enter a container name ...\"\n required={true}\n value={mapping.containerName}\n onChange={(e) => updateServiceDiscoveryContainerName(index, e.target.value)}\n />\n </td>\n )}\n <td>\n <TetheredSelect\n placeholder=\"Select a registry...\"\n options={registriesAvailable}\n value={mapping.registry.displayName.toString()}\n onChange={(e: Option) => updateServiceDiscoveryRegistry(index, e as Option<string>)}\n clearable={false}\n required={true}\n />\n </td>\n <td>\n <input\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort}\n onChange={(e) => updateServiceDiscoveryPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a className=\"btn-link sm-label\" onClick={() => removeServiceDiscoveryAssociation(index)}>\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const newServiceDiscoveryAssociation = this.state.serviceDiscoveryRegistriesAvailable.length ? (\n <button className=\"btn btn-block btn-sm add-new\" onClick={this.pushServiceDiscoveryAssociation}>\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Service Registry\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No registries found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Service Registries (optional)</b>\n <HelpField id=\"ecs.serviceDiscovery\" />\n </div>\n <form name=\"ecsServiceDiscoveryRegistryMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr>\n {useTaskDefinitionArtifact && (\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.serviceDiscoveryContainerName\" />\n </th>\n )}\n {useTaskDefinitionArtifact ? (\n <th style={{ width: '55%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n ) : (\n <th style={{ width: '80%' }}>\n Registry\n <HelpField id=\"ecs.serviceDiscoveryRegistry\" />\n </th>\n )}\n <th style={{ width: '15%' }}>\n Port\n <HelpField id=\"ecs.serviceDiscoveryContainerPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{serviceDiscoveryInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newServiceDiscoveryAssociation}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const SERVICE_DISCOVERY_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.serviceDiscovery.react';\nmodule(SERVICE_DISCOVERY_REACT, []).component(\n 'serviceDiscoveryReact',\n react2angular(withErrorBoundary(ServiceDiscovery, 'serviceDiscoveryReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import { module } from 'angular';\nimport { isEqual, uniqWith } from 'lodash';\nimport React from 'react';\nimport { Alert } from 'react-bootstrap';\nimport type { Option } from 'react-select';\nimport { react2angular } from 'react2angular';\n\nimport type { IArtifact, IExpectedArtifact } from '@spinnaker/core';\nimport {\n ArtifactTypePatterns,\n CheckboxInput,\n HelpField,\n StageArtifactSelectorDelegate,\n StageConfigField,\n TetheredSelect,\n withErrorBoundary,\n} from '@spinnaker/core';\n\nimport type {\n IEcsContainerMapping,\n IEcsDockerImage,\n IEcsServerGroupCommand,\n IEcsTargetGroupMapping,\n IEcsTaskDefinitionArtifact,\n} from '../../serverGroupConfiguration.service';\n\nexport interface ITaskDefinitionProps {\n command: IEcsServerGroupCommand;\n notifyAngular: (key: string, value: any) => void;\n configureCommand: (query: string) => PromiseLike<void>;\n}\n\ninterface ITaskDefinitionState {\n taskDefArtifact: IEcsTaskDefinitionArtifact;\n taskDefArtifactAccount: string;\n containerMappings: IEcsContainerMapping[];\n targetGroupMappings: IEcsTargetGroupMapping[];\n dockerImages: IEcsDockerImage[];\n targetGroupsAvailable: string[];\n loadBalancedContainer: string;\n evaluateTaskDefinitionArtifactExpressions: boolean;\n}\n\nexport class TaskDefinition extends React.Component<ITaskDefinitionProps, ITaskDefinitionState> {\n constructor(props: ITaskDefinitionProps) {\n super(props);\n const cmd = this.props.command;\n let defaultContainer = '';\n if (cmd.containerMappings && cmd.containerMappings.length > 0) {\n defaultContainer = cmd.containerMappings[0].containerName;\n }\n\n let defaultTargetGroup: IEcsTargetGroupMapping[] = [];\n if (cmd.targetGroupMappings && cmd.targetGroupMappings.length > 0) {\n defaultTargetGroup = cmd.targetGroupMappings;\n }\n\n if (cmd.targetGroup && cmd.targetGroup.length > 0) {\n defaultTargetGroup.push({\n containerName: cmd.loadBalancedContainer || defaultContainer,\n targetGroup: cmd.targetGroup,\n containerPort: cmd.containerPort,\n });\n cmd.targetGroup = '';\n cmd.loadBalancedContainer = '';\n }\n\n cmd.targetGroupMappings = uniqWith(defaultTargetGroup, isEqual);\n\n this.state = {\n taskDefArtifact: cmd.taskDefinitionArtifact,\n containerMappings: cmd.containerMappings ? cmd.containerMappings : [],\n targetGroupMappings: cmd.targetGroupMappings,\n targetGroupsAvailable: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.targetGroups : [],\n dockerImages: cmd.backingData && cmd.backingData.filtered ? cmd.backingData.filtered.images : [],\n loadBalancedContainer: cmd.loadBalancedContainer || defaultContainer,\n taskDefArtifactAccount: cmd.taskDefinitionArtifactAccount,\n evaluateTaskDefinitionArtifactExpressions: cmd.evaluateTaskDefinitionArtifactExpressions,\n };\n }\n\n // TODO: Separate docker image component used by both TaskDefinition and Container\n public componentDidMount() {\n this.props.configureCommand('1').then(() => {\n this.setState({\n dockerImages: this.props.command.backingData.filtered.images,\n targetGroupsAvailable: this.props.command.backingData.filtered.targetGroups,\n });\n });\n }\n\n private getIdToImageMap = (): Map<string, IEcsDockerImage> => {\n const imageIdToDescription = new Map<string, IEcsDockerImage>();\n this.props.command.backingData.filtered.images.forEach((e) => {\n imageIdToDescription.set(e.imageId, e);\n });\n\n return imageIdToDescription;\n };\n\n private getEmptyImageDescription = (): IEcsDockerImage => {\n return {\n imageId: '',\n message: '',\n fromTrigger: false,\n fromContext: false,\n stageId: '',\n imageLabelOrSha: '',\n account: '',\n registry: '',\n repository: '',\n tag: '',\n };\n };\n\n private excludedArtifactTypePatterns = [\n ArtifactTypePatterns.KUBERNETES,\n ArtifactTypePatterns.DOCKER_IMAGE,\n ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE,\n ];\n\n private onExpectedArtifactSelected = (expectedArtifactId: string): void => {\n const selectedArtifact = { artifactId: expectedArtifactId };\n this.props.notifyAngular('taskDefinitionArtifact', selectedArtifact);\n this.setState({ taskDefArtifact: selectedArtifact });\n };\n\n private onArtifactEdited = (artifact: IArtifact): void => {\n const newArtifact = { artifact: artifact };\n this.props.notifyAngular('taskDefinitionArtifact', newArtifact);\n this.setState({ taskDefArtifact: newArtifact });\n };\n\n private pushMapping = () => {\n const conMaps = this.state.containerMappings;\n conMaps.push({ containerName: '', imageDescription: this.getEmptyImageDescription() });\n this.setState({ containerMappings: conMaps });\n };\n\n private pushTargetGroupMapping = () => {\n const targetMaps = this.state.targetGroupMappings;\n targetMaps.push({ containerName: '', targetGroup: '', containerPort: 80 });\n this.setState({ targetGroupMappings: targetMaps });\n };\n\n private updateContainerMappingName = (index: number, newName: string) => {\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = newName;\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateContainerMappingImage = (index: number, newImage: Option<string>) => {\n const imageMap = this.getIdToImageMap();\n let newImageDescription = imageMap.get(newImage.value);\n\n if (!newImageDescription) {\n newImageDescription = this.getEmptyImageDescription();\n }\n const currentMappings = this.state.containerMappings;\n const targetMapping = currentMappings[index];\n targetMapping.imageDescription = newImageDescription;\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private updateTargetGroupMappingTargetGroup = (index: number, newTargetGroup: Option<string>) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.targetGroup = newTargetGroup.value;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingContainer = (index: number, targetContainer: string) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerName = targetContainer;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateTargetGroupMappingPort = (index: number, targetPort: number) => {\n const currentMappings = this.state.targetGroupMappings;\n const targetMapping = currentMappings[index];\n targetMapping.containerPort = targetPort;\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private removeMapping = (index: number) => {\n const currentMappings = this.state.containerMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('containerMappings', currentMappings);\n this.setState({ containerMappings: currentMappings });\n };\n\n private removeTargetGroupMapping = (index: number) => {\n const currentMappings = this.state.targetGroupMappings;\n currentMappings.splice(index, 1);\n this.props.notifyAngular('targetGroupMappings', currentMappings);\n this.setState({ targetGroupMappings: currentMappings });\n };\n\n private updateEvaluateTaskDefArtifactFlag = () => {\n this.props.notifyAngular(\n 'evaluateTaskDefinitionArtifactExpressions',\n !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n );\n this.setState({\n evaluateTaskDefinitionArtifactExpressions: !this.props.command.evaluateTaskDefinitionArtifactExpressions,\n });\n };\n\n public render(): React.ReactElement<TaskDefinition> {\n const { command } = this.props;\n const removeMapping = this.removeMapping;\n const removeTargetGroupMapping = this.removeTargetGroupMapping;\n const updateContainerMappingName = this.updateContainerMappingName;\n const updateContainerMappingImage = this.updateContainerMappingImage;\n const updateTargetGroupMappingContainer = this.updateTargetGroupMappingContainer;\n const updateTargetGroupMappingTargetGroup = this.updateTargetGroupMappingTargetGroup;\n const updateTargetGroupMappingPort = this.updateTargetGroupMappingPort;\n const updateEvaluateTaskDefArtifactFlag = this.updateEvaluateTaskDefArtifactFlag;\n\n const dockerImageOptions = this.state.dockerImages.map(function (image) {\n let msg = '';\n if (image.fromTrigger || image.fromContext) {\n msg = image.fromTrigger ? '(TRIGGER) ' : '(FIND IMAGE RESULT) ';\n }\n return { label: `${msg} (${image.imageId})`, value: image.imageId };\n });\n\n const targetGroupsAvailable = this.state.targetGroupsAvailable.map(function (targetGroup) {\n return { label: `${targetGroup}`, value: targetGroup };\n });\n\n const mappingInputs = this.state.containerMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n data-test-id=\"Artifacts.containerName\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"enter container name...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateContainerMappingName(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.containerImage\">\n <TetheredSelect\n placeholder=\"Select an image to use...\"\n options={dockerImageOptions}\n value={mapping.imageDescription.imageId}\n onChange={(e: Option) => {\n updateContainerMappingImage(index, e as Option<string>);\n }}\n clearable={false}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.containerRemove\"\n onClick={() => removeMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const targetGroupInputs = this.state.targetGroupMappings.map(function (mapping, index) {\n return (\n <tr key={index}>\n <td>\n <input\n data-test-id=\"Artifacts.targetGroupContainer\"\n className=\"form-control input-sm\"\n required={true}\n placeholder=\"Enter a container name ...\"\n value={mapping.containerName.toString()}\n onChange={(e) => updateTargetGroupMappingContainer(index, e.target.value)}\n />\n </td>\n <td data-test-id=\"Artifacts.targetGroup\">\n <TetheredSelect\n placeholder=\"Select a target group to use...\"\n options={targetGroupsAvailable}\n value={mapping.targetGroup.toString()}\n onChange={(e: Option) => updateTargetGroupMappingTargetGroup(index, e as Option<string>)}\n clearable={false}\n />\n </td>\n <td>\n <input\n data-test-id=\"Artifacts.targetGroupPort\"\n type=\"number\"\n className=\"form-control input-sm no-spel\"\n required={true}\n value={mapping.containerPort.toString()}\n onChange={(e) => updateTargetGroupMappingPort(index, e.target.valueAsNumber)}\n />\n </td>\n <td>\n <div className=\"form-control-static\">\n <a\n className=\"btn-link sm-label\"\n data-test-id=\"Artifacts.targetGroupRemove\"\n onClick={() => removeTargetGroupMapping(index)}\n >\n <span className=\"glyphicon glyphicon-trash\" />\n <span className=\"sr-only\">Remove</span>\n </a>\n </div>\n </td>\n </tr>\n );\n });\n\n const newTargetGroupMapping = this.state.targetGroupsAvailable.length ? (\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.targetGroupAdd\"\n onClick={this.pushTargetGroupMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Target Group Mapping\n </button>\n ) : (\n <div className=\"sm-label-left\">\n <Alert color=\"warning\">No target groups found in the selected account/region/VPC</Alert>\n </div>\n );\n\n return (\n <div className=\"container-fluid form-horizontal\">\n <div className=\"form-group\">\n <div className=\"col-md-12\">\n <StageArtifactSelectorDelegate\n artifact={this.state.taskDefArtifact.artifact}\n excludedArtifactTypePatterns={this.excludedArtifactTypePatterns}\n expectedArtifactId={this.state.taskDefArtifact.artifactId}\n label=\"Artifact\"\n helpKey=\"ecs.taskDefinitionArtifact\"\n onExpectedArtifactSelected={(artifact: IExpectedArtifact) => this.onExpectedArtifactSelected(artifact.id)}\n onArtifactEdited={this.onArtifactEdited}\n pipeline={command.viewState.pipeline}\n stage={command.viewState.currentStage}\n />\n </div>\n </div>\n\n <StageConfigField\n groupClassName=\"form-group evaluateTaskDef\"\n label=\"Expression Evaluation\"\n helpKey=\"ecs.evaluateExpression\"\n labelColumns={5}\n fieldColumns={7}\n >\n <CheckboxInput\n checked={command.evaluateTaskDefinitionArtifactExpressions === true}\n onChange={() => {\n updateEvaluateTaskDefArtifactFlag();\n }}\n text=\"Evaluate SpEL expressions in artifact\"\n />\n </StageConfigField>\n\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Container Mappings</b>\n <HelpField id=\"ecs.containerMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionContainerMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.containerMappingName\" />\n </th>\n <th style={{ width: '70%' }}>\n Container image\n <HelpField id=\"ecs.containerMappingImage\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{mappingInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={3}>\n <button\n className=\"btn btn-block btn-sm add-new\"\n data-test-id=\"Artifacts.containerAdd\"\n onClick={this.pushMapping}\n >\n <span className=\"glyphicon glyphicon-plus-sign\" />\n Add New Container Mapping\n </button>\n </td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n <div className=\"form-group\">\n <div className=\"sm-label-left\">\n <b>Target Group Mappings</b>\n <HelpField id=\"ecs.targetGroupMappings\" />\n </div>\n <form name=\"ecsTaskDefinitionTargetGroupMappings\">\n <table className=\"table table-condensed packed tags\">\n <thead>\n <tr key=\"header\">\n <th style={{ width: '30%' }}>\n Container name\n <HelpField id=\"ecs.loadBalancedContainer\" />\n </th>\n <th style={{ width: '55%' }}>\n Target group\n <HelpField id=\"ecs.loadBalancer.targetGroup\" />\n </th>\n <th style={{ width: '15%' }}>\n Target port\n <HelpField id=\"ecs.loadbalancing.targetPort\" />\n </th>\n <th />\n </tr>\n </thead>\n <tbody>{targetGroupInputs}</tbody>\n <tfoot>\n <tr>\n <td colSpan={4}>{newTargetGroupMapping}</td>\n </tr>\n </tfoot>\n </table>\n </form>\n </div>\n </div>\n );\n }\n}\n\nexport const TASK_DEFINITION_REACT = 'spinnaker.ecs.serverGroup.configure.wizard.taskDefinition.react';\nmodule(TASK_DEFINITION_REACT, []).component(\n 'taskDefinitionReact',\n react2angular(withErrorBoundary(TaskDefinition, 'taskDefinitionReact'), [\n 'command',\n 'notifyAngular',\n 'configureCommand',\n ]),\n);\n","import type { IComponentOptions } from 'angular';\nimport { module } from 'angular';\n\nconst resizeCapacityComponent: IComponentOptions = {\n bindings: {\n command: '=',\n currentSize: '=',\n },\n templateUrl: require('./resizeCapacity.component.html'),\n controller: () => {},\n};\n\nexport const ECS_RESIZE_CAPACITY_COMPONENT = 'spinnaker.ecs.serverGroup.resize';\nmodule(ECS_RESIZE_CAPACITY_COMPONENT, []).component('ecsResizeCapacity', resizeCapacityComponent);\n","'use strict';\n\nimport * as angular from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nimport { ECS_RESIZE_CAPACITY_COMPONENT } from './resizeCapacity.component';\n\nexport const ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER =\n 'spinnaker.ecs.serverGroup.details.resize.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER, [\n SERVER_GROUP_WRITER,\n ECS_RESIZE_CAPACITY_COMPONENT,\n ])\n .controller('ecsResizeServerGroupCtrl', [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n function ($scope, $uibModalInstance, serverGroupWriter, application, serverGroup) {\n $scope.serverGroup = serverGroup;\n $scope.currentSize = {\n min: serverGroup.capacity.min,\n max: serverGroup.capacity.max,\n desired: serverGroup.capacity.desired,\n newSize: null,\n };\n\n $scope.verification = {};\n\n $scope.command = angular.copy($scope.currentSize);\n $scope.command.advancedMode = serverGroup.capacity.min !== serverGroup.capacity.max;\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Ecs'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n return command.advancedMode\n ? command.min <= command.max && command.desired >= command.min && command.desired <= command.max\n : command.newSize !== null;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Resizing ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.resize = function () {\n if (!this.isValid()) {\n return;\n }\n let capacity = { min: $scope.command.min, max: $scope.command.max, desired: $scope.command.desired };\n if (!$scope.command.advancedMode) {\n capacity = { min: $scope.command.newSize, max: $scope.command.newSize, desired: $scope.command.newSize };\n }\n\n const submitMethod = function () {\n return serverGroupWriter.resizeServerGroup(serverGroup, application, {\n capacity: capacity,\n interestingHealthProviderNames: $scope.command.interestingHealthProviderNames,\n reason: $scope.command.reason,\n });\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n },\n ]);\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { SERVER_GROUP_WRITER, TaskMonitor } from '@spinnaker/core';\n\nexport const ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER =\n 'spinnaker.ecs.serverGroup.details.rollback.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER; // for backwards compatibility\nmodule(ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER, [SERVER_GROUP_WRITER]).controller(\n 'ecsRollbackServerGroupCtrl',\n [\n '$scope',\n '$uibModalInstance',\n 'serverGroupWriter',\n 'application',\n 'serverGroup',\n 'disabledServerGroups',\n 'allServerGroups',\n function (\n $scope,\n $uibModalInstance,\n serverGroupWriter,\n application,\n serverGroup,\n disabledServerGroups,\n allServerGroups,\n ) {\n $scope.serverGroup = serverGroup;\n $scope.disabledServerGroups = disabledServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.allServerGroups = allServerGroups.sort((a, b) => b.name.localeCompare(a.name));\n $scope.verification = {};\n\n $scope.command = {\n rollbackType: 'EXPLICIT',\n rollbackContext: {\n rollbackServerGroupName: serverGroup.name,\n },\n };\n\n if (application && application.attributes) {\n if (application.attributes.platformHealthOnlyShowOverride && application.attributes.platformHealthOnly) {\n $scope.command.interestingHealthProviderNames = ['Ecs'];\n }\n\n $scope.command.platformHealthOnlyShowOverride = application.attributes.platformHealthOnlyShowOverride;\n }\n\n this.isValid = function () {\n const command = $scope.command;\n if (!$scope.verification.verified) {\n return false;\n }\n\n return command.rollbackContext.restoreServerGroupName !== undefined;\n };\n\n $scope.taskMonitor = new TaskMonitor({\n application: application,\n title: 'Rollback ' + serverGroup.name,\n modalInstance: $uibModalInstance,\n });\n\n this.rollback = function () {\n if (!this.isValid()) {\n return;\n }\n\n const submitMethod = function () {\n return serverGroupWriter.rollbackServerGroup(serverGroup, application, $scope.command);\n };\n\n $scope.taskMonitor.submit(submitMethod);\n };\n\n this.cancel = function () {\n $uibModalInstance.dismiss();\n };\n\n this.label = function (serverGroup) {\n if (!serverGroup) {\n return '';\n }\n\n if (!serverGroup.buildInfo || !serverGroup.buildInfo.jenkins || !serverGroup.buildInfo.jenkins.number) {\n return serverGroup.name;\n }\n\n return serverGroup.name + ' (build #' + serverGroup.buildInfo.jenkins.number + ')';\n };\n\n this.group = function (serverGroup) {\n return serverGroup.isDisabled ? 'Disabled Server Groups' : 'Enabled Server Groups';\n };\n },\n ],\n);\n","import { module } from 'angular';\nimport { defaults } from 'lodash';\n\nimport type {\n IAmazonServerGroup,\n IAmazonServerGroupView,\n IScalingAdjustmentView,\n IScalingPolicyAlarmView,\n IScalingPolicyView,\n IStepAdjustment,\n IStepAdjustmentView,\n} from '@spinnaker/amazon';\nimport { VpcReader } from '@spinnaker/amazon';\nimport type { IInstance, IVpc } from '@spinnaker/core';\n\nexport class EcsServerGroupTransformer {\n private addComparator(alarm: IScalingPolicyAlarmView): void {\n if (!alarm.comparisonOperator) {\n return;\n }\n\n switch (alarm.comparisonOperator) {\n case 'LessThanThreshold':\n alarm.comparator = '&lt;';\n break;\n case 'GreaterThanThreshold':\n alarm.comparator = '&gt;';\n break;\n case 'LessThanOrEqualToThreshold':\n alarm.comparator = '&le;';\n break;\n case 'GreaterThanOrEqualToThreshold':\n alarm.comparator = '&ge;';\n break;\n }\n }\n\n private addAdjustmentAttributes(policyOrStepAdjustment: IScalingAdjustmentView): void {\n policyOrStepAdjustment.operator = policyOrStepAdjustment.scalingAdjustment < 0 ? 'decrease' : 'increase';\n policyOrStepAdjustment.absAdjustment = Math.abs(policyOrStepAdjustment.scalingAdjustment);\n }\n\n private transformScalingPolicy(policy: IScalingPolicyView): IScalingPolicyView {\n const view: IScalingPolicyView = { ...policy };\n const upperBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n b.metricIntervalUpperBound - a.metricIntervalUpperBound;\n const lowerBoundSorter = (a: IStepAdjustmentView, b: IStepAdjustmentView) =>\n a.metricIntervalLowerBound - b.metricIntervalLowerBound;\n\n view.alarms = policy.alarms || [];\n view.alarms.forEach((alarm: IScalingPolicyAlarmView) => this.addComparator(alarm));\n this.addAdjustmentAttributes(view); // simple policies\n if (view.stepAdjustments && view.stepAdjustments.length) {\n view.stepAdjustments.forEach((sa: IStepAdjustmentView) => this.addAdjustmentAttributes(sa)); // step policies\n const sorter = policy.stepAdjustments.every((a: IStepAdjustment) => a.metricIntervalUpperBound !== undefined)\n ? upperBoundSorter\n : lowerBoundSorter;\n view.stepAdjustments.sort((a: IStepAdjustmentView, b: IStepAdjustmentView) => sorter(a, b));\n }\n return view;\n }\n\n public normalizeServerGroupDetails(serverGroup: IAmazonServerGroup): IAmazonServerGroupView {\n const view: IAmazonServerGroupView = { ...serverGroup } as IAmazonServerGroupView;\n if (serverGroup.scalingPolicies) {\n view.scalingPolicies = serverGroup.scalingPolicies.map((policy: IScalingPolicyView) =>\n this.transformScalingPolicy(policy),\n );\n }\n return view;\n }\n\n public normalizeServerGroup(serverGroup: IAmazonServerGroup): PromiseLike<IAmazonServerGroup> {\n serverGroup.instances.forEach((instance: IInstance) => {\n instance.vpcId = serverGroup.vpcId;\n });\n return VpcReader.listVpcs().then(\n (vpc: IVpc[]): IAmazonServerGroup => this.addVpcNameToServerGroup(serverGroup)(vpc),\n );\n }\n\n private addVpcNameToServerGroup(serverGroup: IAmazonServerGroup): (vpc: IVpc[]) => IAmazonServerGroup {\n return (vpcs: IVpc[]) => {\n const match = vpcs.find((test) => test.id === serverGroup.vpcId);\n serverGroup.vpcName = match ? match.name : '';\n return serverGroup;\n };\n }\n\n public convertServerGroupCommandToDeployConfiguration(base: any): any {\n // use _.defaults to avoid copying the backingData, which is huge and expensive to copy over\n const command = defaults({ backingData: [], viewState: [] }, base);\n command.cloudProvider = 'ecs';\n command.availabilityZones = {};\n command.availabilityZones[command.region] = base.availabilityZones;\n command.loadBalancers = (base.loadBalancers || []).concat(base.vpcLoadBalancers || []);\n command.targetGroup = base.targetGroup || '';\n command.account = command.credentials;\n command.subnetType = command.subnetType || '';\n\n if (base.viewState.mode !== 'clone') {\n delete command.source;\n }\n\n delete command.region;\n delete command.viewState;\n delete command.backingData;\n delete command.selectedProvider;\n delete command.instanceProfile;\n delete command.vpcId;\n\n return command;\n }\n}\n\nexport const ECS_SERVER_GROUP_TRANSFORMER = 'spinnaker.ecs.serverGroup.transformer';\nmodule(ECS_SERVER_GROUP_TRANSFORMER, []).service('ecsServerGroupTransformer', EcsServerGroupTransformer);\n","'use strict';\n\nimport UIROUTER_ANGULARJS from '@uirouter/angularjs';\nimport * as angular from 'angular';\nimport { chain, filter, find, has, isEmpty } from 'lodash';\n\nimport {\n AccountService,\n ConfirmationModalService,\n FirewallLabels,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_WRITER,\n ServerGroupReader,\n ServerGroupWarningMessageService,\n SubnetReader,\n} from '@spinnaker/core';\n\nimport { ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from '../configure/serverGroupCommandBuilder.service';\nimport { ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER } from './resize/resizeServerGroup.controller';\nimport { ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER } from './rollback/rollbackServerGroup.controller';\nimport { ECS_SERVER_GROUP_TRANSFORMER } from '../serverGroup.transformer';\n\nexport const ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER = 'spinnaker.ecs.serverGroup.details.controller';\nexport const name = ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER; // for backwards compatibility\nangular\n .module(ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER, [\n UIROUTER_ANGULARJS,\n ECS_SERVER_GROUP_TRANSFORMER,\n OVERRIDE_REGISTRY,\n SERVER_GROUP_WRITER,\n ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ECS_SERVERGROUP_DETAILS_RESIZE_RESIZESERVERGROUP_CONTROLLER,\n ECS_SERVERGROUP_DETAILS_ROLLBACK_ROLLBACKSERVERGROUP_CONTROLLER,\n ])\n .controller('ecsServerGroupDetailsCtrl', [\n '$scope',\n '$state',\n 'app',\n 'serverGroup',\n 'ecsServerGroupCommandBuilder',\n '$uibModal',\n 'serverGroupWriter',\n 'ecsServerGroupTransformer',\n 'overrideRegistry',\n function (\n $scope,\n $state,\n app,\n serverGroup,\n ecsServerGroupCommandBuilder,\n $uibModal,\n serverGroupWriter,\n ecsServerGroupTransformer,\n overrideRegistry,\n ) {\n this.state = {\n loading: true,\n };\n\n this.firewallsLabel = FirewallLabels.get('Firewalls');\n\n this.application = app;\n\n const extractServerGroupSummary = () => {\n return app.ready().then(() => {\n let summary = find(app.serverGroups.data, (toCheck) => {\n return (\n toCheck.name === serverGroup.name &&\n toCheck.account === serverGroup.accountId &&\n toCheck.region === serverGroup.region\n );\n });\n if (!summary) {\n app.loadBalancers.data.some((loadBalancer) => {\n if (loadBalancer.account === serverGroup.accountId && loadBalancer.region === serverGroup.region) {\n return loadBalancer.serverGroups.some((possibleServerGroup) => {\n if (possibleServerGroup.name === serverGroup.name) {\n summary = possibleServerGroup;\n return true;\n }\n });\n }\n });\n }\n return summary;\n });\n };\n\n const autoClose = () => {\n if ($scope.$$destroyed) {\n return;\n }\n $state.go('^', { allowModalToStayOpen: true }, { location: 'replace' });\n };\n\n const cancelLoader = () => {\n this.state.loading = false;\n };\n\n const retrieveServerGroup = () => {\n return extractServerGroupSummary()\n .then((summary) => {\n return ServerGroupReader.getServerGroup(\n app.name,\n serverGroup.accountId,\n serverGroup.region,\n serverGroup.name,\n ).then((details) => {\n cancelLoader();\n\n // it's possible the summary was not found because the clusters are still loading\n angular.extend(details, summary, { account: serverGroup.accountId });\n\n this.serverGroup = ecsServerGroupTransformer.normalizeServerGroupDetails(details);\n this.applyAccountDetails(this.serverGroup);\n\n if (!isEmpty(this.serverGroup)) {\n this.image = details.image ? details.image : undefined;\n\n const vpc = this.serverGroup.asg ? this.serverGroup.asg.vpczoneIdentifier : '';\n\n if (vpc !== '') {\n const subnetId = vpc.split(',')[0];\n SubnetReader.listSubnets().then((subnets) => {\n const subnet = chain(subnets).find({ id: subnetId }).value();\n this.serverGroup.subnetType = subnet.purpose;\n });\n }\n\n if (details.image && details.image.description) {\n const tags = details.image.description.split(', ');\n tags.forEach((tag) => {\n const keyVal = tag.split('=');\n if (keyVal.length === 2 && keyVal[0] === 'ancestor_name') {\n details.image.baseImage = keyVal[1];\n }\n });\n }\n\n if (details.image && details.image.tags) {\n const baseAmiVersionTag = details.image.tags.find((tag) => tag.key === 'base_ami_version');\n if (baseAmiVersionTag) {\n details.baseAmiVersion = baseAmiVersionTag.value;\n }\n }\n\n this.scalingPolicies = this.serverGroup.scalingPolicies;\n // TODO - figure out whether we need the commented out block below, or not. IF we do, then we need to make it stop crashing\n\n if (has(this.serverGroup, 'buildInfo.jenkins')) {\n this.changeConfig.buildInfo = {\n jenkins: this.serverGroup.buildInfo.jenkins,\n };\n }\n\n /*this.scalingPoliciesDisabled = this.scalingPolicies.length && this.autoScalingProcesses\n .filter(p => !p.enabled)\n .some(p => ['Launch','Terminate','AlarmNotification'].includes(p.name));\n this.scheduledActionsDisabled = this.serverGroup.scheduledActions.length && this.autoScalingProcesses\n .filter(p => !p.enabled)\n .some(p => ['Launch','Terminate','ScheduledAction'].includes(p.name));\n configureEntityTagTargets();\n\n this.changeConfig = {\n metadata: get(this.serverGroup.entityTags, 'creationMetadata')\n };\n */\n } else {\n autoClose();\n }\n });\n })\n .catch(autoClose);\n };\n\n retrieveServerGroup().then(() => {\n // If the user navigates away from the view before the initial retrieveServerGroup call completes,\n // do not bother subscribing to the refresh\n if (!$scope.$$destroyed) {\n app.serverGroups.onRefresh($scope, retrieveServerGroup);\n }\n });\n\n this.destroyServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Destroying ' + serverGroup.name,\n onTaskComplete: () => {\n if ($state.includes('**.serverGroup', stateParams)) {\n $state.go('^');\n }\n },\n };\n\n const submitMethod = (params) => serverGroupWriter.destroyServerGroup(serverGroup, app, params);\n\n const stateParams = {\n name: serverGroup.name,\n accountId: serverGroup.account,\n region: serverGroup.region,\n };\n\n const confirmationModalParams = {\n header: 'Really destroy ' + serverGroup.name + '?',\n buttonText: 'Destroy ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n submitMethod: submitMethod,\n askForReason: true,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n };\n\n ServerGroupWarningMessageService.addDestroyWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.disableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Disabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.disableServerGroup(serverGroup, app, params);\n };\n\n const confirmationModalParams = {\n header: 'Really disable ' + serverGroup.name + '?',\n buttonText: 'Disable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n ServerGroupWarningMessageService.addDisableWarningMessage(app, serverGroup, confirmationModalParams);\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.enableServerGroup = () => {\n const serverGroup = this.serverGroup;\n\n const taskMonitor = {\n application: app,\n title: 'Enabling ' + serverGroup.name,\n };\n\n const submitMethod = (params) => {\n return serverGroupWriter.enableServerGroup(serverGroup, app, params);\n };\n\n const confirmationModalParams = {\n header: 'Really enable ' + serverGroup.name + '?',\n buttonText: 'Enable ' + serverGroup.name,\n account: serverGroup.account,\n taskMonitorConfig: taskMonitor,\n platformHealthOnlyShowOverride: app.attributes.platformHealthOnlyShowOverride,\n platformHealthType: 'Ecs',\n submitMethod: submitMethod,\n askForReason: true,\n };\n\n if (app.attributes.platformHealthOnlyShowOverride && app.attributes.platformHealthOnly) {\n confirmationModalParams.interestingHealthProviderNames = ['Ecs'];\n }\n\n ConfirmationModalService.confirm(confirmationModalParams);\n };\n\n this.rollbackServerGroup = () => {\n $uibModal.open({\n templateUrl: overrideRegistry.getTemplate(\n 'ecs.rollback.modal',\n require('./rollback/rollbackServerGroup.html'),\n ),\n windowClass: 'modal-z-index',\n controller: 'ecsRollbackServerGroupCtrl as ctrl',\n resolve: {\n serverGroup: () => this.serverGroup,\n disabledServerGroups: () => {\n const cluster = find(app.clusters, { name: this.serverGroup.cluster, account: this.serverGroup.account });\n return filter(cluster.serverGroups, { isDisabled: true, region: this.serverGroup.region });\n },\n allServerGroups: () =>\n app\n .getDataSource('serverGroups')\n .data.filter(\n (g) =>\n g.cluster === this.serverGroup.cluster &&\n g.region === this.serverGroup.region &&\n g.account === this.serverGroup.account &&\n g.name !== this.serverGroup.name,\n ),\n application: () => app,\n },\n });\n };\n\n this.resizeServerGroup = () => {\n $uibModal.open({\n templateUrl: overrideRegistry.getTemplate('ecs.resize.modal', require('./resize/resizeServerGroup.html')),\n controller: 'ecsResizeServerGroupCtrl as ctrl',\n windowClass: 'modal-z-index',\n resolve: {\n serverGroup: () => this.serverGroup,\n application: () => app,\n },\n });\n };\n\n this.cloneServerGroup = (serverGroup) => {\n $uibModal.open({\n templateUrl: require('../configure/wizard/serverGroupWizard.html'),\n controller: 'ecsCloneServerGroupCtrl as ctrl',\n size: 'lg',\n windowClass: 'modal-z-index',\n resolve: {\n title: () => 'Clone ' + serverGroup.name,\n application: () => app,\n serverGroupCommand: () =>\n ecsServerGroupCommandBuilder.buildServerGroupCommandFromExisting(app, serverGroup),\n },\n });\n };\n\n this.buildJenkinsLink = () => {\n if (has(this, 'serverGroup.buildInfo.buildInfoUrl')) {\n return this.serverGroup.buildInfo.buildInfoUrl;\n } else if (has(this, 'serverGroup.buildInfo.jenkins')) {\n const jenkins = this.serverGroup.buildInfo.jenkins;\n return jenkins.host + 'job/' + jenkins.name + '/' + jenkins.number;\n }\n return null;\n };\n\n this.truncateCommitHash = () => {\n if (this.serverGroup && this.serverGroup.buildInfo && this.serverGroup.buildInfo.commit) {\n return this.serverGroup.buildInfo.commit.substring(0, 8);\n }\n return null;\n };\n\n this.applyAccountDetails = (serverGroup) => {\n return AccountService.getAccountDetails(serverGroup.account).then((details) => {\n serverGroup.accountDetails = details;\n });\n };\n },\n ]);\n","import { module } from 'angular';\nimport { ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER } from './serverGroupDetails.ecs.controller';\n\nexport const SERVER_GROUP_DETAILS_MODULE = 'spinnaker.ecs.serverGroup.details';\nmodule(SERVER_GROUP_DETAILS_MODULE, [ECS_SERVERGROUP_DETAILS_SERVERGROUPDETAILS_ECS_CONTROLLER]);\n","import { $log } from 'ngimport';\n\nimport type { IServerGroup } from '@spinnaker/core';\nimport { REST } from '@spinnaker/core';\n\nexport interface IEventDescription {\n createdAt: number;\n message: string;\n id: string;\n status: string;\n}\n\nexport class ServerGroupEventsReader {\n public static getEvents(serverGroup: IServerGroup): PromiseLike<IEventDescription[]> {\n return REST('/applications')\n .path(serverGroup.app, 'serverGroups', serverGroup.account, serverGroup.name, 'events')\n .query({\n region: serverGroup.region,\n provider: serverGroup.cloudProvider,\n })\n .get()\n .catch((error: any): any[] => {\n $log.error(error, 'error retrieving events');\n return [];\n });\n }\n}\n","import type { IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalServiceInstance } from 'angular-ui-bootstrap';\n\nimport type { IServerGroup } from '@spinnaker/core';\n\nimport type { IEventDescription } from './serverGroupEventsReader.service';\nimport { ServerGroupEventsReader } from './serverGroupEventsReader.service';\n\nexport interface IScalingActivitiesViewState {\n loading: boolean;\n error: boolean;\n}\n\nexport class EventsController implements IController {\n public viewState: IScalingActivitiesViewState;\n public events: IEventDescription[] = [];\n\n public static $inject = ['$uibModalInstance', 'serverGroup'];\n public constructor(private $uibModalInstance: IModalServiceInstance, public serverGroup: IServerGroup) {}\n\n public $onInit(): void {\n this.viewState = {\n loading: true,\n error: false,\n };\n\n ServerGroupEventsReader.getEvents(this.serverGroup).then(\n (rawEvents: IEventDescription[]) => {\n this.viewState.loading = false;\n this.events = rawEvents;\n },\n () => {\n this.viewState.error = true;\n },\n );\n }\n\n public close(): void {\n this.$uibModalInstance.close();\n }\n}\n\nexport const EVENTS_CTRL = 'spinnaker.ecs.serverGroup.events.controller';\nmodule(EVENTS_CTRL, []).controller('EventsController', EventsController);\n","import type { IComponentOptions, IController } from 'angular';\nimport { module } from 'angular';\nimport type { IModalService } from 'angular-ui-bootstrap';\n\nimport { EVENTS_CTRL, EventsController } from './events.controller';\n\nclass ViewEventsLinkCtrl implements IController {\n public serverGroup: any;\n\n public static $inject = ['$uibModal'];\n public constructor(private $uibModal: IModalService) {}\n\n public showEvents(): void {\n this.$uibModal.open({\n templateUrl: require('./events.html'),\n controller: EventsController,\n controllerAs: '$ctrl',\n windowClass: 'modal-z-index',\n resolve: {\n serverGroup: () => this.serverGroup,\n },\n });\n }\n}\n\nexport const viewEventsLink: IComponentOptions = {\n bindings: {\n serverGroup: '<',\n },\n controller: ViewEventsLinkCtrl,\n template: `<a href ng-click=\"$ctrl.showEvents()\">View Events</a>`,\n};\n\nexport const VIEW_EVENTS_LINK_COMPONENT = 'spinnaker.ecs.serverGroup.details.viewEvents.link';\nmodule(VIEW_EVENTS_LINK_COMPONENT, [EVENTS_CTRL]).component('viewEventsLink', viewEventsLink);\n","import { module } from 'angular';\n\nimport { VIEW_EVENTS_LINK_COMPONENT } from './events/events.component';\n\nexport const ECS_SERVERGROUP_MODULE = 'spinnaker.ecs.serverGroup';\nmodule(ECS_SERVERGROUP_MODULE, [VIEW_EVENTS_LINK_COMPONENT]);\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","'use strict';\n\nimport { module } from 'angular';\n\nimport { CloudProviderRegistry, DeploymentStrategyRegistry } from '@spinnaker/core';\n\nimport { COMMON_MODULE } from './common/common.module';\nimport './ecs.help';\nimport './ecs.settings';\nimport { ECS_CLUSTER_READ_SERVICE } from './ecsCluster/ecsCluster.read.service';\nimport { IAM_ROLE_READ_SERVICE } from './iamRoles/iamRole.read.service';\nimport { ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER } from './instance/details/instance.details.controller';\nimport { EcsLoadBalancerClusterContainer } from './loadBalancer/EcsLoadBalancerClusterContainer';\nimport { EcsLoadBalancerDetails } from './loadBalancer/details/loadBalancerDetails';\nimport { EcsTargetGroupDetails } from './loadBalancer/details/targetGroupDetails';\nimport { EcsLoadBalancerTransformer } from './loadBalancer/loadBalancer.transformer';\nimport { ECS_TARGET_GROUP_STATES } from './loadBalancer/targetGroup.states';\nimport ecsLogo from './logo/ecs.logo.svg';\nimport { METRIC_ALARM_READ_SERVICE } from './metricAlarm/metricAlarm.read.service';\nimport { ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE } from './pipeline/stages/destroyAsg/ecsDestroyAsgStage';\nimport { ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE } from './pipeline/stages/disableAsg/ecsDisableAsgStage';\nimport { ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE } from './pipeline/stages/disableCluster/ecsDisableClusterStage';\nimport { ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE } from './pipeline/stages/enableAsg/ecsEnableAsgStage';\nimport { ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE } from './pipeline/stages/findImageFromTags/ecsFindImageFromTagStage';\nimport { ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE } from './pipeline/stages/resizeAsg/ecsResizeAsgStage';\nimport { ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE } from './pipeline/stages/scaleDownCluster/ecsScaleDownClusterStage';\nimport { ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE } from './pipeline/stages/shrinkCluster/ecsShrinkClusterStage';\nimport { PLACEMENT_STRATEGY_SERVICE } from './placementStrategy/placementStrategy.service';\nimport { ECS_SECRET_READ_SERVICE } from './secrets/secret.read.service';\nimport { ECS_SECURITY_GROUP_MODULE } from './securityGroup/securityGroup.module';\nimport { ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE } from './serverGroup/configure/serverGroupCommandBuilder.service';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER } from './serverGroup/configure/wizard/CloneServerGroup.ecs.controller';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT } from './serverGroup/configure/wizard/advancedSettings/advancedSettings.component';\nimport { ECS_CAPACITY_PROVIDER_REACT } from './serverGroup/configure/wizard/capacityProvider/CapacityProvider';\nimport { CONTAINER_REACT } from './serverGroup/configure/wizard/container/Container';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT } from './serverGroup/configure/wizard/horizontalScaling/horizontalScaling.component';\nimport { ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER } from './serverGroup/configure/wizard/location/ServerGroupBasicSettings.controller';\nimport { ECS_SERVER_GROUP_LOGGING } from './serverGroup/configure/wizard/logging/logging.component';\nimport { ECS_NETWORKING_REACT } from './serverGroup/configure/wizard/networking/Networking';\nimport { SERVICE_DISCOVERY_REACT } from './serverGroup/configure/wizard/serviceDiscovery/ServiceDiscovery';\nimport { TASK_DEFINITION_REACT } from './serverGroup/configure/wizard/taskDefinition/TaskDefinition';\nimport { SERVER_GROUP_DETAILS_MODULE } from './serverGroup/details/serverGroupDetails.module';\nimport { ECS_SERVERGROUP_MODULE } from './serverGroup/serverGroup.module';\nimport { ECS_SERVER_GROUP_TRANSFORMER } from './serverGroup/serverGroup.transformer';\n\nimport './logo/ecs.logo.less';\n\nexport const ECS_MODULE = 'spinnaker.ecs';\nmodule(ECS_MODULE, [\n ECS_SERVERGROUP_CONFIGURE_WIZARD_CLONESERVERGROUP_ECS_CONTROLLER,\n SERVER_GROUP_DETAILS_MODULE,\n IAM_ROLE_READ_SERVICE,\n ECS_SERVER_GROUP_TRANSFORMER,\n // require('./pipeline/stages/cloneServerGroup/ecsCloneServerGroupStage').name, // TODO(Bruno Carrier): We should enable this on Clouddriver before revealing this stage\n ECS_SERVERGROUP_CONFIGURE_WIZARD_ADVANCEDSETTINGS_ADVANCEDSETTINGS_COMPONENT,\n ECS_SERVERGROUP_CONFIGURE_WIZARD_HORIZONTALSCALING_HORIZONTALSCALING_COMPONENT,\n TASK_DEFINITION_REACT,\n CONTAINER_REACT,\n ECS_NETWORKING_REACT,\n SERVICE_DISCOVERY_REACT,\n ECS_CAPACITY_PROVIDER_REACT,\n ECS_SERVER_GROUP_LOGGING,\n ECS_CLUSTER_READ_SERVICE,\n ECS_SECRET_READ_SERVICE,\n METRIC_ALARM_READ_SERVICE,\n PLACEMENT_STRATEGY_SERVICE,\n COMMON_MODULE,\n ECS_SERVERGROUP_CONFIGURE_WIZARD_LOCATION_SERVERGROUPBASICSETTINGS_CONTROLLER,\n ECS_SERVERGROUP_CONFIGURE_SERVERGROUPCOMMANDBUILDER_SERVICE,\n ECS_INSTANCE_DETAILS_INSTANCE_DETAILS_CONTROLLER,\n ECS_PIPELINE_STAGES_FINDIMAGEFROMTAGS_ECSFINDIMAGEFROMTAGSTAGE,\n ECS_PIPELINE_STAGES_DESTROYASG_ECSDESTROYASGSTAGE,\n ECS_PIPELINE_STAGES_DISABLEASG_ECSDISABLEASGSTAGE,\n ECS_PIPELINE_STAGES_DISABLECLUSTER_ECSDISABLECLUSTERSTAGE,\n ECS_PIPELINE_STAGES_ENABLEASG_ECSENABLEASGSTAGE,\n ECS_PIPELINE_STAGES_RESIZEASG_ECSRESIZEASGSTAGE,\n ECS_PIPELINE_STAGES_SCALEDOWNCLUSTER_ECSSCALEDOWNCLUSTERSTAGE,\n ECS_PIPELINE_STAGES_SHRINKCLUSTER_ECSSHRINKCLUSTERSTAGE,\n ECS_SECURITY_GROUP_MODULE,\n ECS_SERVERGROUP_MODULE,\n ECS_TARGET_GROUP_STATES,\n]).config(function () {\n CloudProviderRegistry.registerProvider('ecs', {\n name: 'EC2 Container Service',\n logo: { path: ecsLogo },\n serverGroup: {\n transformer: 'ecsServerGroupTransformer',\n detailsTemplateUrl: require('./serverGroup/details/serverGroupDetails.html'),\n detailsController: 'ecsServerGroupDetailsCtrl',\n cloneServerGroupTemplateUrl: require('./serverGroup/configure/wizard/serverGroupWizard.html'),\n cloneServerGroupController: 'ecsCloneServerGroupCtrl',\n commandBuilder: 'ecsServerGroupCommandBuilder',\n // configurationService: 'ecsServerGroupConfigurationService',\n scalingActivitiesEnabled: false,\n skipUpstreamStageCheck: true,\n },\n loadBalancer: {\n transformer: EcsLoadBalancerTransformer,\n ClusterContainer: EcsLoadBalancerClusterContainer,\n targetGroupDetails: EcsTargetGroupDetails,\n details: EcsLoadBalancerDetails,\n },\n instance: {\n detailsTemplateUrl: require('./instance/details/instanceDetails.html'),\n detailsController: 'ecsInstanceDetailsCtrl',\n },\n securityGroup: {\n transformer: 'ecsSecurityGroupTransformer',\n reader: 'ecsSecurityGroupReader',\n detailsTemplateUrl: require('./securityGroup/details/securityGroupDetail.html'),\n detailsController: 'ecsSecurityGroupDetailsCtrl',\n },\n });\n});\n\nDeploymentStrategyRegistry.registerProvider('ecs', ['redblack']);\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;AAGA,MAAM,eAAqC,GAAA;AAAA,EACzC,QAAU,EAAA;AAAA,IACR,MAAQ,EAAA,GAAA;AAAA,IACR,OAAS,EAAA,GAAA;AAAA,IACT,MAAQ,EAAA,GAAA;AAAA,IACR,OAAS,EAAA,IAAA;AAAA,IACT,YAAc,EAAA,IAAA;AAAA,GAAA;AAAA,EAEhB,QAAU,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAaV,YAAY,MAAM;AAAA,GAAA;AAAA,CAAA,CAAA;AAGb,MAAM,oBAAuB,GAAA,sBAAA,CAAA;AACpC,MAAO,CAAA,oBAAA,EAAsB,EAAI,CAAA,CAAA,SAAA,CAAU,WAAa,EAAA,eAAA,CAAA;;ACxBjD,MAAM,aAAgB,GAAA,sBAAA,CAAA;AAC7B,MAAA,CAAO,eAAe,CAAC,oBAAA,CAAA,CAAA;;ACHvB,MAAM,YAA0C,GAAA;AAAA,EAC9C,8BACE,EAAA,oQAAA;AAAA,EACF,6BACE,EAAA,iNAAA;AAAA,EACF,sCACE,EAAA,iFAAA;AAAA,EACF,uBACE,EAAA,qPAAA;AAAA,EACF,wBACE,EAAA,oQAAA;AAAA,EACF,wBACE,EAAA,4LAAA;AAAA,EACF,sBAAwB,EAAA,2EAAA;AAAA,EACxB,sBACE,EAAA,kPAAA;AAAA,EACF,sBAAwB,EAAA,mFAAA;AAAA,EACxB,oCACE,EAAA,iRAAA;AAAA,EACF,8BACE,EAAA,yKAAA;AAAA,EACF,8BAAgC,EAAA,6EAAA;AAAA,EAChC,aACE,EAAA,sJAAA;AAAA,EACF,iBAAmB,EAAA,uDAAA;AAAA,EACnB,4BACE,EAAA,+JAAA;AAAA,EACF,0BACE,EAAA,sMAAA;AAAA,EACF,6BACE,EAAA,oMAAA;AAAA,EACF,mCACE,EAAA,6OAAA;AAAA,EACF,uBACE,EAAA,2VAAA;AAAA,EACF,qBAAuB,EAAA,iDAAA;AAAA,EACvB,oCAAsC,EAAA,oDAAA;AAAA,EACtC,kDACE,EAAA,yGAAA;AAAA,EACF,gBAAkB,EAAA,sEAAA;AAAA,EAClB,uBACE,EAAA,qGAAA;AAAA,EACF,cAAgB,EAAA,iDAAA;AAAA,EAChB,iBACE,EAAA,wKAAA;AAAA,EACF,YACE,EAAA,oIAAA;AAAA,EACF,oBAAsB,EAAA,yEAAA;AAAA,EACtB,kBACE,EAAA,ycAAA;AAAA,EACF,eACE,EAAA,CAAA,kNAAA,CAAA;AAAA,EACF,gBACE,EAAA,oKAAA;AAAA,EACF,oBACE,EAAA,uPAAA;AAAA,EACF,4BAA8B,EAAA,yDAAA;AAAA,EAC9B,uBACE,EAAA,gOAAA;AAAA,EACF,0BACE,EAAA,4QAAA;AAAA,EACF,2BAA6B,EAAA,4DAAA;AAAA,EAC7B,yBACE,EAAA,6PAAA;AAAA,EACF,2BACE,EAAA,8JAAA;AAAA,EACF,UAAY,EAAA,6DAAA;AAAA,EACZ,0BACE,EAAA,+MAAA;AAAA,EACF,sBAAwB,EAAA,iFAAA;AAAA,EACxB,8BAAgC,EAAA,4EAAA;AAAA,EAChC,mCACE,EAAA,+LAAA;AAAA,EACF,mCACE,EAAA,2HAAA;AAAA,EACF,oBACE,EAAA,yUAAA;AAAA,EACF,8BACE,EAAA,8SAAA;AAAA,EACF,0BAA4B,EAAA,iDAAA;AAAA,EAC5B,0BACE,EAAA,yLAAA;AAAA,EACF,4BACE,EAAA,kIAAA;AAAA,EACF,wBACE,EAAA,CAAA,6SAAA,CAAA;AAAA,CAAA,CAAA;AAGJ,MAAO,CAAA,IAAA,CAAK,cAAc,OAAQ,CAAA,CAAC,QAAQ,oBAAqB,CAAA,QAAA,CAAS,KAAK,YAAa,CAAA,GAAA,CAAA,CAAA,CAAA;;AC/E9E,MAAA,oBAAA,GAA8C,QAAS,CAAA,SAAA,CAAU,GAAgC,IAAA;AAAA,EAC5G,QAAU,EAAA,EAAA;AAAA,CAAA,CAAA;AAEZ,IAAI,oBAAsB,EAAA;AACxB,EAAqB,oBAAA,CAAA,eAAA,GAAkB,SAAS,aAAc,CAAA,KAAA,CAAA,CAAA;AAAA;;ACRlC,MAAA,gBAAA,CAAA;AAAA,EACrB,YAAqD,GAAA;AAC1D,IAAA,OAAO,KAAK,kBAAoB,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAG3B,gBAAA,CAAiB,SAAiB,MAA4D,EAAA;AACnG,IAAI,IAAA,OAAA,IAAW,IAAQ,IAAA,MAAA,IAAU,IAAM,EAAA;AACrC,MAAA,OAAO,IAAK,CAAA,6BAAA,CAAA,CAA+B,IAAK,CAAA,OAAA,CAAA,CAAS,KAAK,MAAQ,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,KAAA;AAExE,IAAO,OAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIJ,MAAM,wBAA2B,GAAA,uCAAA,CAAA;AAExC,MAAO,CAAA,wBAAA,EAA0B,EAAI,CAAA,CAAA,OAAA,CAAQ,kBAAoB,EAAA,gBAAA,CAAA;;ACjBtC,MAAA,aAAA,CAAA;AAAA,EAClB,UAAU,QAAkD,EAAA;AACjE,IAAO,OAAA,IAAA,CAAK,QAAU,CAAA,CAAA,IAAA,CAAK,QAAU,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIlC,MAAM,qBAAwB,GAAA,oCAAA,CAAA;AAErC,MAAO,CAAA,qBAAA,EAAuB,EAAI,CAAA,CAAA,OAAA,CAAQ,eAAiB,EAAA,aAAA,CAAA;;ACIpD,MAAM,gDAAmD,GAAA,2CAAA,CAAA;AAEhE,MAAA,CAAO,gDAAkD,EAAA,CAAC,kBAAoB,EAAA,oBAAA,CAAA,CAAA,CAAuB,WACnG,wBACA,EAAA;AAAA,EACE,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAU,QAAQ,MAAQ,EAAA,SAAA,EAAW,UAAU,GAAK,EAAA,OAAA,EAAS,WAAa,EAAA,EAAA,EAAI,SAAW,EAAA;AAEvF,IAAO,MAAA,CAAA,kBAAA,GAAqB,qBAAsB,CAAA,QAAA,CAAS,KAAO,EAAA,6BAAA,CAAA,CAAA;AAElE,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,OAAS,EAAA,IAAA;AAAA,MACT,YAAY,GAAI,CAAA,YAAA;AAAA,MAChB,cAAc,CAAE,CAAA,GAAA,CAAI,GAAK,EAAA,yBAAA,CAAA,IAA8B,SAAS,mBAAuB,IAAA,EAAA;AAAA,KAAA,CAAA;AAGzF,IAAA,MAAA,CAAO,WAAc,GAAA,GAAA,CAAA;AACrB,IAAA,MAAA,CAAO,OAAU,GAAA,OAAA,CAAA;AACjB,IAAA,MAAA,CAAO,WAAc,GAAA,WAAA,CAAA;AAErB,IAAA,MAAM,aAAgB,GAAA,KAAA,CAAA;AACtB,IAAA,MAAM,uBAAuB,EAAE,aAAA,EAAA,CAAA;AAE/B,IAAA,SAAA,oBAAA,CAA8B,WAAU,MAAQ,EAAA;AAE9C,MAAA,IAAI,IAAI,YAAc,EAAA;AACpB,QAAA,SAAA,CAAS,SAAS,MAAO,CAAA,MAAA,CAAA;AAAA,OAAA;AAG3B,MAAS,SAAA,CAAA,MAAA,GAAS,UAAS,MAAU,IAAA,EAAA,CAAA;AACrC,MAAA,MAAM,kBAAqB,GAAA,SAAA,CAAS,MAAO,CAAA,MAAA,CAAO,SAAU,MAAQ,EAAA;AAClE,QAAA,OAAO,MAAO,CAAA,IAAA,KAAS,KAAS,IAAA,MAAA,CAAO,KAAU,KAAA,SAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAInD,MAAM,MAAA,YAAA,GAAe,kBAAmB,CAAA,GAAA,CAAI,aAAc,CAAA,IAAA,CAAA,CAAA;AAC1D,MAAmC,kCAAA,CAAA,kBAAA,EAAoB,cAAc,SAAS,CAAA,OAAA,CAAA,CAAA;AAG9E,MAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,QAAmB,kBAAA,CAAA,OAAA,CAAQ,SAAU,MAAQ,EAAA;AAC3C,UAAA,MAAM,YAAe,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,CAAO,SAAU,YAAc,EAAA;AAChE,YAAO,OAAA,YAAA,CAAa,SAAS,MAAO,CAAA,IAAA,CAAA;AAAA,WAAA,CAAA,CAAA;AAEtC,UAAA,IAAI,aAAa,MAAQ,EAAA;AACvB,YAAE,CAAA,CAAA,QAAA,CAAS,QAAQ,YAAa,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA;AAItC,MAAA,MAAA,CAAO,aAAgB,GAAA,kBAAA,CAAA;AAAA,KAAA;AAGzB,IAA4B,SAAA,gBAAA,GAAA;AAC1B,MAAA,MAAM,SAAY,GAAA,EAAA,CAAA;AAClB,MAAA,IAAI,eAAiB,EAAA,aAAA,EAAe,WAAa,EAAA,OAAA,EAAS,MAAQ,EAAA,KAAA,CAAA;AAClE,MAAI,IAAA,CAAC,IAAI,YAAc,EAAA;AAErB,QAAkB,eAAA,GAAA,EAAA,CAAA;AAClB,QAAgB,aAAA,GAAA,EAAA,CAAA;AAChB,QAAc,WAAA,GAAA,EAAA,CAAA;AACd,QAAA,OAAA,GAAU,QAAS,CAAA,OAAA,CAAA;AACnB,QAAA,MAAA,GAAS,QAAS,CAAA,MAAA,CAAA;AAAA,OACb,MAAA;AACL,QAAA,GAAA,CAAI,YAAa,CAAA,IAAA,CAAK,IAAK,CAAA,SAAU,WAAa,EAAA;AAChD,UAAA,OAAO,WAAY,CAAA,SAAA,CAAU,IAAK,CAAA,SAAU,gBAAkB,EAAA;AAC5D,YAAI,IAAA,gBAAA,CAAiB,EAAO,KAAA,QAAA,CAAS,UAAY,EAAA;AAC/C,cAAkB,eAAA,GAAA,gBAAA,CAAA;AAClB,cAAA,aAAA,GAAgB,WAAY,CAAA,aAAA,CAAA;AAC5B,cAAA,WAAA,GAAc,WAAY,CAAA,WAAA,CAAA;AAC1B,cAAA,OAAA,GAAU,WAAY,CAAA,OAAA,CAAA;AACtB,cAAA,MAAA,GAAS,WAAY,CAAA,MAAA,CAAA;AACrB,cAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAA;AACpB,cAAA,SAAA,CAAU,cAAc,WAAY,CAAA,IAAA,CAAA;AACpC,cAAA,SAAA,CAAU,QAAQ,WAAY,CAAA,KAAA,CAAA;AAC9B,cAAO,OAAA,IAAA,CAAA;AAAA,aAAA;AAAA,WAAA,CAAA,CAAA;AAAA,SAAA,CAAA,CAAA;AAIb,QAAA,IAAI,CAAC,eAAiB,EAAA;AAEpB,UAAA,GAAA,CAAI,aAAc,CAAA,IAAA,CAAK,IAAK,CAAA,SAAU,YAAc,EAAA;AAClD,YAAA,OACE,YAAa,CAAA,SAAA,CAAU,IAAK,CAAA,SAAU,gBAAkB,EAAA;AACtD,cAAI,IAAA,gBAAA,CAAiB,EAAO,KAAA,QAAA,CAAS,UAAY,EAAA;AAC/C,gBAAkB,eAAA,GAAA,gBAAA,CAAA;AAClB,gBAAA,aAAA,GAAgB,CAAC,YAAa,CAAA,IAAA,CAAA,CAAA;AAC9B,gBAAA,OAAA,GAAU,YAAa,CAAA,OAAA,CAAA;AACvB,gBAAA,MAAA,GAAS,YAAa,CAAA,MAAA,CAAA;AACtB,gBAAA,KAAA,GAAQ,YAAa,CAAA,KAAA,CAAA;AACrB,gBAAO,OAAA,IAAA,CAAA;AAAA,eAAA;AAAA,aAAA,CAAA,IAGX,YAAa,CAAA,WAAA,CAAY,IAAK,CAAA,SAAU,YAAa,EAAA;AACnD,cAAA,OAAO,YAAY,CAAA,SAAA,CAAU,IAAK,CAAA,SAAU,gBAAkB,EAAA;AAC5D,gBAAI,IAAA,gBAAA,CAAiB,EAAO,KAAA,QAAA,CAAS,UAAY,EAAA;AAC/C,kBAAkB,eAAA,GAAA,gBAAA,CAAA;AAClB,kBAAA,YAAA,GAAc,YAAY,CAAA,IAAA,CAAA;AAC1B,kBAAA,OAAA,GAAU,YAAa,CAAA,OAAA,CAAA;AACvB,kBAAA,MAAA,GAAS,YAAa,CAAA,MAAA,CAAA;AACtB,kBAAA,KAAA,GAAQ,YAAa,CAAA,KAAA,CAAA;AACrB,kBAAO,OAAA,IAAA,CAAA;AAAA,iBAAA;AAAA,eAAA,CAAA,CAAA;AAAA,aAAA,CAAA,CAAA;AAAA,WAAA,CAAA,CAAA;AAMjB,UAAA,IAAI,CAAC,eAAiB,EAAA;AAEpB,YAAA,GAAA,CAAI,aAAc,CAAA,IAAA,CAAK,IAAK,CAAA,SAAU,YAAc,EAAA;AAClD,cAAA,OACE,YAAa,CAAA,YAAA,CAAa,IAAK,CAAA,SAAU,WAAa,EAAA;AACpD,gBAAI,IAAA,CAAC,YAAY,UAAY,EAAA;AAC3B,kBAAO,OAAA,KAAA,CAAA;AAAA,iBAAA;AAET,gBAAA,OAAO,WAAY,CAAA,SAAA,CAAU,IAAK,CAAA,SAAU,gBAAkB,EAAA;AAC5D,kBAAI,IAAA,gBAAA,CAAiB,EAAO,KAAA,QAAA,CAAS,UAAY,EAAA;AAC/C,oBAAkB,eAAA,GAAA,gBAAA,CAAA;AAClB,oBAAA,aAAA,GAAgB,CAAC,YAAa,CAAA,IAAA,CAAA,CAAA;AAC9B,oBAAA,OAAA,GAAU,YAAa,CAAA,OAAA,CAAA;AACvB,oBAAA,MAAA,GAAS,YAAa,CAAA,MAAA,CAAA;AACtB,oBAAA,KAAA,GAAQ,YAAa,CAAA,KAAA,CAAA;AACrB,oBAAO,OAAA,IAAA,CAAA;AAAA,mBAAA;AAAA,iBAAA,CAAA,CAAA;AAAA,eAAA,CAAA,IAIb,YAAa,CAAA,WAAA,CAAY,IAAK,CAAA,SAAU,YAAa,EAAA;AACnD,gBAAY,YAAA,CAAA,YAAA,CAAa,IAAK,CAAA,SAAU,WAAa,EAAA;AACnD,kBAAI,IAAA,CAAC,YAAY,UAAY,EAAA;AAC3B,oBAAO,OAAA,KAAA,CAAA;AAAA,mBAAA;AAET,kBAAA,OAAO,WAAY,CAAA,SAAA,CAAU,IAAK,CAAA,SAAU,gBAAkB,EAAA;AAC5D,oBAAI,IAAA,gBAAA,CAAiB,EAAO,KAAA,QAAA,CAAS,UAAY,EAAA;AAC/C,sBAAkB,eAAA,GAAA,gBAAA,CAAA;AAClB,sBAAA,aAAA,GAAgB,CAAC,YAAa,CAAA,IAAA,CAAA,CAAA;AAC9B,sBAAA,OAAA,GAAU,YAAa,CAAA,OAAA,CAAA;AACvB,sBAAA,MAAA,GAAS,YAAa,CAAA,MAAA,CAAA;AACtB,sBAAA,KAAA,GAAQ,YAAa,CAAA,KAAA,CAAA;AACrB,sBAAO,OAAA,IAAA,CAAA;AAAA,qBAAA;AAAA,mBAAA,CAAA,CAAA;AAAA,iBAAA,CAAA,CAAA;AAAA,eAAA,CAAA,CAAA;AAAA,aAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OAAA;AAWzB,MAAI,IAAA,eAAA,IAAmB,WAAW,MAAQ,EAAA;AACxC,QAAA,eAAA,CAAgB,OAAU,GAAA,OAAA,CAAA;AAC1B,QAAA,SAAA,CAAU,OAAU,GAAA,OAAA,CAAA;AACpB,QAAA,SAAA,CAAU,MAAS,GAAA,MAAA,CAAA;AACnB,QAAA,oBAAA,CAAqB,qBAAqB,WAAa,EAAA,SAAA,CAAA,CAAA;AACvD,QAAO,OAAA,cAAA,CAAe,mBAAmB,OAAS,EAAA,MAAA,EAAQ,SAAS,UAAY,CAAA,CAAA,IAAA,CAAK,CAAC,OAAY,KAAA;AAC/F,UAAA,IAAI,OAAO,WAAa,EAAA;AACtB,YAAA,OAAA;AAAA,WAAA;AAEF,UAAA,MAAA,CAAO,MAAM,OAAU,GAAA,KAAA,CAAA;AACvB,UAAA,oBAAA,CAAqB,eAAiB,EAAA,OAAA,CAAA,CAAA;AACtC,UAAO,MAAA,CAAA,QAAA,GAAW,CAAE,CAAA,QAAA,CAAS,OAAS,EAAA,eAAA,CAAA,CAAA;AACtC,UAAA,MAAA,CAAO,SAAS,OAAU,GAAA,OAAA,CAAA;AAC1B,UAAA,MAAA,CAAO,SAAS,MAAS,GAAA,MAAA,CAAA;AACzB,UAAA,MAAA,CAAO,SAAS,KAAQ,GAAA,KAAA,CAAA;AACxB,UAAA,MAAA,CAAO,SAAS,aAAgB,GAAA,aAAA,CAAA;AAChC,UAAA,MAAA,CAAO,SAAS,WAAc,GAAA,WAAA,CAAA;AAC9B,UAAI,IAAA,MAAA,CAAO,SAAS,iBAAmB,EAAA;AACrC,YAAM,MAAA,0BAAA,GAA6B,OAAO,QAAS,CAAA,iBAAA,CAAkB,OACnE,CAAC,CAAA,KAAM,CAAE,CAAA,UAAA,CAAW,mBAAwB,KAAA,KAAA,CAAA,CAAA;AAE9C,YAAA,IAAI,2BAA2B,MAAQ,EAAA;AACrC,cAAA,MAAA,CAAO,SAAS,YAAe,GAAA,0BAAA,CAA2B,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,gBAAA,CAAA,CAAA;AAAA,aAAA;AAAA,WAAA;AAG3E,UAAO,MAAA,CAAA,aAAA,GAAgB,OAAQ,CAAA,aAAA,IAAiB,OAAQ,CAAA,gBAAA,CAAA;AACxD,UAAA,IAAI,UAAU,qBAAuB,EAAA;AACnC,YAAU,SAAA,CAAA,qBAAA,EAAA,CAAA;AAAA,WAAA;AAAA,SAEX,EAAA,SAAA,CAAA,CAAA;AAAA,OAAA;AAGL,MAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,QAAA,MAAA,CAAO,qBAAqB,QAAS,CAAA,UAAA,CAAA;AACrC,QAAA,MAAA,CAAO,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,OAAA;AAGzB,MAAA,OAAO,GAAG,IAAK,CAAA,IAAA,CAAA,CAAA;AAAA,KAAA;AAGjB,IAAqB,SAAA,SAAA,GAAA;AACnB,MAAA,IAAI,OAAO,WAAa,EAAA;AACtB,QAAA,OAAA;AAAA,OAAA;AAEF,MAAA,IAAI,IAAI,YAAc,EAAA;AACpB,QAAA,MAAA,CAAO,MAAM,OAAU,GAAA,KAAA,CAAA;AACvB,QAAA,MAAA,CAAO,qBAAqB,QAAS,CAAA,UAAA,CAAA;AACrC,QAAA,MAAA,CAAO,MAAM,kBAAqB,GAAA,IAAA,CAAA;AAClC,QAAA,oBAAA,CAAqB,cAAe,CAAA,WAAA,CAAA,CAAA;AAAA,OAC/B,MAAA;AACL,QAAA,MAAA,CAAO,GAAG,GAAK,EAAA,EAAE,oBAAsB,EAAA,IAAA,EAAA,EAAQ,EAAE,QAAU,EAAA,SAAA,EAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAI/D,IAAA,IAAA,CAAK,2BAA2B,WAAY;AAC1C,MAAA,MAAM,YAAW,MAAO,CAAA,QAAA,CAAA;AACxB,MAAM,MAAA,aAAA,GAAgB,UAAS,MAAU,IAAA,EAAA,CAAA;AACzC,MAAA,MAAM,eAAkB,GAAA,aAAA,CAAc,MAAO,CAAA,SAAU,MAAQ,EAAA;AAC7D,QAAA,OAAO,OAAO,IAAS,KAAA,WAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAEzB,MAAA,OAAO,eAAgB,CAAA,MAAA,GAAS,eAAgB,CAAA,CAAA,CAAA,CAAG,UAAU,cAAiB,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA;AAGhF,IAAA,IAAA,CAAK,oBAAoB,SAA6B,iBAAA,GAAA;AACpD,MAAA,MAAM,YAAW,MAAO,CAAA,QAAA,CAAA;AAExB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,iBAAiB,SAAS,CAAA,UAAA;AAAA,QACjC,gBAAgB,WAAY;AAC1B,UAAA,IAAI,OAAO,QAAS,CAAA,oBAAA,EAAsB,EAAE,UAAA,EAAY,UAAS,UAAe,EAAA,CAAA,EAAA;AAC9E,YAAA,MAAA,CAAO,EAAG,CAAA,GAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OAAA,CAAA;AAKhB,MAAA,MAAM,eAAe,WAAY;AAC/B,QAAO,OAAA,cAAA,CAAe,iBAAkB,CAAA,SAAA,EAAU,GAAK,EAAA,oBAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAGzD,MAAA,wBAAA,CAAyB,OAAQ,CAAA;AAAA,QAC/B,MAAA,EAAQ,mBAAsB,GAAA,SAAA,CAAS,UAAa,GAAA,GAAA;AAAA,QACpD,UAAA,EAAY,eAAe,SAAS,CAAA,UAAA;AAAA,QACpC,SAAS,SAAS,CAAA,OAAA;AAAA,QAClB,iBAAmB,EAAA,WAAA;AAAA,QACnB,YAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIJ,IAAA,IAAA,CAAK,wCAAwC,SAAiD,qCAAA,GAAA;AAC5F,MAAA,MAAM,YAAW,MAAO,CAAA,QAAA,CAAA;AAExB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,cAAiB,GAAA,SAAA,CAAS,UAAa,GAAA,6BAAA;AAAA,QAC9C,gBAAgB,WAAY;AAC1B,UAAA,IAAI,OAAO,QAAS,CAAA,oBAAA,EAAsB,EAAE,UAAA,EAAY,UAAS,UAAe,EAAA,CAAA,EAAA;AAC9E,YAAA,MAAA,CAAO,EAAG,CAAA,GAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OAAA,CAAA;AAKhB,MAAA,MAAM,eAAe,WAAY;AAC/B,QAAO,OAAA,cAAA,CAAe,qCAAsC,CAAA,SAAA,EAAU,GAAK,EAAA,oBAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAG7E,MAAA,wBAAA,CAAyB,OAAQ,CAAA;AAAA,QAC/B,QAAQ,mBAAsB,GAAA,SAAA,CAAS,UAAa,GAAA,cAAA,GAAiB,UAAS,WAAc,GAAA,GAAA;AAAA,QAC5F,UAAY,EAAA,YAAA,GAAe,SAAS,CAAA,UAAA,GAAa,iBAAiB,SAAS,CAAA,WAAA;AAAA,QAC3E,SAAS,SAAS,CAAA,OAAA;AAAA,QAClB,iBAAmB,EAAA,WAAA;AAAA,QACnB,YAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIJ,IAAA,IAAA,CAAK,4BAA4B,SAAqC,yBAAA,GAAA;AACpE,MAAA,MAAM,YAAW,MAAO,CAAA,QAAA,CAAA;AAExB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,WAAc,GAAA,SAAA,CAAS,UAAa,GAAA,eAAA;AAAA,OAAA,CAAA;AAG7C,MAAA,MAAM,eAAe,WAAY;AAC/B,QAAO,OAAA,cAAA,CAAe,yBAA0B,CAAA,SAAA,EAAU,GAAK,EAAA,oBAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAGjE,MAAA,wBAAA,CAAyB,OAAQ,CAAA;AAAA,QAC/B,MAAA,EAAQ,gBAAmB,GAAA,SAAA,CAAS,UAAa,GAAA,gBAAA;AAAA,QACjD,UAAA,EAAY,YAAY,SAAS,CAAA,UAAA;AAAA,QACjC,SAAS,SAAS,CAAA,OAAA;AAAA,QAClB,iBAAmB,EAAA,WAAA;AAAA,QACnB,YAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIJ,IAAA,IAAA,CAAK,6BAA6B,SAAsC,0BAAA,GAAA;AACtE,MAAA,MAAM,YAAW,MAAO,CAAA,QAAA,CAAA;AAExB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,YAAe,GAAA,SAAA,CAAS,UAAa,GAAA,eAAA;AAAA,OAAA,CAAA;AAG9C,MAAA,MAAM,eAAe,WAAY;AAC/B,QAAO,OAAA,cAAA,CAAe,0BAA2B,CAAA,SAAA,EAAU,GAAK,EAAA,oBAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAGlE,MAAA,wBAAA,CAAyB,OAAQ,CAAA;AAAA,QAC/B,MAAA,EAAQ,iBAAoB,GAAA,SAAA,CAAS,UAAa,GAAA,gBAAA;AAAA,QAClD,UAAA,EAAY,aAAa,SAAS,CAAA,UAAA;AAAA,QAClC,SAAS,SAAS,CAAA,OAAA;AAAA,QAClB,iBAAmB,EAAA,WAAA;AAAA,QACnB,YAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIJ,IAAK,IAAA,CAAA,cAAA,GAAiB,SAAwB,cAAA,CAAA,kBAAA,EAAoB,KAAO,EAAA;AACvE,MAAA,MAAM,YAAW,MAAO,CAAA,QAAA,CAAA;AACxB,MAAM,MAAA,aAAA,GAAgB,UAAS,MAAU,IAAA,EAAA,CAAA;AACzC,MAAO,OAAA,aAAA,CAAc,IAAK,CAAA,SAAU,MAAQ,EAAA;AAC1C,QAAA,OAAO,MAAO,CAAA,IAAA,KAAS,kBAAsB,IAAA,MAAA,CAAO,KAAU,KAAA,KAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIlE,IAAA,MAAM,UAAa,GAAA,GAAA,CAAI,YACnB,GAAA,gBAAA,EAAA,GACA,EAAG,CAAA,GAAA,CAAI,CAAC,GAAA,CAAI,YAAa,CAAA,KAAA,EAAA,EAAS,GAAI,CAAA,aAAA,CAAc,UAAU,IAAK,CAAA,gBAAA,CAAA,CAAA;AAEvE,IAAA,UAAA,CAAW,KAAK,MAAM;AAKpB,MAAA,IAAI,CAAC,MAAA,CAAO,WAAe,IAAA,CAAC,IAAI,YAAc,EAAA;AAC5C,QAAI,GAAA,CAAA,YAAA,CAAa,UAAU,MAAQ,EAAA,gBAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAIvC,IAAA,MAAA,CAAO,UAAU,QAAS,CAAA,OAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;ACjVzB,MAAA,cAAA,SAA6BA,eAAM,SAAgC,CAAA;AAAA,EACjE,MAA6C,GAAA;AAClD,IAAA,MAAM,EAAE,WAAA,EAAa,YAAc,EAAA,gBAAA,EAAA,GAAqB,IAAK,CAAA,KAAA,CAAA;AAE7D,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,kBAAkB,YAAa,CAAA,IAAA;AAAA,MAC/B,QAAQ,WAAY,CAAA,MAAA;AAAA,MACpB,WAAW,WAAY,CAAA,OAAA;AAAA,MACvB,MAAM,WAAY,CAAA,eAAA;AAAA,MAClB,OAAO,WAAY,CAAA,KAAA;AAAA,MACnB,UAAU,WAAY,CAAA,aAAA;AAAA,KAAA,CAAA;AAKxB,IAAA,MAAM,mBAAuC,GAAA;AAAA,MAC3C,EAAI,EAAA,KAAA,CAAA;AAAA,MACJ,IAAM,EAAA,KAAA,CAAA;AAAA,MACN,QAAU,EAAA,KAAA,CAAA;AAAA,MACV,SAAW,EAAA,KAAA,CAAA;AAAA,MACX,MAAQ,EAAA,KAAA,CAAA;AAAA,MACR,OAAS,EAAA,KAAA,CAAA;AAAA,MACT,YAAc,EAAA,KAAA,CAAA;AAAA,KAAA,CAAA;AAGhB,IAAA,oDACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,mDAAA;AAAA,KAAA,+CACZ,YAAD,EAAA;AAAA,MAAc,KAAM,EAAA,QAAA;AAAA,KAAA,+CACjB,MAAD,EAAA;AAAA,MAAQ,EAAG,EAAA,wBAAA;AAAA,MAAyB,MAAA;AAAA,KAAA,+CACjC,KAAD,EAAA;AAAA,MAAK,SAAW,EAAA,CAAA,2DAAA,CAAA;AAAA,KAAA,+CACb,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,6BAAA;AAAA,KAAA,EAA+B,YAAY,eAI/D,CAAA,CAAA,CAAA,CAAA,EAAA,gBAAA,IACC,YAAY,YAAa,CAAA,GAAA,CAAI,CAAC,MAAW,KAAA;AACvC,MAAA,oDACG,uBAAD,EAAA;AAAA,QACE,GAAK,EAAA,MAAA;AAAA,QACL,SAAS,WAAY,CAAA,OAAA;AAAA,QACrB,QAAQ,WAAY,CAAA,MAAA;AAAA,QACpB,WAAa,EAAA;AAAA,UACX,SAAS,WAAY,CAAA,OAAA;AAAA,UACrB,eAAe,WAAY,CAAA,aAAA;AAAA,UAC3B,OAAS,EAAA,MAAA;AAAA,UACT,cAAgB,EAAA,mBAAA;AAAA,UAChB,WAAW,WAAY,CAAA,SAAA;AAAA,UACvB,IAAM,EAAA,MAAA;AAAA,UACN,MAAM,WAAY,CAAA,IAAA;AAAA,UAClB,QAAQ,WAAY,CAAA,MAAA;AAAA,SAAA;AAAA,QAEtB,aAAe,EAAA,KAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AC1DxB,MAAA,+BAAA,SAA8CA,eAAM,SAA8C,CAAA;AAAA,EAChG,sBAAsB,SAA+C,EAAA;AAC1E,IAAA,MAAM,qBAAqB,MACzB,CAAC,QACE,CAAU,SAAA,CAAA,YAAA,IAAgB,IAAI,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,CAAA,EAC3C,MAAK,KAAM,CAAA,YAAA,IAAgB,IAAI,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,IAAA,CAAA,CAAA,CAAA;AAEjD,IAAM,MAAA,kBAAA,GAAqB,MACzB,CAAC,OAAA,CACG,WAAU,YAAkC,CAAA,YAAA,IAAgB,IAAI,GAAI,CAAA,CAAC,MAAM,CAAE,CAAA,eAAA,CAAA,EAC7E,MAAK,KAAM,CAAA,YAAA,CAAkC,gBAAgB,EAAI,EAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,eAAA,CAAA,CAAA,CAAA;AAEpF,IAAA,OACE,SAAU,CAAA,aAAA,KAAkB,IAAK,CAAA,KAAA,CAAM,iBACvC,SAAU,CAAA,gBAAA,KAAqB,IAAK,CAAA,KAAA,CAAM,oBAC1C,SAAU,CAAA,YAAA,KAAiB,IAAK,CAAA,KAAA,CAAM,gBACtC,kBACA,EAAA,IAAA,kBAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAIG,MAA8D,GAAA;AACnE,IAAA,MAAM,EAAE,YAAA,EAAc,aAAe,EAAA,gBAAA,EAAA,GAAqB,IAAK,CAAA,KAAA,CAAA;AAC/D,IAAA,MAAM,EAAK,GAAA,YAAA,CAAA;AAEX,IAAA,MAAM,YAAe,GAAA,EAAA,CAAG,YAAa,CAAA,GAAA,CAAI,CAAC,WAAgB,KAAA;AACxD,MAAA,oDACG,cAAD,EAAA;AAAA,QACE,KAAK,WAAY,CAAA,eAAA;AAAA,QACjB,YAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAKN,IAAA,oDAAQ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,mBAAA;AAAA,KAAqB,EAAA,YAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACrCxC,MAAA,WAAA,SAA0BA,eAAM,SAA6B,CAAA;AAAA,EAClE,YAAY,KAA0B,EAAA;AACpC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGA,0BAA0B,GAAqB,EAAA;AACrD,IAAM,MAAA,KAAA,GAAQ,IAAI,KAAM,CAAA,GAAA,CAAA,CAAA;AACxB,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAO,OAAA,GAAA,CAAA;AAAA,KAAA;AAET,IAAA,OAAO,KAAM,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGR,MAA0C,GAAA;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAM,QAAU,EAAA,cAAA,EAAA,GAAmB,KAAK,KAAM,CAAA,QAAA,CAAA;AAGtD,IACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,MACG,QAAS,EAAA,GAAA,EAAE,IAEd,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,KAAA,EAAO,EAAE,WAAa,EAAA,EAAA,EAAA;AAAA,KACzB,kBAAAA,cAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,EAAG,iBACH,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,EACG,cAAe,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,CAAM,KAAA;AACjC,MAAI,IAAA,MAAA,CAAO,QAAQ,SAAW,EAAA;AAC5B,QAAA,oDACG,IAAD,EAAA;AAAA,UAAI,GAAK,EAAA,CAAA;AAAA,SAAG,EAAA,QAAA,+CAET,GAAD,EAAA;AAAA,UAAG,SAAU,EAAA,6BAAA;AAAA,UAA8B,aAAY,EAAA,MAAA;AAAA,SACvD,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,EAAA,IAAA,EACG,MAAO,CAAA,cAAA,IACN,OAAO,aAAc,CAAA,YAAA,CAAa,GAAI,CAAA,CAAC,EAAO,KAAA;AAC5C,UAAO,OAAA,IAAA,CAAK,0BAA0B,EAAG,CAAA,cAAA,CAAA,CAAA;AAAA,SAAA,CAAA,CAAA,CAAA,CAAA;AAAA,OAK9C,MAAA;AACL,QAAA,oDACG,IAAD,EAAA;AAAA,UAAI,GAAK,EAAA,CAAA;AAAA,SAAA,EACN,MAAO,CAAA,IAAA,EAAK,GAAE,EAAA,GAAA,EACd,OAAO,cAAe,CAAA,UAAA,IACrB,MAAO,CAAA,mBAAA,CAAoB,UAC3B,IAAA,MAAA,CAAO,sBAAuB,CAAA,QAAA,IAC9B,OAAO,+BAAgC,CAAA,cAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACzBtD,MAAA,sBAAA,SAAqCA,eAAM,SAGhD,CAAA;AAAA,EACA,YAAY,KAAqC,EAAA;AAC/C,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AACN,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,OAAS,EAAA,IAAA;AAAA,MACT,YAAc,EAAA,KAAA,CAAA;AAAA,MACd,4BAA4B,MAAM;AAAA,OAAA;AAAA,KAAA,CAAA;AAGpC,IAAA,KAAA,CAAM,IACH,aAAc,CAAA,eAAA,CAAA,CACd,KACA,EAAA,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGd,oBAA6B,GAAA;AAClC,IAAA,IAAA,CAAK,KAAM,CAAA,0BAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGL,mBAA4B,GAAA;AAClC,IAAA,MAAM,EAAE,IAAA,EAAM,MAAW,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,YAAA,CAAA;AACpC,IAAM,MAAA,YAAA,GAAiC,KAAK,KAAM,CAAA,GAAA,CAC/C,cAAc,eACd,CAAA,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,IAA2B,KAAA;AACrC,MAAO,OAAA,IAAA,CAAK,IAAS,KAAA,IAAA,IAAQ,IAAK,CAAA,OAAA,KAAY,KAAK,KAAM,CAAA,YAAA,CAAa,SAAa,IAAA,IAAA,CAAK,MAAW,KAAA,MAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGvG,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,OAAS,EAAA,KAAA;AAAA,MACT,YAAA;AAAA,KAAA,CAAA,CAAA;AAEF,IAAA,IAAA,CAAK,KAAM,CAAA,0BAAA,EAAA,CAAA;AAEX,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,0BAAA,EAA4B,KAAK,KAAM,CAAA,GAAA,CACpC,cAAc,eACd,CAAA,CAAA,SAAA,CAAU,IAAM,EAAA,MAAM,IAAK,CAAA,mBAAA,EAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAE3B,MAAA;AACL,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,4BAA4B,MAAM;AAAA,SAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAKjC,MAAqD,GAAA;AAC1D,IAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,KAAA,CAAM,YAAa,CAAA,IAAA,CAAA;AACjD,IAAM,MAAA,EAAE,YAAc,EAAA,OAAA,EAAA,GAAY,IAAK,CAAA,KAAA,CAAA;AACvC,IAAM,MAAA,EAAE,cAAc,IAAK,CAAA,KAAA,CAAA;AAE3B,IAAM,MAAA,WAAA,gDACH,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,cAAA;AAAA,KAAA,+CACZ,MAAD,EAAA;AAAA,MAAQ,EAAG,EAAA,GAAA;AAAA,KAAA,+CACR,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,4BAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAKtB,IAAM,MAAA,aAAA,GAAgB,sBACpBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,QAAA;AAAA,KACZ,EAAA,WAAA,+CACA,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,0BAAA;AAAA,KAAA,+CACZ,OAAD,EAAA;AAAA,MAAS,IAAK,EAAA,OAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAKpB,IAAM,MAAA,eAAA,GAAkB,sBACtBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,SAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,iBAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,0BAAA;AAAA,KACb,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,0BAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAMZ,IAAM,MAAA,kBAAA,GAAqB,sBACzBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,QAAA;AAAA,KACZ,EAAA,WAAA,+CACA,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,+BAAA;AAAA,KAAA,+CACZ,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,iBAAA;AAAA,KAAA,CAAA,+CACZ,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,wCAAA;AAAA,KAA0C,EAAA,gBAAA,CAAA,CAAA,CAAA,CAAA;AAK9D,IAAM,MAAA,mBAAA,GAAsB,sBAC1BA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,SAAA;AAAA,KAAA,+CACZ,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,uBAAA;AAAA,MAAwB,eAAiB,EAAA,IAAA;AAAA,KAAA,+CAClE,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,yBAAA;AAAA,KAAA,+CACX,IAAD,EAAA,IAAA,EAAI,4BACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,MAAK,SAAU,CAAA,YAAA,CAAa,WAC5B,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,IAAA,CAAA,+CACH,IAAD,EAAA,IAAA,+CACG,UAAD,EAAA;AAAA,MAAY,OAAS,EAAA,SAAA;AAAA,KAAA,CAAA,kBACpBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACC,CAAA,EAAA,YAAA,CAAa,yBAEfA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,KAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAK,EAAA,YAAA,CAAa,wBACjBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,MAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAK,EAAA,YAAA,CAAa,mCACjBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,SAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EAAK,YAAa,CAAA,aAAA,CAAA,CAAA,+CAEnB,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KAAA,kBACXA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,oBAAA,CAAA,+CACH,IAAD,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACG,EAAA,YAAA,CAAa,iBAAkB,CAAA,GAAA,CAAI,CAAC,EAAO,KAAA;AAC1C,MAAA,oDAAQ,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,EAAA;AAAA,OAAK,EAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,+CAK5B,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KAAA,kBACXA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,eAAA,CAAA,+CACH,IAAD,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACG,EAAA,YAAA,CAAa,YAAa,CAAA,GAAA,CAAI,CAAC,EAAO,KAAA;AACrC,MAAA,oDACG,IAAD,EAAA;AAAA,QAAI,KAAK,EAAG,CAAA,eAAA;AAAA,OAAA,+CACT,YAAD,EAAA;AAAA,QAAc,KAAM,EAAA,QAAA;AAAA,OAAA,+CACjB,MAAD,EAAA;AAAA,QACE,EAAG,EAAA,yBAAA;AAAA,QACH,MAAQ,EAAA;AAAA,UACN,kBAAkB,YAAa,CAAA,IAAA;AAAA,UAC/B,QAAQ,YAAa,CAAA,MAAA;AAAA,UACrB,WAAW,YAAa,CAAA,OAAA;AAAA,UACxB,MAAM,EAAG,CAAA,eAAA;AAAA,UACT,OAAO,EAAG,CAAA,KAAA;AAAA,UACV,UAAU,YAAa,CAAA,aAAA;AAAA,SAAA;AAAA,OAGzB,kBAAAA,cAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,EAAI,EAAG,CAAA,eAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,+CAStB,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KACZ,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,UAAA,CAAA,+CACH,IAAD,EAAA,IAAA,+CACG,GAAD,EAAA;AAAA,MAAG,MAAO,EAAA,QAAA;AAAA,MAAS,IAAA,EAAM,YAAY,YAAa,CAAA,OAAA;AAAA,KAC/C,EAAA,YAAA,CAAa,OAKtB,CAAA,CAAA,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,QAAA;AAAA,MAAS,eAAiB,EAAA,KAAA;AAAA,KAAA,kBACnDA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAD,IAAM,EAAA,+FAAA,CAAA,CAAA,+CAEP,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,WAAA;AAAA,MAAY,eAAiB,EAAA,KAAA;AAAA,KAAA,EACtD,aAAa,SACZ,GAAA,YAAA,CAAa,UAAU,GAAI,CAAA,CAAC,UAAU,KAAU,KAAA;AAC9C,MAAA,oDACG,KAAD,EAAA;AAAA,QAAK,GAAK,EAAA,KAAA;AAAA,OAAA,kBACPA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,WAAD,EAAA;AAAA,QAAa,QAAA;AAAA,OAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,mBAMpBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,wBAAA,CAAA,CAAA,+CAGP,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,WAAA;AAAA,MAAY,eAAiB,EAAA,KAAA;AAAA,KACvD,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IACG,EAAA,YAAA,CAAa,iBACZ,YAAa,CAAA,cAAA,CAAe,GAAI,CAAA,CAAC,EAAO,KAAA;AACtC,MAAA,oDAAQ,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,EAAA;AAAA,OAAK,EAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA,mBAGtBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,8BAAA,CAAA,CAAA,CAAA,+CAIT,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,SAAA;AAAA,MAAU,eAAiB,EAAA,KAAA;AAAA,KAAA,+CACpD,IAAD,EAAA,IAAA,EACG,aAAa,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAW,KAAA;AACpC,MAAA,oDAAQ,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,MAAA;AAAA,OAAS,EAAA,MAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAOnC,IAAA,oDACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,EACZ,OAAW,IAAA,aAAA,EAAA,EACX,CAAC,OAAA,IAAW,kBACZ,EAAA,EAAA,CAAC,OAAW,IAAA,CAAC,YAAgB,IAAA,eAAA,EAAA,EAC7B,CAAC,OAAA,IAAW,YAAgB,IAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACvM9B,MAAA,qBAAA,SAAoCA,eAAM,SAA6D,CAAA;AAAA,EAC5G,YAAY,KAA6B,EAAA;AACvC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AACN,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,OAAS,EAAA,IAAA;AAAA,MACT,WAAa,EAAA,KAAA,CAAA;AAAA,MACb,YAAc,EAAA,KAAA,CAAA;AAAA,MACd,4BAA4B,MAAM;AAAA,OAAA;AAAA,KAAA,CAAA;AAGpC,IAAA,KAAA,CAAM,IACH,aAAc,CAAA,eAAA,CAAA,CACd,KACA,EAAA,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,kBAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGd,oBAA6B,GAAA;AAClC,IAAA,IAAA,CAAK,KAAM,CAAA,0BAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGL,kBAA2B,GAAA;AACjC,IAAA,MAAM,EAAE,gBAAA,EAAkB,MAAQ,EAAA,eAAA,EAAA,GAAoB,KAAK,KAAM,CAAA,WAAA,CAAA;AACjE,IAAM,MAAA,YAAA,GAAiC,KAAK,KAAM,CAAA,GAAA,CAC/C,cAAc,eACd,CAAA,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,IAA2B,KAAA;AACrC,MAAO,OAAA,IAAA,CAAK,SAAS,gBAAoB,IAAA,IAAA,CAAK,YAAY,IAAK,CAAA,KAAA,CAAM,SAAa,IAAA,IAAA,CAAK,MAAW,KAAA,MAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGtG,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,YAAA;AAAA,KAAA,CAAA,CAAA;AAEF,IAAA,IAAA,CAAK,KAAM,CAAA,0BAAA,EAAA,CAAA;AAEX,IAAA,IAAI,CAAC,YAAc,EAAA;AACjB,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,OAAS,EAAA,KAAA;AAAA,QACT,WAAa,EAAA,IAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAEV,MAAA;AACL,MAAA,MAAM,cAA+B,YAAa,CAAA,YAAA,CAAa,KAC7D,CAAC,EAAA,KAAO,GAAG,eAAoB,KAAA,eAAA,CAAA,CAAA;AAEjC,MAAA,IAAI,CAAC,WAAa,EAAA;AAChB,QAAA,IAAA,CAAK,QAAS,CAAA;AAAA,UACZ,OAAS,EAAA,KAAA;AAAA,UACT,WAAa,EAAA,IAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA;AAIjB,MAAA,IAAI,WAAa,EAAA;AACf,QAAA,IAAA,CAAK,QAAS,CAAA;AAAA,UACZ,OAAS,EAAA,KAAA;AAAA,UACT,WAAA;AAAA,SAAA,CAAA,CAAA;AAGF,QAAA,IAAI,WAAa,EAAA;AACf,UAAA,IAAA,CAAK,QAAS,CAAA;AAAA,YACZ,0BAAA,EAA4B,KAAK,KAAM,CAAA,GAAA,CACpC,cAAc,eACd,CAAA,CAAA,SAAA,CAAU,IAAM,EAAA,MAAM,IAAK,CAAA,kBAAA,EAAA,CAAA;AAAA,WAAA,CAAA,CAAA;AAAA,SAE3B,MAAA;AACL,UAAA,IAAA,CAAK,QAAS,CAAA;AAAA,YACZ,4BAA4B,MAAM;AAAA,aAAA;AAAA,WAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAOrC,MAAoD,GAAA;AACzD,IAAM,MAAA,EAAE,IAAM,EAAA,SAAA,EAAA,GAAc,IAAK,CAAA,KAAA,CAAA;AACjC,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,MAAA,CAAA;AACtC,IAAA,MAAM,EAAE,WAAA,EAAa,YAAc,EAAA,OAAA,EAAA,GAAY,IAAK,CAAA,KAAA,CAAA;AAEpD,IAAM,MAAA,WAAA,gDACH,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,cAAA;AAAA,KAAA,+CACZ,MAAD,EAAA;AAAA,MAAQ,EAAG,EAAA,GAAA;AAAA,KAAA,+CACR,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,4BAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAKtB,IAAM,MAAA,aAAA,GAAgB,sBACpBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,QAAA;AAAA,KACZ,EAAA,WAAA,+CACA,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,0BAAA;AAAA,KAAA,+CACZ,OAAD,EAAA;AAAA,MAAS,IAAK,EAAA,OAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAKpB,IAAM,MAAA,eAAA,GAAkB,sBACtBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,SAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,iBAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,0BAAA;AAAA,KACb,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,yBAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAMZ,IAAM,MAAA,iBAAA,GAAoB,sBACxBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,QAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,+BAAA;AAAA,KAAA,+CACZ,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,uBAAA;AAAA,MAAwB,aAAY,EAAA,MAAA;AAAA,KAAA,CAAA,+CAChD,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,wCAAA;AAAA,KAA0C,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA;AAK9D,IAAM,MAAA,kBAAA,GAAqB,sBACzBA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,SAAA;AAAA,KAAA,+CACZ,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,sBAAA;AAAA,MAAuB,eAAiB,EAAA,IAAA;AAAA,KAAA,+CACjE,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,yBAAA;AAAA,KACZ,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,IAAA,CAAA,+CACH,IAAD,EAAA,IAAA,+CACG,UAAD,EAAA;AAAA,MAAY,OAAS,EAAA,SAAA;AAAA,KAAA,CAAA,+CACpB,IAAD,EAAA,IAAA,CAAA,EACC,YAAY,MAEf,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,KAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EAAK,YAAY,KACjB,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,UAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EAAK,YAAY,QACjB,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,MAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EAAK,YAAY,IACjB,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,aAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EAAK,YAAY,UAAW,CAAA,WAAA,EAAA,CAAA,CAAA,+CAE7B,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KACZ,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,gBAAA,CAAA,+CACH,IAAD,EAAA,IAAA,+CAEG,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,oCAAA;AAAA,KAAA,EACX,YAAY,iBACX,GAAA,WAAA,CAAY,kBAAkB,GAAI,CAAA,CAAC,IAAI,CAAM,KAAA;AAC3C,MAAA,oDAAQ,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,CAAA;AAAA,OAAI,EAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA,mBAGrBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,4BAAA,CAAA,CAAA,CAAA,CAAA,+CAKX,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KACZ,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,wBAAA,CAAA,+CACH,IAAD,EAAA,IAAA,+CACG,GAAD,EAAA;AAAA,MAAG,MAAO,EAAA,QAAA;AAAA,MAAS,IAAA,EAAM,YAAY,YAAa,CAAA,OAAA;AAAA,KAC/C,EAAA,YAAA,CAAa,OAIpB,CAAA,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KACZ,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IAAI,EAAA,eAAA,CAAA,+CACH,IAAD,EAAA,IAAA,+CACG,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,oCAAA;AAAA,KAAA,EACX,WAAY,CAAA,YAAA,CAAa,GAAI,CAAA,CAAC,IAAI,CAAM,KAAA;AACvC,MAAA,oDACG,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,CAAA;AAAA,OAAA,+CACN,YAAD,EAAA;AAAA,QAAc,KAAM,EAAA,QAAA;AAAA,OAAA,+CACjB,MAAD,EAAA;AAAA,QACE,EAAG,EAAA,eAAA;AAAA,QACH,MAAQ,EAAA;AAAA,UACN,MAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAa,EAAA,EAAA;AAAA,UACb,QAAU,EAAA,KAAA;AAAA,SAAA;AAAA,OAGZ,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,IAAI,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA,+CAUrB,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,eAAA;AAAA,MAAgB,eAAiB,EAAA,KAAA;AAAA,KAAA,+CAC1D,IAAD,EAAA;AAAA,MAAI,SAAU,EAAA,mCAAA;AAAA,KAAA,kBACXA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,QAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EACG,WAAY,CAAA,mBAAA,EAAoB,GAAE,EAAA,WAAA,CAAY,eAC9C,EAAA,WAAA,CAAY,kCAEdA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,SAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAK,EAAA,WAAA,CAAY,2BAA0B,UAC3C,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,EAAI,UACJ,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,EAAK,YAAY,0BAA2B,EAAA,UAAA,CAAA,kBAC3CA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,mBAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,MAAK,WAAY,CAAA,qBAAA,CAAA,kBAChBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,qBAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,MAAK,WAAY,CAAA,uBAAA,CAAA,kBAChBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,SAAA,CAAA,kBACHA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,MAAI,gBAAe,EAAA,WAAA,IAAe,WAAY,CAAA,OAAA,GAAU,WAAY,CAAA,OAAA,CAAQ,QAAW,GAAA,MAAA,CAAA,CAAA,CAAA,+CAG1F,kBAAD,EAAA;AAAA,MAAoB,OAAQ,EAAA,YAAA;AAAA,MAAa,eAAiB,EAAA,KAAA;AAAA,KACxD,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,MAAI,8BACJ,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,EAAK,WAAY,CAAA,UAAA,CAAW,2CAA2C,CAAE,EAAA,UAAA,CAAA,kBACxEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAAI,EAAA,oBAAA,CAAA,+CACH,IAAD,EAAA,IAAA,EAAK,WAAY,CAAA,UAAA,CAAW,oBAAyB,CAAA,IAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAM7D,IAAA,oDACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,EACZ,OAAW,IAAA,aAAA,EAAA,EACX,CAAC,OAAA,IAAW,iBACZ,EAAA,EAAA,CAAC,OAAW,IAAA,CAAC,WAAe,IAAA,eAAA,EAAA,EAC5B,CAAC,OAAA,IAAW,WAAe,IAAA,kBAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;AClPI,MAAA,0BAAA,CAAA;AAAA,EAEtC,YAAoB,EAAe,EAAA;AAAf,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAEb,sBAAsB,YAAyE,EAAA;AACpG,IAAa,YAAA,CAAA,YAAA,CAAa,OAAQ,CAAA,CAAC,EAAwB,KAAA;AACzD,MAAA,EAAA,CAAG,SAAS,YAAa,CAAA,MAAA,CAAA;AACzB,MAAA,EAAA,CAAG,UAAU,YAAa,CAAA,OAAA,CAAA;AAC1B,MAAA,EAAA,CAAG,gBAAgB,YAAa,CAAA,aAAA,CAAA;AAChC,MAAA,IAAI,aAAa,mBAAqB,EAAA;AACpC,QAAA,MAAM,eAAe,YAAa,CAAA,mBAAA,CAAA;AAClC,QAAG,EAAA,CAAA,YAAA,GAAe,aAAa,EAAG,CAAA,cAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAGtC,IAAO,OAAA,IAAA,CAAK,GAAG,OAAQ,CAAA,YAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAbX,0BADT,CACS,UAAU,CAAC,IAAA,CAAA;;ACIpB,MAAM,uBAA0B,GAAA,+CAAA,CAAA;AACvC,MAAO,CAAA,uBAAA,EAAyB,CAAC,0BAAA,CAAA,CAAA,CAA6B,MAAO,CAAA;AAAA,EACnE,0BAAA;AAAA,EACA,CAAC,wBAAuD,KAAA;AACtD,IAAA,MAAM,qBAAsC,GAAA;AAAA,MAC1C,IAAM,EAAA,uBAAA;AAAA,MACN,GAAK,EAAA,oFAAA;AAAA,MACL,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA;AAAA,UACL,KAAO,EAAA,IAAA;AAAA,UACP,MAAQ,EAAA,IAAA;AAAA,SAAA;AAAA,OAAA;AAAA,MAGZ,KAAO,EAAA;AAAA,QACL,mBAAqB,EAAA;AAAA,UACnB,SAAW,EAAA,qBAAA;AAAA,UACX,KAAO,EAAA,OAAA;AAAA,SAAA;AAAA,OAAA;AAAA,MAGX,OAAS,EAAA;AAAA,QACP,SAAW,EAAA,CAAC,cAAgB,EAAA,CAAC,iBAA8B,YAAa,CAAA,SAAA,CAAA;AAAA,QACxE,IAAM,EAAA,CAAC,cAAgB,EAAA,CAAC,iBAA8B,YAAa,CAAA,IAAA,CAAA;AAAA,QACnE,QAAU,EAAA,CAAC,cAAgB,EAAA,CAAC,iBAA8B,YAAa,CAAA,QAAA,CAAA;AAAA,QAEvE,WAAa,EAAA;AAAA,UACX,cAAA;AAAA,UACA,CAAC,YAA8B,KAAA;AAC7B,YAAO,OAAA;AAAA,cACL,kBAAkB,YAAa,CAAA,gBAAA;AAAA,cAC/B,iBAAiB,YAAa,CAAA,IAAA;AAAA,cAC9B,WAAW,YAAa,CAAA,SAAA;AAAA,cACxB,QAAQ,YAAa,CAAA,MAAA;AAAA,cACrB,OAAO,YAAa,CAAA,KAAA;AAAA,aAAA,CAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OAAA;AAAA,MAK5B,IAAM,EAAA;AAAA,QACJ,gBAAkB,EAAA;AAAA,UAChB,KAAO,EAAA,sBAAA;AAAA,UACP,SAAW,EAAA,MAAA;AAAA,UACX,YAAc,EAAA,WAAA;AAAA,UACd,WAAa,EAAA,QAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAKnB,IAAA,wBAAA,CAAyB,qBAAsB,CAAA,qBAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;ACLnD,cAAe,s8GAAs8G;;AC9Ct7G,MAAA,iBAAA,CAAA;AAAA,EACtB,gBAA0D,GAAA;AAC/D,IAAA,OAAO,KAAK,0BAA4B,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIrC,MAAM,yBAA4B,GAAA,wCAAA,CAAA;AAEzC,MAAO,CAAA,yBAAA,EAA2B,EAAI,CAAA,CAAA,OAAA,CAAQ,mBAAqB,EAAA,iBAAA,CAAA;;ACP5D,MAAM,iDAAoD,GAAA,kDAAA,CAAA;AAEjE,MAAO,CAAA,iDAAA,EAAmD,EACvD,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,oBAAA;AAAA,IACV,KAAO,EAAA,YAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,yDAAA;AAAA,IACb,qBAAuB,EAAA,6DAAA;AAAA,IACvB,gBAAkB,EAAA,CAAC,KAAU,KAAA,CAAC,MAAM,OAAQ,CAAA,WAAA,CAAA;AAAA,IAC5C,sBAAwB,EAAA,CAAC,KAAU,KAAA,CAAC,KAAM,CAAA,WAAA,CAAA;AAAA,IAC1C,UAAY,EAAA;AAAA,MACV;AAAA,QACE,IAAM,EAAA,iBAAA;AAAA,QACN,OACE,EAAA,6GAAA;AAAA,OAAA;AAAA,MAEJ,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,QAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAIpE,WAAW,wBAA0B,EAAA;AAAA,EACpC,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,QAAU,EAAA,KAAA;AAAA,MACV,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1B,IAAA,MAAA,CAAO,OAAU,GAAA,CAAC,WAAa,EAAA,WAAA,EAAa,WAAa,EAAA,WAAA,CAAA,CAAA;AAEzD,IAAA,MAAA,CAAO,UAAU,cAAe,CAAA,WAAA,CAAA;AAEhC,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,MAAM,KAAA,CAAA,MAAA,GAAS,MAAO,CAAA,OAAA,CAAQ,CAAG,CAAA,CAAA,GAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;ACvDlC,MAAM,iDAAoD,GAAA,8CAAA,CAAA;AAEjE,MAAO,CAAA,iDAAA,EAAmD,EACvD,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,oBAAA;AAAA,IACV,KAAO,EAAA,YAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,yDAAA;AAAA,IACb,qBAAqB,iBAAkB,CAAA,0BAAA;AAAA,IACvC,qBAAuB,EAAA,6DAAA;AAAA,IACvB,UAAY,EAAA;AAAA,MACV;AAAA,QACE,IAAM,EAAA,iBAAA;AAAA,QACN,OACE,EAAA,6GAAA;AAAA,OAAA;AAAA,MAEJ,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,QAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAIpE,WAAW,wBAA0B,EAAA;AAAA,EACpC,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,QAAU,EAAA,KAAA;AAAA,MACV,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1B,IAAA,MAAA,CAAO,UAAU,cAAe,CAAA,WAAA,CAAA;AAEhC,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IACE,IAAA,KAAA,CAAM,SACN,MAAO,CAAA,WAAA,CAAY,WAAW,8BAC9B,IAAA,MAAA,CAAO,WAAY,CAAA,UAAA,CAAW,kBAC9B,EAAA;AACA,MAAA,KAAA,CAAM,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,KAAA;AAG1C,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,MAAM,KAAA,CAAA,MAAA,GAAS,MAAO,CAAA,OAAA,CAAQ,CAAG,CAAA,CAAA,GAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;AC5DlC,MAAM,yDACX,GAAA,kDAAA,CAAA;AAEF,MAAO,CAAA,yDAAA,EAA2D,EAC/D,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,gBAAA;AAAA,IACV,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,iEAAA;AAAA,IACb,UAAY,EAAA;AAAA,MACV,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC;AAAA,QACE,IAAM,EAAA,eAAA;AAAA,QACN,SAAW,EAAA,8BAAA;AAAA,QACX,UAAY,EAAA,gCAAA;AAAA,OAAA;AAAA,MAEd,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAIpE,WAAW,4BAA8B,EAAA;AAAA,EACxC,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,IAAO,GAAA,IAAA,CAAA;AAEb,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,QAAU,EAAA,KAAA;AAAA,MACV,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1B,IAAA,IAAA,CAAK,QAAQ,MAAM;AACjB,MAAK,IAAA,CAAA,cAAA,EAAA,CAAA;AACL,MAAK,IAAA,CAAA,oBAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGP,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IACE,IAAA,KAAA,CAAM,SACN,MAAO,CAAA,WAAA,CAAY,WAAW,8BAC9B,IAAA,MAAA,CAAO,WAAY,CAAA,UAAA,CAAW,kBAC9B,EAAA;AACA,MAAA,KAAA,CAAM,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,KAAA;AAG1C,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAI,IAAA,KAAA,CAAM,iCAAiC,KAAW,CAAA,EAAA;AACpD,MAAA,KAAA,CAAM,4BAA+B,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvC,IAAK,IAAA,CAAA,SAAA,GAAY,SAAU,GAAA,EAAK,GAAK,EAAA;AACnC,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAO,OAAA,GAAA,CAAA;AAAA,OAAA;AAET,MAAA,OAAO,GAAM,GAAA,GAAA,CAAA;AAAA,KAAA,CAAA;AAGf,IAAI,IAAA,KAAA,CAAM,0BAA0B,KAAW,CAAA,EAAA;AAC7C,MAAA,KAAA,CAAM,qBAAwB,GAAA,OAAA,CAAA;AAAA,KAAA;AAEhC,IAAM,KAAA,CAAA,qBAAA,GAAwB,MAAM,qBAAsB,CAAA,QAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3EzD,MAAM,+CAAkD,GAAA,6CAAA,CAAA;AAE/D,MAAO,CAAA,+CAAA,EAAiD,EACrD,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,mBAAA;AAAA,IACV,KAAO,EAAA,WAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,uDAAA;AAAA,IACb,qBAAuB,EAAA,2DAAA;AAAA,IACvB,UAAY,EAAA;AAAA,MACV,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,QAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAIpE,WAAW,uBAAyB,EAAA;AAAA,EACnC,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,IAAO,GAAA,IAAA,CAAA;AAEb,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,QAAU,EAAA,KAAA;AAAA,MACV,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1B,IAAA,IAAA,CAAK,QAAQ,MAAM;AACjB,MAAK,IAAA,CAAA,cAAA,EAAA,CAAA;AACL,MAAK,IAAA,CAAA,oBAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGP,IAAA,MAAA,CAAO,UAAU,cAAe,CAAA,WAAA,CAAA;AAEhC,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IACE,IAAA,KAAA,CAAM,SACN,MAAO,CAAA,WAAA,CAAY,WAAW,8BAC9B,IAAA,MAAA,CAAO,WAAY,CAAA,UAAA,CAAW,kBAC9B,EAAA;AACA,MAAA,KAAA,CAAM,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,KAAA;AAG1C,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,MAAM,KAAA,CAAA,MAAA,GAAS,MAAO,CAAA,OAAA,CAAQ,CAAG,CAAA,CAAA,GAAA,CAAA;AAAA,KAAA;AAGnC,IAAO,MAAA,CAAA,MAAA,CAAO,qBAAqB,MAAO,CAAA,cAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;AChEzC,MAAM,8DACX,GAAA,qDAAA,CAAA;AAEF,MAAO,CAAA,8DAAA,EAAgE,EACpE,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,mBAAA;AAAA,IACV,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,uEAAA;AAAA,IACb,mBAAqB,EAAA,kFAAA;AAAA,IACrB,uBAAA,EAAyB,CAAC,iBAAmB,EAAA,YAAA,CAAA;AAAA,IAC7C,UAAY,EAAA,CAAC,EAAE,IAAA,EAAM,iBAAiB,SAAW,EAAA,iBAAA,EAAA,CAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAGpD,WAAW,+BAAiC,EAAA;AAAA,EAC3C,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAA,CAAO,KAAM,CAAA,aAAA,GAAgB,MAAO,CAAA,KAAA,CAAM,aAAiB,IAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjB1D,MAAM,+CAAkD,GAAA,iDAAA,CAAA;AAE/D,MAAO,CAAA,+CAAA,EAAiD,EACrD,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,mBAAA;AAAA,IACV,KAAO,EAAA,WAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,uDAAA;AAAA,IACb,uBAAA,EAAyB,CAAC,yBAA2B,EAAA,YAAA,CAAA;AAAA,IACrD,qBAAuB,EAAA,2DAAA;AAAA,IACvB,gBAAkB,EAAA,CAAC,KAAU,KAAA,CAAC,MAAM,OAAQ,CAAA,WAAA,CAAA;AAAA,IAC5C,sBAAwB,EAAA,CAAC,KAAU,KAAA,CAAC,KAAM,CAAA,WAAA,CAAA;AAAA,IAC1C,UAAY,EAAA;AAAA,MACV;AAAA,QACE,IAAM,EAAA,iBAAA;AAAA,QACN,OACE,EAAA,4GAAA;AAAA,OAAA;AAAA,MAEJ,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,QAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,QAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAIpE,WAAW,uBAAyB,EAAA;AAAA,EACnC,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,IAAO,GAAA,IAAA,CAAA;AAEb,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,SAAY,GAAA;AAAA,MACjB,cAAgB,EAAA,KAAA;AAAA,MAChB,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,UAAU,cAAiB,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGpC,IAAA,MAAA,CAAO,gBAAgB,cAAe,CAAA,WAAA,CAAA;AAEtC,IAAA,MAAA,CAAO,YAAe,GAAA;AAAA,MACpB;AAAA,QACE,KAAO,EAAA,UAAA;AAAA,QACP,GAAK,EAAA,UAAA;AAAA,OAAA;AAAA,MAEP;AAAA,QACE,KAAO,EAAA,YAAA;AAAA,QACP,GAAK,EAAA,YAAA;AAAA,OAAA;AAAA,MAEP;AAAA,QACE,KAAO,EAAA,uBAAA;AAAA,QACP,GAAK,EAAA,kBAAA;AAAA,OAAA;AAAA,MAEP;AAAA,QACE,KAAO,EAAA,qBAAA;AAAA,QACP,GAAK,EAAA,aAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAIT,IAAA,MAAA,CAAO,WAAc,GAAA;AAAA,MACnB;AAAA,QACE,KAAO,EAAA,YAAA;AAAA,QACP,GAAK,EAAA,KAAA;AAAA,OAAA;AAAA,MAEP;AAAA,QACE,KAAO,EAAA,aAAA;AAAA,QACP,GAAK,EAAA,MAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAIT,IAAM,KAAA,CAAA,QAAA,GAAW,MAAM,QAAY,IAAA,EAAA,CAAA;AACnC,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,MAAS,GAAA,KAAA,CAAM,MAAU,IAAA,MAAA,CAAO,cAAc,CAAG,CAAA,CAAA,GAAA,CAAA;AACvD,IAAA,KAAA,CAAM,MAAS,GAAA,KAAA,CAAM,MAAU,IAAA,MAAA,CAAO,aAAa,CAAG,CAAA,CAAA,GAAA,CAAA;AACtD,IAAA,KAAA,CAAM,UAAa,GAAA,KAAA,CAAM,UAAc,IAAA,MAAA,CAAO,YAAY,CAAG,CAAA,CAAA,GAAA,CAAA;AAC7D,IAAI,IAAA,KAAA,CAAM,kCAAkC,KAAW,CAAA,EAAA;AACrD,MAAA,KAAA,CAAM,6BAAgC,GAAA,GAAA,CAAA;AAAA,KAAA;AAExC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAU,IAAA,KAAA,CAAM,eAAe,OAAS,EAAA;AACjD,MAAA,KAAA,CAAM,MAAS,GAAA,aAAA,CAAA;AAAA,KAAA;AAEjB,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IACE,IAAA,KAAA,CAAM,SACN,MAAO,CAAA,WAAA,CAAY,WAAW,8BAC9B,IAAA,MAAA,CAAO,WAAY,CAAA,UAAA,CAAW,kBAC9B,EAAA;AACA,MAAA,KAAA,CAAM,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,KAAA;AAG1C,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAA,IAAA,CAAK,mBAAmB,WAAY;AAClC,MAAI,IAAA,KAAA,CAAM,WAAW,aAAe,EAAA;AAClC,QAAA,KAAA,CAAM,UAAa,GAAA,OAAA,CAAA;AACnB,QAAA,OAAO,KAAM,CAAA,QAAA,CAAA;AACb,QAAA,OAAO,KAAM,CAAA,QAAA,CAAA;AAAA,OACR,MAAA;AACL,QAAA,KAAA,CAAM,QAAW,GAAA,EAAA,CAAA;AACjB,QAAI,IAAA,KAAA,CAAM,eAAe,KAAO,EAAA;AAC9B,UAAA,OAAO,KAAM,CAAA,QAAA,CAAA;AAAA,SACR,MAAA;AACL,UAAA,KAAA,CAAM,UAAa,GAAA,MAAA,CAAA;AACnB,UAAA,OAAO,KAAM,CAAA,QAAA,CAAA;AACb,UAAM,KAAA,CAAA,QAAA,GAAW,MAAM,QAAY,IAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpHxC,MAAM,6DACX,GAAA,oDAAA,CAAA;AAEF,MAAO,CAAA,6DAAA,EAA+D,EACnE,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,kBAAA;AAAA,IACV,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,qEAAA;AAAA,IACb,gBAAkB,EAAA,CAAC,KAAU,KAAA,CAAC,MAAM,OAAQ,CAAA,WAAA,CAAA;AAAA,IAC5C,sBAAwB,EAAA,CAAC,KAAU,KAAA,CAAC,KAAM,CAAA,WAAA,CAAA;AAAA,IAC1C,UAAY,EAAA;AAAA,MACV,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC;AAAA,QACE,IAAM,EAAA,eAAA;AAAA,QACN,SAAW,EAAA,+BAAA;AAAA,QACX,UAAY,EAAA,kCAAA;AAAA,OAAA;AAAA,MAEd,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,IAEjE,QAAU,EAAA,IAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAGb,WAAW,8BAAgC,EAAA;AAAA,EAC1C,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,IAAO,GAAA,IAAA,CAAA;AAEb,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,QAAU,EAAA,KAAA;AAAA,MACV,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1B,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAI,IAAA,KAAA,CAAM,kCAAkC,KAAW,CAAA,EAAA;AACrD,MAAA,KAAA,CAAM,6BAAgC,GAAA,CAAA,CAAA;AAAA,KAAA;AAGxC,IAAI,IAAA,KAAA,CAAM,yBAAyB,KAAW,CAAA,EAAA;AAC5C,MAAA,KAAA,CAAM,oBAAuB,GAAA,KAAA,CAAA;AAAA,KAAA;AAG/B,IAAK,IAAA,CAAA,SAAA,GAAY,SAAU,GAAA,EAAK,GAAK,EAAA;AACnC,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAO,OAAA,GAAA,CAAA;AAAA,OAAA;AAET,MAAA,OAAO,GAAM,GAAA,GAAA,CAAA;AAAA,KAAA,CAAA;AAGf,IAAI,IAAA,KAAA,CAAM,0BAA0B,KAAW,CAAA,EAAA;AAC7C,MAAA,KAAA,CAAM,qBAAwB,GAAA,OAAA,CAAA;AAAA,KAAA;AAEhC,IAAM,KAAA,CAAA,qBAAA,GAAwB,MAAM,qBAAsB,CAAA,QAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrEzD,MAAM,uDACX,GAAA,qDAAA,CAAA;AAEF,MAAO,CAAA,uDAAA,EAAyD,EAC7D,CAAA,CAAA,MAAA,CAAO,WAAY;AAClB,EAAA,QAAA,CAAS,SAAS,aAAc,CAAA;AAAA,IAC9B,QAAU,EAAA,eAAA;AAAA,IACV,aAAe,EAAA,KAAA;AAAA,IACf,WAAa,EAAA,+DAAA;AAAA,IACb,gBAAkB,EAAA,CAAC,KAAU,KAAA,CAAC,MAAM,OAAQ,CAAA,WAAA,CAAA;AAAA,IAC5C,sBAAwB,EAAA,CAAC,KAAU,KAAA,CAAC,KAAM,CAAA,WAAA,CAAA;AAAA,IAC1C,UAAY,EAAA;AAAA,MACV,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,gBAAgB,UAAY,EAAA,6BAAA,EAAA;AAAA,MAChE,EAAE,IAAM,EAAA,eAAA,EAAiB,SAAW,EAAA,SAAA,EAAA;AAAA,MACpC,EAAE,IAAA,EAAM,eAAiB,EAAA,SAAA,EAAW,eAAe,UAAY,EAAA,SAAA,EAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAIpE,WAAW,2BAA6B,EAAA;AAAA,EACvC,QAAA;AAAA,EACA,SAAU,MAAQ,EAAA;AAChB,IAAA,MAAM,IAAO,GAAA,IAAA,CAAA;AAEb,IAAA,MAAM,QAAQ,MAAO,CAAA,KAAA,CAAA;AAErB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,QAAU,EAAA,KAAA;AAAA,MACV,aAAe,EAAA,KAAA;AAAA,KAAA,CAAA;AAGjB,IAAA,cAAA,CAAe,YAAa,CAAA,KAAA,CAAA,CAAO,IAAK,CAAA,SAAU,QAAU,EAAA;AAC1D,MAAA,MAAA,CAAO,QAAW,GAAA,QAAA,CAAA;AAClB,MAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG1B,IAAM,KAAA,CAAA,OAAA,GAAU,MAAM,OAAW,IAAA,EAAA,CAAA;AACjC,IAAA,KAAA,CAAM,aAAgB,GAAA,KAAA,CAAA;AAEtB,IAAA,IAAI,CAAC,KAAM,CAAA,WAAA,IAAe,MAAO,CAAA,WAAA,CAAY,mBAAmB,GAAK,EAAA;AACnE,MAAM,KAAA,CAAA,WAAA,GAAc,MAAO,CAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAAA,KAAA;AAE5D,IAAA,IAAI,CAAC,KAAM,CAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,WAAA,CAAY,eAAe,GAAK,EAAA;AAClE,MAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvD,IAAI,IAAA,KAAA,CAAM,iBAAiB,KAAW,CAAA,EAAA;AACpC,MAAA,KAAA,CAAM,YAAe,GAAA,CAAA,CAAA;AAAA,KAAA;AAGvB,IAAI,IAAA,KAAA,CAAM,sBAAsB,KAAW,CAAA,EAAA;AACzC,MAAA,KAAA,CAAM,iBAAoB,GAAA,KAAA,CAAA;AAAA,KAAA;AAG5B,IAAK,IAAA,CAAA,SAAA,GAAY,SAAU,GAAA,EAAK,GAAK,EAAA;AACnC,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAO,OAAA,GAAA,CAAA;AAAA,OAAA;AAET,MAAA,OAAO,GAAM,GAAA,GAAA,CAAA;AAAA,KAAA,CAAA;AAGf,IAAI,IAAA,KAAA,CAAM,0BAA0B,KAAW,CAAA,EAAA;AAC7C,MAAA,KAAA,CAAM,qBAAwB,GAAA,OAAA,CAAA;AAAA,KAAA;AAEhC,IAAM,KAAA,CAAA,qBAAA,GAAwB,MAAM,qBAAsB,CAAA,QAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClE1B,MAAA,wBAAA,CAAA;AAAA,EAC7B,sBAAsB,YAA4C,EAAA;AACvE,IAAA,IAAI,iBAAiB,oBAAsB,EAAA;AACzC,MAAA,OAAO,IAAK,CAAA,2BAAA,EAAA,CAAA;AAAA,KACH,MAAA,IAAA,YAAA,KAAiB,qBAAyB,IAAA,YAAA,KAAiB,4BAA8B,EAAA;AAElG,MAAA,OAAO,IAAK,CAAA,kCAAA,EAAA,CAAA;AAAA,KACH,MAAA,IAAA,YAAA,KAAiB,SAAa,IAAA,YAAA,KAAiB,gBAAkB,EAAA;AAE1E,MAAA,OAAO,IAAK,CAAA,wBAAA,EAAA,CAAA;AAAA,KAAA,MAAA,IACH,iBAAiB,yBAA2B,EAAA;AACrD,MAAA,OAAO,IAAK,CAAA,+BAAA,EAAA,CAAA;AAAA,KAAA,MAAA,IACH,iBAAiB,aAAe,EAAA;AACzC,MAAA,OAAO,IAAK,CAAA,qBAAA,EAAA,CAAA;AAAA,KAAA,MAAA,IACH,iBAAiB,mBAAqB,EAAA;AAC/C,MAAA,OAAO,IAAK,CAAA,yBAAA,EAAA,CAAA;AAAA,KACP,MAAA;AAEL,MAAO,OAAA,EAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIJ,2BAAoD,GAAA;AACzD,IAAO,OAAA;AAAA,MACL,EAAE,IAAM,EAAA,QAAA,EAAU,KAAO,EAAA,iCAAA,EAAA;AAAA,MACzB,EAAE,IAAM,EAAA,QAAA,EAAU,KAAO,EAAA,YAAA,EAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAItB,kCAA2D,GAAA;AAChE,IAAO,OAAA;AAAA,MACL,EAAE,IAAM,EAAA,QAAA,EAAU,KAAO,EAAA,iCAAA,EAAA;AAAA,MACzB,EAAE,IAAM,EAAA,SAAA,EAAW,KAAO,EAAA,QAAA,EAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIvB,wBAAiD,GAAA;AACtD,IAAA,OAAO,CAAC,EAAE,IAAM,EAAA,SAAA,EAAW,KAAO,EAAA,QAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAG7B,+BAAwD,GAAA;AAC7D,IAAO,OAAA;AAAA,MACL,EAAE,IAAM,EAAA,QAAA,EAAU,KAAO,EAAA,iCAAA,EAAA;AAAA,MACzB,EAAE,IAAM,EAAA,SAAA,EAAW,KAAO,EAAA,KAAA,EAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIvB,qBAA8C,GAAA;AACnD,IAAA,OAAO,CAAC,EAAE,IAAM,EAAA,SAAA,EAAW,KAAO,EAAA,KAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAG7B,yBAAkD,GAAA;AACvD,IAAA,OAAO,CAAC,EAAE,IAAM,EAAA,QAAA,EAAU,KAAO,EAAA,YAAA,EAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAI9B,MAAM,0BAA6B,GAAA,gDAAA,CAAA;AAE1C,MAAO,CAAA,0BAAA,EAA4B,EAAI,CAAA,CAAA,OAAA,CAAQ,0BAA4B,EAAA,wBAAA,CAAA;;ACzDjD,MAAA,YAAA,CAAA;AAAA,EACjB,WAAgD,GAAA;AACrD,IAAA,OAAO,KAAK,cAAgB,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIzB,MAAM,uBAA0B,GAAA,mCAAA,CAAA;AAEvC,MAAO,CAAA,uBAAA,EAAyB,EAAI,CAAA,CAAA,OAAA,CAAQ,cAAgB,EAAA,YAAA,CAAA;;ACErD,MAAM,wDACX,GAAA,gDAAA,CAAA;AAEF,OAAA,CACG,OAAO,wDAA0D,EAAA;AAAA,EAChE,kBAAA;AAAA,EACA,qBAAA;AAAA,EACA,kCAAA;AAAA,CAAA,CAAA,CAED,WAAW,6BAA+B,EAAA;AAAA,EACzC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,uBAAA;AAAA,EACA,KAAA;AAAA,EACA,qBAAA;AAAA,EACA,SAAU,MAAA,EAAQ,MAAQ,EAAA,qBAAA,EAAuB,KAAK,mBAAqB,EAAA;AACzE,IAAA,IAAA,CAAK,WAAc,GAAA,GAAA,CAAA;AACnB,IAAA,MAAM,WAAc,GAAA,GAAA,CAAA;AACpB,IAAA,MAAM,aAAgB,GAAA,qBAAA,CAAA;AACtB,IAAK,IAAA,CAAA,aAAA,GAAgB,eAAe,GAAI,CAAA,UAAA,CAAA,CAAA;AAGxC,IAAO,MAAA,CAAA,kBAAA,GAAqB,qBAAsB,CAAA,QAAA,CAAS,KAAO,EAAA,kCAAA,CAAA,CAAA;AAElE,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,OAAS,EAAA,IAAA;AAAA,MACT,YAAY,GAAI,CAAA,YAAA;AAAA,KAAA,CAAA;AAGlB,IAAgC,SAAA,oBAAA,GAAA;AAC9B,MAAA,OAAO,mBACJ,CAAA,uBAAA,CACC,WACA,EAAA,aAAA,CAAc,WACd,aAAc,CAAA,QAAA,EACd,aAAc,CAAA,MAAA,EACd,cAAc,KACd,EAAA,aAAA,CAAc,IAEf,CAAA,CAAA,IAAA,CAAK,SAAU,OAAS,EAAA;AACvB,QAAA,OAAO,UAAU,UAAW,CAAA,OAAA,CAAQ,KAAO,CAAA,CAAA,IAAA,CAAK,CAAC,KAAS,KAAA;AACxD,UAAA,OAAA,CAAQ,OAAU,GAAA,KAAA,CAAA;AAClB,UAAO,OAAA,OAAA,CAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAGV,CAAA,CAAA,IAAA,CAAK,SAAU,OAAS,EAAA;AACvB,QAAA,MAAA,CAAO,MAAM,OAAU,GAAA,KAAA,CAAA;AAEvB,QAAA,IAAI,CAAC,OAAA,IAAW,CAAE,CAAA,OAAA,CAAQ,OAAU,CAAA,EAAA;AAClC,UAAA,UAAA,EAAA,CAAA;AAAA,SACK,MAAA;AACL,UAAM,MAAA,wBAAA,GAA2B,oBAAoB,2BACnD,CAAA,WAAA,EACA,cAAc,SACd,EAAA,aAAA,CAAc,QACd,aAAc,CAAA,IAAA,CAAA,CAAA;AAGhB,UAAQ,OAAA,CAAA,MAAA,CAAO,eAAe,wBAA0B,EAAA,OAAA,CAAA,CAAA;AACxD,UAAA,MAAA,CAAO,aAAgB,GAAA,aAAA,CAAA;AACvB,UAAA,MAAA,CAAO,UAAU,iBAAkB,CAAA,aAAA,CAAA,CAAA;AACnC,UAAA,MAAA,CAAO,qBAAqB,4BAA6B,CAAA,aAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAE1D,EAAA,UAAA,CAAA,CAAA;AAAA,KAAA;AAGP,IAAA,SAAA,iBAAA,CAA2B,OAAS,EAAA;AAClC,MAAM,MAAA,iBAAA,GAAoB,CAAE,CAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA,EAAc,CAAC,IAAA,KAAS,IAAK,CAAA,KAAA,CAAM,EAAK,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAA,CAAA;AAC/F,MAAA,OAAO,MAAO,CAAA,IAAA,CAAK,iBAChB,CAAA,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AACb,QAAO,OAAA;AAAA,UACL,OAAS,EAAA,IAAA;AAAA,UACT,KAAA,EAAO,eAAe,iBAAmB,EAAA,IAAA,CAAA;AAAA,SAAA,CAAA;AAAA,OAAA,CAAA,CAG5C,MAAO,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAA,CAAA;AAAA,KAAA;AAGjC,IAAA,SAAA,4BAAA,CAAsC,OAAS,EAAA;AAC7C,MAAM,MAAA,iBAAA,GAAoB,EAAE,OAAQ,CAAA,OAAA,CAAQ,oBAAoB,CAAC,IAAA,KAAS,KAAK,aAAc,CAAA,EAAA,CAAA,CAAA;AAC7F,MAAA,OAAO,MAAO,CAAA,IAAA,CAAK,iBAChB,CAAA,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA;AACb,QAAO,OAAA;AAAA,UACL,aAAA,EAAe,iBAAkB,CAAA,IAAA,CAAA,CAAM,CAAG,CAAA,CAAA,aAAA;AAAA,UAC1C,KAAA,EAAO,eAAe,iBAAmB,EAAA,IAAA,CAAA;AAAA,SAAA,CAAA;AAAA,OAAA,CAAA,CAG5C,MAAO,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAA,CAAA;AAAA,KAAA;AAGjC,IAAA,SAAA,cAAA,CAAwB,mBAAmB,IAAM,EAAA;AAC/C,MAAA,MAAM,KAAQ,GAAA,EAAA,CAAA;AACd,MAAkB,iBAAA,CAAA,IAAA,CAAA,CAAM,OAAQ,CAAA,CAAC,IAAS,KAAA;AACxC,QAAC,CAAK,IAAA,CAAA,UAAA,IAAc,EAAI,EAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AACzC,UAAI,IAAA,IAAA,CAAK,aAAa,IAAS,IAAA,KAAA,CAAM,cAAc,KAAa,CAAA,IAAA,KAAA,CAAM,YAAY,KAAY,CAAA,EAAA;AAC5F,YAAM,KAAA,CAAA,IAAA,CAAK,EAAE,SAAW,EAAA,KAAA,CAAM,WAAW,OAAS,EAAA,KAAA,CAAM,OAAS,EAAA,QAAA,EAAU,IAAK,CAAA,QAAA,EAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAItF,MAAO,OAAA,KAAA,CAAA;AAAA,KAAA;AAGT,IAAsB,SAAA,UAAA,GAAA;AACpB,MAAA,IAAI,OAAO,WAAa,EAAA;AACtB,QAAA,OAAA;AAAA,OAAA;AAEF,MAAA,IAAI,IAAI,YAAc,EAAA;AACpB,QAAA,MAAA,CAAO,QAAQ,aAAc,CAAA,IAAA,CAAA;AAC7B,QAAA,MAAA,CAAO,MAAM,QAAW,GAAA,IAAA,CAAA;AACxB,QAAA,MAAA,CAAO,MAAM,OAAU,GAAA,KAAA,CAAA;AACvB,QAAA,oBAAA,CAAqB,cAAe,CAAA,gBAAA,CAAA,CAAA;AAAA,OAC/B,MAAA;AACL,QAAA,MAAA,CAAO,GAAG,GAAK,EAAA,EAAE,oBAAsB,EAAA,IAAA,EAAA,EAAQ,EAAE,QAAU,EAAA,SAAA,EAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAI/D,IAAA,oBAAA,EAAA,CAAuB,KAAK,MAAM;AAGhC,MAAA,IAAI,CAAC,MAAA,CAAO,WAAe,IAAA,CAAC,IAAI,YAAc,EAAA;AAC5C,QAAI,GAAA,CAAA,cAAA,CAAe,UAAU,MAAQ,EAAA,oBAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAIzC,IAAA,IAAI,IAAI,YAAc,EAAA;AAEpB,MAAA,GAAA,CAAI,cAAiB,GAAA;AAAA,QACnB,OAAS,EAAA,oBAAA;AAAA,OAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;AC1IiB,MAAA,sBAAA,CAAA;AAAA,EAC3B,2BAAA,CACL,qBACA,EAAA,SAAA,EACA,eACgB,EAAA;AAChB,IAAA,OAAO,qBAAsB,CAAA,SAAA,CAAU,OAAS,CAAA,CAAA,SAAA,CAAU,MAAQ,CAAA,CAAA,eAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAI/D,MAAM,yBAA4B,GAAA,oCAAA,CAAA;AACzC,MAAO,CAAA,yBAAA,EAA2B,EAAI,CAAA,CAAA,OAAA,CAAQ,wBAA0B,EAAA,sBAAA,CAAA;;ACXjE,MAAM,2CAA8C,GAAA,yCAAA,CAAA;AAE3D,MAAA,CAAO,2CAA6C,EAAA,EAAA,CAAA,CAAI,OAAQ,CAAA,6BAAA,EAA+B,WAAY;AACzG,EAAkC,SAAA,sBAAA,GAAA;AAAA,GAAA;AAElC,EAAO,OAAA;AAAA,IACL,sBAAA;AAAA,GAAA,CAAA;AAAA,CAAA,CAAA;;ACJG,MAAM,yBAA4B,GAAA,6BAAA,CAAA;AACzC,MAAA,CAAO,yBAA2B,EAAA;AAAA,EAChC,yBAAA;AAAA,EACA,2CAAA;AAAA,EACA,wDAAA;AAAA,CAAA,CAAA;;ACPkC,MAAA,sBAAA,CAAA;AAAA,EAAA,OACpB,8BAAqF,GAAA;AACjG,IAAA,OAAO,KAAK,iCAAmC,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA;;ACkKH,MAAA,kCAAA,CAAA;AAAA,EAkB9C,WAAA,CACU,IACA,kBACA,EAAA,0BAAA,EACA,eACA,gBACA,EAAA,iBAAA,EACA,wBACA,EAAA,mBAAA,EACA,YACR,EAAA;AATQ,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA,CAAA;AACA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA,CAAA;AACA,IAAA,IAAA,CAAA,0BAAA,GAAA,0BAAA,CAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA,CAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA,CAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA,CAAA;AACA,IAAA,IAAA,CAAA,wBAAA,GAAA,wBAAA,CAAA;AACA,IAAA,IAAA,CAAA,mBAAA,GAAA,mBAAA,CAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA,CAAA;AAvBF,IAAA,IAAA,CAAA,WAAA,GAAc,CAAC,KAAO,EAAA,SAAA,CAAA,CAAA;AACtB,IAAA,IAAA,CAAA,YAAA,GAAe,CAAC,QAAA,EAAU,MAAQ,EAAA,QAAA,EAAU,MAAQ,EAAA,SAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAyBrD,uBAAuB,OAAuC,EAAA;AACnE,IAAA,OAAA,CAAQ,WAAc,GAAA;AAAA,MAEpB,WAAA,EAAa,MAAM,IAAK,CAAA,WAAA,CAAA;AAAA,MACxB,YAAA,EAAc,MAAM,IAAK,CAAA,YAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAKtB,gBAAA,CAAiB,GAA6B,EAAA,UAAA,GAAa,EAAuB,EAAA;AACvF,IAAA,IAAA,CAAK,eAAe,qBAAuB,EAAA,GAAA,CAAA,CAAA;AAC3C,IAAI,GAAA,CAAA,sBAAA,GAAyB,CAAC,OAAA,EAAiC,OAA0B,KAAA;AACvF,MAAQ,OAAA,CAAA,kBAAA,GAAqB,QAAQ,kBAAsB,IAAA,EAAA,CAAA;AAC3D,MAAM,MAAA,YAAA,GAAe,OAAQ,CAAA,kBAAA,CAAmB,OAAQ,CAAA,OAAA,CAAA,CAAA;AACxD,MAAA,IAAI,iBAAiB,CAAI,CAAA,EAAA;AACvB,QAAA,OAAA,CAAQ,mBAAmB,IAAK,CAAA,OAAA,CAAA,CAAA;AAAA,OAC3B,MAAA;AACL,QAAQ,OAAA,CAAA,kBAAA,CAAmB,OAAO,YAAc,EAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAIpD,IAAA,GAAA,CAAI,qBAAqB,CAAC,OAAA,EAAiC,OACzD,KAAA,OAAA,CAAQ,mBAAmB,QAAS,CAAA,OAAA,CAAA,CAAA;AAEtC,IAAI,GAAA,CAAA,gBAAA,GAAmB,CAAC,OAAA,EAAiC,QAAwC,KAAA;AAE/F,MAAA,IAAI,QAAS,CAAA,GAAA,KAAQ,EAAM,IAAA,QAAA,CAAS,QAAQ,QAAU,EAAA;AACpD,QAAA,OAAA,CAAQ,qBAAsB,CAAQ,OAAA,CAAA,kBAAA,IAAsB,IAAI,MAAO,CAAA,CAAC,MAAM,CAAM,KAAA,mBAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAIxF,IAAI,GAAA,CAAA,kBAAA,GAAqB,CAAC,OAA6C,KAAA;AACrE,MAAA,OACE,GAAI,CAAA,OAAA,EAAS,8BACb,CAAA,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,MAAW,KAAA,MAAA,CAAO,IAAS,KAAA,OAAA,CAAQ,UAAU,MAAO,CAAA,UAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAInG,IAAM,MAAA,YAAA,GAAe,IAAI,gBAAmB,GAAA,CAAC,KAAK,eAAgB,CAAA,GAAA,CAAI,iBAAiB,OAAY,CAAA,CAAA,GAAA,EAAA,CAAA;AAEnG,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,YAAA,CAAa,IAAK,CAAA,UAAA,CAAA,CAAA;AAAA,KAAA;AAGpB,IAAI,IAAA,aAAA,CAAA;AACJ,IAAA,IAAI,aAAa,MAAQ,EAAA;AACvB,MAAgB,aAAA,GAAA,IAAA,CAAK,GAClB,GACC,CAAA,YAAA,CAAa,IAAI,CAAC,CAAA,KAChB,kBAAkB,UAAW,CAAA;AAAA,QAC3B,QAAU,EAAA,gBAAA;AAAA,QACV,KAAO,EAAA,EAAA;AAAA,QACP,CAAA;AAAA,OAIL,CAAA,CAAA,CAAA,CAAA,IAAA,CAAK,CAAC,QAAA,KAAa,OAAQ,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,KACzB,MAAA;AACL,MAAgB,aAAA,GAAA,IAAA,CAAK,GAAG,IAAK,CAAA,EAAA,CAAA,CAAA;AAAA,KAAA;AAG/B,IAAO,OAAA,IAAA,CAAK,GACT,GAAI,CAAA;AAAA,MACH,yBAAA,EAA2B,eAAe,4BAA6B,CAAA,KAAA,CAAA;AAAA,MACvE,aAAA,EAAe,IAAK,CAAA,kBAAA,CAAmB,iBAAkB,CAAA,KAAA,CAAA;AAAA,MACzD,OAAA,EAAS,aAAa,qBAAsB,CAAA,KAAA,CAAA;AAAA,MAC5C,QAAA,EAAU,IAAK,CAAA,aAAA,CAAc,SAAU,CAAA,KAAA,CAAA;AAAA,MACvC,WAAA,EAAa,KAAK,gBAAiB,CAAA,YAAA,EAAA;AAAA,MACnC,yBAAyB,IAAK,CAAA,gBAAA,CAAiB,gBAAiB,CAAA,GAAA,CAAI,aAAa,GAAI,CAAA,MAAA,CAAA;AAAA,MACrF,YAAA,EAAc,KAAK,iBAAkB,CAAA,gBAAA,EAAA;AAAA,MACrC,cAAA,EAAgB,KAAK,mBAAoB,CAAA,oBAAA,EAAA;AAAA,MACzC,WAAa,EAAA,IAAA,CAAK,EAAG,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,WAAA,CAAA,CAAA;AAAA,MACrC,YAAc,EAAA,IAAA,CAAK,EAAG,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,YAAA,CAAA,CAAA;AAAA,MACtC,OAAA,EAAS,KAAK,YAAa,CAAA,WAAA,EAAA;AAAA,MAC3B,4BAA4B,sBAAuB,CAAA,8BAAA,EAAA;AAAA,MACnD,MAAQ,EAAA,aAAA;AAAA,KAET,CAAA,CAAA,IAAA,CAAK,CAAC,WAA4D,KAAA;AACjE,MAAY,WAAA,CAAA,QAAA,GAAW,KAAK,WAAY,CAAA,yBAAA,CAAA,CAAA;AACxC,MAAA,WAAA,CAAY,QAAW,GAAA,EAAA,CAAA;AAEvB,MAAI,IAAA,GAAA,CAAI,UAAU,aAAe,EAAA;AAC/B,QAAA,WAAA,CAAY,MAAS,GAAA,WAAA,CAAY,MAAO,CAAA,MAAA,CAAO,IAAI,SAAU,CAAA,aAAA,CAAA,CAAA;AAAA,OAAA;AAE/D,MAAA,GAAA,CAAI,WAAc,GAAA,WAAA,CAAA;AAClB,MAAA,IAAA,CAAK,cAAe,CAAA,GAAA,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,0BAA2B,CAAA,GAAA,CAAA,CAAA;AAChC,MAAA,IAAA,CAAK,6BAA8B,CAAA,GAAA,CAAA,CAAA;AACnC,MAAA,IAAA,CAAK,gCAAiC,CAAA,GAAA,CAAA,CAAA;AACtC,MAAA,IAAA,CAAK,6BAA8B,CAAA,GAAA,CAAA,CAAA;AACnC,MAAA,IAAA,CAAK,0BAA2B,CAAA,GAAA,CAAA,CAAA;AAChC,MAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA,CAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,4CAA6C,CAAA,GAAA,CAAA,CAAA;AAClD,MAAA,IAAA,CAAK,wBAAyB,CAAA,GAAA,CAAA,CAAA;AAC9B,MAAA,IAAA,CAAK,yBAA0B,CAAA,GAAA,CAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,4BAA6B,CAAA,GAAA,CAAA,CAAA;AAClC,MAAA,IAAA,CAAK,eAAe,oBAAsB,EAAA,GAAA,CAAA,CAAA;AAC1C,MAAA,IAAA,CAAK,mBAAoB,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIxB,2BAA2B,OAAuC,EAAA;AACvE,IAAA,IAAA,CAAK,GACF,GAAI,CAAA;AAAA,MACH,yBAAyB,IAAK,CAAA,gBAAA,CAAiB,gBAAiB,CAAA,OAAA,CAAQ,aAAa,OAAQ,CAAA,MAAA,CAAA;AAAA,KAE9F,CAAA,CAAA,IAAA,CAAK,CAAC,MAAuD,KAAA;AAC5D,MAAQ,OAAA,CAAA,WAAA,CAAY,uBAA0B,GAAA,KAAA,CAAM,MAAO,CAAA,uBAAA,CAAA,CACxD,IAAI,CAAC,OAAA,KAAY,IAAK,CAAA,0BAAA,CAA2B,OACjD,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGP,IAAA,IAAI,QAAQ,cAAkB,IAAA,IAAA,IAAQ,OAAQ,CAAA,cAAA,CAAe,SAAS,CAAG,EAAA;AACvE,MAAA,IAAA,CAAK,mCAAoC,CAAA,OAAA,CAAA,CAAA;AAAA,KACpC,MAAA;AACL,MAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,0BAA6B,GAAA,EAAA,CAAA;AAC1D,MAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,+BAAkC,GAAA,EAAA,CAAA;AAAA,KAAA;AAEjE,IAAA,IAAA,CAAK,2BAA4B,CAAA,OAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAG5B,oCAAoC,OAAuC,EAAA;AAChF,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,0BAAA,GAA6B,MAAM,OAAQ,CAAA,WAAA,CAAY,yBACjF,MAAO,CAAA;AAAA,MACN,aAAa,OAAQ,CAAA,cAAA;AAAA,KAAA,CAAA,CAEtB,GAAI,CAAA,CAAC,YAAiB,KAAA,YAAA,CAAa,mBACnC,WACA,EAAA,CAAA,KAAA,EAAA,CAAA;AAEH,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,+BAAA,GAAkC,MAAM,OAAQ,CAAA,WAAA,CAAY,yBACtF,MAAO,CAAA;AAAA,MACN,aAAa,OAAQ,CAAA,cAAA;AAAA,KAAA,CAAA,CAEtB,GAAI,CAAA,CAAC,YAAiB,KAAA,YAAA,CAAa,iCACnC,WACA,EAAA,CAAA,KAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGE,2BAA2B,gBAA4E,EAAA;AAC5G,IAAO,OAAA;AAAA,MACL,mBAAmB,gBAAiB,CAAA,iBAAA;AAAA,MACpC,aAAa,gBAAiB,CAAA,WAAA;AAAA,MAC9B,iCAAiC,gBAAiB,CAAA,+BAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAI/C,cAAA,CAAe,OAAe,OAAuC,EAAA;AAC1E,IAAA,IAAA,CAAK,0BAA2B,CAAA,mBAAA,CAAoB,KAAO,CAAA,CAAA,OAAA,CAAQ,CAAC,QAAkB,KAAA;AACpF,MAAA,IAAI,SAAS,KAAQ,CAAA,EAAA;AACnB,QAAA,QAAA,CAAS,KAAO,CAAA,CAAA,OAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKf,gBAAgB,OAAyB,EAAA;AAC9C,IAAO,OAAA,OAAA,CAAQ,MAAM,GAAK,CAAA,CAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGrB,aAAa,KAAgC,EAAA;AAClD,IAAA,IAAI,MAAM,WAAa,EAAA;AACrB,MAAA,OAAO,GAAG,KAAM,CAAA,eAAA,CAAA,CAAA,CAAA;AAAA,KAAA,MAAA,IACP,KAAM,CAAA,WAAA,IAAe,CAAC,KAAA,CAAM,GAAK,EAAA;AAC1C,MAAO,OAAA,CAAA,EAAG,KAAM,CAAA,QAAA,CAAA,CAAA,EAAY,KAAM,CAAA,UAAA,CAAA,0BAAA,CAAA,CAAA;AAAA,KAC7B,MAAA;AACL,MAAA,OAAO,CAAG,EAAA,KAAA,CAAM,QAAY,CAAA,CAAA,EAAA,KAAA,CAAM,cAAc,KAAM,CAAA,GAAA,CAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAInD,SAAS,KAAyC,EAAA;AACvD,IAAI,IAAA,KAAA,CAAM,YAAY,KAAW,CAAA,EAAA;AAC/B,MAAO,OAAA,KAAA,CAAA;AAAA,KAAA;AAGT,IAAO,OAAA;AAAA,MACL,YAAY,KAAM,CAAA,UAAA;AAAA,MAClB,KAAK,KAAM,CAAA,GAAA;AAAA,MACX,OAAA,EAAS,KAAK,YAAa,CAAA,KAAA,CAAA;AAAA,MAC3B,UAAU,KAAM,CAAA,QAAA;AAAA,MAChB,aAAa,KAAM,CAAA,WAAA;AAAA,MACnB,aAAa,KAAM,CAAA,WAAA;AAAA,MACnB,SAAS,KAAM,CAAA,OAAA;AAAA,MACf,iBAAiB,KAAM,CAAA,eAAA;AAAA,MACvB,SAAS,KAAM,CAAA,OAAA;AAAA,MACf,SAAS,KAAM,CAAA,OAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIZ,yBAAyB,OAAuC,EAAA;AAErE,IAAQ,OAAA,CAAA,WAAA,CAAY,QAAS,CAAA,MAAA,GAAS,OAAQ,CAAA,WAAA,CAAY,OAAO,GAAI,CAAA,CAAC,KAAU,KAAA,IAAA,CAAK,QAAS,CAAA,KAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGzF,2BAA2B,OAAuC,EAAA;AACvE,IAAA,OAAA,CAAQ,WAAY,CAAA,QAAA,CAAS,iBAAoB,GAAA,IAAA,CAC/C,OAAQ,CAAA,WAAA,CAAY,yBAA0B,CAAA,OAAA,CAAQ,WAAa,CAAA,CAAA,OAAA,EACnE,EAAE,IAAA,EAAM,QAAQ,MAChB,EAAA,CAAA,CAAA,iBAAA,CAAA;AACF,IAAQ,OAAA,CAAA,iBAAA,GAAoB,OAAQ,CAAA,WAAA,CAAY,QAAS,CAAA,iBAAA,CAAA;AAAA,GAAA;AAAA,EAGpD,iCAAiC,OAAuC,EAAA;AAC7E,IAAI,IAAA,OAAA,CAAQ,cAAc,IAAS,KAAA,OAAA,CAAQ,eAAe,IAAQ,IAAA,OAAA,CAAQ,WAAY,CAAA,MAAA,IAAU,CAAI,CAAA,EAAA;AAClG,MAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,cAAiB,GAAA,EAAA,CAAA;AAC9C,MAAA,OAAA;AAAA,KAAA;AAGF,IAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,OAAQ,CAAA,WAAA,CAAY,SACrC,MAAO,CAAA;AAAA,MACN,SAAS,OAAQ,CAAA,WAAA;AAAA,MACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,MAChB,SAAS,OAAQ,CAAA,WAAA,GAAc,OAAQ,CAAA,WAAA,CAAY,KAAK,OAAQ,CAAA,UAAA;AAAA,KAAA,CAAA,CAEjE,OACA,EAAA,CAAA,MAAA,CAAO,SACP,CAAA,CAAA,GAAA,CAAI,SACJ,KAAQ,EAAA,CAAA,CAAA,CAAA,CAAA;AAEX,IAAA,IACE,QAAQ,WAAY,CAAA,cAAA,CAAe,QAAQ,WAC3C,CAAA,IAAA,OAAA,CAAQ,YAAY,cAAe,CAAA,OAAA,CAAQ,WAAa,CAAA,CAAA,KAAA,CAAA,IACxD,QAAQ,WAAY,CAAA,cAAA,CAAe,QAAQ,WAAa,CAAA,CAAA,KAAA,CAAA,CAAO,QAAQ,MACvE,CAAA,EAAA;AACA,MAAA,MAAM,oBAAoB,OAAQ,CAAA,WAAA,CAAY,eAAe,OAAQ,CAAA,WAAA,CAAA,CAAa,OAAO,OAAQ,CAAA,MAAA,CAAA,CAAA;AACjG,MAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,kBAAqB,GAAA,KAAA,CAAM,mBACrD,MAAO,CAAA,EAAE,KACT,EAAA,CAAA,CAAA,GAAA,CAAI,MACJ,CAAA,CAAA,KAAA,EAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIA,8BAA8B,OAAuC,EAAA;AAC1E,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,WAAA,GAAc,MAAM,OAAQ,CAAA,WAAA,CAAY,SAClE,MAAO,CAAA;AAAA,MACN,SAAS,OAAQ,CAAA,WAAA;AAAA,MACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KAAA,CAAA,CAEjB,UACA,MAAO,CAAA,SAAA,CAAA,CACP,KACA,EAAA,CAAA,MAAA,CAAO,SAAU,CAAY,EAAA;AAC5B,MAAA,OAAO,CAAE,CAAA,OAAA,IAAW,CAAE,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAItC,8BAA8B,OAAuC,EAAA;AAC1E,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,WAAA,GAAc,MAAM,OAAQ,CAAA,WAAA,CAAY,aAClE,MAAO,CAAA;AAAA,MACN,SAAS,OAAQ,CAAA,WAAA;AAAA,MACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KAAA,CAAA,CAEjB,IAAI,MACJ,CAAA,CAAA,KAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGE,0BAA0B,OAAuC,EAAA;AACtE,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,OAAA,GAAU,MAAM,OAAQ,CAAA,WAAA,CAAY,SAC9D,MAAO,CAAA;AAAA,MACN,SAAS,OAAQ,CAAA,WAAA;AAAA,MACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KAAA,CAAA,CAEjB,IAAI,MACJ,CAAA,CAAA,KAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGE,gCAAgC,QAAuD,EAAA;AAC5F,IAAO,OAAA,CAAA,EAAG,QAAS,CAAA,IAAA,CAAA,EAAA,EAAS,QAAS,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGhC,mBAAmB,QAAoF,EAAA;AAC5G,IAAO,OAAA;AAAA,MACL,SAAS,QAAS,CAAA,OAAA;AAAA,MAClB,QAAQ,QAAS,CAAA,MAAA;AAAA,MACjB,MAAM,QAAS,CAAA,IAAA;AAAA,MACf,IAAI,QAAS,CAAA,EAAA;AAAA,MACb,KAAK,QAAS,CAAA,GAAA;AAAA,MACd,WAAA,EAAa,KAAK,+BAAgC,CAAA,QAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAI/C,6CAA6C,OAAuC,EAAA;AACzF,IAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,0BAAA,GAA6B,MAAM,OAAQ,CAAA,WAAA,CAAY,4BACjF,MAAO,CAAA;AAAA,MACN,SAAS,OAAQ,CAAA,WAAA;AAAA,MACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,KAAA,CAAA,CAEjB,GAAI,CAAA,CAAC,QAAa,KAAA,IAAA,CAAK,mBAAmB,QAC1C,CAAA,CAAA,CAAA,KAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGE,0BAA0B,OAAuC,EAAA;AACtE,IAAA,MAAM,oBACJ,OAAQ,CAAA,WAAA,CAAY,0BAA0B,OAAQ,CAAA,WAAA,CAAA,IAAiB,EAAE,OAAS,EAAA,EAAA,EAAA,CAAA;AACpF,IAAQ,OAAA,CAAA,WAAA,CAAY,QAAS,CAAA,OAAA,GAAU,iBAAkB,CAAA,OAAA,CAAA;AAAA,GAAA;AAAA,EAGpD,2BAA2B,OAAuC,EAAA;AACvE,IAAA,OAAA,CAAQ,WAAY,CAAA,QAAA,CAAS,QAAW,GAAA,KAAA,CAAM,OAAQ,CAAA,WAAA,CAAY,QAC/D,CAAA,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,OAAQ,CAAA,WAAA,EAAA,CAAA,CAC9B,IAAI,MACJ,CAAA,CAAA,KAAA,EAAA,CAAA;AACH,IAAA,IAAI,OAAQ,CAAA,WAAA,CAAY,QAAS,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACpD,MAAA,OAAA,CAAQ,WAAY,CAAA,QAAA,CAAS,QAAS,CAAA,MAAA,CAAO,GAAG,CAAG,EAAA,oBAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIhD,wBAAwB,OAA4D,EAAA;AACzF,IAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,IAAM,MAAA,YAAA,GAAe,QAAQ,WAAY,CAAA,QAAA,CAAA;AACzC,IAAI,IAAA,OAAA,CAAQ,WAAW,IAAM,EAAA;AAC3B,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA;AAET,IAAa,YAAA,CAAA,cAAA,GAAiB,MAAM,OAAQ,CAAA,WAAA,CAAY,SACrD,MAAO,CAAA,EAAE,OAAS,EAAA,OAAA,CAAQ,WAAa,EAAA,MAAA,EAAQ,QAAQ,MACvD,EAAA,CAAA,CAAA,MAAA,CAAO,EAAE,MAAQ,EAAA,KAAA,EAAA,CAAA,CACjB,OAAO,EAAE,OAAA,EAAS,IAClB,EAAA,CAAA,CAAA,MAAA,CAAO,SACP,CAAA,CAAA,KAAA,EAAA,CAAA;AAEH,IAAA,IAAI,QAAQ,WAAa,EAAA;AACvB,MAAA,MAAA,CAAO,KAAM,CAAA,UAAA,GAAa,CAAC,OAAA,CAAQ,YAAY,KAAM,CAAA,CAAC,UACpD,KAAA,KAAA,CAAM,YAAa,CAAA,cAAA,CAAA,CAAgB,IAAK,CAAA,EAAE,SAAS,UAAc,EAAA,CAAA,CAAA,KAAA,EAAA,CAAA,CAAA;AAAA,KAE1D,MAAA,IAAA,CAAC,MAAM,YAAa,CAAA,cAAA,CAAA,CAAgB,KAAK,EAAE,OAAA,EAAS,OAAQ,CAAA,UAAA,EAAA,CAAA,CAAc,KAAS,EAAA,EAAA;AAC5F,MAAA,MAAA,CAAO,MAAM,UAAa,GAAA,IAAA,CAAA;AAAA,KAAA;AAG5B,IAAI,IAAA,MAAA,CAAO,MAAM,UAAY,EAAA;AAC3B,MAAA,OAAA,CAAQ,WAAc,GAAA,IAAA,CAAA;AACtB,MAAA,OAAA,CAAQ,UAAa,GAAA,IAAA,CAAA;AAAA,KAAA;AAGvB,IAAO,OAAA,MAAA,CAAA;AAAA,GAAA;AAAA,EAGD,mBAAmB,OAAwD,EAAA;AACjF,IAAO,OAAA,KAAA,CAAM,QAAQ,WAAY,CAAA,aAAA,CAAA,CAC9B,IAAI,UACJ,CAAA,CAAA,WAAA,EAAA,CACA,MAAO,CAAA,EAAE,IAAM,EAAA,OAAA,CAAQ,eACvB,GAAI,CAAA,SAAA,CAAA,CACJ,cACA,MAAO,CAAA,EAAE,MAAM,OAAQ,CAAA,MAAA,EAAA,CAAA,CACvB,GAAyB,CAAA,eAAA,CAAA,CACzB,WACA,EAAA,CAAA,KAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGE,qBAAqB,OAA2C,EAAA;AACrE,IAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,kBAAmB,CAAA,OAAA,CAAA,CAAS,OACrD,CAAC,EAAA,KAAQ,CAAC,CAAA,EAAA,CAAG,oBAAoB,EAAG,CAAA,gBAAA,KAAqB,SAAc,KAAA,EAAA,CAAG,UAAU,OAAQ,CAAA,KAAA,CAAA,CAAA;AAE9F,IAAA,OAAO,aAAc,CAAA,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,IAAM,CAAA,CAAA,IAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGrC,wBAAwB,OAA2C,EAAA;AACxE,IAAA,MAAM,mBAAsB,GAAA,IAAA,CAAK,kBAAmB,CAAA,OAAA,CAAA,CAAS,MAC3D,CAAA,CAAC,EAAQ,KAAA,CAAA,CAAC,EAAG,CAAA,gBAAA,IAAoB,EAAG,CAAA,gBAAA,KAAqB,cAAc,EAAG,CAAA,KAAA,CAAA,CAAA;AAE5E,IAAA,OAAO,mBAAoB,CAAA,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,IAAM,CAAA,CAAA,IAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAG3C,oBAAoB,OAA2C,EAAA;AACpE,IAAM,MAAA,eAAA,GAAkB,KAAK,kBAAmB,CAAA,OAAA,CAAA,CAAS,OAAO,CAAC,EAAA,KAAO,GAAG,gBAAqB,KAAA,SAAA,CAAA,CAAA;AAChG,IAAA,MAAM,kBAAkB,OAAQ,CAAA,eAAA,CAAgB,GAAc,CAAA,CAAC,OAAO,EAAG,CAAA,YAAA,CAAA,CAAA,CAAA;AACzE,IAAA,OAAO,eAAgB,CAAA,IAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAGlB,6BAA6B,OAA4D,EAAA;AAC9F,IAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,IAAA,MAAM,uBAAwB,CAAQ,OAAA,CAAA,aAAA,IAAiB,EAAI,EAAA,MAAA,CAAO,QAAQ,gBAAoB,IAAA,EAAA,CAAA,CAAA;AAC9F,IAAM,MAAA,gBAAA,GAAmB,KAAK,oBAAqB,CAAA,OAAA,CAAA,CAAA;AACnD,IAAM,MAAA,gBAAA,GAAmB,KAAK,uBAAwB,CAAA,OAAA,CAAA,CAAA;AACtD,IAAM,MAAA,eAAA,GAAkB,KAAK,mBAAoB,CAAA,OAAA,CAAA,CAAA;AACjD,IAAA,MAAM,sBAAsB,OAAQ,CAAA,mBAAA,CAAoB,GAAI,CAAA,CAAC,OAAO,EAAG,CAAA,WAAA,CAAA,CAAA;AACvE,IAAI,IAAA,oBAAA,IAAwB,QAAQ,aAAe,EAAA;AACjD,MAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,KAAQ,GAAA,gBAAA,GAAmB,iBAAiB,MAAO,CAAA,gBAAA,CAAA,CAAA;AACzE,MAAM,MAAA,OAAA,GAAU,aAAa,KAAO,EAAA,oBAAA,CAAA,CAAA;AACpC,MAAM,MAAA,oBAAA,GAAuB,IAAI,OAAS,EAAA,oBAAA,CAAA,CAAA;AAC1C,MAAQ,OAAA,CAAA,aAAA,GAAgB,aAAa,gBAAkB,EAAA,OAAA,CAAA,CAAA;AACvD,MAAI,IAAA,CAAC,QAAQ,KAAO,EAAA;AAClB,QAAQ,OAAA,CAAA,gBAAA,GAAmB,aAAa,gBAAkB,EAAA,OAAA,CAAA,CAAA;AAAA,OACrD,MAAA;AACL,QAAA,OAAO,OAAQ,CAAA,gBAAA,CAAA;AAAA,OAAA;AAEjB,MAAA,IAAI,qBAAqB,MAAQ,EAAA;AAC/B,QAAA,MAAA,CAAO,MAAM,aAAgB,GAAA,oBAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAIjC,IAAA,IAAI,mBAAqB,EAAA;AACvB,MAAM,MAAA,OAAA,GAAU,aAAa,eAAiB,EAAA,mBAAA,CAAA,CAAA;AAC9C,MAAM,MAAA,mBAAA,GAAsB,IAAI,OAAS,EAAA,mBAAA,CAAA,CAAA;AACzC,MAAI,IAAA,mBAAA,IAAuB,mBAAoB,CAAA,MAAA,GAAS,CAAG,EAAA;AACzD,QAAQ,OAAA,CAAA,SAAA,CAAU,MAAM,YAAe,GAAA,mBAAA,CAAA;AAAA,OAAA,MAAA,IAC9B,QAAQ,SAAU,CAAA,KAAA,IAAS,OAAQ,CAAA,SAAA,CAAU,MAAM,YAAc,EAAA;AAC1E,QAAQ,OAAA,CAAA,SAAA,CAAU,MAAM,YAAe,GAAA,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAI3C,IAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,aAAgB,GAAA,gBAAA,CAAA;AAC7C,IAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,gBAAmB,GAAA,gBAAA,CAAA;AAChD,IAAQ,OAAA,CAAA,WAAA,CAAY,SAAS,YAAe,GAAA,eAAA,CAAA;AAC5C,IAAO,OAAA,MAAA,CAAA;AAAA,GAAA;AAAA,EAGF,oBAAA,CAAqB,SAAiC,0BAAsC,EAAA;AACjG,IAAA,OAAO,KAAK,kBAAmB,CAAA,iBAAA,CAAkB,KAAO,CAAA,CAAA,IAAA,CAAK,CAAC,aAAkB,KAAA;AAC9E,MAAA,OAAA,CAAQ,YAAY,aAAgB,GAAA,aAAA,CAAA;AACpC,MAAA,IAAI,CAAC,0BAA4B,EAAA;AAC/B,QAAA,IAAA,CAAK,4BAA6B,CAAA,OAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKjC,eAAe,OAA+D,EAAA;AACnF,IAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,IAAI,IAAA,OAAA,CAAQ,cAAc,IAAS,KAAA,OAAA,CAAQ,eAAe,IAAQ,IAAA,OAAA,CAAQ,WAAY,CAAA,MAAA,IAAU,CAAI,CAAA,EAAA;AAClG,MAAA,OAAA,CAAQ,KAAQ,GAAA,IAAA,CAAA;AAChB,MAAA,MAAA,CAAO,MAAM,KAAQ,GAAA,IAAA,CAAA;AAAA,KAAA,MAAA,IACZ,QAAQ,WAAe,IAAA,IAAA,IAAQ,OAAQ,CAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AACxE,MAAQ,OAAA,CAAA,WAAA,CAAY,OAAQ,CAAA,SAAU,UAAY,EAAA;AAChD,QAAA,MAAM,MAAS,GAAA,IAAA,CAAc,OAAQ,CAAA,WAAA,CAAY,OAAS,EAAA;AAAA,UACxD,OAAS,EAAA,UAAA;AAAA,UACT,SAAS,OAAQ,CAAA,WAAA;AAAA,UACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,SAAA,CAAA,CAAA;AAElB,QAAQ,OAAA,CAAA,KAAA,GAAQ,MAAS,GAAA,MAAA,CAAO,KAAQ,GAAA,IAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAErC,MAAA;AACL,MAAA,MAAM,MAAS,GAAA,IAAA,CAAc,OAAQ,CAAA,WAAA,CAAY,OAAS,EAAA;AAAA,QACxD,SAAS,OAAQ,CAAA,UAAA;AAAA,QACjB,SAAS,OAAQ,CAAA,WAAA;AAAA,QACjB,QAAQ,OAAQ,CAAA,MAAA;AAAA,OAAA,CAAA,CAAA;AAElB,MAAQ,OAAA,CAAA,KAAA,GAAQ,MAAS,GAAA,MAAA,CAAO,KAAQ,GAAA,IAAA,CAAA;AAAA,KAAA;AAE1C,IAAO,OAAA,MAAA,CAAA;AAAA,GAAA;AAAA,EAGF,4BAA4B,OAAuC,EAAA;AACxE,IAAA,IAAI,QAAQ,wBAA0B,EAAA;AACpC,MAAM,MAAA,gCAAA,GAAmC,OAAQ,CAAA,WAAA,CAAY,QAAS,CAAA,0BAAA,CAAA;AACtE,MAAA,MAAM,2BAA2B,OAAQ,CAAA,wBAAA,CAAyB,GAAI,CAAA,CAAC,OAAO,EAAG,CAAA,gBAAA,CAAA,CAAA;AACjF,MAAM,MAAA,8BAAA,GAAiC,aAAa,gCAAkC,EAAA,wBAAA,CAAA,CAAA;AACtF,MAAM,MAAA,8BAAA,GAAiC,IAAI,8BAAgC,EAAA,wBAAA,CAAA,CAAA;AAE3E,MAAI,IAAA,8BAAA,IAAkC,8BAA+B,CAAA,MAAA,GAAS,CAAG,EAAA;AAC/E,QAAQ,OAAA,CAAA,SAAA,CAAU,MAAM,uBAA0B,GAAA,8BAAA,CAAA;AAAA,OAAA,MAAA,IACzC,QAAQ,SAAU,CAAA,KAAA,IAAS,OAAQ,CAAA,SAAA,CAAU,MAAM,uBAAyB,EAAA;AACrF,QAAQ,OAAA,CAAA,SAAA,CAAU,MAAM,uBAA0B,GAAA,EAAA,CAAA;AAAA,OAAA;AAGpD,MAAA,IAAI,QAAQ,2BAA6B,EAAA;AACvC,QAAM,MAAA,gCAAA,GAAmC,QAAQ,WAAY,CAAA,QAAA,CAAS,gCAAgC,GACpG,CAAA,CAAC,OAAO,EAAG,CAAA,gBAAA,CAAA,CAAA;AAEb,QAAM,MAAA,+BAAA,GAAkC,aACtC,gCACA,EAAA,wBAAA,CAAA,CAAA;AAEF,QAAM,MAAA,+BAAA,GAAkC,IAAI,+BAAiC,EAAA,wBAAA,CAAA,CAAA;AAE7E,QAAI,IAAA,+BAAA,IAAmC,+BAAgC,CAAA,MAAA,GAAS,CAAG,EAAA;AACjF,UAAQ,OAAA,CAAA,SAAA,CAAU,MAAM,uBAA0B,GAAA,+BAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAMnD,oBAAoB,GAAmC,EAAA;AAC5D,IAAI,GAAA,CAAA,aAAA,GAAgB,CAAC,OAA+D,KAAA;AAClF,MAAM,MAAA,MAAA,GAAS,KAAK,cAAe,CAAA,OAAA,CAAA,CAAA;AACnC,MAAA,MAAA,CAAO,MAAO,CAAA,KAAA,EAAO,IAAK,CAAA,4BAAA,CAA6B,OAAS,CAAA,CAAA,KAAA,CAAA,CAAA;AAChE,MAAA,OAAA,CAAQ,SAAU,CAAA,KAAA,GAAQ,OAAQ,CAAA,SAAA,CAAU,KAAS,IAAA,EAAA,CAAA;AACrD,MAAO,MAAA,CAAA,OAAA,CAAQ,SAAU,CAAA,KAAA,EAAO,MAAO,CAAA,KAAA,CAAA,CAAA;AACvC,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAI,GAAA,CAAA,aAAA,GAAgB,CAAC,OAA+D,KAAA;AAClF,MAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,MAAA,MAAA,CAAO,MAAO,CAAA,KAAA,EAAO,IAAK,CAAA,uBAAA,CAAwB,OAAS,CAAA,CAAA,KAAA,CAAA,CAAA;AAC3D,MAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,QAAA,MAAA,CAAO,MAAO,CAAA,KAAA,EAAO,OAAQ,CAAA,aAAA,CAAc,OAAS,CAAA,CAAA,KAAA,CAAA,CAAA;AACpD,QAAA,IAAA,CAAK,0BAA2B,CAAA,OAAA,CAAA,CAAA;AAChC,QAAA,IAAA,CAAK,6BAA8B,CAAA,OAAA,CAAA,CAAA;AACnC,QAAA,IAAA,CAAK,6BAA8B,CAAA,OAAA,CAAA,CAAA;AACnC,QAAA,IAAA,CAAK,gCAAiC,CAAA,OAAA,CAAA,CAAA;AACtC,QAAA,IAAA,CAAK,yBAA0B,CAAA,OAAA,CAAA,CAAA;AAC/B,QAAA,IAAA,CAAK,4CAA6C,CAAA,OAAA,CAAA,CAAA;AAClD,QAAA,IAAA,CAAK,0BAA2B,CAAA,OAAA,CAAA,CAAA;AAAA,OAAA;AAGlC,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAI,GAAA,CAAA,iBAAA,GAAoB,CAAC,OAA+D,KAAA;AACtF,MAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,MAAA,IAAA,CAAK,gCAAiC,CAAA,OAAA,CAAA,CAAA;AACtC,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAI,GAAA,CAAA,cAAA,GAAiB,CAAC,OAA0C,KAAA;AAC9D,MAAA,OAAA,CAAQ,UAAU,SAAU,CAAA,UAAA,CAAW,QAAQ,WAAa,EAAA,OAAA,CAAQ,OAAO,OAAQ,CAAA,eAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGrF,IAAI,GAAA,CAAA,kBAAA,GAAqB,CAAC,OAA+D,KAAA;AACvF,MAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,MAAA,MAAM,cAAc,OAAQ,CAAA,WAAA,CAAA;AAC5B,MAAA,IAAI,QAAQ,WAAa,EAAA;AACvB,QAAA,IAAA,CAAK,0BAA2B,CAAA,OAAA,CAAA,CAAA;AAChC,QAAA,IAAA,CAAK,6BAA8B,CAAA,OAAA,CAAA,CAAA;AACnC,QAAA,IAAA,CAAK,6BAA8B,CAAA,OAAA,CAAA,CAAA;AACnC,QAAA,IAAA,CAAK,gCAAiC,CAAA,OAAA,CAAA,CAAA;AACtC,QAAA,IAAA,CAAK,yBAA0B,CAAA,OAAA,CAAA,CAAA;AAC/B,QAAA,IAAA,CAAK,4CAA6C,CAAA,OAAA,CAAA,CAAA;AAClD,QAAA,IAAA,CAAK,yBAA0B,CAAA,OAAA,CAAA,CAAA;AAC/B,QAAA,IAAA,CAAK,0BAA2B,CAAA,OAAA,CAAA,CAAA;AAEhC,QAAI,IAAA,CAAC,KAAK,WAAY,CAAA,QAAA,CAAS,SAAS,EAAE,IAAA,EAAM,QAAQ,MAAW,EAAA,CAAA,EAAA;AACjE,UAAA,OAAA,CAAQ,MAAS,GAAA,IAAA,CAAA;AACjB,UAAA,MAAA,CAAO,MAAM,MAAS,GAAA,IAAA,CAAA;AAAA,SACjB,MAAA;AACL,UAAA,MAAA,CAAO,MAAO,CAAA,KAAA,EAAO,OAAQ,CAAA,aAAA,CAAc,OAAS,CAAA,CAAA,KAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAEjD,MAAA;AACL,QAAA,OAAA,CAAQ,MAAS,GAAA,IAAA,CAAA;AAAA,OAAA;AAEnB,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAI,GAAA,CAAA,4BAAA,GAA+B,CAAC,OAA+D,KAAA;AACjG,MAAM,MAAA,MAAA,GAAuC,EAAE,KAAO,EAAA,EAAA,EAAA,CAAA;AACtD,MAAA,OAAA,CAAQ,yBAA4B,GAAA,IAAA,CAAK,wBAAyB,CAAA,qBAAA,CAChE,OAAQ,CAAA,qBAAA,CAAA,CAAA;AAEV,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAA,IAAA,CAAK,eAAe,qBAAuB,EAAA,GAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAzjBxC,mCAOS,OAAU,GAAA;AAAA,EACtB,IAAA;AAAA,EACA,oBAAA;AAAA,EACA,4BAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,0BAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,CAAA,CAAA;AA6iBG,MAAM,sCAAyC,GAAA,6CAAA,CAAA;AACtD,MAAA,CAAO,sCAAwC,EAAA;AAAA,EAC7C,0BAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,sCAAA;AAAA,CAAA,CAAA,CACC,QAAQ,oCAAsC,EAAA,kCAAA,CAAA;;ACjuB1C,MAAM,2DACX,GAAA,iDAAA,CAAA;AAEF,OAAA,CACG,OAAO,2DAA6D,EAAA;AAAA,EACnE,qBAAA;AAAA,EACA,sCAAA;AAAA,CAAA,CAAA,CAED,QAAQ,8BAAgC,EAAA;AAAA,EACvC,IAAA;AAAA,EACA,qBAAA;AAAA,EACA,oCAAA;AAAA,EACA,SAAU,EAAI,EAAA,mBAAA,EAAqB,kCAAoC,EAAA;AACrE,IAAA,SAAA,uBAAA,CAAiC,OAAO,cAAgB,EAAA;AACtD,MAAA,IAAI,MAAM,WAAa,EAAA;AACrB,QAAA,MAAM,gBAAgB,cAAe,CAAA,IAAA,CAAK,CAAC,UAAe,KAAA,KAAA,CAAM,YAAY,UAAW,CAAA,OAAA,CAAA,CAAA;AAEvF,QAAA,IAAI,aAAe,EAAA;AACjB,UAAA,KAAA,CAAM,UAAU,aAAc,CAAA,OAAA,CAAA;AAC9B,UAAA,KAAA,CAAM,UAAU,aAAc,CAAA,OAAA,CAAA;AAC9B,UAAA,KAAA,CAAM,aAAa,aAAc,CAAA,UAAA,CAAA;AACjC,UAAO,OAAA,KAAA,CAAA;AAAA,SACF,MAAA;AACL,UAAO,OAAA,IAAA,CAAA;AAAA,SAAA;AAAA,OAAA,MAAA,IAEA,MAAM,WAAa,EAAA;AAC5B,QAAA,MAAM,aAAgB,GAAA,cAAA,CAAe,IAAK,CAAA,CAAC,UAAe,KAAA;AACxD,UACE,OAAA,KAAA,CAAM,QAAa,KAAA,UAAA,CAAW,QAC9B,IAAA,KAAA,CAAM,eAAe,UAAW,CAAA,UAAA,IAChC,KAAM,CAAA,GAAA,KAAQ,UAAW,CAAA,GAAA,CAAA;AAAA,SAAA,CAAA,CAAA;AAI7B,QAAA,IAAI,aAAe,EAAA;AACjB,UAAO,OAAA,KAAA,CAAA;AAAA,SACF,MAAA;AACL,UAAO,OAAA,IAAA,CAAA;AAAA,SAAA;AAAA,OAEJ,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAIX,IAA4B,SAAA,kBAAA,CAAA,OAAA,EAAS,GAAK,EAAA,OAAA,GAAU,EAAI,EAAA;AAEtD,MAAI,IAAA,OAAA,CAAQ,QAAQ,KAAQ,CAAA,EAAA;AAC1B,QAAO,OAAA,EAAA,CAAA;AAAA,OACF,MAAA;AACL,QAAA,OAAA,CAAQ,QAAQ,KAAS,CAAA,GAAA,IAAA,CAAA;AAAA,OAAA;AAE3B,MAAA,IAAI,MAAS,GAAA,EAAA,CAAA;AACb,MAAI,IAAA,OAAA,CAAQ,SAAS,mBAAqB,EAAA;AACxC,QAAA,MAAA,CAAO,IAAK,CAAA;AAAA,UACV,WAAa,EAAA,IAAA;AAAA,UACb,iBAAiB,OAAQ,CAAA,eAAA;AAAA,UACzB,SAAS,OAAQ,CAAA,KAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA;AAGrB,MAAQ,OAAA,CAAA,oBAAA,CAAqB,OAAQ,CAAA,SAAU,EAAI,EAAA;AACjD,QAAA,MAAM,OAAO,GAAI,CAAA,IAAA,CAAK,CAAC,KAAA,KAAU,MAAM,KAAU,KAAA,EAAA,CAAA,CAAA;AACjD,QAAA,IAAI,IAAM,EAAA;AACR,UAAA,MAAA,GAAS,MAAO,CAAA,MAAA,CAAO,kBAAmB,CAAA,IAAA,EAAM,GAAK,EAAA,OAAA,CAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA,CAAA,CAAA;AAIzD,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA;AAGT,IAAA,SAAA,iBAAA,CAA2B,QAAU,EAAA;AACnC,MAAA,MAAM,MAAS,GAAA,QAAA,CACZ,MAAO,CAAA,CAAC,OAAY,KAAA;AACnB,QAAA,OAAO,QAAQ,IAAS,KAAA,QAAA,CAAA;AAAA,OAEzB,CAAA,CAAA,GAAA,CAAI,CAAC,OAAY,KAAA;AAChB,QAAO,OAAA;AAAA,UACL,WAAa,EAAA,IAAA;AAAA,UACb,YAAY,OAAQ,CAAA,UAAA;AAAA,UACpB,SAAS,OAAQ,CAAA,OAAA;AAAA,UACjB,cAAc,OAAQ,CAAA,YAAA;AAAA,UACtB,UAAU,OAAQ,CAAA,QAAA;AAAA,UAClB,KAAK,OAAQ,CAAA,GAAA;AAAA,SAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAInB,MAAO,OAAA,MAAA,CAAA;AAAA,KAAA;AAGT,IAAA,SAAA,0BAAA,CAAoC,aAAa,QAAU,EAAA;AACzD,MAAA,QAAA,GAAW,QAAY,IAAA,EAAA,CAAA;AACvB,MAAM,MAAA,iBAAA,GAAoB,eAAe,4BAA6B,CAAA,KAAA,CAAA,CAAA;AAEtE,MAAA,MAAM,kBAAqB,GAAA,QAAA,CAAS,OAAW,IAAA,WAAA,CAAY,kBAAmB,CAAA,GAAA,CAAA;AAC9E,MAAA,MAAM,aAAgB,GAAA,QAAA,CAAS,MAAU,IAAA,WAAA,CAAY,cAAe,CAAA,GAAA,CAAA;AAEpE,MAAA,MAAM,oBAAuB,GAAA,cAAA,CAAe,uCAC1C,CAAA,KAAA,EACA,kBACA,EAAA,aAAA,CAAA,CAAA;AAGF,MAAA,OAAO,GACJ,GAAI,CAAA;AAAA,QACH,cAAgB,EAAA,oBAAA;AAAA,QAChB,yBAA2B,EAAA,iBAAA;AAAA,OAE5B,CAAA,CAAA,IAAA,CAAK,SAAU,SAAW,EAAA;AACzB,QAAA,MAAM,oBAAoB,SAAU,CAAA,cAAA,CAAA;AAEpC,QAAA,IAAI,cAAiB,GAAA,oBAAA,CAAA;AACrB,QAAiB,cAAA,GAAA,cAAA,CAAe,OAAQ,CAAA,iBAAA,EAAmB,WAAY,CAAA,IAAA,CAAA,CAAA;AAEvE,QAAA,MAAM,uBAA0B,GAAA,gCAAA,CAAA;AAEhC,QAAA,MAAM,OAAU,GAAA;AAAA,UACd,aAAa,WAAY,CAAA,IAAA;AAAA,UACzB,WAAa,EAAA,kBAAA;AAAA,UACb,MAAQ,EAAA,aAAA;AAAA,UACR,QAAU,EAAA,EAAA;AAAA,UACV,QAAU,EAAA;AAAA,YACR,GAAK,EAAA,CAAA;AAAA,YACL,GAAK,EAAA,CAAA;AAAA,YACL,OAAS,EAAA,CAAA;AAAA,WAAA;AAAA,UAEX,UAAY,EAAA,KAAA;AAAA,UACZ,eAAiB,EAAA,KAAA;AAAA,UACjB,gBAAkB,EAAA,KAAA;AAAA,UAClB,OAAS,EAAA,cAAA;AAAA,UACT,4BAA8B,EAAA,uBAAA;AAAA,UAC9B,iBAAA;AAAA,UACA,UAAY,EAAA,EAAA;AAAA,UACZ,kBAAoB,EAAA,EAAA;AAAA,UACpB,6BAA+B,EAAA,EAAA;AAAA,UAC/B,oBAAsB,EAAA,EAAA;AAAA,UACtB,qBAAuB,EAAA,EAAA;AAAA,UACvB,sBAAwB,EAAA,EAAA;AAAA,UACxB,yBAA2B,EAAA,KAAA;AAAA,UAC3B,yBAA2B,EAAA,EAAA;AAAA,UAC3B,4BAA8B,EAAA,EAAA;AAAA,UAC9B,cAAgB,EAAA,EAAA;AAAA,UAChB,WAAa,EAAA,EAAA;AAAA,UACb,mCAAqC,EAAA,IAAA;AAAA,UACrC,oBAAsB,EAAA,IAAA;AAAA,UACtB,iBAAmB,EAAA,IAAA;AAAA,UACnB,8BAAgC,EAAA,KAAA;AAAA,UAChC,SAAW,EAAA;AAAA,YACT,oBAAsB,EAAA,KAAA;AAAA,YACtB,iBAAmB,EAAA,IAAA;AAAA,YACnB,iBAAmB,EAAA,IAAA;AAAA,YACnB,IAAA,EAAM,SAAS,IAAQ,IAAA,QAAA;AAAA,YACvB,wBAA0B,EAAA,IAAA;AAAA,YAC1B,KAAO,EAAA,EAAA;AAAA,WAAA;AAAA,SAAA,CAAA;AAIX,QAAA,IACE,YAAY,UACZ,IAAA,WAAA,CAAY,WAAW,8BACvB,IAAA,WAAA,CAAY,WAAW,kBACvB,EAAA;AACA,UAAA,OAAA,CAAQ,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,SAAA;AAG5C,QAAO,OAAA,OAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAIb,IAA6C,SAAA,mCAAA,CAAA,WAAA,EAAa,eAAiB,EAAA,OAAA,EAAS,QAAU,EAAA;AAC5F,MAAM,MAAA,eAAA,GAAkB,EAAE,SAAU,CAAA,eAAA,CAAA,CAAA;AACpC,MAAA,MAAM,MAAS,GAAA,MAAA,CAAO,IAAK,CAAA,eAAA,CAAgB,iBAAmB,CAAA,CAAA,CAAA,CAAA,CAAA;AAG9D,MAAA,MAAM,cAAiB,GAAA,EAAE,OAAS,EAAA,eAAA,CAAgB,OAAS,EAAA,MAAA,EAAA,CAAA;AAC3D,MAAA,OAAO,0BAA2B,CAAA,WAAA,EAAa,cAAgB,CAAA,CAAA,IAAA,CAAK,SAAU,OAAS,EAAA;AACrF,QAAM,MAAA,KAAA,GAAQ,gBAAgB,iBAAkB,CAAA,MAAA,CAAA,CAAA;AAChD,QAAA,MAAM,oBAAoB,KAAM,CAAA,IAAA,CAAK,GAAS,CAAA,KAAA,OAAA,CAAQ,kBAAkB,IAAK,CAAA,GAAA,CAAA,CAAA;AAE7E,QAAA,IAAI,aAAgB,GAAA,kBAAA,CAAmB,OAAS,EAAA,QAAA,CAAS,MAAW,CAAA,IAAA,EAAA,CAAA;AACpE,QAAgB,aAAA,GAAA,aAAA,CAAc,MAAO,CAAA,iBAAA,CAAkB,QAAS,CAAA,QAAA,CAAA,CAAA,CAAA;AAEhE,QAAA,IAAI,OAAQ,CAAA,MAAA,IAAU,OAAQ,CAAA,MAAA,CAAO,KAAO,EAAA;AAC1C,UAAA,OAAA,CAAQ,MAAO,CAAA,KAAA,GAAQ,uBAAwB,CAAA,OAAA,CAAQ,OAAO,KAAO,EAAA,aAAA,CAAA,CAAA;AAAA,SAAA;AAGvE,QAAA,MAAM,SAAY,GAAA;AAAA,UAChB,eAAiB,EAAA,KAAA,CAAA;AAAA,UACjB,qBAAuB,EAAA,IAAA;AAAA,UACvB,iBAAA,EACE,gBAAgB,QAAS,CAAA,GAAA,KAAQ,gBAAgB,QAAS,CAAA,GAAA,IAC1D,gBAAgB,iBAAsB,KAAA,IAAA;AAAA,UACxC,iBAAA;AAAA,UACA,IAAM,EAAA,cAAA;AAAA,UACN,iBAAmB,EAAA,MAAA;AAAA,UACnB,iBAAmB,EAAA,IAAA;AAAA,UACnB,uBAAyB,EAAA,IAAA;AAAA,UACzB,KAAO,EAAA,EAAA;AAAA,UACP,aAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAc,EAAA,OAAA;AAAA,SAAA,CAAA;AAGhB,QAAA,MAAM,aAAgB,GAAA;AAAA,UACpB,MAAA;AAAA,UACA,aAAa,eAAgB,CAAA,OAAA;AAAA,UAC7B,iBAAA,EAAmB,gBAAgB,iBAAkB,CAAA,MAAA,CAAA;AAAA,UACrD,SAAA;AAAA,SAAA,CAAA;AAGF,QAAgB,eAAA,CAAA,QAAA,GAAW,gBAAgB,QAAY,IAAA,EAAA,CAAA;AAEvD,QAAA,OAAO,OAAQ,CAAA,MAAA,CAAO,EAAI,EAAA,OAAA,EAAS,eAAiB,EAAA,aAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAKxD,IAAA,SAAA,qCAAA,CAA+C,SAAS,QAAU,EAAA;AAChE,MAAA,IAAI,aAAgB,GAAA,kBAAA,CAAmB,OAAS,EAAA,QAAA,CAAS,MAAW,CAAA,IAAA,EAAA,CAAA;AACpE,MAAgB,aAAA,GAAA,aAAA,CAAc,MAAO,CAAA,iBAAA,CAAkB,QAAS,CAAA,QAAA,CAAA,CAAA,CAAA;AAEhE,MAAA,OAAO,GAAG,IAAK,CAAA;AAAA,QACb,SAAW,EAAA;AAAA,UACT,yBAA2B,EAAA,IAAA;AAAA,UAE3B,SAAW,EAAA;AAAA,YACT,SAAW,EAAA;AAAA,cACT,IAAM,EAAA,cAAA;AAAA,cACN,aAAA;AAAA,cACA,QAAA;AAAA,cACA,YAAc,EAAA,OAAA;AAAA,aAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAOxB,IAAA,SAAA,6BAAA,CAAuC,WAAa,EAAA;AAClD,MAAA,MAAM,OAAU,GAAA;AAAA,QACd,IAAM,EAAA,WAAA;AAAA,QACN,MAAM,CAAC,EAAE,SAAS,WAAY,CAAA,IAAA,EAAM,QAAQ,WAAY,CAAA,MAAA,EAAA,CAAA;AAAA,QACxD,eAAA,EAAiB,YAAY,GAAI,CAAA,eAAA;AAAA,QACjC,aAAa,WAAY,CAAA,OAAA;AAAA,OAAA,CAAA;AAE3B,MAAA,kCAAA,CAAmC,sBAAuB,CAAA,OAAA,CAAA,CAAA;AAC1D,MAAO,OAAA,OAAA,CAAA;AAAA,KAAA;AAGT,IAA6C,SAAA,mCAAA,CAAA,WAAA,EAAa,WAAa,EAAA,IAAA,GAAO,OAAS,EAAA;AAGrF,MAAA,MAAM,iBAAiB,EAAE,OAAA,EAAS,WAAY,CAAA,OAAA,EAAS,QAAQ,WAAY,CAAA,MAAA,EAAA,CAAA;AAC3E,MAAA,OAAO,0BAA2B,CAAA,WAAA,EAAa,cAAgB,CAAA,CAAA,IAAA,CAAK,SAAU,OAAS,EAAA;AACrF,QAAA,OAAA,CAAQ,cAAc,WAAY,CAAA,OAAA,CAAA;AAClC,QAAQ,OAAA,CAAA,GAAA,GAAM,YAAY,OAAQ,CAAA,GAAA,CAAA;AAClC,QAAQ,OAAA,CAAA,KAAA,GAAQ,YAAY,OAAQ,CAAA,KAAA,CAAA;AACpC,QAAA,OAAA,CAAQ,SAAS,WAAY,CAAA,MAAA,CAAA;AAC7B,QAAA,OAAA,CAAQ,iBAAiB,WAAY,CAAA,UAAA,CAAA;AACrC,QAAA,OAAA,CAAQ,WAAW,WAAY,CAAA,QAAA,CAAA;AAC/B,QAAA,OAAA,CAAQ,UAAU,IAAO,GAAA,IAAA,CAAA;AAEzB,QAAO,OAAA,OAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAIX,IAAO,OAAA;AAAA,MACL,0BAAA;AAAA,MACA,mCAAA;AAAA,MACA,qCAAA;AAAA,MACA,mCAAA;AAAA,MACA,6BAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;AClQD,MAAM,gEACX,GAAA,2CAAA,CAAA;AAEF,MAAA,CAAO,gEAAkE,EAAA;AAAA,EACvE,kBAAA;AAAA,EACA,sCAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sCAAA;AAAA,EACA,qBAAA;AAAA,EACA,wBAAA;AAAA,EACA,uBAAA;AAAA,EACA,uCAAA;AAAA,CAAA,CAAA,CACC,WAAW,yBAA2B,EAAA;AAAA,EACvC,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oCAAA;AAAA,EACA,4BAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,SACE,MAAA,EACA,iBACA,EAAA,EAAA,EACA,QACA,iBACA,EAAA,gBAAA,EACA,kCACA,EAAA,0BAAA,EACA,kBACA,EAAA,aAAA,EACA,gBACA,EAAA,YAAA,EACA,aACA,KACA,EAAA;AACA,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,iBAAA,EAAmB,gBAAiB,CAAA,WAAA,CAClC,mCACA,EAAA,+EAAA,CAAA;AAAA,MAEF,aAAA,EAAe,gBAAiB,CAAA,WAAA,CAC9B,+BACA,EAAA,kEAAA,CAAA;AAAA,MAEF,SAAA,EAAW,gBAAiB,CAAA,WAAA,CAAY,2BAA6B,EAAA,+DAAA,CAAA;AAAA,MACrE,iBAAA,EAAmB,gBAAiB,CAAA,WAAA,CAClC,mCACA,EAAA,+EAAA,CAAA;AAAA,MAEF,UAAA,EAAY,gBAAiB,CAAA,WAAA,CAAY,4BAA8B,EAAA,iEAAA,CAAA;AAAA,MACvE,OAAA,EAAS,gBAAiB,CAAA,WAAA,CAAY,yBAA2B,EAAA,2DAAA,CAAA;AAAA,MACjE,gBAAA,EAAkB,gBAAiB,CAAA,WAAA,CACjC,kCACA,EAAA,6EAAA,CAAA;AAAA,MAEF,gBAAA,EAAkB,gBAAiB,CAAA,WAAA,CACjC,kCACA,EAAA,6EAAA,CAAA;AAAA,MAEF,cAAA,EAAgB,gBAAiB,CAAA,WAAA,CAC/B,oBACA,EAAA,yEAAA,CAAA;AAAA,KAAA,CAAA;AAIJ,IAAA,MAAA,CAAO,KAAQ,GAAA,KAAA,CAAA;AAEf,IAAA,MAAA,CAAO,kBAAkB,WAAY,CAAA,IAAA,CAAA;AACrC,IAAA,MAAA,CAAO,WAAc,GAAA,WAAA,CAAA;AAErB,IAAA,MAAA,CAAO,OAAU,GAAA,kBAAA,CAAA;AAEjB,IAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,MACb,MAAQ,EAAA,KAAA;AAAA,MACR,yBAA2B,EAAA,CAAC,CAAC,kBAAA,CAAmB,SAAU,CAAA,yBAAA;AAAA,KAAA,CAAA;AAG5D,IAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,MAC3B,MAAA,EAAQ,CAAC,qCAAuC,EAAA,UAAA,CAAA;AAAA,MAChD,WAAW,CAAC,yCAAA,CAAA;AAAA,KAAA,CAAA;AAEd,IAAA,IAAI,CAAC,MAAA,CAAO,OAAQ,CAAA,SAAA,CAAU,wBAA0B,EAAA;AACtD,MAAK,IAAA,CAAA,qBAAA,CAAsB,UAAU,IACnC,CAAA,8EAAA,CAAA,CAAA;AAAA,KAAA;AAIJ,IAAgC,SAAA,oBAAA,GAAA;AAE9B,MAAA,IAAI,OAAO,WAAa,EAAA;AACtB,QAAA,OAAA;AAAA,OAAA;AAEF,MAAM,MAAA,UAAA,GAAa,MAAO,CAAA,WAAA,CAAY,IAAK,CAAA,SAAA,CAAU,OAAO,IAAK,CAAA,CAAC,KAAU,KAAA,KAAA,CAAM,IAAS,KAAA,kBAAA,CAAA,CAAA;AAC3F,MAAI,IAAA,UAAA,IAAc,UAAW,CAAA,OAAA,CAAQ,sBAAyB,CAAA,EAAA;AAC5D,QAAA,MAAM,kBAAqB,GAAA,UAAA,CAAW,OAAQ,CAAA,sBAAA,CAAA,CAAwB,OAAO,OAAQ,CAAA,MAAA,CAAA,CAAA;AACrF,QAAA,IAAI,kBAAoB,EAAA;AACtB,UAAA,MAAM,cAAiB,GAAA;AAAA,YACrB,WAAa,EAAA,kBAAA;AAAA,YACb,SAAA,EAAW,OAAO,OAAQ,CAAA,WAAA;AAAA,YAC1B,MAAA,EAAQ,OAAO,OAAQ,CAAA,MAAA;AAAA,YACvB,QAAU,EAAA,KAAA;AAAA,WAAA,CAAA;AAEZ,UAAA,IAAI,YAAe,GAAA,4BAAA,CAAA;AACnB,UAAI,IAAA,MAAA,CAAO,SAAS,yBAA4B,CAAA,EAAA;AAE9C,YAAe,YAAA,GAAA,eAAA,CAAA;AAAA,WAAA;AAEjB,UAAI,IAAA,MAAA,CAAO,SAAS,iCAAoC,CAAA,EAAA;AAEtD,YAAe,YAAA,GAAA,iBAAA,CAAA;AAAA,WAAA;AAEjB,UAAI,IAAA,MAAA,CAAO,SAAS,aAAgB,CAAA,EAAA;AAElC,YAAe,YAAA,GAAA,cAAA,CAAA;AAAA,WAAA;AAEjB,UAAA,MAAA,CAAO,GAAG,YAAc,EAAA,cAAA,CAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA;AAK9B,IAA0B,SAAA,cAAA,GAAA;AACxB,MAAA,WAAA,CAAY,YAAa,CAAA,OAAA,EAAA,CAAA;AACzB,MAAY,WAAA,CAAA,YAAA,CAAa,cAAc,MAAQ,EAAA,oBAAA,CAAA,CAAA;AAAA,KAAA;AAGjD,IAAO,MAAA,CAAA,WAAA,GAAc,IAAI,WAAY,CAAA;AAAA,MACnC,WAAA;AAAA,MACA,KAAO,EAAA,4BAAA;AAAA,MACP,aAAe,EAAA,iBAAA;AAAA,MACf,cAAA;AAAA,KAAA,CAAA,CAAA;AAGF,IAA4B,SAAA,gBAAA,GAAA;AAC1B,MAAA,kCAAA,CAAmC,gBAAiB,CAAA,MAAA,CAAO,OAAS,CAAA,CAAA,IAAA,CAAK,WAAY;AACnF,QAAA,MAAA,CAAO,MAAM,MAAS,GAAA,IAAA,CAAA;AAEtB,QAAA,uBAAA,EAAA,CAAA;AACA,QAAA,iBAAA,EAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAIJ,IAA6B,SAAA,iBAAA,GAAA;AAC3B,MAAA,MAAA,CAAO,MAAO,CAAA,oBAAA,EAAsB,qBAAsB,CAAA,MAAA,CAAO,OAAQ,CAAA,iBAAA,CAAA,CAAA,CAAA;AACzE,MAAA,MAAA,CAAO,MAAO,CAAA,qBAAA,EAAuB,qBAAsB,CAAA,MAAA,CAAO,OAAQ,CAAA,kBAAA,CAAA,CAAA,CAAA;AAC1E,MAAA,MAAA,CAAO,MAAO,CAAA,gBAAA,EAAkB,qBAAsB,CAAA,MAAA,CAAO,OAAQ,CAAA,aAAA,CAAA,CAAA,CAAA;AACrE,MAAA,MAAA,CAAO,MACL,CAAA,+BAAA,EACA,qBAAsB,CAAA,MAAA,CAAO,OAAQ,CAAA,4BAAA,CAAA,CAAA,CAAA;AAEvC,MAAA,MAAA,CAAO,OAAO,eAAiB,EAAA,MAAM,MAAO,CAAA,OAAA,CAAQ,eAAe,MAAO,CAAA,OAAA,CAAA,CAAA,CAAA;AAC1E,MAAA,MAAA,CAAO,OAAO,yBAA2B,EAAA,MAAM,MAAO,CAAA,OAAA,CAAQ,eAAe,MAAO,CAAA,OAAA,CAAA,CAAA,CAAA;AAAA,KAAA;AAGtF,IAAmC,SAAA,uBAAA,GAAA;AACjC,MAA2B,0BAAA,CAAA,MAAA,CAAO,QAAQ,kBAAmB,CAAA,kBAAA,CAAA,CAAA,CAAA;AAC7D,MAA2B,0BAAA,CAAA,MAAA,CAAO,QAAQ,aAAc,CAAA,kBAAA,CAAA,CAAA,CAAA;AAAA,KAAA;AAG1D,IAAA,SAAA,qBAAA,CAA+B,MAAQ,EAAA;AACrC,MAAA,OAAO,WAAY;AACjB,QAAA,0BAAA,CAA2B,MAAO,CAAA,kBAAA,CAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAAA,KAAA;AAItC,IAAsC,SAAA,0BAAA,GAAA;AAAA,KAAA;AAMtC,IAAA,IAAA,CAAK,UAAU,WAAY;AACzB,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAA,IAAA,CAAK,mBAAmB,WAAY;AAClC,MAAA,OAAO,WAAY,CAAA,eAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGrB,IAAA,IAAA,CAAK,SAAS,WAAY;AACxB,MAAI,IAAA,MAAA,CAAO,QAAQ,SAAU,CAAA,IAAA,KAAS,kBAAkB,MAAO,CAAA,OAAA,CAAQ,SAAU,CAAA,IAAA,KAAS,gBAAkB,EAAA;AAC1G,QAAO,OAAA,iBAAA,CAAkB,MAAM,MAAO,CAAA,OAAA,CAAA,CAAA;AAAA,OAAA;AAExC,MAAO,MAAA,CAAA,WAAA,CAAY,OAAO,WAAY;AACpC,QAAO,OAAA,iBAAA,CAAkB,gBAAiB,CAAA,MAAA,CAAO,OAAS,EAAA,WAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAI9D,IAAA,IAAA,CAAK,SAAS,WAAY;AACxB,MAAkB,iBAAA,CAAA,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGpB,IAAI,IAAA,CAAC,MAAO,CAAA,KAAA,CAAM,yBAA2B,EAAA;AAC3C,MAAA,gBAAA,EAAA,CAAA;AAAA,KACK,MAAA;AACL,MAAA,MAAA,CAAO,MAAM,MAAS,GAAA,IAAA,CAAA;AAAA,KAAA;AAGxB,IAAA,IAAA,CAAK,mBAAmB,MAAM;AAC5B,MAAA,MAAA,CAAO,MAAM,yBAA4B,GAAA,KAAA,CAAA;AACzC,MAAA,gBAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAIF,IAAO,MAAA,CAAA,aAAA,GAAgB,SAAU,UAAA,EAAY,KAAO,EAAA;AAClD,MAAA,IAAI,cAAc,UAAY,EAAA;AAC5B,QAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,QAAW,GAAA,KAAA,CAAA;AAAA,OAC/B,MAAA;AACL,QAAA,MAAA,CAAO,QAAQ,UAAc,CAAA,GAAA,KAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAKjC,IAAO,MAAA,CAAA,gBAAA,GAAmB,SAAU,KAAO,EAAA;AACzC,MAAO,OAAA,kCAAA,CAAmC,gBAAiB,CAAA,MAAA,CAAO,OAAS,EAAA,KAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAI7E,IAAA,MAAA,CAAO,qBAAwB,GAAA;AAAA,MAC7B,sBACE,MAAO,CAAA,OAAA,CAAQ,4BAA4B,MAAO,CAAA,OAAA,CAAQ,yBAAyB,MAAS,GAAA,CAAA;AAAA,MAC9F,mBAAA,EAAqB,SAAU,YAAc,EAAA;AAC3C,QAAA,IAAI,gBAAgB,YAAc,EAAA;AAChC,UAAA,MAAA,CAAO,QAAQ,wBAA2B,GAAA,EAAA,CAAA;AAAA,SAAA,MAAA,IACjC,gBAAgB,mBAAqB,EAAA;AAC9C,UAAA,MAAA,CAAO,QAAQ,UAAa,GAAA,EAAA,CAAA;AAC5B,UAAA,MAAA,CAAO,OAAQ,CAAA,wBAAA,GAA2B,MAAO,CAAA,OAAA,CAAQ,wBAA4B,IAAA,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzPxF,MAAM,4EACX,GAAA,uEAAA,CAAA;AAEF,MAAO,CAAA,4EAAA,EAA8E,EAAI,CAAA,CAAA,SAAA,CACvF,gCACA,EAAA;AAAA,EACE,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,GAAA;AAAA,IACT,WAAa,EAAA,GAAA;AAAA,GAAA;AAAA,EAEf,WAAa,EAAA,uFAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACWjB,MAAA,mBAAA,SAAkCA,eAAM,SAAgE,CAAA;AAAA,EACtG,YAAY,KAAkC,EAAA;AAC5C,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AA8BA,IAAA,IAAA,CAAA,6BAAA,GAAgC,CAAC,GAAgC,KAAA;AACvE,MAAA,OAAO,GAAI,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA,CAAY,QAAY,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,0BAC3E,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,0BACzB,GAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGE,IAAA,IAAA,CAAA,kCAAA,GAAqC,CAAC,GAAgC,KAAA;AAC5E,MAAA,OAAO,GAAI,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA,CAAY,QAAY,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,+BAC3E,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,+BACzB,GAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGE,IAA8B,IAAA,CAAA,2BAAA,GAAA,CAAC,6BAAsC,GAAgC,KAAA;AAC3G,MAAA,OAAO,2BACL,IAAA,GAAA,CAAI,WACJ,IAAA,GAAA,CAAI,YAAY,QAChB,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,kCACvB,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,+BAAA,GACzB,KAAK,KAAM,CAAA,wBAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAA,IAAA,CAAA,2BAAA,GAA8B,MAAM;AAC1C,MAAM,MAAA,wBAAA,GAA2B,KAAK,KAAM,CAAA,wBAAA,CAAA;AAC5C,MAAA,wBAAA,CAAyB,KAAK,EAAE,gBAAA,EAAkB,EAAI,EAAA,IAAA,EAAM,MAAM,MAAQ,EAAA,IAAA,EAAA,CAAA,CAAA;AAC1E,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,wBAAA,CAAA,CAAA;AACrD,MAAA,IAAA,CAAK,SAAS,EAAE,wBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGV,IAAA,IAAA,CAAA,8BAAA,GAAiC,CAAC,KAAkB,KAAA;AAC1D,MAAM,MAAA,wBAAA,GAA2B,KAAK,KAAM,CAAA,wBAAA,CAAA;AAC5C,MAAA,wBAAA,CAAyB,OAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AACvC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,wBAAA,CAAA,CAAA;AACrD,MAAA,IAAA,CAAK,SAAS,EAAE,wBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGV,IAA6B,IAAA,CAAA,0BAAA,GAAA,CAAC,OAAe,0BAAuC,KAAA;AAC1F,MAAM,MAAA,wBAAA,GAA2B,KAAK,KAAM,CAAA,wBAAA,CAAA;AAC5C,MAAA,MAAM,iCAAiC,wBAAyB,CAAA,KAAA,CAAA,CAAA;AAChE,MAAA,8BAAA,CAA+B,gBAAmB,GAAA,0BAAA,CAAA;AAClD,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,wBAAA,CAAA,CAAA;AACrD,MAAA,IAAA,CAAK,SAAS,EAAE,wBAAA,EAAA,CAAA,CAAA;AAChB,MAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,SAAU,CAAA,KAAA,CAAM,uBAA0B,GAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGvD,IAA6B,IAAA,CAAA,0BAAA,GAAA,CAAC,OAAe,0BAAuC,KAAA;AAC1F,MAAM,MAAA,wBAAA,GAA2B,KAAK,KAAM,CAAA,wBAAA,CAAA;AAC5C,MAAA,MAAM,iCAAiC,wBAAyB,CAAA,KAAA,CAAA,CAAA;AAChE,MAAA,8BAAA,CAA+B,IAAO,GAAA,0BAAA,CAAA;AACtC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,wBAAA,CAAA,CAAA;AACrD,MAAA,IAAA,CAAK,SAAS,EAAE,wBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGV,IAA+B,IAAA,CAAA,4BAAA,GAAA,CAAC,OAAe,4BAAyC,KAAA;AAC9F,MAAM,MAAA,wBAAA,GAA2B,KAAK,KAAM,CAAA,wBAAA,CAAA;AAC5C,MAAA,MAAM,iCAAiC,wBAAyB,CAAA,KAAA,CAAA,CAAA;AAChE,MAAA,8BAAA,CAA+B,MAAS,GAAA,4BAAA,CAAA;AACxC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,wBAAA,CAAA,CAAA;AACrD,MAAA,IAAA,CAAK,SAAS,EAAE,wBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGV,IAAA,IAAA,CAAA,0BAAA,GAA6B,CAAC,0BAAwC,KAAA;AAC5E,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,2BAA6B,EAAA,0BAAA,EAAA,CAAA,CAAA;AAC7C,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,6BAA+B,EAAA,0BAAA,CAAA,CAAA;AACxD,MAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,SAAU,CAAA,KAAA,CAAM,uBAA0B,GAAA,EAAA,CAAA;AAE7D,MAAM,MAAA,wBAAA,GACJ,8BAA8B,IAAK,CAAA,KAAA,CAAM,gCAAgC,MAAS,GAAA,CAAA,GAC9E,IAAK,CAAA,KAAA,CAAM,+BACX,GAAA,EAAA,CAAA;AACN,MAAA,IAAA,CAAK,SAAS,EAAE,wBAAA,EAAA,CAAA,CAAA;AAChB,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,wBAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAnGrD,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,0BAAA,EAA4B,KAAK,6BAA8B,CAAA,GAAA,CAAA;AAAA,MAC/D,+BAAA,EAAiC,KAAK,kCAAmC,CAAA,GAAA,CAAA;AAAA,MACzE,gBAAgB,GAAI,CAAA,cAAA;AAAA,MACpB,6BACE,GAAI,CAAA,2BAAA,IAAgC,IAAI,wBAA4B,IAAA,GAAA,CAAI,yBAAyB,MAAU,IAAA,CAAA;AAAA,MAC7G,wBAAA,EACE,IAAI,wBAA4B,IAAA,GAAA,CAAI,yBAAyB,MAAS,GAAA,CAAA,GAAI,IAAI,wBAA2B,GAAA,EAAA;AAAA,MAC3G,0BAA4B,EAAA,KAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIzB,iBAAoB,GAAA;AACzB,IAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAiB,GAAK,CAAA,CAAA,IAAA,CAAK,MAAM;AAC1C,MAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AACvB,MAAM,MAAA,2BAAA,GAA8B,KAAK,KAAM,CAAA,2BAAA,CAAA;AAC/C,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,0BAAA,EAA4B,KAAK,6BAA8B,CAAA,GAAA,CAAA;AAAA,QAC/D,+BAAA,EAAiC,KAAK,kCAAmC,CAAA,GAAA,CAAA;AAAA,QACzE,wBAAA,EAA0B,IAAK,CAAA,2BAAA,CAA4B,2BAA6B,EAAA,GAAA,CAAA;AAAA,QACxF,0BAA4B,EAAA,IAAA;AAAA,OAAA,CAAA,CAAA;AAE9B,MAAA,IAAA,CAAK,KAAM,CAAA,aAAA,CAAc,6BAA+B,EAAA,IAAA,CAAK,KAAM,CAAA,2BAAA,CAAA,CAAA;AACnE,MAAA,IAAA,CAAK,KAAM,CAAA,aAAA,CAAc,0BAA4B,EAAA,IAAA,CAAK,KAAM,CAAA,wBAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EA6EpE,MAAkD,GAAA;AAChD,IAAA,MAAM,6BAA6B,IAAK,CAAA,0BAAA,CAAA;AACxC,IAAA,MAAM,6BAA6B,IAAK,CAAA,0BAAA,CAAA;AACxC,IAAA,MAAM,+BAA+B,IAAK,CAAA,4BAAA,CAAA;AAC1C,IAAA,MAAM,8BAA8B,IAAK,CAAA,2BAAA,CAAA;AACzC,IAAA,MAAM,iCAAiC,IAAK,CAAA,8BAAA,CAAA;AAC5C,IAAA,MAAM,6BAA6B,IAAK,CAAA,0BAAA,CAAA;AACxC,IAAM,MAAA,wBAAA,GAA2B,KAAK,KAAM,CAAA,wBAAA,CAAA;AAC5C,IAAM,MAAA,2BAAA,GAA8B,KAAK,KAAM,CAAA,2BAAA,CAAA;AAC/C,IAAM,MAAA,0BAAA,GAA6B,KAAK,KAAM,CAAA,0BAAA,CAAA;AAC9C,IAAA,MAAM,+BACJ,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,SAAS,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,MAAM,uBACrE,GAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,SAAA,CAAU,MAAM,uBACnC,GAAA,EAAA,CAAA;AACN,IAAA,MAAM,gCACJ,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,SAAS,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,MAAM,uBACrE,GAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,SAAA,CAAU,MAAM,uBACnC,GAAA,EAAA,CAAA;AAEN,IAAA,MAAM,qBACJ,GAAA,IAAA,CAAK,KAAM,CAAA,0BAAA,IAA8B,KAAK,KAAM,CAAA,0BAAA,CAA2B,MAAS,GAAA,CAAA,GACpF,IAAK,CAAA,KAAA,CAAM,0BAA2B,CAAA,GAAA,CAAI,CAAC,sBAA0B,KAAA;AACnE,MAAA,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,sBAAA,CAAA,CAAA,EAAyB,KAAO,EAAA,sBAAA,EAAA,CAAA;AAAA,KAErD,CAAA,GAAA,EAAA,CAAA;AAEN,IAAA,MAAM,cACJ,GAAA,2BAAA,IAA+B,6BAC7B,mBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,qBAAA;AAAA,KAAA,+CACZ,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,WAAA;AAAA,KAAA,+CACV,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,4BAAA;AAAA,KAAA,CAAA,EAAiC,8EAE9C,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,CAAA,EAAM,2HAMV,CAAA,CAAA,GAAA,EAAA,CAAA;AAGJ,IAAA,MAAM,4BAA4B,4BAC9B,GAAA,4BAAA,CAA6B,GAAI,CAAA,SAAU,kBAAkB,KAAO,EAAA;AAClE,MAAA,oDAAQ,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAQ,EAAA,gBAAA,CAAA,CAAA;AAAA,KAE1B,CAAA,GAAA,EAAA,CAAA;AAEJ,IAAA,MAAM,4BACJ,GAAA,2BAAA,IAA+B,6BAA8B,CAAA,MAAA,GAAS,CACpE,GAAA,cAAA,GACE,4BAA6B,CAAA,MAAA,GAAS,CAAK,IAAA,CAAC,2BAC9C,mBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,qBAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,4BAAA;AAAA,KAAiC,CAAA,EAAA,8GAAA,CAAA,+CAG/C,IAAD,EAAA,IAAA,EAAK,4CACJA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,WAAA;AAAA,KAAA,EAAY,iFAG3B,CAAA,CAAA,GAAA,EAAA,CAAA;AAGJ,IAAM,MAAA,sBAAA,GACJ,yBAAyB,MAAS,GAAA,CAAA,GAChC,yBAAyB,GAAI,CAAA,SAAU,SAAS,KAAO,EAAA;AACrD,MAAA,oDACG,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAA,EACN,2BACC,mBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,+CACG,OAAD,EAAA;AAAA,QACE,gBAAc,2CAA8C,GAAA,KAAA;AAAA,QAC5D,IAAK,EAAA,QAAA;AAAA,QACL,SAAU,EAAA,+BAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,OAAO,OAAQ,CAAA,gBAAA;AAAA,QACf,QAAU,EAAA,IAAA;AAAA,OAAA,CAAA,CAAA,gDAIb,IAAD,EAAA;AAAA,QAAI,gBAAc,0CAA6C,GAAA,KAAA;AAAA,OAAA,+CAC5D,cAAD,EAAA;AAAA,QACE,WAAY,EAAA,0BAAA;AAAA,QACZ,OAAS,EAAA,qBAAA;AAAA,QACT,OAAO,OAAQ,CAAA,gBAAA;AAAA,QACf,QAAA,EAAU,CAAC,CAAc,KAAA;AACvB,UAAA,0BAAA,CAA2B,OAAO,CAAE,CAAA,KAAA,CAAA,CAAA;AAAA,SAAA;AAAA,QAEtC,SAAW,EAAA,KAAA;AAAA,OAAA,CAAA,CAAA,kBAIhBA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,gBAAc,oCAAuC,GAAA,KAAA;AAAA,QACrD,QAAU,EAAA,2BAAA;AAAA,QACV,IAAK,EAAA,QAAA;AAAA,QACL,SAAU,EAAA,+BAAA;AAAA,QACV,OAAO,OAAQ,CAAA,IAAA;AAAA,QACf,UAAU,CAAC,CAAA,KAAM,0BAA2B,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,OAAA,CAAA,CAAA,kBAG/DA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,gBAAc,sCAAyC,GAAA,KAAA;AAAA,QACvD,QAAU,EAAA,2BAAA;AAAA,QACV,IAAK,EAAA,QAAA;AAAA,QACL,SAAU,EAAA,+BAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,OAAO,OAAQ,CAAA,MAAA;AAAA,QACf,UAAU,CAAC,CAAA,KAAM,4BAA6B,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,OAAA,CAAA,CAAA,EAGjE,CAAC,2BACA,mBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,+CACG,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,qBAAA;AAAA,OAAA,+CACZ,GAAD,EAAA;AAAA,QAAG,SAAU,EAAA,mBAAA;AAAA,QAAoB,OAAA,EAAS,MAAM,8BAA+B,CAAA,KAAA,CAAA;AAAA,OAAA,+CAC5E,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,2BAAA;AAAA,OAAA,CAAA,+CACf,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,SAAA;AAAA,OAAA,EAAU,QAKhC,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA,CAAA;AAAA,KAKN,CAAA,GAAA,2BAAA,IAA+B,IAAK,CAAA,KAAA,CAAM,wBAAyB,CAAA,MAAA,IAAU,oBAC9EA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,MAAgB,KAAA,EAAO,EAAE,KAAO,EAAA,MAAA,EAAA;AAAA,KAAA,+CAC5C,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAA,EACV,KAAI,4IAOX,CAAA,CAAA,CAAA,GAAA,EAAA,CAAA;AAGJ,IAAA,MAAM,8BACJ,IAAK,CAAA,KAAA,CAAM,kBACX,IAAK,CAAA,KAAA,CAAM,QAAQ,WACnB,IAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,UACnB,CAAC,2BAAA,IACD,sBAAsB,MAAS,GAAA,CAAA,gDAC5B,QAAD,EAAA;AAAA,MACE,cAAa,EAAA,iCAAA;AAAA,MACb,SAAU,EAAA,8BAAA;AAAA,MACV,OAAS,EAAA,2BAAA;AAAA,KAAA,+CAER,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,+BAAA;AAAA,KAAkC,CAAA,EAAA,2BAAA,CAAA,GAGlD,CAAC,2BAA+B,IAAA,0BAAA,IAA8B,sBAAsB,MAAU,IAAA,CAAA,gDAC/F,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,MAAgB,KAAA,EAAO,EAAE,KAAO,EAAA,MAAA,EAAA;AAAA,KAAA,+CAC5C,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAA,EAAU,yDAGzB,CAAA,CAAA,GAAA,EAAA,CAAA;AAGJ,IAAA,oDACG,KAAD,EAAA,IAAA,EACI,CAA6B,4BAAA,CAAA,MAAA,GAAS,KAAK,6BAA8B,CAAA,MAAA,GAAS,CACpF,KAAA,0BAAA,gDACG,KAAD,EAAA,IAAA,EAAM,4BAEN,CAAA,GAAA,EAAA,+CAED,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,4BAAA,CAAA,+CACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,EAAiC,GAAC,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,CAAA,kBAC/CA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAD,IAAM,EAAA,GAAA,EAAE,IAAK,CAAA,KAAA,CAAM,cAAe,EAAA,GAAA,CAAA,CAAA,+CAEnC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,OAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,MACE,cAAa,EAAA,uCAAA;AAAA,MACb,IAAK,EAAA,OAAA;AAAA,MACL,OAAS,EAAA,2BAAA;AAAA,MACT,OAAA,EAAS,MAAM,0BAA2B,CAAA,IAAA,CAAA;AAAA,MAC1C,EAAG,EAAA,2BAAA;AAAA,KACH,CAAA,EAAA,qBAAA,CAAA,CAAA,+CAIL,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,OAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,MACE,cAAa,EAAA,sCAAA;AAAA,MACb,IAAK,EAAA,OAAA;AAAA,MACL,SAAS,CAAC,2BAAA;AAAA,MACV,OAAA,EAAS,MAAM,0BAA2B,CAAA,KAAA,CAAA;AAAA,MAC1C,EAAG,EAAA,kCAAA;AAAA,KACH,CAAA,EAAA,uBAAA,CAAA,CAAA,EAIL,0BACC,mBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,MAAO,SAAU,EAAA,mCAAA;AAAA,KAAA,+CACd,OAAD,EAAA,IAAA,+CACG,IAAD,EAAA,IAAA,+CACG,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,eAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,0BAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,MAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,0BAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,QAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,4BAAA;AAAA,KAIpB,CAAA,CAAA,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA,IAAA,EAAQ,sBACR,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA,IAAA,kBACGA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA;AAAA,MAAI,OAAS,EAAA,CAAA;AAAA,KAAI,EAAA,2BAAA,CAAA,CAAA,CAAA,CAAA,gDAKtB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,aAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,SAAA;AAAA,KAAU,EAAA,+BAAA,CAAA,+CACxB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,MAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,KAAA;AAAA,KAAA,CAAA,+CACd,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,KAAA;AAAA,KAAA,CAAA,+CACd,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,KAAA;AAAA,KAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAStB,MAAM,2BAA8B,GAAA,mEAAA,CAAA;AAC3C,MAAA,CAAO,6BAA6B,EAAI,CAAA,CAAA,SAAA,CACtC,4BACA,aAAc,CAAA,iBAAA,CAAkB,qBAAqB,0BAA6B,CAAA,EAAA;AAAA,EAChF,SAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,CAAA,CAAA,CAAA;;AC5VG,MAAA,SAAA,SAAwB,MAAM,SAA4C,CAAA;AAAA,EAC/E,YAAY,KAAwB,EAAA;AAClC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AAkDA,IAAA,IAAA,CAAA,eAAA,GAAkB,MAAoC;AAC5D,MAAA,MAAM,uBAAuB,IAAI,GAAA,EAAA,CAAA;AACjC,MAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,WAAA,CAAY,SAAS,MAAO,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAC5D,QAAqB,oBAAA,CAAA,GAAA,CAAI,EAAE,OAAS,EAAA,CAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAGtC,MAAO,OAAA,oBAAA,CAAA;AAAA,KAAA,CAAA;AAGD,IAAA,IAAA,CAAA,wBAAA,GAA2B,MAAuB;AACxD,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,EAAA;AAAA,QACT,OAAS,EAAA,EAAA;AAAA,QACT,WAAa,EAAA,KAAA;AAAA,QACb,WAAa,EAAA,KAAA;AAAA,QACb,OAAS,EAAA,EAAA;AAAA,QACT,eAAiB,EAAA,EAAA;AAAA,QACjB,OAAS,EAAA,EAAA;AAAA,QACT,QAAU,EAAA,EAAA;AAAA,QACV,UAAY,EAAA,EAAA;AAAA,QACZ,GAAK,EAAA,EAAA;AAAA,OAAA,CAAA;AAAA,KAAA,CAAA;AAID,IAAA,IAAA,CAAA,sBAAA,GAAyB,MAAM;AACrC,MAAM,MAAA,UAAA,GAAa,KAAK,KAAM,CAAA,mBAAA,CAAA;AAC9B,MAAA,UAAA,CAAW,KAAK,EAAE,aAAA,EAAe,EAAI,EAAA,WAAA,EAAa,IAAI,aAAe,EAAA,EAAA,EAAA,CAAA,CAAA;AACrE,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,UAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAAA,IAAA,CAAA,2BAAA,GAA8B,CAAC,QAA6B,KAAA;AAClE,MAAA,MAAM,WAAW,IAAK,CAAA,eAAA,EAAA,CAAA;AACtB,MAAI,IAAA,mBAAA,GAAsB,QAAS,CAAA,GAAA,CAAI,QAAS,CAAA,KAAA,CAAA,CAAA;AAChD,MAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,QAAA,mBAAA,GAAsB,IAAK,CAAA,wBAAA,EAAA,CAAA;AAAA,OAAA;AAG7B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,kBAAoB,EAAA,mBAAA,CAAA,CAAA;AAC7C,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,gBAAkB,EAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG5B,IAAA,IAAA,CAAA,kBAAA,GAAqB,CAAC,eAA4B,KAAA;AACxD,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,cAAgB,EAAA,eAAA,CAAA,CAAA;AACzC,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,YAAc,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGxB,IAAA,IAAA,CAAA,oBAAA,GAAuB,CAAC,iBAA8B,KAAA;AAC5D,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,gBAAkB,EAAA,iBAAA,CAAA,CAAA;AAC3C,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,cAAgB,EAAA,iBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG1B,IAAsC,IAAA,CAAA,mCAAA,GAAA,CAAC,OAAe,cAAmC,KAAA;AAC/F,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,cAAc,cAAe,CAAA,KAAA,CAAA;AAC3C,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AACrC,MAAK,IAAA,CAAA,uBAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGC,IAA+B,IAAA,CAAA,4BAAA,GAAA,CAAC,OAAe,UAAuB,KAAA;AAC5E,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,aAAgB,GAAA,UAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAAA,IAAA,CAAA,wBAAA,GAA2B,CAAC,KAAkB,KAAA;AACpD,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,eAAA,CAAgB,OAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAAA,IAAA,CAAA,uBAAA,GAA0B,MAAM;AACtC,MAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,SAAU,CAAA,KAAA,CAAM,YAAe,GAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AA7HlD,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AACvB,IAAA,IAAI,gBAAmB,GAAA,EAAA,CAAA;AACvB,IAAA,IAAI,GAAI,CAAA,iBAAA,IAAqB,GAAI,CAAA,iBAAA,CAAkB,SAAS,CAAG,EAAA;AAC7D,MAAmB,gBAAA,GAAA,GAAA,CAAI,kBAAkB,CAAG,CAAA,CAAA,aAAA,CAAA;AAAA,KAAA;AAG9C,IAAA,IAAI,kBAA+C,GAAA,EAAA,CAAA;AACnD,IAAA,IAAI,GAAI,CAAA,mBAAA,IAAuB,GAAI,CAAA,mBAAA,CAAoB,SAAS,CAAG,EAAA;AACjE,MAAA,kBAAA,GAAqB,GAAI,CAAA,mBAAA,CAAA;AAAA,KAAA;AAG3B,IAAA,IAAI,GAAI,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AACjD,MAAA,kBAAA,CAAmB,IAAK,CAAA;AAAA,QACtB,aAAA,EAAe,IAAI,qBAAyB,IAAA,gBAAA;AAAA,QAC5C,aAAa,GAAI,CAAA,WAAA;AAAA,QACjB,eAAe,GAAI,CAAA,aAAA;AAAA,OAAA,CAAA,CAAA;AAErB,MAAA,GAAA,CAAI,WAAc,GAAA,EAAA,CAAA;AAClB,MAAA,GAAA,CAAI,qBAAwB,GAAA,EAAA,CAAA;AAAA,KAAA;AAG9B,IAAI,GAAA,CAAA,mBAAA,GAAsB,SAAS,kBAAoB,EAAA,OAAA,CAAA,CAAA;AACvD,IAAA,GAAA,CAAI,iBAAoB,GAAA,IAAA,CAAA;AAExB,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,gBAAkB,EAAA,GAAA,CAAI,gBAAmB,GAAA,GAAA,CAAI,mBAAmB,IAAK,CAAA,wBAAA,EAAA;AAAA,MACrE,cAAc,GAAI,CAAA,YAAA;AAAA,MAClB,gBAAgB,GAAI,CAAA,cAAA;AAAA,MACpB,YAAA,EAAc,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,QAAW,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,MAAS,GAAA,EAAA;AAAA,MAC9F,qBAAqB,GAAI,CAAA,mBAAA;AAAA,MACzB,qBAAA,EAAuB,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,QAAW,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,YAAe,GAAA,EAAA;AAAA,KAAA,CAAA;AAG/G,IAAA,IAAA,CAAK,KAAM,CAAA,mBAAA,CAAoB,OAAQ,CAAA,CAAC,kBAAuB,KAAA;AAC7D,MAAA,kBAAA,CAAmB,aAAgB,GAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAIhC,iBAAoB,GAAA;AACzB,IAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAiB,GAAK,CAAA,CAAA,IAAA,CAAK,MAAM;AAC1C,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,YAAc,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,MAAA;AAAA,QACtD,qBAAuB,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,YAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAsF9D,MAAwC,GAAA;AAC7C,IAAA,MAAM,2BAA2B,IAAK,CAAA,wBAAA,CAAA;AACtC,IAAA,MAAM,8BAA8B,IAAK,CAAA,2BAAA,CAAA;AACzC,IAAA,MAAM,sCAAsC,IAAK,CAAA,mCAAA,CAAA;AACjD,IAAA,MAAM,+BAA+B,IAAK,CAAA,4BAAA,CAAA;AAC1C,IAAA,MAAM,qBAAqB,IAAK,CAAA,kBAAA,CAAA;AAChC,IAAA,MAAM,uBAAuB,IAAK,CAAA,oBAAA,CAAA;AAClC,IAAA,MAAM,mBACJ,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,SAAS,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,SAAA,CAAU,MAAM,YACrE,GAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,SAAA,CAAU,MAAM,YACnC,GAAA,EAAA,CAAA;AAEN,IAAA,MAAM,qBAAqB,IAAK,CAAA,KAAA,CAAM,YAAa,CAAA,GAAA,CAAI,SAAU,KAAO,EAAA;AACtE,MAAA,IAAI,GAAM,GAAA,EAAA,CAAA;AACV,MAAI,IAAA,KAAA,CAAM,WAAe,IAAA,KAAA,CAAM,WAAa,EAAA;AAC1C,QAAM,GAAA,GAAA,KAAA,CAAM,cAAc,YAAe,GAAA,sBAAA,CAAA;AAAA,OAAA;AAE3C,MAAA,OAAO,EAAE,KAAO,EAAA,CAAA,EAAG,QAAQ,KAAM,CAAA,OAAA,CAAA,CAAA,CAAA,EAAY,OAAO,KAAM,CAAA,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG5D,IAAA,MAAM,uBAAuB,gBACzB,GAAA,gBAAA,CAAiB,GAAI,CAAA,SAAU,aAAa,KAAO,EAAA;AACjD,MAAA,2CAAQ,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAQ,EAAA,WAAA,CAAA,CAAA;AAAA,KAE1B,CAAA,GAAA,EAAA,CAAA;AAEJ,IAAM,MAAA,uBAAA,uCACH,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,qBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,4BAAA;AAAA,KAAiC,CAAA,EAAA,qGAAA,CAAA,sCAG/C,IAAD,EAAA,IAAA,EAAK,uCACJ,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACA,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA;AAAA,MAAG,SAAU,EAAA,WAAA;AAAA,KAAY,EAAA,4EAAA,CAAA,CAAA,CAAA;AAI7B,IAAA,MAAM,wBAAwB,IAAK,CAAA,KAAA,CAAM,qBAAsB,CAAA,MAAA,uCAC5D,QAAD,EAAA;AAAA,MACE,SAAU,EAAA,8BAAA;AAAA,MACV,cAAa,EAAA,gCAAA;AAAA,MACb,SAAS,IAAK,CAAA,sBAAA;AAAA,KAAA,sCAEb,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,+BAAA;AAAA,KAAkC,CAAA,EAAA,8BAAA,CAAA,uCAInD,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAU,EAAA,2DAAA,CAAA,CAAA,CAAA;AAI3B,IAAA,MAAM,wBAAwB,IAAK,CAAA,KAAA,CAAM,qBAAsB,CAAA,GAAA,CAAI,SAAU,WAAa,EAAA;AACxF,MAAA,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,WAAA,CAAA,CAAA,EAAe,KAAO,EAAA,WAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG3C,IAAA,MAAM,oBAAoB,IAAK,CAAA,KAAA,CAAM,oBAAoB,GAAI,CAAA,SAAU,SAAS,KAAO,EAAA;AACrF,MAAA,2CACG,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAA,sCACN,IAAD,EAAA;AAAA,QAAI,cAAa,EAAA,6BAAA;AAAA,OAAA,sCACd,cAAD,EAAA;AAAA,QACE,WAAY,EAAA,iCAAA;AAAA,QACZ,OAAS,EAAA,qBAAA;AAAA,QACT,KAAA,EAAO,QAAQ,WAAY,CAAA,QAAA,EAAA;AAAA,QAC3B,QAAU,EAAA,CAAC,CAAc,KAAA,mCAAA,CAAoC,KAAO,EAAA,CAAA,CAAA;AAAA,QACpE,SAAW,EAAA,KAAA;AAAA,OAAA,CAAA,CAAA,kBAGd,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,cAAa,EAAA,iCAAA;AAAA,QACb,IAAK,EAAA,QAAA;AAAA,QACL,SAAU,EAAA,+BAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,KAAA,EAAO,QAAQ,aAAc,CAAA,QAAA,EAAA;AAAA,QAC7B,UAAU,CAAC,CAAA,KAAM,4BAA6B,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,OAAA,CAAA,CAAA,kBAGjE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,qBAAA;AAAA,OAAA,sCACZ,GAAD,EAAA;AAAA,QACE,SAAU,EAAA,mBAAA;AAAA,QACV,cAAa,EAAA,mCAAA;AAAA,QACb,OAAA,EAAS,MAAM,wBAAyB,CAAA,KAAA,CAAA;AAAA,OAAA,sCAEvC,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,2BAAA;AAAA,OAAA,CAAA,sCACf,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,SAAA;AAAA,OAAU,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAQtC,IAAA,2CACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,iCAAA;AAAA,KACZ,EAAA,gBAAA,CAAiB,SAAS,CAAI,mBAAA,KAAA,CAAA,aAAA,CAAC,OAAD,IAAM,EAAA,uBAAA,CAAA,GAAiC,EACtE,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,iBAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,2BAAA;AAAA,KAAA,CAAA,CAAA,sCAEf,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,UAAA;AAAA,MAAW,cAAa,EAAA,gCAAA;AAAA,KAAA,sCACpC,cAAD,EAAA;AAAA,MACE,WAAY,EAAA,2BAAA;AAAA,MACZ,OAAS,EAAA,kBAAA;AAAA,MACT,KAAA,EAAO,IAAK,CAAA,KAAA,CAAM,gBAAiB,CAAA,OAAA;AAAA,MACnC,QAAA,EAAU,CAAC,CAAc,KAAA;AACvB,QAA4B,2BAAA,CAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,MAE9B,SAAW,EAAA,KAAA;AAAA,KAAA,CAAA,CAAA,CAAA,sCAIhB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,eAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,oCAAA;AAAA,KAAA,CAAA,CAAA,sCAEf,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,UAAA;AAAA,MAAW,KAAA,EAAO,EAAE,KAAO,EAAA,OAAA,EAAA;AAAA,KAAA,sCACvC,OAAD,EAAA;AAAA,MACE,cAAa,EAAA,8BAAA;AAAA,MACb,IAAK,EAAA,QAAA;AAAA,MACL,SAAU,EAAA,+BAAA;AAAA,MACV,QAAU,EAAA,KAAA;AAAA,MACV,KAAA,EAAO,KAAK,KAAM,CAAA,YAAA;AAAA,MAClB,QAAU,EAAA,CAAC,CAAM,KAAA,kBAAA,CAAmB,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,sCAIlD,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,iBAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,sCAEf,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,UAAA;AAAA,MAAW,KAAA,EAAO,EAAE,KAAO,EAAA,OAAA,EAAA;AAAA,KAAA,sCACvC,OAAD,EAAA;AAAA,MACE,cAAa,EAAA,gCAAA;AAAA,MACb,IAAK,EAAA,QAAA;AAAA,MACL,SAAU,EAAA,+BAAA;AAAA,MACV,QAAU,EAAA,KAAA;AAAA,MACV,KAAA,EAAO,KAAK,KAAM,CAAA,cAAA;AAAA,MAClB,QAAU,EAAA,CAAC,CAAM,KAAA,oBAAA,CAAqB,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,KAAA,CAAA,CAAA,CAAA,sCAIpD,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,uBAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,yBAAA;AAAA,KAAA,CAAA,CAAA,sCAEf,MAAD,EAAA;AAAA,MAAM,IAAK,EAAA,iCAAA;AAAA,KAAA,sCACR,OAAD,EAAA;AAAA,MAAO,SAAU,EAAA,mCAAA;AAAA,KAAA,kBACd,KAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAD,EAAA;AAAA,MAAI,GAAI,EAAA,QAAA;AAAA,KAAA,sCACL,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,cAAA,sCAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,sCAEf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,aAAA,sCAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,kBAEf,KAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAGJ,CAAA,CAAA,CAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,SAAD,IAAQ,EAAA,iBAAA,CAAA,kBACP,KAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,sCACG,IAAD,EAAA;AAAA,MAAI,OAAS,EAAA,CAAA;AAAA,KAAI,EAAA,qBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAW5B,MAAM,eAAkB,GAAA,4DAAA,CAAA;AAC/B,MAAO,CAAA,eAAA,EAAiB,EAAI,CAAA,CAAA,SAAA,CAC1B,gBACA,EAAA,aAAA,CAAc,kBAAkB,SAAW,EAAA,gBAAA,CAAA,EAAmB,CAAC,SAAA,EAAW,eAAiB,EAAA,kBAAA,CAAA,CAAA,CAAA;;ACrVtF,MAAM,8EACX,GAAA,wEAAA,CAAA;AAEF,MAAO,CAAA,8EAAA,EAAgF,EAAI,CAAA,CAAA,SAAA,CACzF,iCACA,EAAA;AAAA,EACE,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,GAAA;AAAA,IACT,WAAa,EAAA,GAAA;AAAA,IACb,qBAAuB,EAAA,GAAA;AAAA,IACvB,aAAe,EAAA,GAAA;AAAA,IACf,gBAAkB,EAAA,GAAA;AAAA,GAAA;AAAA,EAEpB,WAAa,EAAA,yFAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACTV,MAAM,6EACX,GAAA,mDAAA,CAAA;AAEF,OAAA,CACG,OAAO,6EAA+E,EAAA;AAAA,EACrF,kBAAA;AAAA,EACA,oBAAA;AAAA,CAAA,CAAA,CAED,WAAW,iCAAmC,EAAA;AAAA,EAC7C,QAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAU,MAAA,EAAQ,WAAa,EAAA,cAAA,EAAgB,MAAQ,EAAA;AACrD,IAAQ,OAAA,CAAA,MAAA,CACN,IACA,EAAA,WAAA,CAAY,oBAAsB,EAAA;AAAA,MAChC,MAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,KAAA,CAAA,CAAA,CAAA;AAIJ,IAAO,MAAA,CAAA,MAAA,CAAO,aAAe,EAAA,SAAU,MAAQ,EAAA;AAC7C,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,WAAA,CAAY,SAAU,CAAA,eAAA,CAAA,CAAA;AACtB,QAAA,WAAA,CAAY,YAAa,CAAA,eAAA,CAAA,CAAA;AAAA,OACpB,MAAA;AACL,QAAA,WAAA,CAAY,cAAe,CAAA,eAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;AChC9B,MAAM,wBAA2B,GAAA,8DAAA,CAAA;AACxC,MAAO,CAAA,wBAAA,EAA0B,EAAI,CAAA,CAAA,SAAA,CAAU,uBAAyB,EAAA;AAAA,EACtE,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,GAAA;AAAA,IACT,WAAa,EAAA,GAAA;AAAA,GAAA;AAAA,EAEf,WAAa,EAAA,qEAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkBR,MAAA,aAAA,SAA4B,MAAM,SAAoD,CAAA;AAAA,EAC3F,YAAY,KAA4B,EAAA;AACtC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AAkDA,IAAA,IAAA,CAAA,iBAAA,GAAoB,CAAC,cAAmC,KAAA;AAC9D,MAAA,MAAM,qBAAqB,cAAe,CAAA,KAAA,CAAA;AAC1C,MAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AACvB,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,aAAe,EAAA,kBAAA,CAAA,CAAA;AACxC,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,WAAa,EAAA,kBAAA;AAAA,QACb,oBACE,EAAA,GAAA,CAAI,WAAe,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,WAAA,GACpE,GAAI,CAAA,WAAA,CAAY,SAAS,WACzB,GAAA,EAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIF,IAAA,IAAA,CAAA,oBAAA,GAAuB,CAAC,iBAAsC,KAAA;AACpE,MAAM,MAAA,qBAAA,GAAwB,MAAM,OAAQ,CAAA,iBAAA,CAAA,GACxC,kBAAkB,GAAI,CAAA,CAAC,cAAmB,KAAA,cAAA,CAAe,KACzD,CAAA,GAAA,EAAA,CAAA;AACJ,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,oBAAsB,EAAA,qBAAA,CAAA,CAAA;AAC/C,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,kBAAoB,EAAA,qBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG9B,IAAA,IAAA,CAAA,iBAAA,GAAoB,CAAC,cAAmC,KAAA;AAC9D,MAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AACvB,MAAM,MAAA,kBAAA,GAAqB,MAAM,OAAQ,CAAA,cAAA,CAAA,GACrC,eAAe,GAAI,CAAA,CAAC,UAAe,KAAA,UAAA,CAAW,KAC9C,CAAA,GAAA,EAAA,CAAA;AACJ,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,aAAe,EAAA,kBAAA,CAAA,CAAA;AACxC,MAAA,GAAA,CAAI,iBAAkB,CAAA,GAAA,CAAA,CAAA;AACtB,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,WAAa,EAAA,kBAAA;AAAA,QACb,uBACE,EAAA,GAAA,CAAI,WAAe,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,kBAAA,GACpE,GAAI,CAAA,WAAA,CAAY,SAAS,kBACzB,GAAA,EAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIF,IAAA,IAAA,CAAA,8BAAA,GAAiC,CAAC,WAAyB,KAAA;AACjE,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,0BAA4B,EAAA,WAAA,CAAA,CAAA;AACrD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,wBAA0B,EAAA,WAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAxF1C,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AAEvB,IAAA,IAAI,kBAA+B,GAAA,EAAA,CAAA;AACnC,IAAA,IAAI,GAAI,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AACjD,MAAA,kBAAA,GAAqB,GAAI,CAAA,WAAA,CAAA;AAAA,KAAA;AAG3B,IAAA,IAAI,GAAI,CAAA,UAAA,IAAc,GAAI,CAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AAC/C,MAAA,kBAAA,CAAmB,KAAK,GAAI,CAAA,UAAA,CAAA,CAAA;AAC5B,MAAA,GAAA,CAAI,UAAa,GAAA,EAAA,CAAA;AAAA,KAAA;AAGnB,IAAI,GAAA,CAAA,WAAA,GAAc,SAAS,kBAAoB,EAAA,OAAA,CAAA,CAAA;AAE/C,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,0BAA0B,GAAI,CAAA,wBAAA;AAAA,MAC9B,aAAa,GAAI,CAAA,WAAA;AAAA,MACjB,qBAAA,EAAuB,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,YAAe,GAAA,GAAA,CAAI,YAAY,YAAe,GAAA,EAAA;AAAA,MACxG,oBAAoB,GAAI,CAAA,kBAAA;AAAA,MACxB,uBACE,EAAA,GAAA,CAAI,WAAe,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,kBAAA,GACpE,GAAI,CAAA,WAAA,CAAY,SAAS,kBACzB,GAAA,EAAA;AAAA,MACN,aAAa,GAAI,CAAA,WAAA;AAAA,MACjB,oBACE,EAAA,GAAA,CAAI,WAAe,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,WAAA,GACpE,GAAI,CAAA,WAAA,CAAY,SAAS,WACzB,GAAA,EAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIH,iBAAoB,GAAA;AACzB,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAiB,GAAK,CAAA,CAAA,IAAA,CAAK,MAAM;AAC1C,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,qBAAA,EAAuB,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,YAAe,GAAA,GAAA,CAAI,YAAY,YAAe,GAAA,EAAA;AAAA,QACxG,uBACE,EAAA,GAAA,CAAI,WAAe,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,kBAAA,GACpE,GAAI,CAAA,WAAA,CAAY,SAAS,kBACzB,GAAA,EAAA;AAAA,QACN,oBACE,EAAA,GAAA,CAAI,WAAe,IAAA,GAAA,CAAI,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,WAAA,CAAY,QAAS,CAAA,WAAA,GACpE,GAAI,CAAA,WAAA,CAAY,SAAS,WACzB,GAAA,EAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EA+CL,MAA4C,GAAA;AACjD,IAAA,MAAM,iCAAiC,IAAK,CAAA,8BAAA,CAAA;AAC5C,IAAA,MAAM,oBAAoB,IAAK,CAAA,iBAAA,CAAA;AAC/B,IAAA,MAAM,uBAAuB,IAAK,CAAA,oBAAA,CAAA;AAClC,IAAA,MAAM,oBAAoB,IAAK,CAAA,iBAAA,CAAA;AAE/B,IAAA,MAAM,wBAAwB,IAAK,CAAA,KAAA,CAAM,qBAAsB,CAAA,GAAA,CAAI,SAAU,WAAa,EAAA;AACxF,MAAA,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,WAAA,CAAA,CAAA,EAAe,KAAO,EAAA,WAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG3C,IAAA,MAAM,0BAA0B,IAAK,CAAA,KAAA,CAAM,uBAAwB,CAAA,GAAA,CAAI,SAAU,aAAe,EAAA;AAC9F,MAAA,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,aAAA,CAAA,CAAA,EAAiB,KAAO,EAAA,aAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG7C,IAAA,MAAM,uBAAuB,IAAK,CAAA,KAAA,CAAM,oBAAqB,CAAA,GAAA,CAAI,SAAU,UAAY,EAAA;AACrF,MAAO,OAAA,EAAE,OAAO,CAAG,EAAA,UAAA,CAAW,YAAY,UAAW,CAAA,KAAA,CAAA,CAAA,CAAA,EAAU,OAAO,UAAW,CAAA,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAGnF,IAAA,MAAM,oBAAoB,IAAK,CAAA,KAAA,CAAM,oBAAqB,CAAA,MAAA,uCACvD,cAAD,EAAA;AAAA,MACE,KAAO,EAAA,IAAA;AAAA,MACP,OAAS,EAAA,oBAAA;AAAA,MACT,KAAA,EAAO,KAAK,KAAM,CAAA,WAAA;AAAA,MAClB,QAAA,EAAU,CAAC,CAAc,KAAA;AACvB,QAAkB,iBAAA,CAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,uCAIrB,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAU,EAAA,4EAAA,CAAA,CAAA;AAGzB,IAAA,MAAM,wBAAwB,IAAK,CAAA,KAAA,CAAM,uBAAwB,CAAA,MAAA,uCAC9D,cAAD,EAAA;AAAA,MACE,KAAO,EAAA,IAAA;AAAA,MACP,OAAS,EAAA,uBAAA;AAAA,MACT,KAAA,EAAO,KAAK,KAAM,CAAA,kBAAA;AAAA,MAClB,QAAA,EAAU,CAAC,CAAc,KAAA;AACvB,QAAqB,oBAAA,CAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,uCAIxB,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAU,EAAA,yDAAA,CAAA,CAAA;AAGzB,IAAA,MAAM,gBACJ,IAAK,CAAA,KAAA,CAAM,WAAgB,KAAA,QAAA,uCACxB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,YAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,GAAI,EAAA,YAAA;AAAA,KAAA,CAAA,CAAA,sCAEhB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,UAAA;AAAA,MAAW,cAAa,EAAA,uBAAA;AAAA,KACpC,EAAA,iBAAA,CAAA,CAAA,sCAIJ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,iBAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,GAAI,EAAA,oBAAA;AAAA,KAAA,CAAA,CAAA,sCAEhB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,UAAA;AAAA,MAAW,cAAa,EAAA,2BAAA;AAAA,KACpC,EAAA,qBAAA,CAAA,CAAA,sCAIJ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,6BAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,GAAI,EAAA,cAAA;AAAA,KAAA,CAAA,CAAA,sCAEhB,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,gBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,MACE,cAAa,EAAA,yCAAA;AAAA,MACb,IAAK,EAAA,OAAA;AAAA,MACL,KAAM,EAAA,MAAA;AAAA,MACN,EAAG,EAAA,8BAAA;AAAA,MACH,OAAA,EAAS,IAAK,CAAA,KAAA,CAAM,wBAA6B,KAAA,IAAA;AAAA,MACjD,QAAA,EAAU,MAAM,8BAA+B,CAAA,IAAA,CAAA;AAAA,KAC/C,CAAA,EAAA,KAAA,CAAA,CAAA,sCAIL,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,gBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAA,KAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,MACE,cAAa,EAAA,0CAAA;AAAA,MACb,IAAK,EAAA,OAAA;AAAA,MACL,KAAM,EAAA,OAAA;AAAA,MACN,EAAG,EAAA,+BAAA;AAAA,MACH,OAAA,EAAS,IAAK,CAAA,KAAA,CAAM,wBAA6B,KAAA,KAAA;AAAA,MACjD,QAAA,EAAU,MAAM,8BAA+B,CAAA,KAAA,CAAA;AAAA,KAC/C,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA,uCAOT,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,CAAA,CAAA;AAGnB,IAAA,2CACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,kCAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,sCACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,yBAAA;AAAA,KAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,cAAA,CAAA,sCACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,iBAAA;AAAA,KAAA,CAAA,CAAA,sCAEf,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,UAAA;AAAA,MAAW,cAAa,EAAA,wBAAA;AAAA,KAAA,sCACpC,cAAD,EAAA;AAAA,MACE,WAAY,EAAA,kCAAA;AAAA,MACZ,OAAS,EAAA,qBAAA;AAAA,MACT,KAAA,EAAO,KAAK,KAAM,CAAA,WAAA;AAAA,MAClB,QAAA,EAAU,CAAC,CAAc,KAAA;AACvB,QAAkB,iBAAA,CAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAM3B,CAAA,CAAA,CAAA,CAAA,EAAA,aAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAMF,MAAM,oBAAuB,GAAA,6DAAA,CAAA;AACpC,MAAA,CAAO,sBAAsB,EAAI,CAAA,CAAA,SAAA,CAC/B,sBACA,aAAc,CAAA,iBAAA,CAAkB,eAAe,oBAAuB,CAAA,EAAA;AAAA,EACpE,SAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,CAAA,CAAA,CAAA;;AChOG,MAAA,gBAAA,SAA+BA,eAAM,SAA0D,CAAA;AAAA,EACpG,YAAY,KAA+B,EAAA;AACzC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AAyBA,IAAA,IAAA,CAAA,oBAAA,GAAuB,MAAiD;AAC9E,MAAA,MAAM,wBAAwB,IAAI,GAAA,EAAA,CAAA;AAClC,MAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,WAAA,CAAY,SAAS,0BAA2B,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAChF,QAAsB,qBAAA,CAAA,GAAA,CAAI,EAAE,WAAa,EAAA,CAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAG3C,MAAO,OAAA,qBAAA,CAAA;AAAA,KAAA,CAAA;AAGD,IAAA,IAAA,CAAA,gBAAA,GAAmB,MAAoC;AAC7D,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,EAAA;AAAA,QACT,MAAQ,EAAA,EAAA;AAAA,QACR,IAAM,EAAA,EAAA;AAAA,QACN,EAAI,EAAA,EAAA;AAAA,QACJ,GAAK,EAAA,EAAA;AAAA,QACL,WAAa,EAAA,EAAA;AAAA,OAAA,CAAA;AAAA,KAAA,CAAA;AAIT,IAAiC,IAAA,CAAA,8BAAA,GAAA,CAAC,OAAe,WAAgC,KAAA;AACvF,MAAA,MAAM,cAAc,IAAK,CAAA,oBAAA,EAAA,CAAA;AACzB,MAAI,IAAA,2BAAA,GAA8B,WAAY,CAAA,GAAA,CAAI,WAAY,CAAA,KAAA,CAAA,CAAA;AAE9D,MAAA,IAAI,CAAC,2BAA6B,EAAA;AAChC,QAAA,2BAAA,GAA8B,IAAK,CAAA,gBAAA,EAAA,CAAA;AAAA,OAAA;AAGrC,MAAM,MAAA,mBAAA,GAAsB,KAAK,KAAM,CAAA,4BAAA,CAAA;AACvC,MAAA,MAAM,oBAAoB,mBAAoB,CAAA,KAAA,CAAA,CAAA;AAC9C,MAAA,iBAAA,CAAkB,QAAW,GAAA,2BAAA,CAAA;AAC7B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,8BAAgC,EAAA,mBAAA,CAAA,CAAA;AACzD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,4BAA8B,EAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGxC,IAA6B,IAAA,CAAA,0BAAA,GAAA,CAAC,OAAe,UAAuB,KAAA;AAC1E,MAAM,MAAA,mBAAA,GAAsB,KAAK,KAAM,CAAA,4BAAA,CAAA;AACvC,MAAA,MAAM,qBAAqB,mBAAoB,CAAA,KAAA,CAAA,CAAA;AAC/C,MAAA,kBAAA,CAAmB,aAAgB,GAAA,UAAA,CAAA;AACnC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,8BAAgC,EAAA,mBAAA,CAAA,CAAA;AACzD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,4BAA8B,EAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGxC,IAAsC,IAAA,CAAA,mCAAA,GAAA,CAAC,OAAe,mBAAgC,KAAA;AAC5F,MAAM,MAAA,mBAAA,GAAsB,KAAK,KAAM,CAAA,4BAAA,CAAA;AACvC,MAAA,MAAM,qBAAqB,mBAAoB,CAAA,KAAA,CAAA,CAAA;AAC/C,MAAA,kBAAA,CAAmB,aAAgB,GAAA,mBAAA,CAAA;AACnC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,8BAAgC,EAAA,mBAAA,CAAA,CAAA;AACzD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,4BAA8B,EAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGxC,IAAA,IAAA,CAAA,+BAAA,GAAkC,MAAM;AAC9C,MAAM,MAAA,oBAAA,GAAuB,KAAK,KAAM,CAAA,4BAAA,CAAA;AACxC,MAAA,oBAAA,CAAqB,KAAK,EAAE,QAAA,EAAU,KAAK,gBAAoB,EAAA,EAAA,aAAA,EAAe,IAAI,aAAe,EAAA,EAAA,EAAA,CAAA,CAAA;AACjG,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,4BAA8B,EAAA,oBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGxC,IAAA,IAAA,CAAA,kCAAA,GAAqC,CAAC,KAAkB,KAAA;AAC9D,MAAM,MAAA,mBAAA,GAAsB,KAAK,KAAM,CAAA,4BAAA,CAAA;AACvC,MAAA,mBAAA,CAAoB,OAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AAClC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,8BAAgC,EAAA,mBAAA,CAAA,CAAA;AACzD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,4BAA8B,EAAA,mBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AArF9C,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,8BAA8B,GAAI,CAAA,4BAAA;AAAA,MAClC,mCAAA,EACE,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,QAAW,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,0BAA6B,GAAA,EAAA;AAAA,MACtG,2BAA2B,GAAI,CAAA,yBAAA;AAAA,KAAA,CAAA;AAGjC,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,yBAA2B,EAAA;AACzC,MAAA,IAAA,CAAK,KAAM,CAAA,4BAAA,CAA6B,OAAQ,CAAA,CAAC,mCAAwC,KAAA;AACvF,QAAA,mCAAA,CAAoC,aAAgB,GAAA,IAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAKnD,iBAAoB,GAAA;AACzB,IAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAiB,GAAK,CAAA,CAAA,IAAA,CAAK,MAAM;AAC1C,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,mCAAqC,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,0BAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAqE5E,MAA+C,GAAA;AACpD,IAAA,MAAM,oCAAoC,IAAK,CAAA,kCAAA,CAAA;AAC/C,IAAA,MAAM,iCAAiC,IAAK,CAAA,8BAAA,CAAA;AAC5C,IAAA,MAAM,6BAA6B,IAAK,CAAA,0BAAA,CAAA;AACxC,IAAA,MAAM,sCAAsC,IAAK,CAAA,mCAAA,CAAA;AAEjD,IAAA,MAAM,sBAAsB,IAAK,CAAA,KAAA,CAAM,mCAAoC,CAAA,GAAA,CAAI,SAAU,QAAU,EAAA;AACjG,MAAA,OAAO,EAAE,KAAO,EAAA,CAAA,EAAG,QAAS,CAAA,WAAA,CAAA,CAAA,EAAe,OAAO,QAAS,CAAA,WAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG7D,IAAM,MAAA,yBAAA,GAA4B,KAAK,KAAM,CAAA,yBAAA,CAAA;AAC7C,IAAA,MAAM,yBAAyB,IAAK,CAAA,KAAA,CAAM,6BAA6B,GAAI,CAAA,SAAU,SAAS,KAAO,EAAA;AACnG,MAAA,oDACG,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAA,EACN,yBACC,oBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,+CACG,OAAD,EAAA;AAAA,QACE,SAAU,EAAA,uBAAA;AAAA,QACV,WAAY,EAAA,4BAAA;AAAA,QACZ,QAAU,EAAA,IAAA;AAAA,QACV,OAAO,OAAQ,CAAA,aAAA;AAAA,QACf,UAAU,CAAC,CAAA,KAAM,mCAAoC,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,KAAA,CAAA;AAAA,OAAA,CAAA,CAAA,kBAI1EA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAD,EAAA;AAAA,QACE,WAAY,EAAA,sBAAA;AAAA,QACZ,OAAS,EAAA,mBAAA;AAAA,QACT,KAAA,EAAO,OAAQ,CAAA,QAAA,CAAS,WAAY,CAAA,QAAA,EAAA;AAAA,QACpC,QAAU,EAAA,CAAC,CAAc,KAAA,8BAAA,CAA+B,KAAO,EAAA,CAAA,CAAA;AAAA,QAC/D,SAAW,EAAA,KAAA;AAAA,QACX,QAAU,EAAA,IAAA;AAAA,OAAA,CAAA,CAAA,kBAGbA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,IAAK,EAAA,QAAA;AAAA,QACL,SAAU,EAAA,+BAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,OAAO,OAAQ,CAAA,aAAA;AAAA,QACf,UAAU,CAAC,CAAA,KAAM,0BAA2B,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,OAAA,CAAA,CAAA,kBAG/DA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,qBAAA;AAAA,OAAA,+CACZ,GAAD,EAAA;AAAA,QAAG,SAAU,EAAA,mBAAA;AAAA,QAAoB,OAAA,EAAS,MAAM,iCAAkC,CAAA,KAAA,CAAA;AAAA,OAAA,+CAC/E,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,2BAAA;AAAA,OAAA,CAAA,+CACf,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,SAAA;AAAA,OAAU,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAQtC,IAAA,MAAM,iCAAiC,IAAK,CAAA,KAAA,CAAM,mCAAoC,CAAA,MAAA,gDACnF,QAAD,EAAA;AAAA,MAAQ,SAAU,EAAA,8BAAA;AAAA,MAA+B,SAAS,IAAK,CAAA,+BAAA;AAAA,KAAA,+CAC5D,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,+BAAA;AAAA,KAAkC,CAAA,EAAA,0BAAA,CAAA,gDAInD,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAU,EAAA,wDAAA,CAAA,CAAA,CAAA;AAI3B,IAAA,oDACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,iCAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,+BAAA,CAAA,+CACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,sBAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,MAAD,EAAA;AAAA,MAAM,IAAK,EAAA,qCAAA;AAAA,KAAA,+CACR,OAAD,EAAA;AAAA,MAAO,SAAU,EAAA,mCAAA;AAAA,KACf,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,MAAD,IACG,EAAA,yBAAA,iDACE,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,gBAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,mCAAA;AAAA,KAGjB,CAAA,CAAA,EAAA,yBAAA,gDACE,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,UAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,gDAGf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,UAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,+CAGjB,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,MAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,mCAAA;AAAA,KAAA,CAAA,CAAA,kBAEfA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAGJ,CAAA,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAD,IAAQ,EAAA,sBAAA,CAAA,kBACPA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,+CACG,IAAD,EAAA;AAAA,MAAI,OAAS,EAAA,CAAA;AAAA,KAAI,EAAA,8BAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAW5B,MAAM,uBAA0B,GAAA,mEAAA,CAAA;AACvC,MAAA,CAAO,yBAAyB,EAAI,CAAA,CAAA,SAAA,CAClC,yBACA,aAAc,CAAA,iBAAA,CAAkB,kBAAkB,uBAA0B,CAAA,EAAA;AAAA,EAC1E,SAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,CAAA,CAAA,CAAA;;AC5MG,MAAA,cAAA,SAA6BA,eAAM,SAAsD,CAAA;AAAA,EAC9F,YAAY,KAA6B,EAAA;AACvC,IAAM,KAAA,CAAA,KAAA,CAAA,CAAA;AA8CA,IAAA,IAAA,CAAA,eAAA,GAAkB,MAAoC;AAC5D,MAAA,MAAM,uBAAuB,IAAI,GAAA,EAAA,CAAA;AACjC,MAAA,IAAA,CAAK,MAAM,OAAQ,CAAA,WAAA,CAAY,SAAS,MAAO,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAC5D,QAAqB,oBAAA,CAAA,GAAA,CAAI,EAAE,OAAS,EAAA,CAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAGtC,MAAO,OAAA,oBAAA,CAAA;AAAA,KAAA,CAAA;AAGD,IAAA,IAAA,CAAA,wBAAA,GAA2B,MAAuB;AACxD,MAAO,OAAA;AAAA,QACL,OAAS,EAAA,EAAA;AAAA,QACT,OAAS,EAAA,EAAA;AAAA,QACT,WAAa,EAAA,KAAA;AAAA,QACb,WAAa,EAAA,KAAA;AAAA,QACb,OAAS,EAAA,EAAA;AAAA,QACT,eAAiB,EAAA,EAAA;AAAA,QACjB,OAAS,EAAA,EAAA;AAAA,QACT,QAAU,EAAA,EAAA;AAAA,QACV,UAAY,EAAA,EAAA;AAAA,QACZ,GAAK,EAAA,EAAA;AAAA,OAAA,CAAA;AAAA,KAAA,CAAA;AAID,IAA+B,IAAA,CAAA,4BAAA,GAAA;AAAA,MACrC,oBAAqB,CAAA,UAAA;AAAA,MACrB,oBAAqB,CAAA,YAAA;AAAA,MACrB,oBAAqB,CAAA,yBAAA;AAAA,KAAA,CAAA;AAGf,IAAA,IAAA,CAAA,0BAAA,GAA6B,CAAC,kBAAqC,KAAA;AACzE,MAAM,MAAA,gBAAA,GAAmB,EAAE,UAAY,EAAA,kBAAA,EAAA,CAAA;AACvC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,wBAA0B,EAAA,gBAAA,CAAA,CAAA;AACnD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,eAAiB,EAAA,gBAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG3B,IAAA,IAAA,CAAA,gBAAA,GAAmB,CAAC,QAA8B,KAAA;AACxD,MAAA,MAAM,cAAc,EAAE,QAAA,EAAA,CAAA;AACtB,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,wBAA0B,EAAA,WAAA,CAAA,CAAA;AACnD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,eAAiB,EAAA,WAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG3B,IAAA,IAAA,CAAA,WAAA,GAAc,MAAM;AAC1B,MAAM,MAAA,OAAA,GAAU,KAAK,KAAM,CAAA,iBAAA,CAAA;AAC3B,MAAA,OAAA,CAAQ,IAAK,CAAA,EAAE,aAAe,EAAA,EAAA,EAAI,kBAAkB,IAAK,CAAA,wBAAA,EAAA,EAAA,CAAA,CAAA;AACzD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,iBAAmB,EAAA,OAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG7B,IAAA,IAAA,CAAA,sBAAA,GAAyB,MAAM;AACrC,MAAM,MAAA,UAAA,GAAa,KAAK,KAAM,CAAA,mBAAA,CAAA;AAC9B,MAAA,UAAA,CAAW,KAAK,EAAE,aAAA,EAAe,EAAI,EAAA,WAAA,EAAa,IAAI,aAAe,EAAA,EAAA,EAAA,CAAA,CAAA;AACrE,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,UAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAA6B,IAAA,CAAA,0BAAA,GAAA,CAAC,OAAe,OAAoB,KAAA;AACvE,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,iBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,aAAgB,GAAA,OAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,mBAAqB,EAAA,eAAA,CAAA,CAAA;AAC9C,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,iBAAmB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG7B,IAA8B,IAAA,CAAA,2BAAA,GAAA,CAAC,OAAe,QAA6B,KAAA;AACjF,MAAA,MAAM,WAAW,IAAK,CAAA,eAAA,EAAA,CAAA;AACtB,MAAI,IAAA,mBAAA,GAAsB,QAAS,CAAA,GAAA,CAAI,QAAS,CAAA,KAAA,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,mBAAqB,EAAA;AACxB,QAAA,mBAAA,GAAsB,IAAK,CAAA,wBAAA,EAAA,CAAA;AAAA,OAAA;AAE7B,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,iBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,gBAAmB,GAAA,mBAAA,CAAA;AACjC,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,mBAAqB,EAAA,eAAA,CAAA,CAAA;AAC9C,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,iBAAmB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG7B,IAAsC,IAAA,CAAA,mCAAA,GAAA,CAAC,OAAe,cAAmC,KAAA;AAC/F,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,cAAc,cAAe,CAAA,KAAA,CAAA;AAC3C,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAAoC,IAAA,CAAA,iCAAA,GAAA,CAAC,OAAe,eAA4B,KAAA;AACtF,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,aAAgB,GAAA,eAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAA+B,IAAA,CAAA,4BAAA,GAAA,CAAC,OAAe,UAAuB,KAAA;AAC5E,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,MAAM,gBAAgB,eAAgB,CAAA,KAAA,CAAA,CAAA;AACtC,MAAA,aAAA,CAAc,aAAgB,GAAA,UAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAAA,IAAA,CAAA,aAAA,GAAgB,CAAC,KAAkB,KAAA;AACzC,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,iBAAA,CAAA;AACnC,MAAA,eAAA,CAAgB,OAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,mBAAqB,EAAA,eAAA,CAAA,CAAA;AAC9C,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,iBAAmB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG7B,IAAA,IAAA,CAAA,wBAAA,GAA2B,CAAC,KAAkB,KAAA;AACpD,MAAM,MAAA,eAAA,GAAkB,KAAK,KAAM,CAAA,mBAAA,CAAA;AACnC,MAAA,eAAA,CAAgB,OAAO,KAAO,EAAA,CAAA,CAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,KAAA,CAAM,cAAc,qBAAuB,EAAA,eAAA,CAAA,CAAA;AAChD,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,mBAAqB,EAAA,eAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG/B,IAAA,IAAA,CAAA,iCAAA,GAAoC,MAAM;AAChD,MAAA,IAAA,CAAK,MAAM,aACT,CAAA,2CAAA,EACA,CAAC,IAAA,CAAK,MAAM,OAAQ,CAAA,yCAAA,CAAA,CAAA;AAEtB,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,yCAA2C,EAAA,CAAC,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,yCAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AArKjE,IAAM,MAAA,GAAA,GAAM,KAAK,KAAM,CAAA,OAAA,CAAA;AACvB,IAAA,IAAI,gBAAmB,GAAA,EAAA,CAAA;AACvB,IAAA,IAAI,GAAI,CAAA,iBAAA,IAAqB,GAAI,CAAA,iBAAA,CAAkB,SAAS,CAAG,EAAA;AAC7D,MAAmB,gBAAA,GAAA,GAAA,CAAI,kBAAkB,CAAG,CAAA,CAAA,aAAA,CAAA;AAAA,KAAA;AAG9C,IAAA,IAAI,kBAA+C,GAAA,EAAA,CAAA;AACnD,IAAA,IAAI,GAAI,CAAA,mBAAA,IAAuB,GAAI,CAAA,mBAAA,CAAoB,SAAS,CAAG,EAAA;AACjE,MAAA,kBAAA,GAAqB,GAAI,CAAA,mBAAA,CAAA;AAAA,KAAA;AAG3B,IAAA,IAAI,GAAI,CAAA,WAAA,IAAe,GAAI,CAAA,WAAA,CAAY,SAAS,CAAG,EAAA;AACjD,MAAA,kBAAA,CAAmB,IAAK,CAAA;AAAA,QACtB,aAAA,EAAe,IAAI,qBAAyB,IAAA,gBAAA;AAAA,QAC5C,aAAa,GAAI,CAAA,WAAA;AAAA,QACjB,eAAe,GAAI,CAAA,aAAA;AAAA,OAAA,CAAA,CAAA;AAErB,MAAA,GAAA,CAAI,WAAc,GAAA,EAAA,CAAA;AAClB,MAAA,GAAA,CAAI,qBAAwB,GAAA,EAAA,CAAA;AAAA,KAAA;AAG9B,IAAI,GAAA,CAAA,mBAAA,GAAsB,SAAS,kBAAoB,EAAA,OAAA,CAAA,CAAA;AAEvD,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,iBAAiB,GAAI,CAAA,sBAAA;AAAA,MACrB,iBAAmB,EAAA,GAAA,CAAI,iBAAoB,GAAA,GAAA,CAAI,iBAAoB,GAAA,EAAA;AAAA,MACnE,qBAAqB,GAAI,CAAA,mBAAA;AAAA,MACzB,qBAAA,EAAuB,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,QAAW,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,YAAe,GAAA,EAAA;AAAA,MAC7G,YAAA,EAAc,IAAI,WAAe,IAAA,GAAA,CAAI,YAAY,QAAW,GAAA,GAAA,CAAI,WAAY,CAAA,QAAA,CAAS,MAAS,GAAA,EAAA;AAAA,MAC9F,qBAAA,EAAuB,IAAI,qBAAyB,IAAA,gBAAA;AAAA,MACpD,wBAAwB,GAAI,CAAA,6BAAA;AAAA,MAC5B,2CAA2C,GAAI,CAAA,yCAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAK5C,iBAAoB,GAAA;AACzB,IAAA,IAAA,CAAK,KAAM,CAAA,gBAAA,CAAiB,GAAK,CAAA,CAAA,IAAA,CAAK,MAAM;AAC1C,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,YAAc,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,MAAA;AAAA,QACtD,qBAAuB,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,YAAY,QAAS,CAAA,YAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAiI9D,MAA6C,GAAA;AAClD,IAAM,MAAA,EAAE,YAAY,IAAK,CAAA,KAAA,CAAA;AACzB,IAAA,MAAM,gBAAgB,IAAK,CAAA,aAAA,CAAA;AAC3B,IAAA,MAAM,2BAA2B,IAAK,CAAA,wBAAA,CAAA;AACtC,IAAA,MAAM,6BAA6B,IAAK,CAAA,0BAAA,CAAA;AACxC,IAAA,MAAM,8BAA8B,IAAK,CAAA,2BAAA,CAAA;AACzC,IAAA,MAAM,oCAAoC,IAAK,CAAA,iCAAA,CAAA;AAC/C,IAAA,MAAM,sCAAsC,IAAK,CAAA,mCAAA,CAAA;AACjD,IAAA,MAAM,+BAA+B,IAAK,CAAA,4BAAA,CAAA;AAC1C,IAAA,MAAM,oCAAoC,IAAK,CAAA,iCAAA,CAAA;AAE/C,IAAA,MAAM,qBAAqB,IAAK,CAAA,KAAA,CAAM,YAAa,CAAA,GAAA,CAAI,SAAU,KAAO,EAAA;AACtE,MAAA,IAAI,GAAM,GAAA,EAAA,CAAA;AACV,MAAI,IAAA,KAAA,CAAM,WAAe,IAAA,KAAA,CAAM,WAAa,EAAA;AAC1C,QAAM,GAAA,GAAA,KAAA,CAAM,cAAc,YAAe,GAAA,sBAAA,CAAA;AAAA,OAAA;AAE3C,MAAA,OAAO,EAAE,KAAO,EAAA,CAAA,EAAG,QAAQ,KAAM,CAAA,OAAA,CAAA,CAAA,CAAA,EAAY,OAAO,KAAM,CAAA,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG5D,IAAA,MAAM,wBAAwB,IAAK,CAAA,KAAA,CAAM,qBAAsB,CAAA,GAAA,CAAI,SAAU,WAAa,EAAA;AACxF,MAAA,OAAO,EAAE,KAAA,EAAO,CAAG,EAAA,WAAA,CAAA,CAAA,EAAe,KAAO,EAAA,WAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAG3C,IAAA,MAAM,gBAAgB,IAAK,CAAA,KAAA,CAAM,kBAAkB,GAAI,CAAA,SAAU,SAAS,KAAO,EAAA;AAC/E,MAAA,oDACG,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAA,kBACNA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,cAAa,EAAA,yBAAA;AAAA,QACb,SAAU,EAAA,uBAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,WAAY,EAAA,yBAAA;AAAA,QACZ,KAAA,EAAO,QAAQ,aAAc,CAAA,QAAA,EAAA;AAAA,QAC7B,UAAU,CAAC,CAAA,KAAM,0BAA2B,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,KAAA,CAAA;AAAA,OAAA,CAAA,CAAA,+CAG/D,IAAD,EAAA;AAAA,QAAI,cAAa,EAAA,0BAAA;AAAA,OAAA,+CACd,cAAD,EAAA;AAAA,QACE,WAAY,EAAA,2BAAA;AAAA,QACZ,OAAS,EAAA,kBAAA;AAAA,QACT,KAAA,EAAO,QAAQ,gBAAiB,CAAA,OAAA;AAAA,QAChC,QAAA,EAAU,CAAC,CAAc,KAAA;AACvB,UAAA,2BAAA,CAA4B,KAAO,EAAA,CAAA,CAAA,CAAA;AAAA,SAAA;AAAA,QAErC,SAAW,EAAA,KAAA;AAAA,OAAA,CAAA,CAAA,kBAGdA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,qBAAA;AAAA,OAAA,+CACZ,GAAD,EAAA;AAAA,QACE,SAAU,EAAA,mBAAA;AAAA,QACV,cAAa,EAAA,2BAAA;AAAA,QACb,OAAA,EAAS,MAAM,aAAc,CAAA,KAAA,CAAA;AAAA,OAAA,+CAE5B,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,2BAAA;AAAA,OAAA,CAAA,+CACf,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,SAAA;AAAA,OAAU,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAQtC,IAAA,MAAM,oBAAoB,IAAK,CAAA,KAAA,CAAM,oBAAoB,GAAI,CAAA,SAAU,SAAS,KAAO,EAAA;AACrF,MAAA,oDACG,IAAD,EAAA;AAAA,QAAI,GAAK,EAAA,KAAA;AAAA,OAAA,kBACNA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,cAAa,EAAA,gCAAA;AAAA,QACb,SAAU,EAAA,uBAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,WAAY,EAAA,4BAAA;AAAA,QACZ,KAAA,EAAO,QAAQ,aAAc,CAAA,QAAA,EAAA;AAAA,QAC7B,UAAU,CAAC,CAAA,KAAM,iCAAkC,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,KAAA,CAAA;AAAA,OAAA,CAAA,CAAA,+CAGtE,IAAD,EAAA;AAAA,QAAI,cAAa,EAAA,uBAAA;AAAA,OAAA,+CACd,cAAD,EAAA;AAAA,QACE,WAAY,EAAA,iCAAA;AAAA,QACZ,OAAS,EAAA,qBAAA;AAAA,QACT,KAAA,EAAO,QAAQ,WAAY,CAAA,QAAA,EAAA;AAAA,QAC3B,QAAU,EAAA,CAAC,CAAc,KAAA,mCAAA,CAAoC,KAAO,EAAA,CAAA,CAAA;AAAA,QACpE,SAAW,EAAA,KAAA;AAAA,OAAA,CAAA,CAAA,kBAGdA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,OAAD,EAAA;AAAA,QACE,cAAa,EAAA,2BAAA;AAAA,QACb,IAAK,EAAA,QAAA;AAAA,QACL,SAAU,EAAA,+BAAA;AAAA,QACV,QAAU,EAAA,IAAA;AAAA,QACV,KAAA,EAAO,QAAQ,aAAc,CAAA,QAAA,EAAA;AAAA,QAC7B,UAAU,CAAC,CAAA,KAAM,4BAA6B,CAAA,KAAA,EAAO,EAAE,MAAO,CAAA,aAAA,CAAA;AAAA,OAAA,CAAA,CAAA,kBAGjEA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,KAAD,EAAA;AAAA,QAAK,SAAU,EAAA,qBAAA;AAAA,OAAA,+CACZ,GAAD,EAAA;AAAA,QACE,SAAU,EAAA,mBAAA;AAAA,QACV,cAAa,EAAA,6BAAA;AAAA,QACb,OAAA,EAAS,MAAM,wBAAyB,CAAA,KAAA,CAAA;AAAA,OAAA,+CAEvC,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,2BAAA;AAAA,OAAA,CAAA,+CACf,MAAD,EAAA;AAAA,QAAM,SAAU,EAAA,SAAA;AAAA,OAAU,EAAA,QAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAQtC,IAAA,MAAM,wBAAwB,IAAK,CAAA,KAAA,CAAM,qBAAsB,CAAA,MAAA,gDAC5D,QAAD,EAAA;AAAA,MACE,SAAU,EAAA,8BAAA;AAAA,MACV,cAAa,EAAA,0BAAA;AAAA,MACb,SAAS,IAAK,CAAA,sBAAA;AAAA,KAAA,+CAEb,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,+BAAA;AAAA,KAAkC,CAAA,EAAA,8BAAA,CAAA,gDAInD,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAO,KAAM,EAAA,SAAA;AAAA,KAAU,EAAA,2DAAA,CAAA,CAAA,CAAA;AAI3B,IAAA,oDACG,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,iCAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,WAAA;AAAA,KAAA,+CACZ,6BAAD,EAAA;AAAA,MACE,QAAA,EAAU,IAAK,CAAA,KAAA,CAAM,eAAgB,CAAA,QAAA;AAAA,MACrC,8BAA8B,IAAK,CAAA,4BAAA;AAAA,MACnC,kBAAA,EAAoB,IAAK,CAAA,KAAA,CAAM,eAAgB,CAAA,UAAA;AAAA,MAC/C,KAAM,EAAA,UAAA;AAAA,MACN,OAAQ,EAAA,4BAAA;AAAA,MACR,0BAA4B,EAAA,CAAC,QAAgC,KAAA,IAAA,CAAK,2BAA2B,QAAS,CAAA,EAAA,CAAA;AAAA,MACtG,kBAAkB,IAAK,CAAA,gBAAA;AAAA,MACvB,QAAA,EAAU,QAAQ,SAAU,CAAA,QAAA;AAAA,MAC5B,KAAA,EAAO,QAAQ,SAAU,CAAA,YAAA;AAAA,KAAA,CAAA,CAAA,CAAA,+CAK9B,gBAAD,EAAA;AAAA,MACE,cAAe,EAAA,4BAAA;AAAA,MACf,KAAM,EAAA,uBAAA;AAAA,MACN,OAAQ,EAAA,wBAAA;AAAA,MACR,YAAc,EAAA,CAAA;AAAA,MACd,YAAc,EAAA,CAAA;AAAA,KAAA,+CAEb,aAAD,EAAA;AAAA,MACE,OAAA,EAAS,QAAQ,yCAA8C,KAAA,IAAA;AAAA,MAC/D,UAAU,MAAM;AACd,QAAA,iCAAA,EAAA,CAAA;AAAA,OAAA;AAAA,MAEF,IAAK,EAAA,uCAAA;AAAA,KAAA,CAAA,CAAA,+CAIR,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,oBAAA,CAAA,+CACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,uBAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,MAAD,EAAA;AAAA,MAAM,IAAK,EAAA,oCAAA;AAAA,KAAA,+CACR,OAAD,EAAA;AAAA,MAAO,SAAU,EAAA,mCAAA;AAAA,KAAA,kBACdA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA;AAAA,MAAI,GAAI,EAAA,QAAA;AAAA,KAAA,+CACL,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,gBAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,0BAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,iBAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,2BAAA;AAAA,KAAA,CAAA,CAAA,kBAEfA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAGJ,CAAA,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAD,IAAQ,EAAA,aAAA,CAAA,kBACPA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,+CACG,IAAD,EAAA;AAAA,MAAI,OAAS,EAAA,CAAA;AAAA,KAAA,+CACV,QAAD,EAAA;AAAA,MACE,SAAU,EAAA,8BAAA;AAAA,MACV,cAAa,EAAA,wBAAA;AAAA,MACb,SAAS,IAAK,CAAA,WAAA;AAAA,KAAA,+CAEb,MAAD,EAAA;AAAA,MAAM,SAAU,EAAA,+BAAA;AAAA,KAAkC,CAAA,EAAA,2BAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,+CAS/D,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,YAAA;AAAA,KAAA,+CACZ,KAAD,EAAA;AAAA,MAAK,SAAU,EAAA,eAAA;AAAA,KAAA,kBACZA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAD,IAAG,EAAA,uBAAA,CAAA,+CACF,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,yBAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,MAAD,EAAA;AAAA,MAAM,IAAK,EAAA,sCAAA;AAAA,KAAA,+CACR,OAAD,EAAA;AAAA,MAAO,SAAU,EAAA,mCAAA;AAAA,KAAA,kBACdA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA;AAAA,MAAI,GAAI,EAAA,QAAA;AAAA,KAAA,+CACL,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,gBAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,2BAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,cAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,+CAEf,IAAD,EAAA;AAAA,MAAI,KAAA,EAAO,EAAE,KAAO,EAAA,KAAA,EAAA;AAAA,KAAS,EAAA,aAAA,+CAE1B,SAAD,EAAA;AAAA,MAAW,EAAG,EAAA,8BAAA;AAAA,KAAA,CAAA,CAAA,kBAEfA,cAAA,CAAA,aAAA,CAAA,IAAA,EAAD,IAGJ,CAAA,CAAA,CAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAD,IAAQ,EAAA,iBAAA,CAAA,kBACPA,cAAA,CAAA,aAAA,CAAA,OAAA,EAAD,IACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,IAAD,EAAA,IAAA,+CACG,IAAD,EAAA;AAAA,MAAI,OAAS,EAAA,CAAA;AAAA,KAAI,EAAA,qBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAW5B,MAAM,qBAAwB,GAAA,iEAAA,CAAA;AACrC,MAAA,CAAO,uBAAuB,EAAI,CAAA,CAAA,SAAA,CAChC,uBACA,aAAc,CAAA,iBAAA,CAAkB,gBAAgB,qBAAwB,CAAA,EAAA;AAAA,EACtE,SAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,CAAA,CAAA,CAAA;;ACtcJ,MAAM,uBAA6C,GAAA;AAAA,EACjD,QAAU,EAAA;AAAA,IACR,OAAS,EAAA,GAAA;AAAA,IACT,WAAa,EAAA,GAAA;AAAA,GAAA;AAAA,EAEf,WAAa,EAAA,kEAAA;AAAA,EACb,YAAY,MAAM;AAAA,GAAA;AAAA,CAAA,CAAA;AAGb,MAAM,6BAAgC,GAAA,kCAAA,CAAA;AAC7C,MAAO,CAAA,6BAAA,EAA+B,EAAI,CAAA,CAAA,SAAA,CAAU,mBAAqB,EAAA,uBAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACLlE,MAAM,2DACX,GAAA,qDAAA,CAAA;AAEF,OAAA,CACG,OAAO,2DAA6D,EAAA;AAAA,EACnE,mBAAA;AAAA,EACA,6BAAA;AAAA,CAAA,CAAA,CAED,WAAW,0BAA4B,EAAA;AAAA,EACtC,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAU,MAAA,EAAQ,iBAAmB,EAAA,iBAAA,EAAmB,aAAa,WAAa,EAAA;AAChF,IAAA,MAAA,CAAO,WAAc,GAAA,WAAA,CAAA;AACrB,IAAA,MAAA,CAAO,WAAc,GAAA;AAAA,MACnB,GAAA,EAAK,YAAY,QAAS,CAAA,GAAA;AAAA,MAC1B,GAAA,EAAK,YAAY,QAAS,CAAA,GAAA;AAAA,MAC1B,OAAA,EAAS,YAAY,QAAS,CAAA,OAAA;AAAA,MAC9B,OAAS,EAAA,IAAA;AAAA,KAAA,CAAA;AAGX,IAAA,MAAA,CAAO,YAAe,GAAA,EAAA,CAAA;AAEtB,IAAO,MAAA,CAAA,OAAA,GAAU,OAAQ,CAAA,IAAA,CAAK,MAAO,CAAA,WAAA,CAAA,CAAA;AACrC,IAAA,MAAA,CAAO,QAAQ,YAAe,GAAA,WAAA,CAAY,QAAS,CAAA,GAAA,KAAQ,YAAY,QAAS,CAAA,GAAA,CAAA;AAEhF,IAAI,IAAA,WAAA,IAAe,YAAY,UAAY,EAAA;AACzC,MAAA,IAAI,WAAY,CAAA,UAAA,CAAW,8BAAkC,IAAA,WAAA,CAAY,WAAW,kBAAoB,EAAA;AACtG,QAAO,MAAA,CAAA,OAAA,CAAQ,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,OAAA;AAGnD,MAAO,MAAA,CAAA,OAAA,CAAQ,8BAAiC,GAAA,WAAA,CAAY,UAAW,CAAA,8BAAA,CAAA;AAAA,KAAA;AAGzE,IAAA,IAAA,CAAK,UAAU,WAAY;AACzB,MAAA,MAAM,UAAU,MAAO,CAAA,OAAA,CAAA;AACvB,MAAI,IAAA,CAAC,MAAO,CAAA,YAAA,CAAa,QAAU,EAAA;AACjC,QAAO,OAAA,KAAA,CAAA;AAAA,OAAA;AAET,MAAA,OAAO,OAAQ,CAAA,YAAA,GACX,OAAQ,CAAA,GAAA,IAAO,QAAQ,GAAO,IAAA,OAAA,CAAQ,OAAW,IAAA,OAAA,CAAQ,OAAO,OAAQ,CAAA,OAAA,IAAW,OAAQ,CAAA,GAAA,GAC3F,QAAQ,OAAY,KAAA,IAAA,CAAA;AAAA,KAAA,CAAA;AAG1B,IAAO,MAAA,CAAA,WAAA,GAAc,IAAI,WAAY,CAAA;AAAA,MACnC,WAAA;AAAA,MACA,KAAA,EAAO,cAAc,WAAY,CAAA,IAAA;AAAA,MACjC,aAAe,EAAA,iBAAA;AAAA,KAAA,CAAA,CAAA;AAGjB,IAAA,IAAA,CAAK,SAAS,WAAY;AACxB,MAAI,IAAA,CAAC,KAAK,OAAW,EAAA,EAAA;AACnB,QAAA,OAAA;AAAA,OAAA;AAEF,MAAA,IAAI,QAAW,GAAA,EAAE,GAAK,EAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,EAAK,GAAK,EAAA,MAAA,CAAO,OAAQ,CAAA,GAAA,EAAK,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,EAAA,CAAA;AAC3F,MAAI,IAAA,CAAC,MAAO,CAAA,OAAA,CAAQ,YAAc,EAAA;AAChC,QAAW,QAAA,GAAA,EAAE,GAAK,EAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,EAAS,GAAK,EAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,EAAS,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,OAAA,EAAA,CAAA;AAAA,OAAA;AAGjG,MAAA,MAAM,eAAe,WAAY;AAC/B,QAAO,OAAA,iBAAA,CAAkB,iBAAkB,CAAA,WAAA,EAAa,WAAa,EAAA;AAAA,UACnE,QAAA;AAAA,UACA,8BAAA,EAAgC,OAAO,OAAQ,CAAA,8BAAA;AAAA,UAC/C,MAAA,EAAQ,OAAO,OAAQ,CAAA,MAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAI3B,MAAA,MAAA,CAAO,YAAY,MAAO,CAAA,YAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG5B,IAAA,IAAA,CAAK,SAAS,WAAY;AACxB,MAAkB,iBAAA,CAAA,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;AC3EnB,MAAM,+DACX,GAAA,uDAAA,CAAA;AAEF,MAAA,CAAO,+DAAiE,EAAA,CAAC,mBAAsB,CAAA,CAAA,CAAA,UAAA,CAC7F,4BACA,EAAA;AAAA,EACE,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,SACE,MACA,EAAA,iBAAA,EACA,mBACA,WACA,EAAA,WAAA,EACA,sBACA,eACA,EAAA;AACA,IAAA,MAAA,CAAO,WAAc,GAAA,WAAA,CAAA;AACrB,IAAO,MAAA,CAAA,oBAAA,GAAuB,qBAAqB,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,CAAE,IAAK,CAAA,aAAA,CAAc,CAAE,CAAA,IAAA,CAAA,CAAA,CAAA;AACzF,IAAO,MAAA,CAAA,eAAA,GAAkB,gBAAgB,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,CAAE,IAAK,CAAA,aAAA,CAAc,CAAE,CAAA,IAAA,CAAA,CAAA,CAAA;AAC/E,IAAA,MAAA,CAAO,YAAe,GAAA,EAAA,CAAA;AAEtB,IAAA,MAAA,CAAO,OAAU,GAAA;AAAA,MACf,YAAc,EAAA,UAAA;AAAA,MACd,eAAiB,EAAA;AAAA,QACf,yBAAyB,WAAY,CAAA,IAAA;AAAA,OAAA;AAAA,KAAA,CAAA;AAIzC,IAAI,IAAA,WAAA,IAAe,YAAY,UAAY,EAAA;AACzC,MAAA,IAAI,WAAY,CAAA,UAAA,CAAW,8BAAkC,IAAA,WAAA,CAAY,WAAW,kBAAoB,EAAA;AACtG,QAAO,MAAA,CAAA,OAAA,CAAQ,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,OAAA;AAGnD,MAAO,MAAA,CAAA,OAAA,CAAQ,8BAAiC,GAAA,WAAA,CAAY,UAAW,CAAA,8BAAA,CAAA;AAAA,KAAA;AAGzE,IAAA,IAAA,CAAK,UAAU,WAAY;AACzB,MAAA,MAAM,UAAU,MAAO,CAAA,OAAA,CAAA;AACvB,MAAI,IAAA,CAAC,MAAO,CAAA,YAAA,CAAa,QAAU,EAAA;AACjC,QAAO,OAAA,KAAA,CAAA;AAAA,OAAA;AAGT,MAAO,OAAA,OAAA,CAAQ,gBAAgB,sBAA2B,KAAA,KAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG5D,IAAO,MAAA,CAAA,WAAA,GAAc,IAAI,WAAY,CAAA;AAAA,MACnC,WAAA;AAAA,MACA,KAAA,EAAO,cAAc,WAAY,CAAA,IAAA;AAAA,MACjC,aAAe,EAAA,iBAAA;AAAA,KAAA,CAAA,CAAA;AAGjB,IAAA,IAAA,CAAK,WAAW,WAAY;AAC1B,MAAI,IAAA,CAAC,KAAK,OAAW,EAAA,EAAA;AACnB,QAAA,OAAA;AAAA,OAAA;AAGF,MAAA,MAAM,eAAe,WAAY;AAC/B,QAAA,OAAO,iBAAkB,CAAA,mBAAA,CAAoB,WAAa,EAAA,WAAA,EAAa,MAAO,CAAA,OAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAGhF,MAAA,MAAA,CAAO,YAAY,MAAO,CAAA,YAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG5B,IAAA,IAAA,CAAK,SAAS,WAAY;AACxB,MAAkB,iBAAA,CAAA,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA;AAGpB,IAAK,IAAA,CAAA,KAAA,GAAQ,SAAU,YAAa,EAAA;AAClC,MAAA,IAAI,CAAC,YAAa,EAAA;AAChB,QAAO,OAAA,EAAA,CAAA;AAAA,OAAA;AAGT,MAAI,IAAA,CAAC,YAAY,CAAA,SAAA,IAAa,CAAC,YAAA,CAAY,SAAU,CAAA,OAAA,IAAW,CAAC,YAAA,CAAY,SAAU,CAAA,OAAA,CAAQ,MAAQ,EAAA;AACrG,QAAA,OAAO,YAAY,CAAA,IAAA,CAAA;AAAA,OAAA;AAGrB,MAAA,OAAO,aAAY,IAAO,GAAA,WAAA,GAAc,YAAY,CAAA,SAAA,CAAU,QAAQ,MAAS,GAAA,GAAA,CAAA;AAAA,KAAA,CAAA;AAGjF,IAAK,IAAA,CAAA,KAAA,GAAQ,SAAU,YAAa,EAAA;AAClC,MAAO,OAAA,YAAA,CAAY,aAAa,wBAA2B,GAAA,uBAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA;;AC7E5B,MAAA,yBAAA,CAAA;AAAA,EAC7B,cAAc,KAAsC,EAAA;AAC1D,IAAI,IAAA,CAAC,MAAM,kBAAoB,EAAA;AAC7B,MAAA,OAAA;AAAA,KAAA;AAGF,IAAA,QAAQ,KAAM,CAAA,kBAAA;AAAA,MACP,KAAA,mBAAA;AACH,QAAA,KAAA,CAAM,UAAa,GAAA,MAAA,CAAA;AACnB,QAAA,MAAA;AAAA,MACG,KAAA,sBAAA;AACH,QAAA,KAAA,CAAM,UAAa,GAAA,MAAA,CAAA;AACnB,QAAA,MAAA;AAAA,MACG,KAAA,4BAAA;AACH,QAAA,KAAA,CAAM,UAAa,GAAA,MAAA,CAAA;AACnB,QAAA,MAAA;AAAA,MACG,KAAA,+BAAA;AACH,QAAA,KAAA,CAAM,UAAa,GAAA,MAAA,CAAA;AACnB,QAAA,MAAA;AAAA,KAAA;AAAA,GAAA;AAAA,EAIE,wBAAwB,sBAAsD,EAAA;AACpF,IAAA,sBAAA,CAAuB,QAAW,GAAA,sBAAA,CAAuB,iBAAoB,GAAA,CAAA,GAAI,UAAa,GAAA,UAAA,CAAA;AAC9F,IAAuB,sBAAA,CAAA,aAAA,GAAgB,IAAK,CAAA,GAAA,CAAI,sBAAuB,CAAA,iBAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAGjE,uBAAuB,MAAgD,EAAA;AAC7E,IAAA,MAAM,OAA2B,EAAK,GAAA,MAAA,EAAA,CAAA;AACtC,IAAA,MAAM,mBAAmB,CAAC,CAAA,EAAwB,CAChD,KAAA,CAAA,CAAE,2BAA2B,CAAE,CAAA,wBAAA,CAAA;AACjC,IAAA,MAAM,mBAAmB,CAAC,CAAA,EAAwB,CAChD,KAAA,CAAA,CAAE,2BAA2B,CAAE,CAAA,wBAAA,CAAA;AAEjC,IAAK,IAAA,CAAA,MAAA,GAAS,OAAO,MAAU,IAAA,EAAA,CAAA;AAC/B,IAAA,IAAA,CAAK,MAAO,CAAA,OAAA,CAAQ,CAAC,KAAA,KAAmC,KAAK,aAAc,CAAA,KAAA,CAAA,CAAA,CAAA;AAC3E,IAAA,IAAA,CAAK,uBAAwB,CAAA,IAAA,CAAA,CAAA;AAC7B,IAAA,IAAI,IAAK,CAAA,eAAA,IAAmB,IAAK,CAAA,eAAA,CAAgB,MAAQ,EAAA;AACvD,MAAA,IAAA,CAAK,eAAgB,CAAA,OAAA,CAAQ,CAAC,EAAA,KAA4B,KAAK,uBAAwB,CAAA,EAAA,CAAA,CAAA,CAAA;AACvF,MAAM,MAAA,MAAA,GAAS,OAAO,eAAgB,CAAA,KAAA,CAAM,CAAC,CAAuB,KAAA,CAAA,CAAE,wBAA6B,KAAA,KAAA,CAAA,CAAA,GAC/F,gBACA,GAAA,gBAAA,CAAA;AACJ,MAAA,IAAA,CAAK,gBAAgB,IAAK,CAAA,CAAC,CAAwB,EAAA,CAAA,KAA2B,OAAO,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KAAA;AAE1F,IAAO,OAAA,IAAA,CAAA;AAAA,GAAA;AAAA,EAGF,4BAA4B,WAAyD,EAAA;AAC1F,IAAA,MAAM,OAA+B,EAAK,GAAA,WAAA,EAAA,CAAA;AAC1C,IAAA,IAAI,YAAY,eAAiB,EAAA;AAC/B,MAAA,IAAA,CAAK,kBAAkB,WAAY,CAAA,eAAA,CAAgB,IAAI,CAAC,MAAA,KACtD,KAAK,sBAAuB,CAAA,MAAA,CAAA,CAAA,CAAA;AAAA,KAAA;AAGhC,IAAO,OAAA,IAAA,CAAA;AAAA,GAAA;AAAA,EAGF,qBAAqB,WAAkE,EAAA;AAC5F,IAAY,WAAA,CAAA,SAAA,CAAU,OAAQ,CAAA,CAAC,QAAwB,KAAA;AACrD,MAAA,QAAA,CAAS,QAAQ,WAAY,CAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAE/B,IAAA,OAAO,UAAU,QAAW,EAAA,CAAA,IAAA,CAC1B,CAAC,GAAoC,KAAA,IAAA,CAAK,wBAAwB,WAAa,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAI3E,wBAAwB,WAAsE,EAAA;AACpG,IAAA,OAAO,CAAC,IAAiB,KAAA;AACvB,MAAA,MAAM,QAAQ,IAAK,CAAA,IAAA,CAAK,CAAC,IAAS,KAAA,IAAA,CAAK,OAAO,WAAY,CAAA,KAAA,CAAA,CAAA;AAC1D,MAAY,WAAA,CAAA,OAAA,GAAU,KAAQ,GAAA,KAAA,CAAM,IAAO,GAAA,EAAA,CAAA;AAC3C,MAAO,OAAA,WAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,EAIJ,+CAA+C,IAAgB,EAAA;AAEpE,IAAA,MAAM,UAAU,QAAS,CAAA,EAAE,WAAa,EAAA,EAAA,EAAI,WAAW,EAAM,EAAA,EAAA,IAAA,CAAA,CAAA;AAC7D,IAAA,OAAA,CAAQ,aAAgB,GAAA,KAAA,CAAA;AACxB,IAAA,OAAA,CAAQ,iBAAoB,GAAA,EAAA,CAAA;AAC5B,IAAQ,OAAA,CAAA,iBAAA,CAAkB,OAAQ,CAAA,MAAA,CAAA,GAAU,IAAK,CAAA,iBAAA,CAAA;AACjD,IAAA,OAAA,CAAQ,gBAAiB,CAAK,IAAA,CAAA,aAAA,IAAiB,EAAI,EAAA,MAAA,CAAO,KAAK,gBAAoB,IAAA,EAAA,CAAA,CAAA;AACnF,IAAQ,OAAA,CAAA,WAAA,GAAc,KAAK,WAAe,IAAA,EAAA,CAAA;AAC1C,IAAA,OAAA,CAAQ,UAAU,OAAQ,CAAA,WAAA,CAAA;AAC1B,IAAQ,OAAA,CAAA,UAAA,GAAa,QAAQ,UAAc,IAAA,EAAA,CAAA;AAE3C,IAAI,IAAA,IAAA,CAAK,SAAU,CAAA,IAAA,KAAS,OAAS,EAAA;AACnC,MAAA,OAAO,OAAQ,CAAA,MAAA,CAAA;AAAA,KAAA;AAGjB,IAAA,OAAO,OAAQ,CAAA,MAAA,CAAA;AACf,IAAA,OAAO,OAAQ,CAAA,SAAA,CAAA;AACf,IAAA,OAAO,OAAQ,CAAA,WAAA,CAAA;AACf,IAAA,OAAO,OAAQ,CAAA,gBAAA,CAAA;AACf,IAAA,OAAO,OAAQ,CAAA,eAAA,CAAA;AACf,IAAA,OAAO,OAAQ,CAAA,KAAA,CAAA;AAEf,IAAO,OAAA,OAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAIJ,MAAM,4BAA+B,GAAA,uCAAA,CAAA;AAC5C,MAAO,CAAA,4BAAA,EAA8B,EAAI,CAAA,CAAA,OAAA,CAAQ,2BAA6B,EAAA,yBAAA,CAAA;;AC9FvE,MAAM,yDAA4D,GAAA,8CAAA,CAAA;AAEzE,OAAA,CACG,OAAO,yDAA2D,EAAA;AAAA,EACjE,kBAAA;AAAA,EACA,4BAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,2DAAA;AAAA,EACA,2DAAA;AAAA,EACA,+DAAA;AAAA,CAAA,CAAA,CAED,WAAW,2BAA6B,EAAA;AAAA,EACvC,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,8BAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,2BAAA;AAAA,EACA,kBAAA;AAAA,EACA,SACE,QACA,MACA,EAAA,GAAA,EACA,aACA,4BACA,EAAA,SAAA,EACA,iBACA,EAAA,yBAAA,EACA,gBACA,EAAA;AACA,IAAA,IAAA,CAAK,KAAQ,GAAA;AAAA,MACX,OAAS,EAAA,IAAA;AAAA,KAAA,CAAA;AAGX,IAAK,IAAA,CAAA,cAAA,GAAiB,eAAe,GAAI,CAAA,WAAA,CAAA,CAAA;AAEzC,IAAA,IAAA,CAAK,WAAc,GAAA,GAAA,CAAA;AAEnB,IAAA,MAAM,4BAA4B,MAAM;AACtC,MAAO,OAAA,GAAA,CAAI,KAAQ,EAAA,CAAA,IAAA,CAAK,MAAM;AAC5B,QAAA,IAAI,UAAU,IAAK,CAAA,GAAA,CAAI,YAAa,CAAA,IAAA,EAAM,CAAC,OAAY,KAAA;AACrD,UACE,OAAA,OAAA,CAAQ,IAAS,KAAA,WAAA,CAAY,IAC7B,IAAA,OAAA,CAAQ,YAAY,WAAY,CAAA,SAAA,IAChC,OAAQ,CAAA,MAAA,KAAW,WAAY,CAAA,MAAA,CAAA;AAAA,SAAA,CAAA,CAAA;AAGnC,QAAA,IAAI,CAAC,OAAS,EAAA;AACZ,UAAA,GAAA,CAAI,aAAc,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,YAAiB,KAAA;AAC5C,YAAA,IAAI,aAAa,OAAY,KAAA,WAAA,CAAY,aAAa,YAAa,CAAA,MAAA,KAAW,YAAY,MAAQ,EAAA;AAChG,cAAA,OAAO,YAAa,CAAA,YAAA,CAAa,IAAK,CAAA,CAAC,mBAAwB,KAAA;AAC7D,gBAAI,IAAA,mBAAA,CAAoB,IAAS,KAAA,WAAA,CAAY,IAAM,EAAA;AACjD,kBAAU,OAAA,GAAA,mBAAA,CAAA;AACV,kBAAO,OAAA,IAAA,CAAA;AAAA,iBAAA;AAAA,eAAA,CAAA,CAAA;AAAA,aAAA;AAAA,WAAA,CAAA,CAAA;AAAA,SAAA;AAMjB,QAAO,OAAA,OAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAIX,IAAA,MAAM,YAAY,MAAM;AACtB,MAAA,IAAI,OAAO,WAAa,EAAA;AACtB,QAAA,OAAA;AAAA,OAAA;AAEF,MAAA,MAAA,CAAO,GAAG,GAAK,EAAA,EAAE,oBAAsB,EAAA,IAAA,EAAA,EAAQ,EAAE,QAAU,EAAA,SAAA,EAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAG7D,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAA,CAAK,MAAM,OAAU,GAAA,KAAA,CAAA;AAAA,KAAA,CAAA;AAGvB,IAAA,MAAM,sBAAsB,MAAM;AAChC,MAAO,OAAA,yBAAA,EAAA,CACJ,IAAK,CAAA,CAAC,OAAY,KAAA;AACjB,QAAA,OAAO,iBAAkB,CAAA,cAAA,CACvB,GAAI,CAAA,IAAA,EACJ,WAAY,CAAA,SAAA,EACZ,WAAY,CAAA,MAAA,EACZ,WAAY,CAAA,IAAA,CAAA,CACZ,IAAK,CAAA,CAAC,OAAY,KAAA;AAClB,UAAA,YAAA,EAAA,CAAA;AAGA,UAAA,OAAA,CAAQ,MAAO,CAAA,OAAA,EAAS,OAAS,EAAA,EAAE,SAAS,WAAY,CAAA,SAAA,EAAA,CAAA,CAAA;AAExD,UAAK,IAAA,CAAA,WAAA,GAAc,0BAA0B,2BAA4B,CAAA,OAAA,CAAA,CAAA;AACzE,UAAA,IAAA,CAAK,oBAAoB,IAAK,CAAA,WAAA,CAAA,CAAA;AAE9B,UAAI,IAAA,CAAC,OAAQ,CAAA,IAAA,CAAK,WAAc,CAAA,EAAA;AAC9B,YAAA,IAAA,CAAK,KAAQ,GAAA,OAAA,CAAQ,KAAQ,GAAA,OAAA,CAAQ,KAAQ,GAAA,KAAA,CAAA,CAAA;AAE7C,YAAA,MAAM,MAAM,IAAK,CAAA,WAAA,CAAY,MAAM,IAAK,CAAA,WAAA,CAAY,IAAI,iBAAoB,GAAA,EAAA,CAAA;AAE5E,YAAA,IAAI,QAAQ,EAAI,EAAA;AACd,cAAM,MAAA,QAAA,GAAW,GAAI,CAAA,KAAA,CAAM,GAAK,CAAA,CAAA,CAAA,CAAA,CAAA;AAChC,cAAa,YAAA,CAAA,WAAA,EAAA,CAAc,IAAK,CAAA,CAAC,OAAY,KAAA;AAC3C,gBAAA,MAAM,SAAS,KAAM,CAAA,OAAA,CAAA,CAAS,IAAK,CAAA,EAAE,IAAI,QAAY,EAAA,CAAA,CAAA,KAAA,EAAA,CAAA;AACrD,gBAAK,IAAA,CAAA,WAAA,CAAY,aAAa,MAAO,CAAA,OAAA,CAAA;AAAA,eAAA,CAAA,CAAA;AAAA,aAAA;AAIzC,YAAA,IAAI,OAAQ,CAAA,KAAA,IAAS,OAAQ,CAAA,KAAA,CAAM,WAAa,EAAA;AAC9C,cAAA,MAAM,IAAO,GAAA,OAAA,CAAQ,KAAM,CAAA,WAAA,CAAY,KAAM,CAAA,IAAA,CAAA,CAAA;AAC7C,cAAK,IAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACpB,gBAAM,MAAA,MAAA,GAAS,IAAI,KAAM,CAAA,GAAA,CAAA,CAAA;AACzB,gBAAA,IAAI,MAAO,CAAA,MAAA,KAAW,CAAK,IAAA,MAAA,CAAO,OAAO,eAAiB,EAAA;AACxD,kBAAQ,OAAA,CAAA,KAAA,CAAM,YAAY,MAAO,CAAA,CAAA,CAAA,CAAA;AAAA,iBAAA;AAAA,eAAA,CAAA,CAAA;AAAA,aAAA;AAKvC,YAAA,IAAI,OAAQ,CAAA,KAAA,IAAS,OAAQ,CAAA,KAAA,CAAM,IAAM,EAAA;AACvC,cAAM,MAAA,iBAAA,GAAoB,QAAQ,KAAM,CAAA,IAAA,CAAK,KAAK,CAAC,GAAA,KAAQ,IAAI,GAAQ,KAAA,kBAAA,CAAA,CAAA;AACvE,cAAA,IAAI,iBAAmB,EAAA;AACrB,gBAAA,OAAA,CAAQ,iBAAiB,iBAAkB,CAAA,KAAA,CAAA;AAAA,eAAA;AAAA,aAAA;AAI/C,YAAK,IAAA,CAAA,eAAA,GAAkB,KAAK,WAAY,CAAA,eAAA,CAAA;AAGxC,YAAI,IAAA,GAAA,CAAI,IAAK,CAAA,WAAA,EAAa,mBAAsB,CAAA,EAAA;AAC9C,cAAA,IAAA,CAAK,aAAa,SAAY,GAAA;AAAA,gBAC5B,OAAA,EAAS,IAAK,CAAA,WAAA,CAAY,SAAU,CAAA,OAAA;AAAA,eAAA,CAAA;AAAA,aAAA;AAAA,WAgBnC,MAAA;AACL,YAAA,SAAA,EAAA,CAAA;AAAA,WAAA;AAAA,SAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAIL,KAAM,CAAA,SAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGX,IAAA,mBAAA,EAAA,CAAsB,KAAK,MAAM;AAG/B,MAAI,IAAA,CAAC,OAAO,WAAa,EAAA;AACvB,QAAI,GAAA,CAAA,YAAA,CAAa,UAAU,MAAQ,EAAA,mBAAA,CAAA,CAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAIvC,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,MAAM,eAAc,IAAK,CAAA,WAAA,CAAA;AAEzB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,gBAAgB,YAAY,CAAA,IAAA;AAAA,QACnC,gBAAgB,MAAM;AACpB,UAAI,IAAA,MAAA,CAAO,QAAS,CAAA,gBAAA,EAAkB,WAAc,CAAA,EAAA;AAClD,YAAA,MAAA,CAAO,EAAG,CAAA,GAAA,CAAA,CAAA;AAAA,WAAA;AAAA,SAAA;AAAA,OAAA,CAAA;AAKhB,MAAA,MAAM,eAAe,CAAC,MAAA,KAAW,iBAAkB,CAAA,kBAAA,CAAmB,cAAa,GAAK,EAAA,MAAA,CAAA,CAAA;AAExF,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,MAAM,YAAY,CAAA,IAAA;AAAA,QAClB,WAAW,YAAY,CAAA,OAAA;AAAA,QACvB,QAAQ,YAAY,CAAA,MAAA;AAAA,OAAA,CAAA;AAGtB,MAAA,MAAM,uBAA0B,GAAA;AAAA,QAC9B,MAAA,EAAQ,iBAAoB,GAAA,YAAA,CAAY,IAAO,GAAA,GAAA;AAAA,QAC/C,UAAA,EAAY,aAAa,YAAY,CAAA,IAAA;AAAA,QACrC,SAAS,YAAY,CAAA,OAAA;AAAA,QACrB,iBAAmB,EAAA,WAAA;AAAA,QACnB,YAAA;AAAA,QACA,YAAc,EAAA,IAAA;AAAA,QACd,8BAAA,EAAgC,IAAI,UAAW,CAAA,8BAAA;AAAA,QAC/C,kBAAoB,EAAA,KAAA;AAAA,OAAA,CAAA;AAGtB,MAAiC,gCAAA,CAAA,wBAAA,CAAyB,KAAK,YAAa,EAAA,uBAAA,CAAA,CAAA;AAE5E,MAAA,IAAI,GAAI,CAAA,UAAA,CAAW,8BAAkC,IAAA,GAAA,CAAI,WAAW,kBAAoB,EAAA;AACtF,QAAA,uBAAA,CAAwB,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,OAAA;AAG5D,MAAA,wBAAA,CAAyB,OAAQ,CAAA,uBAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGnC,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,MAAM,eAAc,IAAK,CAAA,WAAA,CAAA;AAEzB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,eAAe,YAAY,CAAA,IAAA;AAAA,OAAA,CAAA;AAGpC,MAAM,MAAA,YAAA,GAAe,CAAC,MAAW,KAAA;AAC/B,QAAO,OAAA,iBAAA,CAAkB,kBAAmB,CAAA,YAAA,EAAa,GAAK,EAAA,MAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAGhE,MAAA,MAAM,uBAA0B,GAAA;AAAA,QAC9B,MAAA,EAAQ,iBAAoB,GAAA,YAAA,CAAY,IAAO,GAAA,GAAA;AAAA,QAC/C,UAAA,EAAY,aAAa,YAAY,CAAA,IAAA;AAAA,QACrC,SAAS,YAAY,CAAA,OAAA;AAAA,QACrB,iBAAmB,EAAA,WAAA;AAAA,QACnB,8BAAA,EAAgC,IAAI,UAAW,CAAA,8BAAA;AAAA,QAC/C,kBAAoB,EAAA,KAAA;AAAA,QACpB,YAAA;AAAA,QACA,YAAc,EAAA,IAAA;AAAA,OAAA,CAAA;AAGhB,MAAiC,gCAAA,CAAA,wBAAA,CAAyB,KAAK,YAAa,EAAA,uBAAA,CAAA,CAAA;AAE5E,MAAA,IAAI,GAAI,CAAA,UAAA,CAAW,8BAAkC,IAAA,GAAA,CAAI,WAAW,kBAAoB,EAAA;AACtF,QAAA,uBAAA,CAAwB,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,OAAA;AAG5D,MAAA,wBAAA,CAAyB,OAAQ,CAAA,uBAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGnC,IAAA,IAAA,CAAK,oBAAoB,MAAM;AAC7B,MAAA,MAAM,eAAc,IAAK,CAAA,WAAA,CAAA;AAEzB,MAAA,MAAM,WAAc,GAAA;AAAA,QAClB,WAAa,EAAA,GAAA;AAAA,QACb,KAAA,EAAO,cAAc,YAAY,CAAA,IAAA;AAAA,OAAA,CAAA;AAGnC,MAAM,MAAA,YAAA,GAAe,CAAC,MAAW,KAAA;AAC/B,QAAO,OAAA,iBAAA,CAAkB,iBAAkB,CAAA,YAAA,EAAa,GAAK,EAAA,MAAA,CAAA,CAAA;AAAA,OAAA,CAAA;AAG/D,MAAA,MAAM,uBAA0B,GAAA;AAAA,QAC9B,MAAA,EAAQ,gBAAmB,GAAA,YAAA,CAAY,IAAO,GAAA,GAAA;AAAA,QAC9C,UAAA,EAAY,YAAY,YAAY,CAAA,IAAA;AAAA,QACpC,SAAS,YAAY,CAAA,OAAA;AAAA,QACrB,iBAAmB,EAAA,WAAA;AAAA,QACnB,8BAAA,EAAgC,IAAI,UAAW,CAAA,8BAAA;AAAA,QAC/C,kBAAoB,EAAA,KAAA;AAAA,QACpB,YAAA;AAAA,QACA,YAAc,EAAA,IAAA;AAAA,OAAA,CAAA;AAGhB,MAAA,IAAI,GAAI,CAAA,UAAA,CAAW,8BAAkC,IAAA,GAAA,CAAI,WAAW,kBAAoB,EAAA;AACtF,QAAA,uBAAA,CAAwB,iCAAiC,CAAC,KAAA,CAAA,CAAA;AAAA,OAAA;AAG5D,MAAA,wBAAA,CAAyB,OAAQ,CAAA,uBAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAGnC,IAAA,IAAA,CAAK,sBAAsB,MAAM;AAC/B,MAAA,SAAA,CAAU,IAAK,CAAA;AAAA,QACb,WAAA,EAAa,gBAAiB,CAAA,WAAA,CAC5B,oBACA,EAAA,+DAAA,CAAA;AAAA,QAEF,WAAa,EAAA,eAAA;AAAA,QACb,UAAY,EAAA,oCAAA;AAAA,QACZ,OAAS,EAAA;AAAA,UACP,WAAA,EAAa,MAAM,IAAK,CAAA,WAAA;AAAA,UACxB,sBAAsB,MAAM;AAC1B,YAAM,MAAA,OAAA,GAAU,IAAK,CAAA,GAAA,CAAI,QAAU,EAAA,EAAE,IAAM,EAAA,IAAA,CAAK,WAAY,CAAA,OAAA,EAAS,OAAS,EAAA,IAAA,CAAK,WAAY,CAAA,OAAA,EAAA,CAAA,CAAA;AAC/F,YAAO,OAAA,MAAA,CAAO,QAAQ,YAAc,EAAA,EAAE,YAAY,IAAM,EAAA,MAAA,EAAQ,KAAK,WAAY,CAAA,MAAA,EAAA,CAAA,CAAA;AAAA,WAAA;AAAA,UAEnF,eAAA,EAAiB,MACf,GAAA,CACG,aAAc,CAAA,cAAA,CAAA,CACd,IAAK,CAAA,MAAA,CACJ,CAAC,CAAA,KACC,CAAE,CAAA,OAAA,KAAY,IAAK,CAAA,WAAA,CAAY,OAC/B,IAAA,CAAA,CAAE,MAAW,KAAA,IAAA,CAAK,WAAY,CAAA,MAAA,IAC9B,CAAE,CAAA,OAAA,KAAY,IAAK,CAAA,WAAA,CAAY,OAC/B,IAAA,CAAA,CAAE,IAAS,KAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAA;AAAA,UAEpC,aAAa,MAAM,GAAA;AAAA,SAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAKzB,IAAA,IAAA,CAAK,oBAAoB,MAAM;AAC7B,MAAA,SAAA,CAAU,IAAK,CAAA;AAAA,QACb,WAAA,EAAa,gBAAiB,CAAA,WAAA,CAAY,kBAAoB,EAAA,2DAAA,CAAA;AAAA,QAC9D,UAAY,EAAA,kCAAA;AAAA,QACZ,WAAa,EAAA,eAAA;AAAA,QACb,OAAS,EAAA;AAAA,UACP,WAAA,EAAa,MAAM,IAAK,CAAA,WAAA;AAAA,UACxB,aAAa,MAAM,GAAA;AAAA,SAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAKzB,IAAK,IAAA,CAAA,gBAAA,GAAmB,CAAC,YAAgB,KAAA;AACvC,MAAA,SAAA,CAAU,IAAK,CAAA;AAAA,QACb,WAAa,EAAA,6DAAA;AAAA,QACb,UAAY,EAAA,iCAAA;AAAA,QACZ,IAAM,EAAA,IAAA;AAAA,QACN,WAAa,EAAA,eAAA;AAAA,QACb,OAAS,EAAA;AAAA,UACP,KAAA,EAAO,MAAM,QAAA,GAAW,YAAY,CAAA,IAAA;AAAA,UACpC,aAAa,MAAM,GAAA;AAAA,UACnB,kBAAoB,EAAA,MAClB,4BAA6B,CAAA,mCAAA,CAAoC,GAAK,EAAA,YAAA,CAAA;AAAA,SAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAK9E,IAAA,IAAA,CAAK,mBAAmB,MAAM;AAC5B,MAAI,IAAA,GAAA,CAAI,MAAM,oCAAuC,CAAA,EAAA;AACnD,QAAO,OAAA,IAAA,CAAK,YAAY,SAAU,CAAA,YAAA,CAAA;AAAA,OACzB,MAAA,IAAA,GAAA,CAAI,MAAM,+BAAkC,CAAA,EAAA;AACrD,QAAM,MAAA,OAAA,GAAU,IAAK,CAAA,WAAA,CAAY,SAAU,CAAA,OAAA,CAAA;AAC3C,QAAA,OAAO,QAAQ,IAAO,GAAA,MAAA,GAAS,OAAQ,CAAA,IAAA,GAAO,MAAM,OAAQ,CAAA,MAAA,CAAA;AAAA,OAAA;AAE9D,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAI,IAAA,IAAA,CAAK,eAAe,IAAK,CAAA,WAAA,CAAY,aAAa,IAAK,CAAA,WAAA,CAAY,UAAU,MAAQ,EAAA;AACvF,QAAA,OAAO,IAAK,CAAA,WAAA,CAAY,SAAU,CAAA,MAAA,CAAO,UAAU,CAAG,EAAA,CAAA,CAAA,CAAA;AAAA,OAAA;AAExD,MAAO,OAAA,IAAA,CAAA;AAAA,KAAA,CAAA;AAGT,IAAK,IAAA,CAAA,mBAAA,GAAsB,CAAC,YAAgB,KAAA;AAC1C,MAAA,OAAO,eAAe,iBAAkB,CAAA,YAAA,CAAY,OAAS,CAAA,CAAA,IAAA,CAAK,CAAC,OAAY,KAAA;AAC7E,QAAA,YAAA,CAAY,cAAiB,GAAA,OAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA,CAAA;AAAA,GAAA;AAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtWhC,MAAM,2BAA8B,GAAA,mCAAA,CAAA;AAC3C,MAAA,CAAO,6BAA6B,CAAC,yDAAA,CAAA,CAAA;;ACQA,MAAA,uBAAA,CAAA;AAAA,EAAA,OACrB,UAAU,WAA6D,EAAA;AACnF,IAAO,OAAA,IAAA,CAAK,eACT,CAAA,CAAA,IAAA,CAAK,WAAY,CAAA,GAAA,EAAK,cAAgB,EAAA,WAAA,CAAY,OAAS,EAAA,WAAA,CAAY,IAAM,EAAA,QAAA,CAAA,CAC7E,KAAM,CAAA;AAAA,MACL,QAAQ,WAAY,CAAA,MAAA;AAAA,MACpB,UAAU,WAAY,CAAA,aAAA;AAAA,KAEvB,CAAA,CAAA,GAAA,EAAA,CACA,KAAM,CAAA,CAAC,KAAsB,KAAA;AAC5B,MAAA,IAAA,CAAK,MAAM,KAAO,EAAA,yBAAA,CAAA,CAAA;AAClB,MAAO,OAAA,EAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA;;ACTsC,MAAA,gBAAA,CAAA;AAAA,EAK5C,WAAA,CAAoB,mBAAiD,WAA2B,EAAA;AAA5E,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA,CAAA;AAAiD,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA,CAAA;AAHrE,IAA8B,IAAA,CAAA,MAAA,GAAA,EAAA,CAAA;AAAA,GAAA;AAAA,EAK9B,OAAgB,GAAA;AACrB,IAAA,IAAA,CAAK,SAAY,GAAA;AAAA,MACf,OAAS,EAAA,IAAA;AAAA,MACT,KAAO,EAAA,KAAA;AAAA,KAAA,CAAA;AAGT,IAAA,uBAAA,CAAwB,SAAU,CAAA,IAAA,CAAK,WAAa,CAAA,CAAA,IAAA,CAClD,CAAC,SAAmC,KAAA;AAClC,MAAA,IAAA,CAAK,UAAU,OAAU,GAAA,KAAA,CAAA;AACzB,MAAA,IAAA,CAAK,MAAS,GAAA,SAAA,CAAA;AAAA,KAAA,EAEhB,MAAM;AACJ,MAAA,IAAA,CAAK,UAAU,KAAQ,GAAA,IAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,EAKtB,KAAc,GAAA;AACnB,IAAA,IAAA,CAAK,iBAAkB,CAAA,KAAA,EAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AArBX,gBAJT,CAIS,OAAU,GAAA,CAAC,mBAAqB,EAAA,aAAA,CAAA,CAAA;AAyBzC,MAAM,WAAc,GAAA,6CAAA,CAAA;AAC3B,MAAO,CAAA,WAAA,EAAa,EAAI,CAAA,CAAA,UAAA,CAAW,kBAAoB,EAAA,gBAAA,CAAA;;ACtCvD,MAAgD,kBAAA,CAAA;AAAA,EAIvC,YAAoB,SAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA,CAAA;AAAA,GAAA;AAAA,EAEpB,UAAmB,GAAA;AACxB,IAAA,IAAA,CAAK,UAAU,IAAK,CAAA;AAAA,MAClB,WAAa,EAAA,wCAAA;AAAA,MACb,UAAY,EAAA,gBAAA;AAAA,MACZ,YAAc,EAAA,OAAA;AAAA,MACd,WAAa,EAAA,eAAA;AAAA,MACb,OAAS,EAAA;AAAA,QACP,WAAA,EAAa,MAAM,IAAK,CAAA,WAAA;AAAA,OAAA;AAAA,KAAA,CAAA,CAAA;AAAA,GAAA;AAAA,CAAA;AAVhB,kBAHhB,CAGgB,UAAU,CAAC,WAAA,CAAA,CAAA;AAgBpB,MAAM,cAAoC,GAAA;AAAA,EAC/C,QAAU,EAAA;AAAA,IACR,WAAa,EAAA,GAAA;AAAA,GAAA;AAAA,EAEf,UAAY,EAAA,kBAAA;AAAA,EACZ,QAAU,EAAA,CAAA,qDAAA,CAAA;AAAA,CAAA,CAAA;AAGL,MAAM,0BAA6B,GAAA,mDAAA,CAAA;AAC1C,MAAA,CAAO,0BAA4B,EAAA,CAAC,WAAc,CAAA,CAAA,CAAA,SAAA,CAAU,gBAAkB,EAAA,cAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9BvE,MAAM,sBAAyB,GAAA,2BAAA,CAAA;AACtC,MAAA,CAAO,wBAAwB,CAAC,0BAAA,CAAA,CAAA;;ACLhC,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;AACjC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AAC9B;AACA,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,EAAE;AAC1D;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC9C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AAC1B;AACA,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AAChD,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC9B,KAAK;AACL,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;AACnC,GAAG,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AACpD,GAAG;AACH;;;;;ACsBO,MAAM,UAAa,GAAA,gBAAA;AAC1B,MAAA,CAAO,UAAY,EAAA;AAAA,EACjB,gEAAA;AAAA,EACA,2BAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EAEA,4EAAA;AAAA,EACA,8EAAA;AAAA,EACA,qBAAA;AAAA,EACA,eAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,2BAAA;AAAA,EACA,wBAAA;AAAA,EACA,wBAAA;AAAA,EACA,uBAAA;AAAA,EACA,yBAAA;AAAA,EACA,0BAAA;AAAA,EACA,aAAA;AAAA,EACA,6EAAA;AAAA,EACA,2DAAA;AAAA,EACA,gDAAA;AAAA,EACA,8DAAA;AAAA,EACA,iDAAA;AAAA,EACA,iDAAA;AAAA,EACA,yDAAA;AAAA,EACA,+CAAA;AAAA,EACA,+CAAA;AAAA,EACA,6DAAA;AAAA,EACA,uDAAA;AAAA,EACA,yBAAA;AAAA,EACA,sBAAA;AAAA,EACA,uBAAA;AAAA,CAAA,CAAA,CACC,OAAO,WAAY;AACpB,EAAA,qBAAA,CAAsB,iBAAiB,KAAO,EAAA;AAAA,IAC5C,IAAM,EAAA,uBAAA;AAAA,IACN,IAAA,EAAM,EAAE,IAAM,EAAA,OAAA,EAAA;AAAA,IACd,WAAa,EAAA;AAAA,MACX,WAAa,EAAA,2BAAA;AAAA,MACb,kBAAoB,EAAA,qDAAA;AAAA,MACpB,iBAAmB,EAAA,2BAAA;AAAA,MACnB,2BAA6B,EAAA,6DAAA;AAAA,MAC7B,0BAA4B,EAAA,yBAAA;AAAA,MAC5B,cAAgB,EAAA,8BAAA;AAAA,MAEhB,wBAA0B,EAAA,KAAA;AAAA,MAC1B,sBAAwB,EAAA,IAAA;AAAA,KAAA;AAAA,IAE1B,YAAc,EAAA;AAAA,MACZ,WAAa,EAAA,0BAAA;AAAA,MACb,gBAAkB,EAAA,+BAAA;AAAA,MAClB,kBAAoB,EAAA,qBAAA;AAAA,MACpB,OAAS,EAAA,sBAAA;AAAA,KAAA;AAAA,IAEX,QAAU,EAAA;AAAA,MACR,kBAAoB,EAAA,+CAAA;AAAA,MACpB,iBAAmB,EAAA,wBAAA;AAAA,KAAA;AAAA,IAErB,aAAe,EAAA;AAAA,MACb,WAAa,EAAA,6BAAA;AAAA,MACb,MAAQ,EAAA,wBAAA;AAAA,MACR,kBAAoB,EAAA,wDAAA;AAAA,MACpB,iBAAmB,EAAA,6BAAA;AAAA,KAAA;AAAA,GAAA,CAAA,CAAA;AAAA,CAAA,CAAA,CAAA;AAKzB,0BAA2B,CAAA,gBAAA,CAAiB,OAAO,CAAC,UAAA,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}