全部产品
Search
文档中心

资源编排:ALIYUN::CS::ManagedEdgeKubernetesCluster

更新时间:Dec 25, 2025

ALIYUN::CS::ManagedEdgeKubernetesCluster类型用于创建Kubernetes边缘托管版集群实例。

语法

{ 
  "Type": "ALIYUN::CS::ManagedEdgeKubernetesCluster",
  "Properties": {
    "Profile": String,
    "VpcId": String,
    "ServiceCidr": String,
    "Name": String,
    "Tags": List,
    "ProxyMode": String,
    "SnatEntry": Boolean,
    "LoginPassword": String,
    "KeyPair": String,
    "Addons": List,
    "EndpointPublicAccess": Boolean,
    "TimeoutMins": Number,
    "ClusterSpec": String,
    "ContainerCidr": String,
    "CloudMonitorFlags": Boolean,
    "IsEnterpriseSecurityGroup": Boolean,
    "NodeCidrMask": String,
    "DeletionProtection": Boolean,
    "ResourceGroupId": String,
    "RrsaConfig": Map,
    "MaintenanceWindow": Map,
    "ZoneIds": List,
    "VSwitchIds": List,
    "NodePools": List,
    "EncryptionProviderKey": String,
    "KubernetesVersion": String,
    "IpStack": String
  }
}

属性

属性名称

类型

必须

允许更新

描述

约束

Name

String

是

否

集群名称。

以英文字母或数字开头,可包含英文字母、汉字、数字和短划线(-)。

Addons

List

否

否

集群安装的组件列表。

取值:

  • 网络组件

    支持Flannel和Terway两种网络类型,创建集群时需二选一:

    • Flannel网络:[{"Name":"flannel","Config":""}]。

    • Terway网络:[{"Name": "terway-eniip","Config": ""}]。

  • 存储组件

    支持CSI和FlexVolume两种类型:

    • csi:[{"Name":"csi-plugin","Config": ""},{"Name": "csi-provisioner","Config": ""}]。

    • flexvolume:[{"Name": "flexvolume","Config": ""}]。

  • 日志组件(可选)

    说明

    如果不开启日志服务,将无法使用集群审计功能。

    • 使用已有SLS Project:[{"Name": "logtail-ds","Config": "{\"IngressDashboardEnabled\":\"true\",\"sls_project_name\":\"your_sls_project_name\"}"}]。

    • 创建新的SLS Project:[{"Name": "logtail-ds","Config": "{\"IngressDashboardEnabled\":\"true\"}"}]。

  • Ingress组件(可选)

    Kubernetes专有版集群默认安装Ingress组件nginx-ingress-controller。

    • 安装Ingress并且开启公网:[{"Name":"nginx-ingress-controller","Config":"{\"IngressSlbNetworkType\":\"internet\"}"}]。

    • 不安装Ingress:[{"Name": "nginx-ingress-controller","Config": "","Disabled": true}]。

  • 事件中心(可选,默认开启)

    事件中心提供对Kubernetes事件的存储、查询、告警等能力。Kubernetes事件中心关联的Logstore在90天内免费。更多信息,请参见创建并使用Kubernetes事件中心。

    开启事件中心:[{"Name":"ack-node-problem-detector","Config":"{\"sls_project_name\":\"your_sls_project_name\"}"}]。

更多信息,请参见Addons属性。

CloudMonitorFlags

Boolean

否

否

是否安装云监控插件。

取值:

  • true:安装。

  • false(默认值):不安装。

ClusterSpec

String

否

否

托管版集群类型。

取值:

  • ack.pro.small:专业托管集群,即:ACK@Edge Pro版集群。

  • ack.standard(默认值):标准托管集群,即ACK@Edge标准版集群。

ContainerCidr

String

否

否

Pod网络地址段。

当创建Flannel网络类型的集群时,ContainerCidr为必填。ContainerCidr必须是有效的私有网段,即以下网段及其子网:

  • 10.0.0.0/8

  • 172.16-31.0.0/12-16

  • 192.168.0.0/16

不能与专有网络及专有网络内已有Kubernetes集群使用的网段重复,且创建成功后不能修改。

