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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface RouteTableRouteArgs extends core.SchemaArgs {
  destinationCidr: string | core.StringOut;

  destinationPrefixListId: string | core.StringOut;

  egressOnlyInternetGatewayId: string | core.StringOut;

  gatewayId: string | core.StringOut;

  instanceId: string | core.StringOut;

  natGatewayId: string | core.StringOut;

  networkInterfaceId: string | core.StringOut;

  origin: string | core.StringOut;

  transitGatewayId: string | core.StringOut;

  vpcPeeringConnectionId: string | core.StringOut;
}

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

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

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

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

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

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

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

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface ClassicLoadBalancerListenerArgs extends core.SchemaArgs {
  instancePort: number | core.NumberOut;

  loadBalancerPort: number | core.NumberOut;
}

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface PortRangeArgs extends core.SchemaArgs {
  from: number | core.NumberOut;

  to: number | core.NumberOut;
}

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

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

export interface AclRuleArgs extends core.SchemaArgs {
  cidr: string | core.StringOut;

  egress: boolean | core.BooleanOut;

  portRange: core.Array<PortRange> | core.ArrayOut<PortRange>;

  protocol: string | core.StringOut;

  ruleAction: string | core.StringOut;

  ruleNumber: number | core.NumberOut;
}

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

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

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

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface TransitGatewayRouteTableRouteArgs extends core.SchemaArgs {
  attachmentId: string | core.StringOut;

  destinationCidr: string | core.StringOut;

  prefixListId: string | core.StringOut;

  resourceId: string | core.StringOut;

  resourceType: string | core.StringOut;

  routeOrigin: string | core.StringOut;

  state: string | core.StringOut;
}

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

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

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

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

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface PortRangesArgs extends core.SchemaArgs {
  from: number | core.NumberOut;

  to: number | core.NumberOut;
}

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface SecurityGroupRuleArgs extends core.SchemaArgs {
  cidr: string | core.StringOut;

  direction: string | core.StringOut;

  portRange: core.Array<PortRange> | core.ArrayOut<PortRange>;

  prefixListId: string | core.StringOut;

  protocol: string | core.StringOut;

  securityGroupId: string | core.StringOut;
}

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

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

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

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

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

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

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

  id: string | core.StringOut;

  name: string | core.StringOut;
}

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

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

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

export interface ExplanationsArgs extends core.SchemaArgs {
  acl: core.Array<Acl> | core.ArrayOut<Acl>;

  aclRule: core.Array<AclRule> | core.ArrayOut<AclRule>;

  address: string | core.StringOut;

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

  attachedTo: core.Array<AttachedTo> | core.ArrayOut<AttachedTo>;

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

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

  classicLoadBalancerListener:
    | core.Array<ClassicLoadBalancerListener>
    | core.ArrayOut<ClassicLoadBalancerListener>;

  component: core.Array<Component> | core.ArrayOut<Component>;

  customerGateway: core.Array<CustomerGateway> | core.ArrayOut<CustomerGateway>;

  destination: core.Array<Destination> | core.ArrayOut<Destination>;

  destinationVpc: core.Array<DestinationVpc> | core.ArrayOut<DestinationVpc>;

  direction: string | core.StringOut;

  elasticLoadBalancerListener:
    | core.Array<ElasticLoadBalancerListener>
    | core.ArrayOut<ElasticLoadBalancerListener>;

  explanationCode: string | core.StringOut;

  ingressRouteTable:
    | core.Array<IngressRouteTable>
    | core.ArrayOut<IngressRouteTable>;

  internetGateway: core.Array<InternetGateway> | core.ArrayOut<InternetGateway>;

  loadBalancerArn: string | core.StringOut;

  loadBalancerListenerPort: number | core.NumberOut;

  loadBalancerTargetGroup:
    | core.Array<LoadBalancerTargetGroup>
    | core.ArrayOut<LoadBalancerTargetGroup>;

  loadBalancerTargetGroups:
    | core.Array<LoadBalancerTargetGroups>
    | core.ArrayOut<LoadBalancerTargetGroups>;

  loadBalancerTargetPort: number | core.NumberOut;

  missingComponent: string | core.StringOut;

  natGateway: core.Array<NatGateway> | core.ArrayOut<NatGateway>;

  networkInterface:
    | core.Array<NetworkInterface>
    | core.ArrayOut<NetworkInterface>;

  packetField: string | core.StringOut;

