import * as core from "@terrascript/core";

export interface MetadataOptionsArgs extends core.SchemaArgs {
  httpEndpoint: string | core.StringOut;

  httpProtocolIpv6: string | core.StringOut;

  httpPutResponseHopLimit: number | core.NumberOut;

  httpTokens: string | core.StringOut;

  instanceMetadataTags: string | core.StringOut;
}

export class MetadataOptions extends core.Schema<MetadataOptionsArgs> {
  @core.attr(String, { computed: true })
  public httpEndpoint!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public httpProtocolIpv6!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public httpPutResponseHopLimit!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public httpTokens!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public instanceMetadataTags!: string | core.StringOut;
}

export interface EbsArgs extends core.SchemaArgs {
  deleteOnTermination: string | core.StringOut;

  encrypted: string | core.StringOut;

  iops: number | core.NumberOut;

  kmsKeyId: string | core.StringOut;

  snapshotId: string | core.StringOut;

  throughput: number | core.NumberOut;

  volumeSize: number | core.NumberOut;

  volumeType: string | core.StringOut;
}

export class Ebs extends core.Schema<EbsArgs> {
  @core.attr(String, { computed: true })
  public deleteOnTermination!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public encrypted!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public iops!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public kmsKeyId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public snapshotId!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public throughput!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public volumeSize!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public volumeType!: string | core.StringOut;
}

export interface BlockDeviceMappingsArgs extends core.SchemaArgs {
  deviceName: string | core.StringOut;

  ebs: core.Array<Ebs> | core.ArrayOut<Ebs>;

  noDevice: string | core.StringOut;

  virtualName: string | core.StringOut;
}

export class BlockDeviceMappings extends core.Schema<BlockDeviceMappingsArgs> {
  @core.attr(String, { computed: true })
  public deviceName!: string | core.StringOut;

  @core.attr(Ebs, { computed: true, kind: "array" })
  public ebs!: core.Array<Ebs> | core.ArrayOut<Ebs>;

  @core.attr(String, { computed: true })
  public noDevice!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public virtualName!: string | core.StringOut;
}

export interface NetworkInterfacesArgs extends core.SchemaArgs {
  associateCarrierIpAddress: string | core.StringOut;

  associatePublicIpAddress: string | core.StringOut;

  deleteOnTermination: string | core.StringOut;

  description: string | core.StringOut;

  deviceIndex: number | core.NumberOut;

  interfaceType: string | core.StringOut;

  ipv4AddressCount: number | core.NumberOut;

  ipv4Addresses: core.Array<string> | core.ArrayOut<core.StringOut>;

  ipv4PrefixCount: number | core.NumberOut;

  ipv4Prefixes: core.Array<string> | core.ArrayOut<core.StringOut>;

  ipv6AddressCount: number | core.NumberOut;

  ipv6Addresses: core.Array<string> | core.ArrayOut<core.StringOut>;

  ipv6PrefixCount: number | core.NumberOut;

  ipv6Prefixes: core.Array<string> | core.ArrayOut<core.StringOut>;

  networkCardIndex: number | core.NumberOut;

  networkInterfaceId: string | core.StringOut;

  privateIpAddress: string | core.StringOut;

  securityGroups: core.Array<string> | core.ArrayOut<core.StringOut>;

  subnetId: string | core.StringOut;
}

export class NetworkInterfaces extends core.Schema<NetworkInterfacesArgs> {
  @core.attr(String, { computed: true })
  public associateCarrierIpAddress!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public associatePublicIpAddress!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public deleteOnTermination!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public description!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public deviceIndex!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public interfaceType!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public ipv4AddressCount!: number | core.NumberOut;

  @core.attr(String, { computed: true, kind: "array" })
  public ipv4Addresses!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(Number, { computed: true })
  public ipv4PrefixCount!: number | core.NumberOut;

  @core.attr(String, { computed: true, kind: "array" })
  public ipv4Prefixes!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(Number, { computed: true })
  public ipv6AddressCount!: number | core.NumberOut;

  @core.attr(String, { computed: true, kind: "array" })
  public ipv6Addresses!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(Number, { computed: true })
  public ipv6PrefixCount!: number | core.NumberOut;