关于集群网络规划,请参见ACK托管集群网络规划。

RrsaConfig

Map

否

否

RRSA 的配置。

更多信息,请参考RrsaConfig属性。

DeletionProtection

Boolean

否

是

是否启用删除保护功能。

启用删除保护后,集群不能被直接删除。取值:

  • true:启用。

  • false(默认值):禁用。

EndpointPublicAccess

Boolean

否

否

是否开启公网API Server。

取值:

  • true(默认值):开启公网API Server。

  • false:仅开启私网API Server。

IsEnterpriseSecurityGroup

Boolean

否

否

是否创建高级安全组。

当SecurityGroupId为空时,该参数生效。取值:

  • true:创建。安装了Terway的集群,必须创建高级安全组。

  • false(默认值):不创建。

KeyPair

String

否

否

密钥对名称。

LoginPassword和KeyPair二者只能指定一个参数。

LoginPassword

String

否

否

登录密码。

长度为8~30个字符。必须同时包含大写英文字母、小写英文字母,数字和特殊字符中至少三项,支持的特殊字符为:( ) ` ~ ! @ # $ % ^ & * - + = | { } [ ] : ; ‘ < > , . ? /。

LoginPassword和KeyPair二者只能指定一个参数。

NodeCidrMask

String

否

否

可分配给节点的最大CIDR地址块数量。

数量由指定的pod CIDR决定。该参数仅在集群使用Flannel插件时生效。

默认值:25。

Profile

String

否

否

边缘集群标识。

默认值:Edge。

ProxyMode

String

否

否

kube-proxy代理模式。

取值:

  • iptables(默认值)

  • ipvs

ResourceGroupId

String

否

是

集群所属的资源组ID。

无

ServiceCidr

String

否

否

服务网段。

不能与专有网络网段以及容器网段冲突。当选择系统自动创建专有网络时,默认使用172.19.0.0/20网段。

SnatEntry

Boolean

否

否

是否为网络配置SNAT。

取值:

  • true:配置。

  • false(默认值):不配置。

说明

如果使用自动创建的专有网络,则必须设置为true。如果使用已有非系统自动创建的专有网络,则需要根据是否具备出网能力来设置。

MaintenanceWindow

Map

否

是

集群维护窗口配置。

更多信息,请参见MaintenanceWindow属性。

Tags

List

否

是

标签。

最多可以设置20个标签。

更多信息,请参见Tags属性。

TimeoutMins

Number

否

否

集群资源栈创建超时时间。

默认值:60。

单位:分钟。

VSwitchIds

List

否

否

Worker node绑定的交换机。

无

VpcId

String

否

否

专有网络ID。

如果不设置,系统会自动创建专有网络,系统创建的专有网络网段为192.168.0.0/16。

VpcId和VSwitchIds只能同时为空或者同时都设置对应的值。

ZoneIds

List

否

否

可用区列表。

无

NodePools

List

否

否

节点池信息。

更多信息,请参见NodePools属性。

EncryptionProviderKey

String

否

否

由密钥管理服务KMS管理的密钥ID。

该密钥用于加密数据磁盘。您只能在专业托管的Kubernetes集群中使用KMS。

IpStack

String

否

否

集群的IP协议栈。

取值:

  • ipv4

  • ipv6

KubernetesVersion

String

否

是

集群版本,与Kubernetes社区基线版本保持一致。建议选择最新版本。

目前您可以创建两种最新版本的集群。关于ACK支持的Kubernetes版本,请参见版本说明。

MaintenanceWindow语法

"MaintenanceWindow": {
  "Enable": Boolean,
  "MaintenanceTime": String,
  "Duration": String,
  "WeeklyPeriod": String,
  "Recurrence": String
}

MaintenanceWindow属性

属性名称

类型

必须

允许更新

描述

约束

Duration

String

否

是

维护时长。

取值范围[1,24],单位为小时。

默认值:3h。

Enable

Boolean

否

是

是否开启维护窗口。

取值:

  • true:开启维护窗口。

  • false:不开启维护窗口。

默认值:false。

MaintenanceTime

String

否

是

维护起始时间。

RFC3339 标准格式。

WeeklyPeriod

String

否

是

维护周期。

多个值用英文半角逗号(,)分隔。取值:{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday}

默认值:Thursday。

Recurrence

String

否

是

使用 RFC5545 Recurrence Rule 语法定义的维护窗口循环规则。

目前仅支持 FREQ=WEEKLY,且不支持指定 COUNT 或 UNTIL。

NodePools语法

"NodePools": [
  {
    "ScalingGroup": Map,
    "KubernetesConfig": Map,
    "NodePoolInfo": Map
  }
]

NodePools属性

属性名称

类型

必须

允许更新

描述

约束

ScalingGroup

Map

是

否

节点池扩容组配置。

更多信息,请参见ScalingGroup属性。

KubernetesConfig

Map

否

否

集群相关配置。

更多信息,请参见KubernetesConfig属性。

NodePoolInfo

Map

否

否

节点池配置。

更多信息,请参见NodePoolInfo属性。

NodePoolInfo语法

"NodePoolInfo": {
  "Name": String,
  "Type": String,
  "ResourceGroupId": String
}

NodePoolInfo属性

属性名称

类型

必须

允许更新

描述

约束

ResourceGroupId

String

否

是

节点池所属资源组。

无

Name

String

是

否

节点池名称。

无

Type

String

否

否

节点池类型

取值:

  • ess: ess节点池。

  • edge:edge节点池。

KubernetesConfig语法

"KubernetesConfig": {
  "Runtime": String,
  "RuntimeVersion": String,
  "CpuPolicy": String,
  "Labels": List,
  "NodeNameMode": String,
  "Taints": List
}

KubernetesConfig属性

属性名称

类型

必须

允许更新

描述

约束

Runtime

String

是

否

容器运行时。

无

RuntimeVersion

String

是

否

容器运行时版本。

无

CpuPolicy

String

否

否

节点CPU管理策略。

当集群版本在1.12.6及以上时支持以下两种策略:

  • static:允许为节点上具有某些资源特征Pod增强其CPU亲和性和独占性。

  • none(默认值):表示启用现有的默认CPU亲和性方案。

Labels

List

否

否

节点标签。

为Kubernetes集群节点添加标签。

更多信息,请参见Labels属性。

NodeNameMode

String

否

否

自定义节点名。

节点名称由三部分组成:前缀+节点IP地址子串+后缀。

  • 前缀和后缀均可由半角句号(.)分隔的一个或多个部分组成,每个部分可以使用小写英文字母、数字和短划线(-),节点名称首尾必须为小写英文字母或数字。

  • IP地址段长度指截取节点IP地址末尾的位数,取值范围为5~12。

例如,节点IP地址为:192.168.XX.XX,指定前缀为aliyun.com,IP地址段长度为5,后缀为test,则节点名称为aliyun.com0****test。

Taints

List

否

否

污点配置。

更多信息,请参见Taints属性。

Labels语法

"Labels": {
 "Value": String,
 "Key": String
}

Labels属性

属性名称

类型

必须

允许更新

描述

约束

Key

String

是

否

标签键。

无

Value

String

是

否

标签值。

无

Taints语法

"Taints": [{
 "Value": String,
 "Effect": String,
 "Key": String
}]

Taints属性

属性名称

类型

必须

允许更新

描述

约束

Key

String

是

否

污点名称。

无

Value

String

是

否

污点值。

无

Effect

String

否

否

调度策略。

  • NoSchedule(默认值):不能容忍,但仅影响调度过程,已被调度的Pod不受影响,仅对新增加的Pod生效。

  • NoExecute:不能容忍,当污点变动时,Pod对象会被驱逐。

  • PreferNoSchedule:柔性约束,节点现存Pod不受影响。

ScalingGroup语法

"ScalingGroup": {
  "SocEnabled": Boolean,
  "ImageType": String,
  "InstancePatterns": List,
  "SecurityHardeningOs": Boolean,
  "RdsInstances": List,
  "IsEnterpriseSecurityGroup": Boolean,
  "VSwitchIds": List,
  "InternetMaxBandwidthOut": Integer,
  "DataDisks": List,
  "Period": Integer,
  "InternetChargeType": String,
  "KeyPair": String,
  "SystemDiskPerformanceLevel": String,
  "ImageId": String,
  "InstanceTypes": List,
  "SystemDiskCategory": String,
  "PeriodUnit": String,
  "LoginPassword": String,
  "InstanceChargeType": String,
  "SystemDiskSize": Integer,
  "Tags": List,
  "ZoneIds": List,
  "DesiredSize": Integer
}

ScalingGroup属性

属性名称

类型

必须

允许更新

描述

约束

InstanceTypes

List

否

否

实例规格。

无

SystemDiskSize

Integer

是

否

节点系统盘大小。

单位:GiB。

取值范围:40~500。

VSwitchIds

List

否

否

虚拟交换机ID列表。

无

SocEnabled

Boolean

否

否

是否启用基于分级保护的加固。

取值:

  • true:启用。

  • false(默认值):禁用。

ImageType

String

否

否

操作系统镜像类型。

无

InstancePatterns

List

否

否

实例属性配置。

更多信息,请参考InstancePatterns属性。

SecurityHardeningOs

Boolean

否

否

阿里云 OS 安全加固。

取值:

  • true:开启阿里云 OS 安全加固。

  • false:不开启阿里云 OS 安全加固。

默认值:false。

DesiredSize

Integer

否

否

节点池期望节点数。

无

DataDisks

List

否

否

节点池节点数据盘配置。

更多信息,请参见DataDisks属性。

ImageId

String

否

否

自定义镜像ID。

默认使用系统提供的镜像。

InstanceChargeType

String

否

否

节点池节点付费类型。

取值:

  • PrePaid:预付费。

  • PostPaid(默认值):按量付费。

InternetChargeType

String

否

否

公网IP收费类型。

取值:

  • PayByBandwidth:按固定带宽计费。

  • PayByTraffic:按使用流量计费。

InternetMaxBandwidthOut

Integer

否

否

节点公网IP出带宽最大值。

单位:Mbps。

取值范围:1~100。

IsEnterpriseSecurityGroup

Boolean

否

否

自动创建企业级安全组。

取值:

  • true:创建并使用企业级安全组。

  • false:不使用企业级安全组。

KeyPair

String

否

否

免密登录密钥对名称。

KeyPair和LoginPassword属性二选一。

LoginPassword

String

否

否

SSH登录密码。

KeyPair和LoginPassword只能选择其中之一。

密码规则为8~30个字符,且至少同时包含大小写字母、数字和特殊符号。

Period

Integer

否

否

节点池节点包年包月时长。

当InstanceChargeType取值为PrePaid时,本属性才生效且为必选值。

当period_unit取值为Month时,period取值范围:{ 1, 2, 3, 6, 12}。

默认值:1。

PeriodUnit

String

否

否

节点池节点付费周期。

当InstanceChargeType指定为PrePaid时需要指定周期。

Month:以月为计时单位。

RdsInstances

List

否

否

RDS实例ID。

无

SystemDiskCategory

String

否

否

节点系统盘类型。

取值:

  • cloud_efficiency(默认值):高效云盘。

  • cloud_ssd:SSD云盘。

  • cloud_essd:ESSD云盘。

SystemDiskPerformanceLevel

String

否

否

节点系统盘磁盘性能。

只对ESSD磁盘生效。

Tags

List

否

否

仅为ECS实例添加标签。

更多信息,请参见Tags属性。

ZoneIds

List

否

否

可用区列表。

无

RrsaConfig语法

"RrsaConfig": 
  {
    "Enabled": Boolean
  }

RrsaConfig属性

属性名称

类型

必须

允许更新

描述

约束

Enabled

Boolean

是

否

是否启用服务账户的 RAM 角色(RRSA)功能。

取值:

  • true:启用

  • false:不启用

Tags语法

"Tags": [
  {
    "Key": String,
    "Value": String
  }
]

Tags属性

属性名称

类型

必须

允许更新

描述

约束

Key

String

是

否

标签键。

长度为1~64个字符,不能以aliyun、acs:、https://或http://开头。

Value

String

是

否

标签值。

长度为0~128个字符,不能以aliyun、acs:、https://或http://开头。

Addons语法

"Addons": [
  {
    "Disabled": Boolean,
    "Config": String,
    "Name": String,
    "Version": String
  }
]

Addons属性

属性名称

类型

必须

允许更新

描述

约束

Name

String

是

否

组件名称。

无

Config

String

否

否

组件配置。

无

Disabled

Boolean

否

否

是否禁止默认安装组件。

取值:

  • true:禁止默认安装组件。

  • false(默认值):允许默认安装组件。

Version

String

否

否

Addon插件版本。

默认取最新版本。

InstancePatterns语法

"InstancePatterns": [
  {
    "CpuArchitectures": List,
    "MaxCpuCores": Integer,
    "MinMemorySize": Integer,
    "Memory": Integer,
    "InstanceFamilyLevel": String,
    "MinCpuCores": Integer,
    "Cores": Integer,
    "InstanceTypeFamilies": List,
    "InstanceCategories": List,
    "ExcludedInstanceTypes": List,
    "MaxMemorySize": Integer
  }
]

InstancePatterns属性

属性名称

类型

必须

允许更新

描述

约束

CpuArchitectures

List

否

否

实例的 CPU 架构。

取值:

  • X86

  • ARM

MaxCpuCores

Integer

否

否

实例规格的最大 vCPU 内核数目

无

MinMemorySize

Integer

否

否

实例规格的最小内存。

单位:GiB。

Memory

Integer

否

否

实例规格的内存大小。

单位为 GiB。

InstanceFamilyLevel

String

否

否

实例规格族级别。

无

MinCpuCores

Integer

否

否

实例规格的最小 vCPU 内核数目。

无

Cores

Integer

否

否

实例规格的 vCPU 内核数目。

无

InstanceTypeFamilies

List

否

否

指定实例规格族。

无

InstanceCategories

List

否

否

实例分类。

无

ExcludedInstanceTypes

List

否

否

需要排除的实例规格。

无

MaxMemorySize

Integer

否

否

实例规格的最大内存。

单位:GiB。

DataDisks语法

"DataDisks": [
  {
    "Category": String,
    "Encrypted": Boolean,
    "PerformanceLevel": String,
    "Size": Integer,
    "AutoSnapshotPolicyId": String,
    "Categories": List
  }
]

DataDisks属性

属性名称

类型

必须

允许更新

描述

约束

AutoSnapshotPolicyId

String

否

否

选择自动快照策略ID,云盘会按照快照策略自动备份。

默认值为空,表示不自动备份。

Category

String

否

否

数据盘类型。

取值:

  • cloud_efficiency(默认值):高效云盘。

  • cloud_ssd:SSD云盘。

  • cloud_essd:ESSD云盘。

Encrypted

Boolean

否

否

是否对数据盘加密。

取值:

  • true:对数据盘加密。

  • false(默认值):不对数据盘加密。

PerformanceLevel

String

否

否

设置云盘的性能等级。

取值:

  • PL1:单盘最高随机读写IOPS 5万。

  • PL2:单盘最高随机读写IOPS 10万。

  • PL3:单盘最高随机读写IOPS 100万。

更多信息,请参见ESSD云盘。

Size

Integer

否

否

数据盘大小。

取值范围:40~32768。

默认值:120。

单位:GiB。

Categories

List

否

否

数据磁盘类型的列表。

无

返回值

Fn::GetAtt

  • ClusterId:集群ID。

  • TaskId:任务ID。系统自动分配,用于查询任务状态。

  • DefaultUserKubeConfig:用户配置集群凭据的默认Kubernetes配置。

  • ScalingRuleId:伸缩规则ID。

  • ScalingGroupId:伸缩组ID。

  • PrivateUserKubConfig:用户配置集群凭据的专有Kubernetes配置。

  • ScalingConfigurationId:伸缩配置ID。

  • Nodes:集群节点列表。

  • APIServerSLBId:API服务器负载均衡ID。

  • IngressSLBId:Ingress负载均衡ID。

  • WorkerRamRoleName:Worker节点RAM角色名称。

示例

ROSTemplateFormatVersion: '2015-09-01'
Description: Test ManagedEdgeKubernetesCluster
Parameters:
  VSwitchZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    Description: Availability ID for existing switches
    Label: VSwitch Zone ID
  VpcId:
    Type: String
    Default: Null
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
    Description: Please search the ID starts with (vpc-xxx)from console-Virtual Private Cloud
    Label: Existing VPC ID
  VSwitchId:
    Type: String
    Default: Null
    AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
    Description: Please search the business VSwitch ID starts with(vsw-xxx)from console-Virtual Private Cloud-VSwitches
    Label: VSwitch ID
    AssociationPropertyMetadata:
      ZoneId: ${VSwitchZoneId}
      VpcId: ${VpcId}
  ClusterName:
    Type: String
    Default: mytest
  Password:
    Type: String
    Description: Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^*_-+=|{}[]:;,.? Special symbol in).
    MinLength: 8
    Label: Instance Password
    NoEcho: true
    MaxLength: 30
    ConstraintDescription: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^*_-+=|{}[]:;',.?/ Special symbol in).
  NumOfNodes:
    Type: Number
    Default: 1
    MinValue: 0
    MaxValue: 300
Resources:
  Cluster:
    Type: ALIYUN::CS::ManagedEdgeKubernetesCluster
    Properties:
      NumOfNodes:
        Ref: NumOfNodes
      Name:
        Ref: ClusterName
      LoginPassword:
        Ref: Password
      VpcId:
        Ref: VpcId
      VSwitchIds:
        - Ref: VSwitchId
      ServiceCidr: 172.19.0.0/20
Outputs:
  ClusterId:
    Value:
      Fn::GetAtt:
        - Cluster
        - ClusterId
  TaskId:
    Value:
      Fn::GetAtt:
        - Cluster
        - TaskId
{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Description": "Test ManagedEdgeKubernetesCluster",
  "Parameters": {
    "VSwitchZoneId": {
      "Type": "String",
      "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId",
      "Description": "Availability ID for existing switches",
      "Label": "VSwitch Zone ID"
    },
    "VpcId": {
      "Type": "String",
      "Default": null,
      "AssociationProperty": "ALIYUN::ECS::VPC::VPCId",
      "Description": "Please search the ID starts with (vpc-xxx)from console-Virtual Private Cloud",
      "Label": "Existing VPC ID"
    },
    "VSwitchId": {
      "Type": "String",
      "Default": null,
      "AssociationProperty": "ALIYUN::ECS::VSwitch::VSwitchId",
      "Description": "Please search the business VSwitch ID starts with(vsw-xxx)from console-Virtual Private Cloud-VSwitches",
      "Label": "VSwitch ID",
      "AssociationPropertyMetadata": {
        "ZoneId": "${VSwitchZoneId}",
        "VpcId": "${VpcId}"
      }
    },
    "ClusterName": {
      "Type": "String",
      "Default": "mytest"
    },
    "Password": {
      "Type": "String",
      "Description": "Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^*_-+=|{}[]:;,.? Special symbol in).",
      "MinLength": 8,
      "Label": "Instance Password",
      "NoEcho": true,
      "MaxLength": 30,
      "ConstraintDescription": "Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^*_-+=|{}[]:;',.?/ Special symbol in)."
    },
    "NumOfNodes": {
      "Type": "Number",
      "Default": 1,
      "MinValue": 0,
      "MaxValue": 300
    }
  },
  "Resources": {
    "Cluster": {
      "Type": "ALIYUN::CS::ManagedEdgeKubernetesCluster",
      "Properties": {
        "NumOfNodes": {
          "Ref": "NumOfNodes"
        },
        "Name": {
          "Ref": "ClusterName"
        },
        "LoginPassword": {
          "Ref": "Password"
        },
        "VpcId": {
          "Ref": "VpcId"
        },
        "VSwitchIds": [
          {
            "Ref": "VSwitchId"
          }
        ]
        "ServiceCidr": "172.19.0.0/20"
      }
    }
  },
  "Outputs": {
    "ClusterId": {
      "Value": {
        "Fn::GetAtt": [
          "Cluster",
          "ClusterId"
        ]
      }
    },
    "TaskId": {
      "Value": {
        "Fn::GetAtt": [
          "Cluster",
          "TaskId"
        ]
      }
    }
  }
}