  port: number | core.NumberOut;

  portRanges: core.Array<PortRanges> | core.ArrayOut<PortRanges>;

  prefixList: core.Array<PrefixList> | core.ArrayOut<PrefixList>;

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

  routeTable: core.Array<RouteTable> | core.ArrayOut<RouteTable>;

  routeTableRoute: core.Array<RouteTableRoute> | core.ArrayOut<RouteTableRoute>;

  securityGroup: core.Array<SecurityGroup> | core.ArrayOut<SecurityGroup>;

  securityGroupRule:
    | core.Array<SecurityGroupRule>
    | core.ArrayOut<SecurityGroupRule>;

  securityGroups: core.Array<SecurityGroups> | core.ArrayOut<SecurityGroups>;

  sourceVpc: core.Array<SourceVpc> | core.ArrayOut<SourceVpc>;

  state: string | core.StringOut;

  subnet: core.Array<Subnet> | core.ArrayOut<Subnet>;

  subnetRouteTable:
    | core.Array<SubnetRouteTable>
    | core.ArrayOut<SubnetRouteTable>;

  transitGateway: core.Array<TransitGateway> | core.ArrayOut<TransitGateway>;

  transitGatewayAttachment:
    | core.Array<TransitGatewayAttachment>
    | core.ArrayOut<TransitGatewayAttachment>;

  transitGatewayRouteTable:
    | core.Array<TransitGatewayRouteTable>
    | core.ArrayOut<TransitGatewayRouteTable>;

  transitGatewayRouteTableRoute:
    | core.Array<TransitGatewayRouteTableRoute>
    | core.ArrayOut<TransitGatewayRouteTableRoute>;

  vpc: core.Array<Vpc> | core.ArrayOut<Vpc>;

  vpcEndpoint: core.Array<VpcEndpoint> | core.ArrayOut<VpcEndpoint>;

  vpcPeeringConnection:
    | core.Array<VpcPeeringConnection>
    | core.ArrayOut<VpcPeeringConnection>;

  vpnConnection: core.Array<VpnConnection> | core.ArrayOut<VpnConnection>;

  vpnGateway: core.Array<VpnGateway> | core.ArrayOut<VpnGateway>;
}

export class Explanations extends core.Schema<ExplanationsArgs> {
  @core.attr(Acl, { computed: true, kind: "array" })
  public acl!: core.Array<Acl> | core.ArrayOut<Acl>;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

export interface DestinationPortRangesArgs extends core.SchemaArgs {
  from: number | core.NumberOut;

  to: number | core.NumberOut;
}

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

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

export interface SourcePortRangesArgs extends core.SchemaArgs {
  from: number | core.NumberOut;

  to: number | core.NumberOut;
}

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

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

export interface OutboundHeaderArgs extends core.SchemaArgs {
  destinationAddresses: core.Array<string> | core.ArrayOut<core.StringOut>;

  destinationPortRanges:
    | core.Array<DestinationPortRanges>
    | core.ArrayOut<DestinationPortRanges>;

  protocol: string | core.StringOut;

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

  sourcePortRanges:
    | core.Array<SourcePortRanges>
    | core.ArrayOut<SourcePortRanges>;
}

export class OutboundHeader extends core.Schema<OutboundHeaderArgs> {
  @core.attr(String, { computed: true, kind: "array" })
  public destinationAddresses!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

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

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

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

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

export interface AdditionalDetailsArgs extends core.SchemaArgs {
  additionalDetailType: string | core.StringOut;

  component: core.Array<Component> | core.ArrayOut<Component>;
}

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

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

export interface InboundHeaderArgs extends core.SchemaArgs {
  destinationAddresses: core.Array<string> | core.ArrayOut<core.StringOut>;

  destinationPortRanges:
    | core.Array<DestinationPortRanges>
    | core.ArrayOut<DestinationPortRanges>;

  protocol: string | core.StringOut;

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

  sourcePortRanges:
    | core.Array<SourcePortRanges>
    | core.ArrayOut<SourcePortRanges>;
}

export class InboundHeader extends core.Schema<InboundHeaderArgs> {
  @core.attr(String, { computed: true, kind: "array" })
  public destinationAddresses!:
    | core.Array<string>
    | core.ArrayOut<core.StringOut>;

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

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

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

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

export interface ForwardPathComponentsArgs extends core.SchemaArgs {
  aclRule: core.Array<AclRule> | core.ArrayOut<AclRule>;