  @core.attr(String, { computed: true, kind: "array" })
  public ipv6Prefixes!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(Number, { computed: true })
  public networkCardIndex!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public networkInterfaceId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public privateIpAddress!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public securityGroups!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true })
  public subnetId!: string | core.StringOut;
}

export interface FilterArgs extends core.SchemaArgs {
  name: string | core.StringOut;

  values: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export class Filter extends core.Schema<FilterArgs> {
  @core.attr(String)
  public name!: string | core.StringOut;

  @core.attr(String, { kind: "array" })
  public values!: core.Array<string> | core.ArrayOut<core.StringOut>;
}

export interface BaselineEbsBandwidthMbpsArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class BaselineEbsBandwidthMbps extends core.Schema<BaselineEbsBandwidthMbpsArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface MemoryMibArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class MemoryMib extends core.Schema<MemoryMibArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface MemoryGibPerVcpuArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class MemoryGibPerVcpu extends core.Schema<MemoryGibPerVcpuArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface AcceleratorCountArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class AcceleratorCount extends core.Schema<AcceleratorCountArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface TotalLocalStorageGbArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class TotalLocalStorageGb extends core.Schema<TotalLocalStorageGbArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface NetworkInterfaceCountArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class NetworkInterfaceCount extends core.Schema<NetworkInterfaceCountArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface VcpuCountArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class VcpuCount extends core.Schema<VcpuCountArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface AcceleratorTotalMemoryMibArgs extends core.SchemaArgs {
  max: number | core.NumberOut;

  min: number | core.NumberOut;
}

export class AcceleratorTotalMemoryMib extends core.Schema<AcceleratorTotalMemoryMibArgs> {
  @core.attr(Number, { computed: true })
  public max!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public min!: number | core.NumberOut;
}

export interface InstanceRequirementsArgs extends core.SchemaArgs {
  acceleratorCount:
    | core.Array<AcceleratorCount>
    | core.ArrayOut<AcceleratorCount>;

  acceleratorManufacturers: core.Array<string> | core.ArrayOut<core.StringOut>;

  acceleratorNames: core.Array<string> | core.ArrayOut<core.StringOut>;

  acceleratorTotalMemoryMib:
    | core.Array<AcceleratorTotalMemoryMib>
    | core.ArrayOut<AcceleratorTotalMemoryMib>;

  acceleratorTypes: core.Array<string> | core.ArrayOut<core.StringOut>;

  bareMetal: string | core.StringOut;

  baselineEbsBandwidthMbps:
    | core.Array<BaselineEbsBandwidthMbps>
    | core.ArrayOut<BaselineEbsBandwidthMbps>;

  burstablePerformance: string | core.StringOut;

  cpuManufacturers: core.Array<string> | core.ArrayOut<core.StringOut>;

  excludedInstanceTypes: core.Array<string> | core.ArrayOut<core.StringOut>;

  instanceGenerations: core.Array<string> | core.ArrayOut<core.StringOut>;

  localStorage: string | core.StringOut;

  localStorageTypes: core.Array<string> | core.ArrayOut<core.StringOut>;

  memoryGibPerVcpu:
    | core.Array<MemoryGibPerVcpu>
    | core.ArrayOut<MemoryGibPerVcpu>;

  memoryMib: core.Array<MemoryMib> | core.ArrayOut<MemoryMib>;

  networkInterfaceCount:
    | core.Array<NetworkInterfaceCount>
    | core.ArrayOut<NetworkInterfaceCount>;

  onDemandMaxPricePercentageOverLowestPrice: number | core.NumberOut;

  requireHibernateSupport: boolean | core.BooleanOut;

  spotMaxPricePercentageOverLowestPrice: number | core.NumberOut;

  totalLocalStorageGb:
    | core.Array<TotalLocalStorageGb>
    | core.ArrayOut<TotalLocalStorageGb>;