  additionalDetails:
    | core.Array<AdditionalDetails>
    | core.ArrayOut<AdditionalDetails>;

  attachedTo: core.Array<AttachedTo> | core.ArrayOut<AttachedTo>;

  component: core.Array<Component> | core.ArrayOut<Component>;

  destinationVpc: core.Array<DestinationVpc> | core.ArrayOut<DestinationVpc>;

  inboundHeader: core.Array<InboundHeader> | core.ArrayOut<InboundHeader>;

  outboundHeader: core.Array<OutboundHeader> | core.ArrayOut<OutboundHeader>;

  routeTableRoute: core.Array<RouteTableRoute> | core.ArrayOut<RouteTableRoute>;

  securityGroupRule:
    | core.Array<SecurityGroupRule>
    | core.ArrayOut<SecurityGroupRule>;

  sequenceNumber: number | core.NumberOut;

  sourceVpc: core.Array<SourceVpc> | core.ArrayOut<SourceVpc>;

  subnet: core.Array<Subnet> | core.ArrayOut<Subnet>;

  transitGateway: core.Array<TransitGateway> | core.ArrayOut<TransitGateway>;

  transitGatewayRouteTableRoute:
    | core.Array<TransitGatewayRouteTableRoute>
    | core.ArrayOut<TransitGatewayRouteTableRoute>;

  vpc: core.Array<Vpc> | core.ArrayOut<Vpc>;
}

export class ForwardPathComponents extends core.Schema<ForwardPathComponentsArgs> {
  @core.attr(AclRule, { computed: true, kind: "array" })
  public aclRule!: core.Array<AclRule> | core.ArrayOut<AclRule>;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

export interface AlternatePathHintsArgs extends core.SchemaArgs {
  componentArn: string | core.StringOut;

  componentId: string | core.StringOut;
}

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

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

export interface ReturnPathComponentsArgs extends core.SchemaArgs {
  aclRule: core.Array<AclRule> | core.ArrayOut<AclRule>;

  additionalDetails:
    | core.Array<AdditionalDetails>
    | core.ArrayOut<AdditionalDetails>;

  attachedTo: core.Array<AttachedTo> | core.ArrayOut<AttachedTo>;

  component: core.Array<Component> | core.ArrayOut<Component>;

  destinationVpc: core.Array<DestinationVpc> | core.ArrayOut<DestinationVpc>;

  inboundHeader: core.Array<InboundHeader> | core.ArrayOut<InboundHeader>;

  outboundHeader: core.Array<OutboundHeader> | core.ArrayOut<OutboundHeader>;

  routeTableRoute: core.Array<RouteTableRoute> | core.ArrayOut<RouteTableRoute>;

  securityGroupRule:
    | core.Array<SecurityGroupRule>
    | core.ArrayOut<SecurityGroupRule>;

  sequenceNumber: number | core.NumberOut;

  sourceVpc: core.Array<SourceVpc> | core.ArrayOut<SourceVpc>;

  subnet: core.Array<Subnet> | core.ArrayOut<Subnet>;

  transitGateway: core.Array<TransitGateway> | core.ArrayOut<TransitGateway>;

  transitGatewayRouteTableRoute:
    | core.Array<TransitGatewayRouteTableRoute>
    | core.ArrayOut<TransitGatewayRouteTableRoute>;

  vpc: core.Array<Vpc> | core.ArrayOut<Vpc>;
}

export class ReturnPathComponents extends core.Schema<ReturnPathComponentsArgs> {
  @core.attr(AclRule, { computed: true, kind: "array" })
  public aclRule!: core.Array<AclRule> | core.ArrayOut<AclRule>;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 DsEc2NetworkInsightsAnalysisArgs {
  filter?: core.Array<Filter> | core.ArrayOut<Filter>;

  networkInsightsAnalysisId?: string | core.StringOut;

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

export class DsEc2NetworkInsightsAnalysis extends core.Data<DsEc2NetworkInsightsAnalysisArgs> {
  @core.attr(AlternatePathHints, { computed: true, kind: "array" })
  public alternatePathHints!:
    | core.Array<AlternatePathHints>
    | core.ArrayOut<AlternatePathHints>;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  constructor(name: string, args?: DsEc2NetworkInsightsAnalysisArgs) {
    super(name, "aws_ec2_network_insights_analysis", args);
  }

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