  vcpuCount: core.Array<VcpuCount> | core.ArrayOut<VcpuCount>;
}

export class InstanceRequirements extends core.Schema<InstanceRequirementsArgs> {
  @core.attr(AcceleratorCount, { computed: true, kind: "array" })
  public acceleratorCount!:
    | core.Array<AcceleratorCount>
    | core.ArrayOut<AcceleratorCount>;

  @core.attr(String, { computed: true, kind: "array" })
  public acceleratorManufacturers!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true, kind: "array" })
  public acceleratorNames!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(AcceleratorTotalMemoryMib, { computed: true, kind: "array" })
  public acceleratorTotalMemoryMib!:
    | core.Array<AcceleratorTotalMemoryMib>
    | core.ArrayOut<AcceleratorTotalMemoryMib>;

  @core.attr(String, { computed: true, kind: "array" })
  public acceleratorTypes!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true })
  public bareMetal!: string | core.StringOut;

  @core.attr(BaselineEbsBandwidthMbps, { computed: true, kind: "array" })
  public baselineEbsBandwidthMbps!:
    | core.Array<BaselineEbsBandwidthMbps>
    | core.ArrayOut<BaselineEbsBandwidthMbps>;

  @core.attr(String, { computed: true })
  public burstablePerformance!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public cpuManufacturers!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true, kind: "array" })
  public excludedInstanceTypes!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true, kind: "array" })
  public instanceGenerations!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

  @core.attr(String, { computed: true })
  public localStorage!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public localStorageTypes!: core.Array<string> | core.ArrayOut<core.StringOut>;

  @core.attr(MemoryGibPerVcpu, { computed: true, kind: "array" })
  public memoryGibPerVcpu!:
    | core.Array<MemoryGibPerVcpu>
    | core.ArrayOut<MemoryGibPerVcpu>;

  @core.attr(MemoryMib, { computed: true, kind: "array" })
  public memoryMib!: core.Array<MemoryMib> | core.ArrayOut<MemoryMib>;

  @core.attr(NetworkInterfaceCount, { computed: true, kind: "array" })
  public networkInterfaceCount!:
    | core.Array<NetworkInterfaceCount>
    | core.ArrayOut<NetworkInterfaceCount>;

  @core.attr(Number, { computed: true })
  public onDemandMaxPricePercentageOverLowestPrice!: number | core.NumberOut;

  @core.attr(Boolean, { computed: true })
  public requireHibernateSupport!: boolean | core.BooleanOut;

  @core.attr(Number, { computed: true })
  public spotMaxPricePercentageOverLowestPrice!: number | core.NumberOut;

  @core.attr(TotalLocalStorageGb, { computed: true, kind: "array" })
  public totalLocalStorageGb!:
    | core.Array<TotalLocalStorageGb>
    | core.ArrayOut<TotalLocalStorageGb>;

  @core.attr(VcpuCount, { computed: true, kind: "array" })
  public vcpuCount!: core.Array<VcpuCount> | core.ArrayOut<VcpuCount>;
}

export interface PlacementArgs extends core.SchemaArgs {
  affinity: string | core.StringOut;

  availabilityZone: string | core.StringOut;

  groupName: string | core.StringOut;

  hostId: string | core.StringOut;

  hostResourceGroupArn: string | core.StringOut;

  partitionNumber: number | core.NumberOut;

  spreadDomain: string | core.StringOut;

  tenancy: string | core.StringOut;
}

export class Placement extends core.Schema<PlacementArgs> {
  @core.attr(String, { computed: true })
  public affinity!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public availabilityZone!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public groupName!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public hostId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public hostResourceGroupArn!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public partitionNumber!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public spreadDomain!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public tenancy!: string | core.StringOut;
}

export interface CapacityReservationTargetArgs extends core.SchemaArgs {
  capacityReservationId: string | core.StringOut;

  capacityReservationResourceGroupArn: string | core.StringOut;
}

export class CapacityReservationTarget extends core.Schema<CapacityReservationTargetArgs> {
  @core.attr(String, { computed: true })
  public capacityReservationId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public capacityReservationResourceGroupArn!: string | core.StringOut;
}

export interface CapacityReservationSpecificationArgs extends core.SchemaArgs {
  capacityReservationPreference: string | core.StringOut;

  capacityReservationTarget:
    | core.Array<CapacityReservationTarget>
    | core.ArrayOut<CapacityReservationTarget>;
}

export class CapacityReservationSpecification extends core.Schema<CapacityReservationSpecificationArgs> {
  @core.attr(String, { computed: true })
  public capacityReservationPreference!: string | core.StringOut;

  @core.attr(CapacityReservationTarget, { computed: true, kind: "array" })
  public capacityReservationTarget!:
    | core.Array<CapacityReservationTarget>
    | core.ArrayOut<CapacityReservationTarget>;
}

export interface HibernationOptionsArgs extends core.SchemaArgs {
  configured: boolean | core.BooleanOut;
}

export class HibernationOptions extends core.Schema<HibernationOptionsArgs> {
  @core.attr(Boolean, { computed: true })
  public configured!: boolean | core.BooleanOut;
}

export interface IamInstanceProfileArgs extends core.SchemaArgs {
  arn: string | core.StringOut;

  name: string | core.StringOut;
}

export class IamInstanceProfile extends core.Schema<IamInstanceProfileArgs> {
  @core.attr(String, { computed: true })
  public arn!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public name!: string | core.StringOut;
}

export interface CreditSpecificationArgs extends core.SchemaArgs {
  cpuCredits: string | core.StringOut;
}

export class CreditSpecification extends core.Schema<CreditSpecificationArgs> {
  @core.attr(String, { computed: true })
  public cpuCredits!: string | core.StringOut;
}

export interface CpuOptionsArgs extends core.SchemaArgs {
  coreCount: number | core.NumberOut;

  threadsPerCore: number | core.NumberOut;
}

export class CpuOptions extends core.Schema<CpuOptionsArgs> {
  @core.attr(Number, { computed: true })
  public coreCount!: number | core.NumberOut;

  @core.attr(Number, { computed: true })
  public threadsPerCore!: number | core.NumberOut;
}

export interface MaintenanceOptionsArgs extends core.SchemaArgs {
  autoRecovery: string | core.StringOut;
}

export class MaintenanceOptions extends core.Schema<MaintenanceOptionsArgs> {
  @core.attr(String, { computed: true })
  public autoRecovery!: string | core.StringOut;
}

export interface LicenseSpecificationArgs extends core.SchemaArgs {
  licenseConfigurationArn: string | core.StringOut;
}

export class LicenseSpecification extends core.Schema<LicenseSpecificationArgs> {
  @core.attr(String, { computed: true })
  public licenseConfigurationArn!: string | core.StringOut;
}

export interface TagSpecificationsArgs extends core.SchemaArgs {
  resourceType: string | core.StringOut;

  tags?: core.Map<string, string> | core.MapOut<core.StringOut>;
}

export class TagSpecifications extends core.Schema<TagSpecificationsArgs> {
  @core.attr(String, { computed: true })
  public resourceType!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "map" })
  public tags?: core.Map<string, string> | core.MapOut<core.StringOut>;
}

export interface ElasticGpuSpecificationsArgs extends core.SchemaArgs {
  type: string | core.StringOut;
}

export class ElasticGpuSpecifications extends core.Schema<ElasticGpuSpecificationsArgs> {
  @core.attr(String)
  public type!: string | core.StringOut;
}

export interface SpotOptionsArgs extends core.SchemaArgs {
  blockDurationMinutes: number | core.NumberOut;

  instanceInterruptionBehavior: string | core.StringOut;

  maxPrice: string | core.StringOut;

  spotInstanceType: string | core.StringOut;

  validUntil: string | core.StringOut;
}

export class SpotOptions extends core.Schema<SpotOptionsArgs> {
  @core.attr(Number, { computed: true })
  public blockDurationMinutes!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public instanceInterruptionBehavior!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public maxPrice!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public spotInstanceType!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public validUntil!: string | core.StringOut;
}

export interface InstanceMarketOptionsArgs extends core.SchemaArgs {
  marketType: string | core.StringOut;

  spotOptions: core.Array<SpotOptions> | core.ArrayOut<SpotOptions>;
}

export class InstanceMarketOptions extends core.Schema<InstanceMarketOptionsArgs> {
  @core.attr(String, { computed: true })
  public marketType!: string | core.StringOut;

  @core.attr(SpotOptions, { computed: true, kind: "array" })
  public spotOptions!: core.Array<SpotOptions> | core.ArrayOut<SpotOptions>;
}

export interface EnclaveOptionsArgs extends core.SchemaArgs {
  enabled: boolean | core.BooleanOut;
}

export class EnclaveOptions extends core.Schema<EnclaveOptionsArgs> {
  @core.attr(Boolean, { computed: true })
  public enabled!: boolean | core.BooleanOut;
}

export interface ElasticInferenceAcceleratorArgs extends core.SchemaArgs {
  type: string | core.StringOut;
}

export class ElasticInferenceAccelerator extends core.Schema<ElasticInferenceAcceleratorArgs> {
  @core.attr(String, { computed: true })
  public type!: string | core.StringOut;
}

export interface MonitoringArgs extends core.SchemaArgs {
  enabled: boolean | core.BooleanOut;
}

export class Monitoring extends core.Schema<MonitoringArgs> {
  @core.attr(Boolean, { computed: true })
  public enabled!: boolean | core.BooleanOut;
}

export interface PrivateDnsNameOptionsArgs extends core.SchemaArgs {
  enableResourceNameDnsARecord: boolean | core.BooleanOut;

  enableResourceNameDnsAaaaRecord: boolean | core.BooleanOut;

  hostnameType: string | core.StringOut;
}

export class PrivateDnsNameOptions extends core.Schema<PrivateDnsNameOptionsArgs> {
  @core.attr(Boolean, { computed: true })
  public enableResourceNameDnsARecord!: boolean | core.BooleanOut;

  @core.attr(Boolean, { computed: true })
  public enableResourceNameDnsAaaaRecord!: boolean | core.BooleanOut;

  @core.attr(String, { computed: true })
  public hostnameType!: string | core.StringOut;
}

export interface DsLaunchTemplateArgs {
  filter?: core.Array<Filter> | core.ArrayOut<Filter>;

  id?: string | core.StringOut;

  name?: string | core.StringOut;

  tags?: core.Map<string, string> | core.MapOut<core.StringOut>;
}

export class DsLaunchTemplate extends core.Data<DsLaunchTemplateArgs> {
  @core.attr(String, { computed: true })
  public arn!: string | core.StringOut;

  @core.attr(BlockDeviceMappings, { computed: true, kind: "array" })
  public blockDeviceMappings!:
    | core.Array<BlockDeviceMappings>
    | core.ArrayOut<BlockDeviceMappings>;

  @core.attr(CapacityReservationSpecification, {
    computed: true,
    kind: "array",
  })
  public capacityReservationSpecification!:
    | core.Array<CapacityReservationSpecification>
    | core.ArrayOut<CapacityReservationSpecification>;

  @core.attr(CpuOptions, { computed: true, kind: "array" })
  public cpuOptions!: core.Array<CpuOptions> | core.ArrayOut<CpuOptions>;

  @core.attr(CreditSpecification, { computed: true, kind: "array" })
  public creditSpecification!:
    | core.Array<CreditSpecification>
    | core.ArrayOut<CreditSpecification>;

  @core.attr(Number, { computed: true })
  public defaultVersion!: number | core.NumberOut;

  @core.attr(String, { computed: true })
  public description!: string | core.StringOut;

  @core.attr(Boolean, { computed: true })
  public disableApiStop!: boolean | core.BooleanOut;

  @core.attr(Boolean, { computed: true })
  public disableApiTermination!: boolean | core.BooleanOut;

  @core.attr(String, { computed: true })
  public ebsOptimized!: string | core.StringOut;

  @core.attr(ElasticGpuSpecifications, { computed: true, kind: "array" })
  public elasticGpuSpecifications!:
    | core.Array<ElasticGpuSpecifications>
    | core.ArrayOut<ElasticGpuSpecifications>;

  @core.attr(ElasticInferenceAccelerator, { computed: true, kind: "array" })
  public elasticInferenceAccelerator!:
    | core.Array<ElasticInferenceAccelerator>
    | core.ArrayOut<ElasticInferenceAccelerator>;

  @core.attr(EnclaveOptions, { computed: true, kind: "array" })
  public enclaveOptions!:
    | core.Array<EnclaveOptions>
    | core.ArrayOut<EnclaveOptions>;

  @core.attr(Filter, { kind: "array" })
  public filter?: core.Array<Filter> | core.ArrayOut<Filter>;

  @core.attr(HibernationOptions, { computed: true, kind: "array" })
  public hibernationOptions!:
    | core.Array<HibernationOptions>
    | core.ArrayOut<HibernationOptions>;

  @core.attr(IamInstanceProfile, { computed: true, kind: "array" })
  public iamInstanceProfile!:
    | core.Array<IamInstanceProfile>
    | core.ArrayOut<IamInstanceProfile>;

  @core.attr(String, { computed: true })
  public id?: string | core.StringOut;

  @core.attr(String, { computed: true })
  public imageId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public instanceInitiatedShutdownBehavior!: string | core.StringOut;

  @core.attr(InstanceMarketOptions, { computed: true, kind: "array" })
  public instanceMarketOptions!:
    | core.Array<InstanceMarketOptions>
    | core.ArrayOut<InstanceMarketOptions>;

  @core.attr(InstanceRequirements, { computed: true, kind: "array" })
  public instanceRequirements!:
    | core.Array<InstanceRequirements>
    | core.ArrayOut<InstanceRequirements>;

  @core.attr(String, { computed: true })
  public instanceType!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public kernelId!: string | core.StringOut;

  @core.attr(String, { computed: true })
  public keyName!: string | core.StringOut;

  @core.attr(Number, { computed: true })
  public latestVersion!: number | core.NumberOut;

  @core.attr(LicenseSpecification, { computed: true, kind: "array" })
  public licenseSpecification!:
    | core.Array<LicenseSpecification>
    | core.ArrayOut<LicenseSpecification>;

  @core.attr(MaintenanceOptions, { computed: true, kind: "array" })
  public maintenanceOptions!:
    | core.Array<MaintenanceOptions>
    | core.ArrayOut<MaintenanceOptions>;

  @core.attr(MetadataOptions, { computed: true, kind: "array" })
  public metadataOptions!:
    | core.Array<MetadataOptions>
    | core.ArrayOut<MetadataOptions>;

  @core.attr(Monitoring, { computed: true, kind: "array" })
  public monitoring!: core.Array<Monitoring> | core.ArrayOut<Monitoring>;

  @core.attr(String, { computed: true })
  public name?: string | core.StringOut;

  @core.attr(NetworkInterfaces, { computed: true, kind: "array" })
  public networkInterfaces!:
    | core.Array<NetworkInterfaces>
    | core.ArrayOut<NetworkInterfaces>;

  @core.attr(Placement, { computed: true, kind: "array" })
  public placement!: core.Array<Placement> | core.ArrayOut<Placement>;

  @core.attr(PrivateDnsNameOptions, { computed: true, kind: "array" })
  public privateDnsNameOptions!:
    | core.Array<PrivateDnsNameOptions>
    | core.ArrayOut<PrivateDnsNameOptions>;

  @core.attr(String, { computed: true })
  public ramDiskId!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public securityGroupNames!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

  @core.attr(TagSpecifications, { computed: true, kind: "array" })
  public tagSpecifications!:
    | core.Array<TagSpecifications>
    | core.ArrayOut<TagSpecifications>;

  @core.attr(String, { computed: true, kind: "map" })
  public tags?: core.Map<string, string> | core.MapOut<core.StringOut>;

  @core.attr(String, { computed: true })
  public userData!: string | core.StringOut;

  @core.attr(String, { computed: true, kind: "array" })
  public vpcSecurityGroupIds!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

  constructor(name: string, args?: DsLaunchTemplateArgs) {
    super(name, "aws_launch_template", args);
  }

  public override getNamespace(): string {
    return "aws_ec2";
  }
}
