// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.

package ec2

import (
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awsutil"
	"github.com/aws/aws-sdk-go/aws/request"
	"github.com/aws/aws-sdk-go/private/protocol"
	"github.com/aws/aws-sdk-go/private/protocol/ec2query"
)

const opAcceptReservedInstancesExchangeQuote = "AcceptReservedInstancesExchangeQuote"

// AcceptReservedInstancesExchangeQuoteRequest generates a "aws/request.Request" representing the
// client's request for the AcceptReservedInstancesExchangeQuote operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AcceptReservedInstancesExchangeQuote for more information on using the AcceptReservedInstancesExchangeQuote
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AcceptReservedInstancesExchangeQuoteRequest method.
//    req, resp := client.AcceptReservedInstancesExchangeQuoteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptReservedInstancesExchangeQuote
func (c *EC2) AcceptReservedInstancesExchangeQuoteRequest(input *AcceptReservedInstancesExchangeQuoteInput) (req *request.Request, output *AcceptReservedInstancesExchangeQuoteOutput) {
	op := &request.Operation{
		Name:       opAcceptReservedInstancesExchangeQuote,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AcceptReservedInstancesExchangeQuoteInput{}
	}

	output = &AcceptReservedInstancesExchangeQuoteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AcceptReservedInstancesExchangeQuote API operation for Amazon Elastic Compute Cloud.
//
// Accepts the Convertible Reserved Instance exchange quote described in the
// GetReservedInstancesExchangeQuote call.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AcceptReservedInstancesExchangeQuote for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptReservedInstancesExchangeQuote
func (c *EC2) AcceptReservedInstancesExchangeQuote(input *AcceptReservedInstancesExchangeQuoteInput) (*AcceptReservedInstancesExchangeQuoteOutput, error) {
	req, out := c.AcceptReservedInstancesExchangeQuoteRequest(input)
	return out, req.Send()
}

// AcceptReservedInstancesExchangeQuoteWithContext is the same as AcceptReservedInstancesExchangeQuote with the addition of
// the ability to pass a context and additional request options.
//
// See AcceptReservedInstancesExchangeQuote for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AcceptReservedInstancesExchangeQuoteWithContext(ctx aws.Context, input *AcceptReservedInstancesExchangeQuoteInput, opts ...request.Option) (*AcceptReservedInstancesExchangeQuoteOutput, error) {
	req, out := c.AcceptReservedInstancesExchangeQuoteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAcceptTransitGatewayVpcAttachment = "AcceptTransitGatewayVpcAttachment"

// AcceptTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the
// client's request for the AcceptTransitGatewayVpcAttachment operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AcceptTransitGatewayVpcAttachment for more information on using the AcceptTransitGatewayVpcAttachment
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AcceptTransitGatewayVpcAttachmentRequest method.
//    req, resp := client.AcceptTransitGatewayVpcAttachmentRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptTransitGatewayVpcAttachment
func (c *EC2) AcceptTransitGatewayVpcAttachmentRequest(input *AcceptTransitGatewayVpcAttachmentInput) (req *request.Request, output *AcceptTransitGatewayVpcAttachmentOutput) {
	op := &request.Operation{
		Name:       opAcceptTransitGatewayVpcAttachment,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AcceptTransitGatewayVpcAttachmentInput{}
	}

	output = &AcceptTransitGatewayVpcAttachmentOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AcceptTransitGatewayVpcAttachment API operation for Amazon Elastic Compute Cloud.
//
// Accepts a request to attach a VPC to a transit gateway.
//
// The VPC attachment must be in the pendingAcceptance state. Use DescribeTransitGatewayVpcAttachments
// to view your pending VPC attachment requests. Use RejectTransitGatewayVpcAttachment
// to reject a VPC attachment request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AcceptTransitGatewayVpcAttachment for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptTransitGatewayVpcAttachment
func (c *EC2) AcceptTransitGatewayVpcAttachment(input *AcceptTransitGatewayVpcAttachmentInput) (*AcceptTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.AcceptTransitGatewayVpcAttachmentRequest(input)
	return out, req.Send()
}

// AcceptTransitGatewayVpcAttachmentWithContext is the same as AcceptTransitGatewayVpcAttachment with the addition of
// the ability to pass a context and additional request options.
//
// See AcceptTransitGatewayVpcAttachment for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AcceptTransitGatewayVpcAttachmentWithContext(ctx aws.Context, input *AcceptTransitGatewayVpcAttachmentInput, opts ...request.Option) (*AcceptTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.AcceptTransitGatewayVpcAttachmentRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAcceptVpcEndpointConnections = "AcceptVpcEndpointConnections"

// AcceptVpcEndpointConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the AcceptVpcEndpointConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AcceptVpcEndpointConnections for more information on using the AcceptVpcEndpointConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AcceptVpcEndpointConnectionsRequest method.
//    req, resp := client.AcceptVpcEndpointConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptVpcEndpointConnections
func (c *EC2) AcceptVpcEndpointConnectionsRequest(input *AcceptVpcEndpointConnectionsInput) (req *request.Request, output *AcceptVpcEndpointConnectionsOutput) {
	op := &request.Operation{
		Name:       opAcceptVpcEndpointConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AcceptVpcEndpointConnectionsInput{}
	}

	output = &AcceptVpcEndpointConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AcceptVpcEndpointConnections API operation for Amazon Elastic Compute Cloud.
//
// Accepts one or more interface VPC endpoint connection requests to your VPC
// endpoint service.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AcceptVpcEndpointConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptVpcEndpointConnections
func (c *EC2) AcceptVpcEndpointConnections(input *AcceptVpcEndpointConnectionsInput) (*AcceptVpcEndpointConnectionsOutput, error) {
	req, out := c.AcceptVpcEndpointConnectionsRequest(input)
	return out, req.Send()
}

// AcceptVpcEndpointConnectionsWithContext is the same as AcceptVpcEndpointConnections with the addition of
// the ability to pass a context and additional request options.
//
// See AcceptVpcEndpointConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AcceptVpcEndpointConnectionsWithContext(ctx aws.Context, input *AcceptVpcEndpointConnectionsInput, opts ...request.Option) (*AcceptVpcEndpointConnectionsOutput, error) {
	req, out := c.AcceptVpcEndpointConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAcceptVpcPeeringConnection = "AcceptVpcPeeringConnection"

// AcceptVpcPeeringConnectionRequest generates a "aws/request.Request" representing the
// client's request for the AcceptVpcPeeringConnection operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AcceptVpcPeeringConnection for more information on using the AcceptVpcPeeringConnection
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AcceptVpcPeeringConnectionRequest method.
//    req, resp := client.AcceptVpcPeeringConnectionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptVpcPeeringConnection
func (c *EC2) AcceptVpcPeeringConnectionRequest(input *AcceptVpcPeeringConnectionInput) (req *request.Request, output *AcceptVpcPeeringConnectionOutput) {
	op := &request.Operation{
		Name:       opAcceptVpcPeeringConnection,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AcceptVpcPeeringConnectionInput{}
	}

	output = &AcceptVpcPeeringConnectionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AcceptVpcPeeringConnection API operation for Amazon Elastic Compute Cloud.
//
// Accept a VPC peering connection request. To accept a request, the VPC peering
// connection must be in the pending-acceptance state, and you must be the owner
// of the peer VPC. Use DescribeVpcPeeringConnections to view your outstanding
// VPC peering connection requests.
//
// For an inter-region VPC peering connection request, you must accept the VPC
// peering connection in the region of the accepter VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AcceptVpcPeeringConnection for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AcceptVpcPeeringConnection
func (c *EC2) AcceptVpcPeeringConnection(input *AcceptVpcPeeringConnectionInput) (*AcceptVpcPeeringConnectionOutput, error) {
	req, out := c.AcceptVpcPeeringConnectionRequest(input)
	return out, req.Send()
}

// AcceptVpcPeeringConnectionWithContext is the same as AcceptVpcPeeringConnection with the addition of
// the ability to pass a context and additional request options.
//
// See AcceptVpcPeeringConnection for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AcceptVpcPeeringConnectionWithContext(ctx aws.Context, input *AcceptVpcPeeringConnectionInput, opts ...request.Option) (*AcceptVpcPeeringConnectionOutput, error) {
	req, out := c.AcceptVpcPeeringConnectionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAdvertiseByoipCidr = "AdvertiseByoipCidr"

// AdvertiseByoipCidrRequest generates a "aws/request.Request" representing the
// client's request for the AdvertiseByoipCidr operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AdvertiseByoipCidr for more information on using the AdvertiseByoipCidr
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AdvertiseByoipCidrRequest method.
//    req, resp := client.AdvertiseByoipCidrRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AdvertiseByoipCidr
func (c *EC2) AdvertiseByoipCidrRequest(input *AdvertiseByoipCidrInput) (req *request.Request, output *AdvertiseByoipCidrOutput) {
	op := &request.Operation{
		Name:       opAdvertiseByoipCidr,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AdvertiseByoipCidrInput{}
	}

	output = &AdvertiseByoipCidrOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AdvertiseByoipCidr API operation for Amazon Elastic Compute Cloud.
//
// Advertises an IPv4 address range that is provisioned for use with your AWS
// resources through bring your own IP addresses (BYOIP).
//
// You can perform this operation at most once every 10 seconds, even if you
// specify different address ranges each time.
//
// We recommend that you stop advertising the BYOIP CIDR from other locations
// when you advertise it from AWS. To minimize down time, you can configure
// your AWS resources to use an address from a BYOIP CIDR before it is advertised,
// and then simultaneously stop advertising it from the current location and
// start advertising it through AWS.
//
// It can take a few minutes before traffic to the specified addresses starts
// routing to AWS because of BGP propagation delays.
//
// To stop advertising the BYOIP CIDR, use WithdrawByoipCidr.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AdvertiseByoipCidr for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AdvertiseByoipCidr
func (c *EC2) AdvertiseByoipCidr(input *AdvertiseByoipCidrInput) (*AdvertiseByoipCidrOutput, error) {
	req, out := c.AdvertiseByoipCidrRequest(input)
	return out, req.Send()
}

// AdvertiseByoipCidrWithContext is the same as AdvertiseByoipCidr with the addition of
// the ability to pass a context and additional request options.
//
// See AdvertiseByoipCidr for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AdvertiseByoipCidrWithContext(ctx aws.Context, input *AdvertiseByoipCidrInput, opts ...request.Option) (*AdvertiseByoipCidrOutput, error) {
	req, out := c.AdvertiseByoipCidrRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAllocateAddress = "AllocateAddress"

// AllocateAddressRequest generates a "aws/request.Request" representing the
// client's request for the AllocateAddress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AllocateAddress for more information on using the AllocateAddress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AllocateAddressRequest method.
//    req, resp := client.AllocateAddressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AllocateAddress
func (c *EC2) AllocateAddressRequest(input *AllocateAddressInput) (req *request.Request, output *AllocateAddressOutput) {
	op := &request.Operation{
		Name:       opAllocateAddress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AllocateAddressInput{}
	}

	output = &AllocateAddressOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AllocateAddress API operation for Amazon Elastic Compute Cloud.
//
// Allocates an Elastic IP address to your AWS account. After you allocate the
// Elastic IP address you can associate it with an instance or network interface.
// After you release an Elastic IP address, it is released to the IP address
// pool and can be allocated to a different AWS account.
//
// You can allocate an Elastic IP address from an address pool owned by AWS
// or from an address pool created from a public IPv4 address range that you
// have brought to AWS for use with your AWS resources using bring your own
// IP addresses (BYOIP). For more information, see Bring Your Own IP Addresses
// (BYOIP) (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// [EC2-VPC] If you release an Elastic IP address, you might be able to recover
// it. You cannot recover an Elastic IP address that you released after it is
// allocated to another AWS account. You cannot recover an Elastic IP address
// for EC2-Classic. To attempt to recover an Elastic IP address that you released,
// specify it in this operation.
//
// An Elastic IP address is for use either in the EC2-Classic platform or in
// a VPC. By default, you can allocate 5 Elastic IP addresses for EC2-Classic
// per region and 5 Elastic IP addresses for EC2-VPC per region.
//
// For more information, see Elastic IP Addresses (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AllocateAddress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AllocateAddress
func (c *EC2) AllocateAddress(input *AllocateAddressInput) (*AllocateAddressOutput, error) {
	req, out := c.AllocateAddressRequest(input)
	return out, req.Send()
}

// AllocateAddressWithContext is the same as AllocateAddress with the addition of
// the ability to pass a context and additional request options.
//
// See AllocateAddress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AllocateAddressWithContext(ctx aws.Context, input *AllocateAddressInput, opts ...request.Option) (*AllocateAddressOutput, error) {
	req, out := c.AllocateAddressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAllocateHosts = "AllocateHosts"

// AllocateHostsRequest generates a "aws/request.Request" representing the
// client's request for the AllocateHosts operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AllocateHosts for more information on using the AllocateHosts
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AllocateHostsRequest method.
//    req, resp := client.AllocateHostsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AllocateHosts
func (c *EC2) AllocateHostsRequest(input *AllocateHostsInput) (req *request.Request, output *AllocateHostsOutput) {
	op := &request.Operation{
		Name:       opAllocateHosts,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AllocateHostsInput{}
	}

	output = &AllocateHostsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AllocateHosts API operation for Amazon Elastic Compute Cloud.
//
// Allocates a Dedicated Host to your account. At a minimum, specify the instance
// size type, Availability Zone, and quantity of hosts to allocate.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AllocateHosts for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AllocateHosts
func (c *EC2) AllocateHosts(input *AllocateHostsInput) (*AllocateHostsOutput, error) {
	req, out := c.AllocateHostsRequest(input)
	return out, req.Send()
}

// AllocateHostsWithContext is the same as AllocateHosts with the addition of
// the ability to pass a context and additional request options.
//
// See AllocateHosts for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AllocateHostsWithContext(ctx aws.Context, input *AllocateHostsInput, opts ...request.Option) (*AllocateHostsOutput, error) {
	req, out := c.AllocateHostsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opApplySecurityGroupsToClientVpnTargetNetwork = "ApplySecurityGroupsToClientVpnTargetNetwork"

// ApplySecurityGroupsToClientVpnTargetNetworkRequest generates a "aws/request.Request" representing the
// client's request for the ApplySecurityGroupsToClientVpnTargetNetwork operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ApplySecurityGroupsToClientVpnTargetNetwork for more information on using the ApplySecurityGroupsToClientVpnTargetNetwork
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ApplySecurityGroupsToClientVpnTargetNetworkRequest method.
//    req, resp := client.ApplySecurityGroupsToClientVpnTargetNetworkRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ApplySecurityGroupsToClientVpnTargetNetwork
func (c *EC2) ApplySecurityGroupsToClientVpnTargetNetworkRequest(input *ApplySecurityGroupsToClientVpnTargetNetworkInput) (req *request.Request, output *ApplySecurityGroupsToClientVpnTargetNetworkOutput) {
	op := &request.Operation{
		Name:       opApplySecurityGroupsToClientVpnTargetNetwork,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ApplySecurityGroupsToClientVpnTargetNetworkInput{}
	}

	output = &ApplySecurityGroupsToClientVpnTargetNetworkOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ApplySecurityGroupsToClientVpnTargetNetwork API operation for Amazon Elastic Compute Cloud.
//
// Applies a security group to the association between the target network and
// the Client VPN endpoint. This action replaces the existing security groups
// with the specified security groups.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ApplySecurityGroupsToClientVpnTargetNetwork for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ApplySecurityGroupsToClientVpnTargetNetwork
func (c *EC2) ApplySecurityGroupsToClientVpnTargetNetwork(input *ApplySecurityGroupsToClientVpnTargetNetworkInput) (*ApplySecurityGroupsToClientVpnTargetNetworkOutput, error) {
	req, out := c.ApplySecurityGroupsToClientVpnTargetNetworkRequest(input)
	return out, req.Send()
}

// ApplySecurityGroupsToClientVpnTargetNetworkWithContext is the same as ApplySecurityGroupsToClientVpnTargetNetwork with the addition of
// the ability to pass a context and additional request options.
//
// See ApplySecurityGroupsToClientVpnTargetNetwork for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ApplySecurityGroupsToClientVpnTargetNetworkWithContext(ctx aws.Context, input *ApplySecurityGroupsToClientVpnTargetNetworkInput, opts ...request.Option) (*ApplySecurityGroupsToClientVpnTargetNetworkOutput, error) {
	req, out := c.ApplySecurityGroupsToClientVpnTargetNetworkRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssignIpv6Addresses = "AssignIpv6Addresses"

// AssignIpv6AddressesRequest generates a "aws/request.Request" representing the
// client's request for the AssignIpv6Addresses operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssignIpv6Addresses for more information on using the AssignIpv6Addresses
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssignIpv6AddressesRequest method.
//    req, resp := client.AssignIpv6AddressesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssignIpv6Addresses
func (c *EC2) AssignIpv6AddressesRequest(input *AssignIpv6AddressesInput) (req *request.Request, output *AssignIpv6AddressesOutput) {
	op := &request.Operation{
		Name:       opAssignIpv6Addresses,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssignIpv6AddressesInput{}
	}

	output = &AssignIpv6AddressesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssignIpv6Addresses API operation for Amazon Elastic Compute Cloud.
//
// Assigns one or more IPv6 addresses to the specified network interface. You
// can specify one or more specific IPv6 addresses, or you can specify the number
// of IPv6 addresses to be automatically assigned from within the subnet's IPv6
// CIDR block range. You can assign as many IPv6 addresses to a network interface
// as you can assign private IPv4 addresses, and the limit varies per instance
// type. For information, see IP Addresses Per Network Interface Per Instance
// Type (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssignIpv6Addresses for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssignIpv6Addresses
func (c *EC2) AssignIpv6Addresses(input *AssignIpv6AddressesInput) (*AssignIpv6AddressesOutput, error) {
	req, out := c.AssignIpv6AddressesRequest(input)
	return out, req.Send()
}

// AssignIpv6AddressesWithContext is the same as AssignIpv6Addresses with the addition of
// the ability to pass a context and additional request options.
//
// See AssignIpv6Addresses for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssignIpv6AddressesWithContext(ctx aws.Context, input *AssignIpv6AddressesInput, opts ...request.Option) (*AssignIpv6AddressesOutput, error) {
	req, out := c.AssignIpv6AddressesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssignPrivateIpAddresses = "AssignPrivateIpAddresses"

// AssignPrivateIpAddressesRequest generates a "aws/request.Request" representing the
// client's request for the AssignPrivateIpAddresses operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssignPrivateIpAddresses for more information on using the AssignPrivateIpAddresses
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssignPrivateIpAddressesRequest method.
//    req, resp := client.AssignPrivateIpAddressesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssignPrivateIpAddresses
func (c *EC2) AssignPrivateIpAddressesRequest(input *AssignPrivateIpAddressesInput) (req *request.Request, output *AssignPrivateIpAddressesOutput) {
	op := &request.Operation{
		Name:       opAssignPrivateIpAddresses,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssignPrivateIpAddressesInput{}
	}

	output = &AssignPrivateIpAddressesOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// AssignPrivateIpAddresses API operation for Amazon Elastic Compute Cloud.
//
// Assigns one or more secondary private IP addresses to the specified network
// interface.
//
// You can specify one or more specific secondary IP addresses, or you can specify
// the number of secondary IP addresses to be automatically assigned within
// the subnet's CIDR block range. The number of secondary IP addresses that
// you can assign to an instance varies by instance type. For information about
// instance types, see Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)
// in the Amazon Elastic Compute Cloud User Guide. For more information about
// Elastic IP addresses, see Elastic IP Addresses (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// When you move a secondary private IP address to another network interface,
// any Elastic IP address that is associated with the IP address is also moved.
//
// Remapping an IP address is an asynchronous operation. When you move an IP
// address from one network interface to another, check network/interfaces/macs/mac/local-ipv4s
// in the instance metadata to confirm that the remapping is complete.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssignPrivateIpAddresses for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssignPrivateIpAddresses
func (c *EC2) AssignPrivateIpAddresses(input *AssignPrivateIpAddressesInput) (*AssignPrivateIpAddressesOutput, error) {
	req, out := c.AssignPrivateIpAddressesRequest(input)
	return out, req.Send()
}

// AssignPrivateIpAddressesWithContext is the same as AssignPrivateIpAddresses with the addition of
// the ability to pass a context and additional request options.
//
// See AssignPrivateIpAddresses for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssignPrivateIpAddressesWithContext(ctx aws.Context, input *AssignPrivateIpAddressesInput, opts ...request.Option) (*AssignPrivateIpAddressesOutput, error) {
	req, out := c.AssignPrivateIpAddressesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateAddress = "AssociateAddress"

// AssociateAddressRequest generates a "aws/request.Request" representing the
// client's request for the AssociateAddress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateAddress for more information on using the AssociateAddress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateAddressRequest method.
//    req, resp := client.AssociateAddressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateAddress
func (c *EC2) AssociateAddressRequest(input *AssociateAddressInput) (req *request.Request, output *AssociateAddressOutput) {
	op := &request.Operation{
		Name:       opAssociateAddress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateAddressInput{}
	}

	output = &AssociateAddressOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateAddress API operation for Amazon Elastic Compute Cloud.
//
// Associates an Elastic IP address with an instance or a network interface.
// Before you can use an Elastic IP address, you must allocate it to your account.
//
// An Elastic IP address is for use in either the EC2-Classic platform or in
// a VPC. For more information, see Elastic IP Addresses (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// [EC2-Classic, VPC in an EC2-VPC-only account] If the Elastic IP address is
// already associated with a different instance, it is disassociated from that
// instance and associated with the specified instance. If you associate an
// Elastic IP address with an instance that has an existing Elastic IP address,
// the existing address is disassociated from the instance, but remains allocated
// to your account.
//
// [VPC in an EC2-Classic account] If you don't specify a private IP address,
// the Elastic IP address is associated with the primary IP address. If the
// Elastic IP address is already associated with a different instance or a network
// interface, you get an error unless you allow reassociation. You cannot associate
// an Elastic IP address with an instance or network interface that has an existing
// Elastic IP address.
//
// This is an idempotent operation. If you perform the operation more than once,
// Amazon EC2 doesn't return an error, and you may be charged for each time
// the Elastic IP address is remapped to the same instance. For more information,
// see the Elastic IP Addresses section of Amazon EC2 Pricing (http://aws.amazon.com/ec2/pricing/).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateAddress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateAddress
func (c *EC2) AssociateAddress(input *AssociateAddressInput) (*AssociateAddressOutput, error) {
	req, out := c.AssociateAddressRequest(input)
	return out, req.Send()
}

// AssociateAddressWithContext is the same as AssociateAddress with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateAddress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateAddressWithContext(ctx aws.Context, input *AssociateAddressInput, opts ...request.Option) (*AssociateAddressOutput, error) {
	req, out := c.AssociateAddressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateClientVpnTargetNetwork = "AssociateClientVpnTargetNetwork"

// AssociateClientVpnTargetNetworkRequest generates a "aws/request.Request" representing the
// client's request for the AssociateClientVpnTargetNetwork operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateClientVpnTargetNetwork for more information on using the AssociateClientVpnTargetNetwork
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateClientVpnTargetNetworkRequest method.
//    req, resp := client.AssociateClientVpnTargetNetworkRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateClientVpnTargetNetwork
func (c *EC2) AssociateClientVpnTargetNetworkRequest(input *AssociateClientVpnTargetNetworkInput) (req *request.Request, output *AssociateClientVpnTargetNetworkOutput) {
	op := &request.Operation{
		Name:       opAssociateClientVpnTargetNetwork,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateClientVpnTargetNetworkInput{}
	}

	output = &AssociateClientVpnTargetNetworkOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateClientVpnTargetNetwork API operation for Amazon Elastic Compute Cloud.
//
// Associates a target network with a Client VPN endpoint. A target network
// is a subnet in a VPC. You can associate multiple subnets from the same VPC
// with a Client VPN endpoint. You can associate only one subnet in each Availability
// Zone. We recommend that you associate at least two subnets to provide Availability
// Zone redundancy.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateClientVpnTargetNetwork for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateClientVpnTargetNetwork
func (c *EC2) AssociateClientVpnTargetNetwork(input *AssociateClientVpnTargetNetworkInput) (*AssociateClientVpnTargetNetworkOutput, error) {
	req, out := c.AssociateClientVpnTargetNetworkRequest(input)
	return out, req.Send()
}

// AssociateClientVpnTargetNetworkWithContext is the same as AssociateClientVpnTargetNetwork with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateClientVpnTargetNetwork for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateClientVpnTargetNetworkWithContext(ctx aws.Context, input *AssociateClientVpnTargetNetworkInput, opts ...request.Option) (*AssociateClientVpnTargetNetworkOutput, error) {
	req, out := c.AssociateClientVpnTargetNetworkRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateDhcpOptions = "AssociateDhcpOptions"

// AssociateDhcpOptionsRequest generates a "aws/request.Request" representing the
// client's request for the AssociateDhcpOptions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateDhcpOptions for more information on using the AssociateDhcpOptions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateDhcpOptionsRequest method.
//    req, resp := client.AssociateDhcpOptionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateDhcpOptions
func (c *EC2) AssociateDhcpOptionsRequest(input *AssociateDhcpOptionsInput) (req *request.Request, output *AssociateDhcpOptionsOutput) {
	op := &request.Operation{
		Name:       opAssociateDhcpOptions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateDhcpOptionsInput{}
	}

	output = &AssociateDhcpOptionsOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// AssociateDhcpOptions API operation for Amazon Elastic Compute Cloud.
//
// Associates a set of DHCP options (that you've previously created) with the
// specified VPC, or associates no DHCP options with the VPC.
//
// After you associate the options with the VPC, any existing instances and
// all new instances that you launch in that VPC use the options. You don't
// need to restart or relaunch the instances. They automatically pick up the
// changes within a few hours, depending on how frequently the instance renews
// its DHCP lease. You can explicitly renew the lease using the operating system
// on the instance.
//
// For more information, see DHCP Options Sets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_DHCP_Options.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateDhcpOptions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateDhcpOptions
func (c *EC2) AssociateDhcpOptions(input *AssociateDhcpOptionsInput) (*AssociateDhcpOptionsOutput, error) {
	req, out := c.AssociateDhcpOptionsRequest(input)
	return out, req.Send()
}

// AssociateDhcpOptionsWithContext is the same as AssociateDhcpOptions with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateDhcpOptions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateDhcpOptionsWithContext(ctx aws.Context, input *AssociateDhcpOptionsInput, opts ...request.Option) (*AssociateDhcpOptionsOutput, error) {
	req, out := c.AssociateDhcpOptionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateIamInstanceProfile = "AssociateIamInstanceProfile"

// AssociateIamInstanceProfileRequest generates a "aws/request.Request" representing the
// client's request for the AssociateIamInstanceProfile operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateIamInstanceProfile for more information on using the AssociateIamInstanceProfile
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateIamInstanceProfileRequest method.
//    req, resp := client.AssociateIamInstanceProfileRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateIamInstanceProfile
func (c *EC2) AssociateIamInstanceProfileRequest(input *AssociateIamInstanceProfileInput) (req *request.Request, output *AssociateIamInstanceProfileOutput) {
	op := &request.Operation{
		Name:       opAssociateIamInstanceProfile,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateIamInstanceProfileInput{}
	}

	output = &AssociateIamInstanceProfileOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateIamInstanceProfile API operation for Amazon Elastic Compute Cloud.
//
// Associates an IAM instance profile with a running or stopped instance. You
// cannot associate more than one IAM instance profile with an instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateIamInstanceProfile for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateIamInstanceProfile
func (c *EC2) AssociateIamInstanceProfile(input *AssociateIamInstanceProfileInput) (*AssociateIamInstanceProfileOutput, error) {
	req, out := c.AssociateIamInstanceProfileRequest(input)
	return out, req.Send()
}

// AssociateIamInstanceProfileWithContext is the same as AssociateIamInstanceProfile with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateIamInstanceProfile for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateIamInstanceProfileWithContext(ctx aws.Context, input *AssociateIamInstanceProfileInput, opts ...request.Option) (*AssociateIamInstanceProfileOutput, error) {
	req, out := c.AssociateIamInstanceProfileRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateRouteTable = "AssociateRouteTable"

// AssociateRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the AssociateRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateRouteTable for more information on using the AssociateRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateRouteTableRequest method.
//    req, resp := client.AssociateRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateRouteTable
func (c *EC2) AssociateRouteTableRequest(input *AssociateRouteTableInput) (req *request.Request, output *AssociateRouteTableOutput) {
	op := &request.Operation{
		Name:       opAssociateRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateRouteTableInput{}
	}

	output = &AssociateRouteTableOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Associates a subnet with a route table. The subnet and route table must be
// in the same VPC. This association causes traffic originating from the subnet
// to be routed according to the routes in the route table. The action returns
// an association ID, which you need in order to disassociate the route table
// from the subnet later. A route table can be associated with multiple subnets.
//
// For more information, see Route Tables (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateRouteTable
func (c *EC2) AssociateRouteTable(input *AssociateRouteTableInput) (*AssociateRouteTableOutput, error) {
	req, out := c.AssociateRouteTableRequest(input)
	return out, req.Send()
}

// AssociateRouteTableWithContext is the same as AssociateRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateRouteTableWithContext(ctx aws.Context, input *AssociateRouteTableInput, opts ...request.Option) (*AssociateRouteTableOutput, error) {
	req, out := c.AssociateRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateSubnetCidrBlock = "AssociateSubnetCidrBlock"

// AssociateSubnetCidrBlockRequest generates a "aws/request.Request" representing the
// client's request for the AssociateSubnetCidrBlock operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateSubnetCidrBlock for more information on using the AssociateSubnetCidrBlock
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateSubnetCidrBlockRequest method.
//    req, resp := client.AssociateSubnetCidrBlockRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateSubnetCidrBlock
func (c *EC2) AssociateSubnetCidrBlockRequest(input *AssociateSubnetCidrBlockInput) (req *request.Request, output *AssociateSubnetCidrBlockOutput) {
	op := &request.Operation{
		Name:       opAssociateSubnetCidrBlock,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateSubnetCidrBlockInput{}
	}

	output = &AssociateSubnetCidrBlockOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateSubnetCidrBlock API operation for Amazon Elastic Compute Cloud.
//
// Associates a CIDR block with your subnet. You can only associate a single
// IPv6 CIDR block with your subnet. An IPv6 CIDR block must have a prefix length
// of /64.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateSubnetCidrBlock for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateSubnetCidrBlock
func (c *EC2) AssociateSubnetCidrBlock(input *AssociateSubnetCidrBlockInput) (*AssociateSubnetCidrBlockOutput, error) {
	req, out := c.AssociateSubnetCidrBlockRequest(input)
	return out, req.Send()
}

// AssociateSubnetCidrBlockWithContext is the same as AssociateSubnetCidrBlock with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateSubnetCidrBlock for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateSubnetCidrBlockWithContext(ctx aws.Context, input *AssociateSubnetCidrBlockInput, opts ...request.Option) (*AssociateSubnetCidrBlockOutput, error) {
	req, out := c.AssociateSubnetCidrBlockRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateTransitGatewayRouteTable = "AssociateTransitGatewayRouteTable"

// AssociateTransitGatewayRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the AssociateTransitGatewayRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateTransitGatewayRouteTable for more information on using the AssociateTransitGatewayRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateTransitGatewayRouteTableRequest method.
//    req, resp := client.AssociateTransitGatewayRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateTransitGatewayRouteTable
func (c *EC2) AssociateTransitGatewayRouteTableRequest(input *AssociateTransitGatewayRouteTableInput) (req *request.Request, output *AssociateTransitGatewayRouteTableOutput) {
	op := &request.Operation{
		Name:       opAssociateTransitGatewayRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateTransitGatewayRouteTableInput{}
	}

	output = &AssociateTransitGatewayRouteTableOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateTransitGatewayRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Associates the specified attachment with the specified transit gateway route
// table. You can associate only one route table with an attachment.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateTransitGatewayRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateTransitGatewayRouteTable
func (c *EC2) AssociateTransitGatewayRouteTable(input *AssociateTransitGatewayRouteTableInput) (*AssociateTransitGatewayRouteTableOutput, error) {
	req, out := c.AssociateTransitGatewayRouteTableRequest(input)
	return out, req.Send()
}

// AssociateTransitGatewayRouteTableWithContext is the same as AssociateTransitGatewayRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateTransitGatewayRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateTransitGatewayRouteTableWithContext(ctx aws.Context, input *AssociateTransitGatewayRouteTableInput, opts ...request.Option) (*AssociateTransitGatewayRouteTableOutput, error) {
	req, out := c.AssociateTransitGatewayRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAssociateVpcCidrBlock = "AssociateVpcCidrBlock"

// AssociateVpcCidrBlockRequest generates a "aws/request.Request" representing the
// client's request for the AssociateVpcCidrBlock operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AssociateVpcCidrBlock for more information on using the AssociateVpcCidrBlock
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AssociateVpcCidrBlockRequest method.
//    req, resp := client.AssociateVpcCidrBlockRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateVpcCidrBlock
func (c *EC2) AssociateVpcCidrBlockRequest(input *AssociateVpcCidrBlockInput) (req *request.Request, output *AssociateVpcCidrBlockOutput) {
	op := &request.Operation{
		Name:       opAssociateVpcCidrBlock,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AssociateVpcCidrBlockInput{}
	}

	output = &AssociateVpcCidrBlockOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AssociateVpcCidrBlock API operation for Amazon Elastic Compute Cloud.
//
// Associates a CIDR block with your VPC. You can associate a secondary IPv4
// CIDR block, or you can associate an Amazon-provided IPv6 CIDR block. The
// IPv6 CIDR block size is fixed at /56.
//
// For more information about associating CIDR blocks with your VPC and applicable
// restrictions, see VPC and Subnet Sizing (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html#VPC_Sizing)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AssociateVpcCidrBlock for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AssociateVpcCidrBlock
func (c *EC2) AssociateVpcCidrBlock(input *AssociateVpcCidrBlockInput) (*AssociateVpcCidrBlockOutput, error) {
	req, out := c.AssociateVpcCidrBlockRequest(input)
	return out, req.Send()
}

// AssociateVpcCidrBlockWithContext is the same as AssociateVpcCidrBlock with the addition of
// the ability to pass a context and additional request options.
//
// See AssociateVpcCidrBlock for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AssociateVpcCidrBlockWithContext(ctx aws.Context, input *AssociateVpcCidrBlockInput, opts ...request.Option) (*AssociateVpcCidrBlockOutput, error) {
	req, out := c.AssociateVpcCidrBlockRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAttachClassicLinkVpc = "AttachClassicLinkVpc"

// AttachClassicLinkVpcRequest generates a "aws/request.Request" representing the
// client's request for the AttachClassicLinkVpc operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AttachClassicLinkVpc for more information on using the AttachClassicLinkVpc
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AttachClassicLinkVpcRequest method.
//    req, resp := client.AttachClassicLinkVpcRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachClassicLinkVpc
func (c *EC2) AttachClassicLinkVpcRequest(input *AttachClassicLinkVpcInput) (req *request.Request, output *AttachClassicLinkVpcOutput) {
	op := &request.Operation{
		Name:       opAttachClassicLinkVpc,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AttachClassicLinkVpcInput{}
	}

	output = &AttachClassicLinkVpcOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AttachClassicLinkVpc API operation for Amazon Elastic Compute Cloud.
//
// Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or
// more of the VPC's security groups. You cannot link an EC2-Classic instance
// to more than one VPC at a time. You can only link an instance that's in the
// running state. An instance is automatically unlinked from a VPC when it's
// stopped - you can link it to the VPC again when you restart it.
//
// After you've linked an instance, you cannot change the VPC security groups
// that are associated with it. To change the security groups, you must first
// unlink the instance, and then link it again.
//
// Linking your instance to a VPC is sometimes referred to as attaching your
// instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AttachClassicLinkVpc for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachClassicLinkVpc
func (c *EC2) AttachClassicLinkVpc(input *AttachClassicLinkVpcInput) (*AttachClassicLinkVpcOutput, error) {
	req, out := c.AttachClassicLinkVpcRequest(input)
	return out, req.Send()
}

// AttachClassicLinkVpcWithContext is the same as AttachClassicLinkVpc with the addition of
// the ability to pass a context and additional request options.
//
// See AttachClassicLinkVpc for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AttachClassicLinkVpcWithContext(ctx aws.Context, input *AttachClassicLinkVpcInput, opts ...request.Option) (*AttachClassicLinkVpcOutput, error) {
	req, out := c.AttachClassicLinkVpcRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAttachInternetGateway = "AttachInternetGateway"

// AttachInternetGatewayRequest generates a "aws/request.Request" representing the
// client's request for the AttachInternetGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AttachInternetGateway for more information on using the AttachInternetGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AttachInternetGatewayRequest method.
//    req, resp := client.AttachInternetGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachInternetGateway
func (c *EC2) AttachInternetGatewayRequest(input *AttachInternetGatewayInput) (req *request.Request, output *AttachInternetGatewayOutput) {
	op := &request.Operation{
		Name:       opAttachInternetGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AttachInternetGatewayInput{}
	}

	output = &AttachInternetGatewayOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// AttachInternetGateway API operation for Amazon Elastic Compute Cloud.
//
// Attaches an internet gateway to a VPC, enabling connectivity between the
// internet and the VPC. For more information about your VPC and internet gateway,
// see the Amazon Virtual Private Cloud User Guide (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AttachInternetGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachInternetGateway
func (c *EC2) AttachInternetGateway(input *AttachInternetGatewayInput) (*AttachInternetGatewayOutput, error) {
	req, out := c.AttachInternetGatewayRequest(input)
	return out, req.Send()
}

// AttachInternetGatewayWithContext is the same as AttachInternetGateway with the addition of
// the ability to pass a context and additional request options.
//
// See AttachInternetGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AttachInternetGatewayWithContext(ctx aws.Context, input *AttachInternetGatewayInput, opts ...request.Option) (*AttachInternetGatewayOutput, error) {
	req, out := c.AttachInternetGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAttachNetworkInterface = "AttachNetworkInterface"

// AttachNetworkInterfaceRequest generates a "aws/request.Request" representing the
// client's request for the AttachNetworkInterface operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AttachNetworkInterface for more information on using the AttachNetworkInterface
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AttachNetworkInterfaceRequest method.
//    req, resp := client.AttachNetworkInterfaceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachNetworkInterface
func (c *EC2) AttachNetworkInterfaceRequest(input *AttachNetworkInterfaceInput) (req *request.Request, output *AttachNetworkInterfaceOutput) {
	op := &request.Operation{
		Name:       opAttachNetworkInterface,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AttachNetworkInterfaceInput{}
	}

	output = &AttachNetworkInterfaceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AttachNetworkInterface API operation for Amazon Elastic Compute Cloud.
//
// Attaches a network interface to an instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AttachNetworkInterface for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachNetworkInterface
func (c *EC2) AttachNetworkInterface(input *AttachNetworkInterfaceInput) (*AttachNetworkInterfaceOutput, error) {
	req, out := c.AttachNetworkInterfaceRequest(input)
	return out, req.Send()
}

// AttachNetworkInterfaceWithContext is the same as AttachNetworkInterface with the addition of
// the ability to pass a context and additional request options.
//
// See AttachNetworkInterface for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AttachNetworkInterfaceWithContext(ctx aws.Context, input *AttachNetworkInterfaceInput, opts ...request.Option) (*AttachNetworkInterfaceOutput, error) {
	req, out := c.AttachNetworkInterfaceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAttachVolume = "AttachVolume"

// AttachVolumeRequest generates a "aws/request.Request" representing the
// client's request for the AttachVolume operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AttachVolume for more information on using the AttachVolume
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AttachVolumeRequest method.
//    req, resp := client.AttachVolumeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachVolume
func (c *EC2) AttachVolumeRequest(input *AttachVolumeInput) (req *request.Request, output *VolumeAttachment) {
	op := &request.Operation{
		Name:       opAttachVolume,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AttachVolumeInput{}
	}

	output = &VolumeAttachment{}
	req = c.newRequest(op, input, output)
	return
}

// AttachVolume API operation for Amazon Elastic Compute Cloud.
//
// Attaches an EBS volume to a running or stopped instance and exposes it to
// the instance with the specified device name.
//
// Encrypted EBS volumes may only be attached to instances that support Amazon
// EBS encryption. For more information, see Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For a list of supported device names, see Attaching an EBS Volume to an Instance
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-attaching-volume.html).
// Any device names that aren't reserved for instance store volumes can be used
// for EBS volumes. For more information, see Amazon EC2 Instance Store (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// If a volume has an AWS Marketplace product code:
//
//    * The volume can be attached only to a stopped instance.
//
//    * AWS Marketplace product codes are copied from the volume to the instance.
//
//    * You must be subscribed to the product.
//
//    * The instance type and operating system of the instance must support
//    the product. For example, you can't detach a volume from a Windows instance
//    and attach it to a Linux instance.
//
// For more information about EBS volumes, see Attaching Amazon EBS Volumes
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-attaching-volume.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AttachVolume for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachVolume
func (c *EC2) AttachVolume(input *AttachVolumeInput) (*VolumeAttachment, error) {
	req, out := c.AttachVolumeRequest(input)
	return out, req.Send()
}

// AttachVolumeWithContext is the same as AttachVolume with the addition of
// the ability to pass a context and additional request options.
//
// See AttachVolume for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AttachVolumeWithContext(ctx aws.Context, input *AttachVolumeInput, opts ...request.Option) (*VolumeAttachment, error) {
	req, out := c.AttachVolumeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAttachVpnGateway = "AttachVpnGateway"

// AttachVpnGatewayRequest generates a "aws/request.Request" representing the
// client's request for the AttachVpnGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AttachVpnGateway for more information on using the AttachVpnGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AttachVpnGatewayRequest method.
//    req, resp := client.AttachVpnGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachVpnGateway
func (c *EC2) AttachVpnGatewayRequest(input *AttachVpnGatewayInput) (req *request.Request, output *AttachVpnGatewayOutput) {
	op := &request.Operation{
		Name:       opAttachVpnGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AttachVpnGatewayInput{}
	}

	output = &AttachVpnGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AttachVpnGateway API operation for Amazon Elastic Compute Cloud.
//
// Attaches a virtual private gateway to a VPC. You can attach one virtual private
// gateway to one VPC at a time.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AttachVpnGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AttachVpnGateway
func (c *EC2) AttachVpnGateway(input *AttachVpnGatewayInput) (*AttachVpnGatewayOutput, error) {
	req, out := c.AttachVpnGatewayRequest(input)
	return out, req.Send()
}

// AttachVpnGatewayWithContext is the same as AttachVpnGateway with the addition of
// the ability to pass a context and additional request options.
//
// See AttachVpnGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AttachVpnGatewayWithContext(ctx aws.Context, input *AttachVpnGatewayInput, opts ...request.Option) (*AttachVpnGatewayOutput, error) {
	req, out := c.AttachVpnGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAuthorizeClientVpnIngress = "AuthorizeClientVpnIngress"

// AuthorizeClientVpnIngressRequest generates a "aws/request.Request" representing the
// client's request for the AuthorizeClientVpnIngress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AuthorizeClientVpnIngress for more information on using the AuthorizeClientVpnIngress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AuthorizeClientVpnIngressRequest method.
//    req, resp := client.AuthorizeClientVpnIngressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AuthorizeClientVpnIngress
func (c *EC2) AuthorizeClientVpnIngressRequest(input *AuthorizeClientVpnIngressInput) (req *request.Request, output *AuthorizeClientVpnIngressOutput) {
	op := &request.Operation{
		Name:       opAuthorizeClientVpnIngress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AuthorizeClientVpnIngressInput{}
	}

	output = &AuthorizeClientVpnIngressOutput{}
	req = c.newRequest(op, input, output)
	return
}

// AuthorizeClientVpnIngress API operation for Amazon Elastic Compute Cloud.
//
// Adds an ingress authorization rule to a Client VPN endpoint. Ingress authorization
// rules act as firewall rules that grant access to networks. You must configure
// ingress authorization rules to enable clients to access resources in AWS
// or on-premises networks.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AuthorizeClientVpnIngress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AuthorizeClientVpnIngress
func (c *EC2) AuthorizeClientVpnIngress(input *AuthorizeClientVpnIngressInput) (*AuthorizeClientVpnIngressOutput, error) {
	req, out := c.AuthorizeClientVpnIngressRequest(input)
	return out, req.Send()
}

// AuthorizeClientVpnIngressWithContext is the same as AuthorizeClientVpnIngress with the addition of
// the ability to pass a context and additional request options.
//
// See AuthorizeClientVpnIngress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AuthorizeClientVpnIngressWithContext(ctx aws.Context, input *AuthorizeClientVpnIngressInput, opts ...request.Option) (*AuthorizeClientVpnIngressOutput, error) {
	req, out := c.AuthorizeClientVpnIngressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAuthorizeSecurityGroupEgress = "AuthorizeSecurityGroupEgress"

// AuthorizeSecurityGroupEgressRequest generates a "aws/request.Request" representing the
// client's request for the AuthorizeSecurityGroupEgress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AuthorizeSecurityGroupEgress for more information on using the AuthorizeSecurityGroupEgress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AuthorizeSecurityGroupEgressRequest method.
//    req, resp := client.AuthorizeSecurityGroupEgressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AuthorizeSecurityGroupEgress
func (c *EC2) AuthorizeSecurityGroupEgressRequest(input *AuthorizeSecurityGroupEgressInput) (req *request.Request, output *AuthorizeSecurityGroupEgressOutput) {
	op := &request.Operation{
		Name:       opAuthorizeSecurityGroupEgress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AuthorizeSecurityGroupEgressInput{}
	}

	output = &AuthorizeSecurityGroupEgressOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// AuthorizeSecurityGroupEgress API operation for Amazon Elastic Compute Cloud.
//
// [EC2-VPC only] Adds one or more egress rules to a security group for use
// with a VPC. Specifically, this action permits instances to send traffic to
// one or more destination IPv4 or IPv6 CIDR address ranges, or to one or more
// destination security groups for the same VPC. This action doesn't apply to
// security groups for use in EC2-Classic. For more information, see Security
// Groups for Your VPC (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html)
// in the Amazon Virtual Private Cloud User Guide. For more information about
// security group limits, see Amazon VPC Limits (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html).
//
// Each rule consists of the protocol (for example, TCP), plus either a CIDR
// range or a source group. For the TCP and UDP protocols, you must also specify
// the destination port or port range. For the ICMP protocol, you must also
// specify the ICMP type and code. You can use -1 for the type or code to mean
// all types or all codes. You can optionally specify a description for the
// rule.
//
// Rule changes are propagated to affected instances as quickly as possible.
// However, a small delay might occur.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AuthorizeSecurityGroupEgress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AuthorizeSecurityGroupEgress
func (c *EC2) AuthorizeSecurityGroupEgress(input *AuthorizeSecurityGroupEgressInput) (*AuthorizeSecurityGroupEgressOutput, error) {
	req, out := c.AuthorizeSecurityGroupEgressRequest(input)
	return out, req.Send()
}

// AuthorizeSecurityGroupEgressWithContext is the same as AuthorizeSecurityGroupEgress with the addition of
// the ability to pass a context and additional request options.
//
// See AuthorizeSecurityGroupEgress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AuthorizeSecurityGroupEgressWithContext(ctx aws.Context, input *AuthorizeSecurityGroupEgressInput, opts ...request.Option) (*AuthorizeSecurityGroupEgressOutput, error) {
	req, out := c.AuthorizeSecurityGroupEgressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opAuthorizeSecurityGroupIngress = "AuthorizeSecurityGroupIngress"

// AuthorizeSecurityGroupIngressRequest generates a "aws/request.Request" representing the
// client's request for the AuthorizeSecurityGroupIngress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See AuthorizeSecurityGroupIngress for more information on using the AuthorizeSecurityGroupIngress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the AuthorizeSecurityGroupIngressRequest method.
//    req, resp := client.AuthorizeSecurityGroupIngressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AuthorizeSecurityGroupIngress
func (c *EC2) AuthorizeSecurityGroupIngressRequest(input *AuthorizeSecurityGroupIngressInput) (req *request.Request, output *AuthorizeSecurityGroupIngressOutput) {
	op := &request.Operation{
		Name:       opAuthorizeSecurityGroupIngress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &AuthorizeSecurityGroupIngressInput{}
	}

	output = &AuthorizeSecurityGroupIngressOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// AuthorizeSecurityGroupIngress API operation for Amazon Elastic Compute Cloud.
//
// Adds one or more ingress rules to a security group.
//
// Rule changes are propagated to instances within the security group as quickly
// as possible. However, a small delay might occur.
//
// [EC2-Classic] This action gives one or more IPv4 CIDR address ranges permission
// to access a security group in your account, or gives one or more security
// groups (called the source groups) permission to access a security group for
// your account. A source group can be for your own AWS account, or another.
// You can have up to 100 rules per group.
//
// [EC2-VPC] This action gives one or more IPv4 or IPv6 CIDR address ranges
// permission to access a security group in your VPC, or gives one or more other
// security groups (called the source groups) permission to access a security
// group for your VPC. The security groups must all be for the same VPC or a
// peer VPC in a VPC peering connection. For more information about VPC security
// group limits, see Amazon VPC Limits (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html).
//
// You can optionally specify a description for the security group rule.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation AuthorizeSecurityGroupIngress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/AuthorizeSecurityGroupIngress
func (c *EC2) AuthorizeSecurityGroupIngress(input *AuthorizeSecurityGroupIngressInput) (*AuthorizeSecurityGroupIngressOutput, error) {
	req, out := c.AuthorizeSecurityGroupIngressRequest(input)
	return out, req.Send()
}

// AuthorizeSecurityGroupIngressWithContext is the same as AuthorizeSecurityGroupIngress with the addition of
// the ability to pass a context and additional request options.
//
// See AuthorizeSecurityGroupIngress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) AuthorizeSecurityGroupIngressWithContext(ctx aws.Context, input *AuthorizeSecurityGroupIngressInput, opts ...request.Option) (*AuthorizeSecurityGroupIngressOutput, error) {
	req, out := c.AuthorizeSecurityGroupIngressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opBundleInstance = "BundleInstance"

// BundleInstanceRequest generates a "aws/request.Request" representing the
// client's request for the BundleInstance operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See BundleInstance for more information on using the BundleInstance
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the BundleInstanceRequest method.
//    req, resp := client.BundleInstanceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/BundleInstance
func (c *EC2) BundleInstanceRequest(input *BundleInstanceInput) (req *request.Request, output *BundleInstanceOutput) {
	op := &request.Operation{
		Name:       opBundleInstance,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &BundleInstanceInput{}
	}

	output = &BundleInstanceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// BundleInstance API operation for Amazon Elastic Compute Cloud.
//
// Bundles an Amazon instance store-backed Windows instance.
//
// During bundling, only the root device volume (C:\) is bundled. Data on other
// instance store volumes is not preserved.
//
// This action is not applicable for Linux/Unix instances or Windows instances
// that are backed by Amazon EBS.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation BundleInstance for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/BundleInstance
func (c *EC2) BundleInstance(input *BundleInstanceInput) (*BundleInstanceOutput, error) {
	req, out := c.BundleInstanceRequest(input)
	return out, req.Send()
}

// BundleInstanceWithContext is the same as BundleInstance with the addition of
// the ability to pass a context and additional request options.
//
// See BundleInstance for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) BundleInstanceWithContext(ctx aws.Context, input *BundleInstanceInput, opts ...request.Option) (*BundleInstanceOutput, error) {
	req, out := c.BundleInstanceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelBundleTask = "CancelBundleTask"

// CancelBundleTaskRequest generates a "aws/request.Request" representing the
// client's request for the CancelBundleTask operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelBundleTask for more information on using the CancelBundleTask
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelBundleTaskRequest method.
//    req, resp := client.CancelBundleTaskRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelBundleTask
func (c *EC2) CancelBundleTaskRequest(input *CancelBundleTaskInput) (req *request.Request, output *CancelBundleTaskOutput) {
	op := &request.Operation{
		Name:       opCancelBundleTask,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelBundleTaskInput{}
	}

	output = &CancelBundleTaskOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CancelBundleTask API operation for Amazon Elastic Compute Cloud.
//
// Cancels a bundling operation for an instance store-backed Windows instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelBundleTask for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelBundleTask
func (c *EC2) CancelBundleTask(input *CancelBundleTaskInput) (*CancelBundleTaskOutput, error) {
	req, out := c.CancelBundleTaskRequest(input)
	return out, req.Send()
}

// CancelBundleTaskWithContext is the same as CancelBundleTask with the addition of
// the ability to pass a context and additional request options.
//
// See CancelBundleTask for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelBundleTaskWithContext(ctx aws.Context, input *CancelBundleTaskInput, opts ...request.Option) (*CancelBundleTaskOutput, error) {
	req, out := c.CancelBundleTaskRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelCapacityReservation = "CancelCapacityReservation"

// CancelCapacityReservationRequest generates a "aws/request.Request" representing the
// client's request for the CancelCapacityReservation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelCapacityReservation for more information on using the CancelCapacityReservation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelCapacityReservationRequest method.
//    req, resp := client.CancelCapacityReservationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelCapacityReservation
func (c *EC2) CancelCapacityReservationRequest(input *CancelCapacityReservationInput) (req *request.Request, output *CancelCapacityReservationOutput) {
	op := &request.Operation{
		Name:       opCancelCapacityReservation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelCapacityReservationInput{}
	}

	output = &CancelCapacityReservationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CancelCapacityReservation API operation for Amazon Elastic Compute Cloud.
//
// Cancels the specified Capacity Reservation, releases the reserved capacity,
// and changes the Capacity Reservation's state to cancelled.
//
// Instances running in the reserved capacity continue running until you stop
// them. Stopped instances that target the Capacity Reservation can no longer
// launch. Modify these instances to either target a different Capacity Reservation,
// launch On-Demand Instance capacity, or run in any open Capacity Reservation
// that has matching attributes and sufficient capacity.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelCapacityReservation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelCapacityReservation
func (c *EC2) CancelCapacityReservation(input *CancelCapacityReservationInput) (*CancelCapacityReservationOutput, error) {
	req, out := c.CancelCapacityReservationRequest(input)
	return out, req.Send()
}

// CancelCapacityReservationWithContext is the same as CancelCapacityReservation with the addition of
// the ability to pass a context and additional request options.
//
// See CancelCapacityReservation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelCapacityReservationWithContext(ctx aws.Context, input *CancelCapacityReservationInput, opts ...request.Option) (*CancelCapacityReservationOutput, error) {
	req, out := c.CancelCapacityReservationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelConversionTask = "CancelConversionTask"

// CancelConversionTaskRequest generates a "aws/request.Request" representing the
// client's request for the CancelConversionTask operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelConversionTask for more information on using the CancelConversionTask
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelConversionTaskRequest method.
//    req, resp := client.CancelConversionTaskRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelConversionTask
func (c *EC2) CancelConversionTaskRequest(input *CancelConversionTaskInput) (req *request.Request, output *CancelConversionTaskOutput) {
	op := &request.Operation{
		Name:       opCancelConversionTask,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelConversionTaskInput{}
	}

	output = &CancelConversionTaskOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// CancelConversionTask API operation for Amazon Elastic Compute Cloud.
//
// Cancels an active conversion task. The task can be the import of an instance
// or volume. The action removes all artifacts of the conversion, including
// a partially uploaded volume or instance. If the conversion is complete or
// is in the process of transferring the final disk image, the command fails
// and returns an exception.
//
// For more information, see Importing a Virtual Machine Using the Amazon EC2
// CLI (https://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-cli-vmimport-export.html).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelConversionTask for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelConversionTask
func (c *EC2) CancelConversionTask(input *CancelConversionTaskInput) (*CancelConversionTaskOutput, error) {
	req, out := c.CancelConversionTaskRequest(input)
	return out, req.Send()
}

// CancelConversionTaskWithContext is the same as CancelConversionTask with the addition of
// the ability to pass a context and additional request options.
//
// See CancelConversionTask for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelConversionTaskWithContext(ctx aws.Context, input *CancelConversionTaskInput, opts ...request.Option) (*CancelConversionTaskOutput, error) {
	req, out := c.CancelConversionTaskRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelExportTask = "CancelExportTask"

// CancelExportTaskRequest generates a "aws/request.Request" representing the
// client's request for the CancelExportTask operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelExportTask for more information on using the CancelExportTask
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelExportTaskRequest method.
//    req, resp := client.CancelExportTaskRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelExportTask
func (c *EC2) CancelExportTaskRequest(input *CancelExportTaskInput) (req *request.Request, output *CancelExportTaskOutput) {
	op := &request.Operation{
		Name:       opCancelExportTask,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelExportTaskInput{}
	}

	output = &CancelExportTaskOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// CancelExportTask API operation for Amazon Elastic Compute Cloud.
//
// Cancels an active export task. The request removes all artifacts of the export,
// including any partially-created Amazon S3 objects. If the export task is
// complete or is in the process of transferring the final disk image, the command
// fails and returns an error.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelExportTask for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelExportTask
func (c *EC2) CancelExportTask(input *CancelExportTaskInput) (*CancelExportTaskOutput, error) {
	req, out := c.CancelExportTaskRequest(input)
	return out, req.Send()
}

// CancelExportTaskWithContext is the same as CancelExportTask with the addition of
// the ability to pass a context and additional request options.
//
// See CancelExportTask for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelExportTaskWithContext(ctx aws.Context, input *CancelExportTaskInput, opts ...request.Option) (*CancelExportTaskOutput, error) {
	req, out := c.CancelExportTaskRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelImportTask = "CancelImportTask"

// CancelImportTaskRequest generates a "aws/request.Request" representing the
// client's request for the CancelImportTask operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelImportTask for more information on using the CancelImportTask
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelImportTaskRequest method.
//    req, resp := client.CancelImportTaskRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelImportTask
func (c *EC2) CancelImportTaskRequest(input *CancelImportTaskInput) (req *request.Request, output *CancelImportTaskOutput) {
	op := &request.Operation{
		Name:       opCancelImportTask,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelImportTaskInput{}
	}

	output = &CancelImportTaskOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CancelImportTask API operation for Amazon Elastic Compute Cloud.
//
// Cancels an in-process import virtual machine or import snapshot task.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelImportTask for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelImportTask
func (c *EC2) CancelImportTask(input *CancelImportTaskInput) (*CancelImportTaskOutput, error) {
	req, out := c.CancelImportTaskRequest(input)
	return out, req.Send()
}

// CancelImportTaskWithContext is the same as CancelImportTask with the addition of
// the ability to pass a context and additional request options.
//
// See CancelImportTask for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelImportTaskWithContext(ctx aws.Context, input *CancelImportTaskInput, opts ...request.Option) (*CancelImportTaskOutput, error) {
	req, out := c.CancelImportTaskRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelReservedInstancesListing = "CancelReservedInstancesListing"

// CancelReservedInstancesListingRequest generates a "aws/request.Request" representing the
// client's request for the CancelReservedInstancesListing operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelReservedInstancesListing for more information on using the CancelReservedInstancesListing
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelReservedInstancesListingRequest method.
//    req, resp := client.CancelReservedInstancesListingRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelReservedInstancesListing
func (c *EC2) CancelReservedInstancesListingRequest(input *CancelReservedInstancesListingInput) (req *request.Request, output *CancelReservedInstancesListingOutput) {
	op := &request.Operation{
		Name:       opCancelReservedInstancesListing,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelReservedInstancesListingInput{}
	}

	output = &CancelReservedInstancesListingOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CancelReservedInstancesListing API operation for Amazon Elastic Compute Cloud.
//
// Cancels the specified Reserved Instance listing in the Reserved Instance
// Marketplace.
//
// For more information, see Reserved Instance Marketplace (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelReservedInstancesListing for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelReservedInstancesListing
func (c *EC2) CancelReservedInstancesListing(input *CancelReservedInstancesListingInput) (*CancelReservedInstancesListingOutput, error) {
	req, out := c.CancelReservedInstancesListingRequest(input)
	return out, req.Send()
}

// CancelReservedInstancesListingWithContext is the same as CancelReservedInstancesListing with the addition of
// the ability to pass a context and additional request options.
//
// See CancelReservedInstancesListing for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelReservedInstancesListingWithContext(ctx aws.Context, input *CancelReservedInstancesListingInput, opts ...request.Option) (*CancelReservedInstancesListingOutput, error) {
	req, out := c.CancelReservedInstancesListingRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelSpotFleetRequests = "CancelSpotFleetRequests"

// CancelSpotFleetRequestsRequest generates a "aws/request.Request" representing the
// client's request for the CancelSpotFleetRequests operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelSpotFleetRequests for more information on using the CancelSpotFleetRequests
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelSpotFleetRequestsRequest method.
//    req, resp := client.CancelSpotFleetRequestsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelSpotFleetRequests
func (c *EC2) CancelSpotFleetRequestsRequest(input *CancelSpotFleetRequestsInput) (req *request.Request, output *CancelSpotFleetRequestsOutput) {
	op := &request.Operation{
		Name:       opCancelSpotFleetRequests,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelSpotFleetRequestsInput{}
	}

	output = &CancelSpotFleetRequestsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CancelSpotFleetRequests API operation for Amazon Elastic Compute Cloud.
//
// Cancels the specified Spot Fleet requests.
//
// After you cancel a Spot Fleet request, the Spot Fleet launches no new Spot
// Instances. You must specify whether the Spot Fleet should also terminate
// its Spot Instances. If you terminate the instances, the Spot Fleet request
// enters the cancelled_terminating state. Otherwise, the Spot Fleet request
// enters the cancelled_running state and the instances continue to run until
// they are interrupted or you terminate them manually.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelSpotFleetRequests for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelSpotFleetRequests
func (c *EC2) CancelSpotFleetRequests(input *CancelSpotFleetRequestsInput) (*CancelSpotFleetRequestsOutput, error) {
	req, out := c.CancelSpotFleetRequestsRequest(input)
	return out, req.Send()
}

// CancelSpotFleetRequestsWithContext is the same as CancelSpotFleetRequests with the addition of
// the ability to pass a context and additional request options.
//
// See CancelSpotFleetRequests for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelSpotFleetRequestsWithContext(ctx aws.Context, input *CancelSpotFleetRequestsInput, opts ...request.Option) (*CancelSpotFleetRequestsOutput, error) {
	req, out := c.CancelSpotFleetRequestsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCancelSpotInstanceRequests = "CancelSpotInstanceRequests"

// CancelSpotInstanceRequestsRequest generates a "aws/request.Request" representing the
// client's request for the CancelSpotInstanceRequests operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CancelSpotInstanceRequests for more information on using the CancelSpotInstanceRequests
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CancelSpotInstanceRequestsRequest method.
//    req, resp := client.CancelSpotInstanceRequestsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelSpotInstanceRequests
func (c *EC2) CancelSpotInstanceRequestsRequest(input *CancelSpotInstanceRequestsInput) (req *request.Request, output *CancelSpotInstanceRequestsOutput) {
	op := &request.Operation{
		Name:       opCancelSpotInstanceRequests,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CancelSpotInstanceRequestsInput{}
	}

	output = &CancelSpotInstanceRequestsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CancelSpotInstanceRequests API operation for Amazon Elastic Compute Cloud.
//
// Cancels one or more Spot Instance requests.
//
// Canceling a Spot Instance request does not terminate running Spot Instances
// associated with the request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CancelSpotInstanceRequests for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CancelSpotInstanceRequests
func (c *EC2) CancelSpotInstanceRequests(input *CancelSpotInstanceRequestsInput) (*CancelSpotInstanceRequestsOutput, error) {
	req, out := c.CancelSpotInstanceRequestsRequest(input)
	return out, req.Send()
}

// CancelSpotInstanceRequestsWithContext is the same as CancelSpotInstanceRequests with the addition of
// the ability to pass a context and additional request options.
//
// See CancelSpotInstanceRequests for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CancelSpotInstanceRequestsWithContext(ctx aws.Context, input *CancelSpotInstanceRequestsInput, opts ...request.Option) (*CancelSpotInstanceRequestsOutput, error) {
	req, out := c.CancelSpotInstanceRequestsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opConfirmProductInstance = "ConfirmProductInstance"

// ConfirmProductInstanceRequest generates a "aws/request.Request" representing the
// client's request for the ConfirmProductInstance operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ConfirmProductInstance for more information on using the ConfirmProductInstance
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ConfirmProductInstanceRequest method.
//    req, resp := client.ConfirmProductInstanceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ConfirmProductInstance
func (c *EC2) ConfirmProductInstanceRequest(input *ConfirmProductInstanceInput) (req *request.Request, output *ConfirmProductInstanceOutput) {
	op := &request.Operation{
		Name:       opConfirmProductInstance,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ConfirmProductInstanceInput{}
	}

	output = &ConfirmProductInstanceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ConfirmProductInstance API operation for Amazon Elastic Compute Cloud.
//
// Determines whether a product code is associated with an instance. This action
// can only be used by the owner of the product code. It is useful when a product
// code owner must verify whether another user's instance is eligible for support.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ConfirmProductInstance for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ConfirmProductInstance
func (c *EC2) ConfirmProductInstance(input *ConfirmProductInstanceInput) (*ConfirmProductInstanceOutput, error) {
	req, out := c.ConfirmProductInstanceRequest(input)
	return out, req.Send()
}

// ConfirmProductInstanceWithContext is the same as ConfirmProductInstance with the addition of
// the ability to pass a context and additional request options.
//
// See ConfirmProductInstance for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ConfirmProductInstanceWithContext(ctx aws.Context, input *ConfirmProductInstanceInput, opts ...request.Option) (*ConfirmProductInstanceOutput, error) {
	req, out := c.ConfirmProductInstanceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCopyFpgaImage = "CopyFpgaImage"

// CopyFpgaImageRequest generates a "aws/request.Request" representing the
// client's request for the CopyFpgaImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CopyFpgaImage for more information on using the CopyFpgaImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CopyFpgaImageRequest method.
//    req, resp := client.CopyFpgaImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CopyFpgaImage
func (c *EC2) CopyFpgaImageRequest(input *CopyFpgaImageInput) (req *request.Request, output *CopyFpgaImageOutput) {
	op := &request.Operation{
		Name:       opCopyFpgaImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CopyFpgaImageInput{}
	}

	output = &CopyFpgaImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CopyFpgaImage API operation for Amazon Elastic Compute Cloud.
//
// Copies the specified Amazon FPGA Image (AFI) to the current region.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CopyFpgaImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CopyFpgaImage
func (c *EC2) CopyFpgaImage(input *CopyFpgaImageInput) (*CopyFpgaImageOutput, error) {
	req, out := c.CopyFpgaImageRequest(input)
	return out, req.Send()
}

// CopyFpgaImageWithContext is the same as CopyFpgaImage with the addition of
// the ability to pass a context and additional request options.
//
// See CopyFpgaImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CopyFpgaImageWithContext(ctx aws.Context, input *CopyFpgaImageInput, opts ...request.Option) (*CopyFpgaImageOutput, error) {
	req, out := c.CopyFpgaImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCopyImage = "CopyImage"

// CopyImageRequest generates a "aws/request.Request" representing the
// client's request for the CopyImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CopyImage for more information on using the CopyImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CopyImageRequest method.
//    req, resp := client.CopyImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CopyImage
func (c *EC2) CopyImageRequest(input *CopyImageInput) (req *request.Request, output *CopyImageOutput) {
	op := &request.Operation{
		Name:       opCopyImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CopyImageInput{}
	}

	output = &CopyImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CopyImage API operation for Amazon Elastic Compute Cloud.
//
// Initiates the copy of an AMI from the specified source region to the current
// region. You specify the destination region by using its endpoint when making
// the request.
//
// Copies of encrypted backing snapshots for the AMI are encrypted. Copies of
// unencrypted backing snapshots remain unencrypted, unless you set Encrypted
// during the copy operation. You cannot create an unencrypted copy of an encrypted
// backing snapshot.
//
// For more information about the prerequisites and limits when copying an AMI,
// see Copying an AMI (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/CopyingAMIs.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CopyImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CopyImage
func (c *EC2) CopyImage(input *CopyImageInput) (*CopyImageOutput, error) {
	req, out := c.CopyImageRequest(input)
	return out, req.Send()
}

// CopyImageWithContext is the same as CopyImage with the addition of
// the ability to pass a context and additional request options.
//
// See CopyImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CopyImageWithContext(ctx aws.Context, input *CopyImageInput, opts ...request.Option) (*CopyImageOutput, error) {
	req, out := c.CopyImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCopySnapshot = "CopySnapshot"

// CopySnapshotRequest generates a "aws/request.Request" representing the
// client's request for the CopySnapshot operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CopySnapshot for more information on using the CopySnapshot
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CopySnapshotRequest method.
//    req, resp := client.CopySnapshotRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CopySnapshot
func (c *EC2) CopySnapshotRequest(input *CopySnapshotInput) (req *request.Request, output *CopySnapshotOutput) {
	op := &request.Operation{
		Name:       opCopySnapshot,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CopySnapshotInput{}
	}

	output = &CopySnapshotOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CopySnapshot API operation for Amazon Elastic Compute Cloud.
//
// Copies a point-in-time snapshot of an EBS volume and stores it in Amazon
// S3. You can copy the snapshot within the same region or from one region to
// another. You can use the snapshot to create EBS volumes or Amazon Machine
// Images (AMIs). The snapshot is copied to the regional endpoint that you send
// the HTTP request to.
//
// Copies of encrypted EBS snapshots remain encrypted. Copies of unencrypted
// snapshots remain unencrypted, unless the Encrypted flag is specified during
// the snapshot copy operation. By default, encrypted snapshot copies use the
// default AWS Key Management Service (AWS KMS) customer master key (CMK); however,
// you can specify a non-default CMK with the KmsKeyId parameter.
//
// To copy an encrypted snapshot that has been shared from another account,
// you must have permissions for the CMK used to encrypt the snapshot.
//
// Snapshots created by copying another snapshot have an arbitrary volume ID
// that should not be used for any purpose.
//
// For more information, see Copying an Amazon EBS Snapshot (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-copy-snapshot.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CopySnapshot for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CopySnapshot
func (c *EC2) CopySnapshot(input *CopySnapshotInput) (*CopySnapshotOutput, error) {
	req, out := c.CopySnapshotRequest(input)
	return out, req.Send()
}

// CopySnapshotWithContext is the same as CopySnapshot with the addition of
// the ability to pass a context and additional request options.
//
// See CopySnapshot for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CopySnapshotWithContext(ctx aws.Context, input *CopySnapshotInput, opts ...request.Option) (*CopySnapshotOutput, error) {
	req, out := c.CopySnapshotRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateCapacityReservation = "CreateCapacityReservation"

// CreateCapacityReservationRequest generates a "aws/request.Request" representing the
// client's request for the CreateCapacityReservation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateCapacityReservation for more information on using the CreateCapacityReservation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateCapacityReservationRequest method.
//    req, resp := client.CreateCapacityReservationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateCapacityReservation
func (c *EC2) CreateCapacityReservationRequest(input *CreateCapacityReservationInput) (req *request.Request, output *CreateCapacityReservationOutput) {
	op := &request.Operation{
		Name:       opCreateCapacityReservation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateCapacityReservationInput{}
	}

	output = &CreateCapacityReservationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateCapacityReservation API operation for Amazon Elastic Compute Cloud.
//
// Creates a new Capacity Reservation with the specified attributes.
//
// Capacity Reservations enable you to reserve capacity for your Amazon EC2
// instances in a specific Availability Zone for any duration. This gives you
// the flexibility to selectively add capacity reservations and still get the
// Regional RI discounts for that usage. By creating Capacity Reservations,
// you ensure that you always have access to Amazon EC2 capacity when you need
// it, for as long as you need it. For more information, see Capacity Reservations
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Your request to create a Capacity Reservation could fail if Amazon EC2 does
// not have sufficient capacity to fulfill the request. If your request fails
// due to Amazon EC2 capacity constraints, either try again at a later time,
// try in a different Availability Zone, or request a smaller capacity reservation.
// If your application is flexible across instance types and sizes, try to create
// a Capacity Reservation with different instance attributes.
//
// Your request could also fail if the requested quantity exceeds your On-Demand
// Instance limit for the selected instance type. If your request fails due
// to limit constraints, increase your On-Demand Instance limit for the required
// instance type and try again. For more information about increasing your instance
// limits, see Amazon EC2 Service Limits (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateCapacityReservation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateCapacityReservation
func (c *EC2) CreateCapacityReservation(input *CreateCapacityReservationInput) (*CreateCapacityReservationOutput, error) {
	req, out := c.CreateCapacityReservationRequest(input)
	return out, req.Send()
}

// CreateCapacityReservationWithContext is the same as CreateCapacityReservation with the addition of
// the ability to pass a context and additional request options.
//
// See CreateCapacityReservation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateCapacityReservationWithContext(ctx aws.Context, input *CreateCapacityReservationInput, opts ...request.Option) (*CreateCapacityReservationOutput, error) {
	req, out := c.CreateCapacityReservationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateClientVpnEndpoint = "CreateClientVpnEndpoint"

// CreateClientVpnEndpointRequest generates a "aws/request.Request" representing the
// client's request for the CreateClientVpnEndpoint operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateClientVpnEndpoint for more information on using the CreateClientVpnEndpoint
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateClientVpnEndpointRequest method.
//    req, resp := client.CreateClientVpnEndpointRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateClientVpnEndpoint
func (c *EC2) CreateClientVpnEndpointRequest(input *CreateClientVpnEndpointInput) (req *request.Request, output *CreateClientVpnEndpointOutput) {
	op := &request.Operation{
		Name:       opCreateClientVpnEndpoint,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateClientVpnEndpointInput{}
	}

	output = &CreateClientVpnEndpointOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateClientVpnEndpoint API operation for Amazon Elastic Compute Cloud.
//
// Creates a Client VPN endpoint. A Client VPN endpoint is the resource you
// create and configure to enable and manage client VPN sessions. It is the
// destination endpoint at which all client VPN sessions are terminated.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateClientVpnEndpoint for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateClientVpnEndpoint
func (c *EC2) CreateClientVpnEndpoint(input *CreateClientVpnEndpointInput) (*CreateClientVpnEndpointOutput, error) {
	req, out := c.CreateClientVpnEndpointRequest(input)
	return out, req.Send()
}

// CreateClientVpnEndpointWithContext is the same as CreateClientVpnEndpoint with the addition of
// the ability to pass a context and additional request options.
//
// See CreateClientVpnEndpoint for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateClientVpnEndpointWithContext(ctx aws.Context, input *CreateClientVpnEndpointInput, opts ...request.Option) (*CreateClientVpnEndpointOutput, error) {
	req, out := c.CreateClientVpnEndpointRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateClientVpnRoute = "CreateClientVpnRoute"

// CreateClientVpnRouteRequest generates a "aws/request.Request" representing the
// client's request for the CreateClientVpnRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateClientVpnRoute for more information on using the CreateClientVpnRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateClientVpnRouteRequest method.
//    req, resp := client.CreateClientVpnRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateClientVpnRoute
func (c *EC2) CreateClientVpnRouteRequest(input *CreateClientVpnRouteInput) (req *request.Request, output *CreateClientVpnRouteOutput) {
	op := &request.Operation{
		Name:       opCreateClientVpnRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateClientVpnRouteInput{}
	}

	output = &CreateClientVpnRouteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateClientVpnRoute API operation for Amazon Elastic Compute Cloud.
//
// Adds a route to a network to a Client VPN endpoint. Each Client VPN endpoint
// has a route table that describes the available destination network routes.
// Each route in the route table specifies the path for traﬃc to speciﬁc resources
// or networks.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateClientVpnRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateClientVpnRoute
func (c *EC2) CreateClientVpnRoute(input *CreateClientVpnRouteInput) (*CreateClientVpnRouteOutput, error) {
	req, out := c.CreateClientVpnRouteRequest(input)
	return out, req.Send()
}

// CreateClientVpnRouteWithContext is the same as CreateClientVpnRoute with the addition of
// the ability to pass a context and additional request options.
//
// See CreateClientVpnRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateClientVpnRouteWithContext(ctx aws.Context, input *CreateClientVpnRouteInput, opts ...request.Option) (*CreateClientVpnRouteOutput, error) {
	req, out := c.CreateClientVpnRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateCustomerGateway = "CreateCustomerGateway"

// CreateCustomerGatewayRequest generates a "aws/request.Request" representing the
// client's request for the CreateCustomerGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateCustomerGateway for more information on using the CreateCustomerGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateCustomerGatewayRequest method.
//    req, resp := client.CreateCustomerGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateCustomerGateway
func (c *EC2) CreateCustomerGatewayRequest(input *CreateCustomerGatewayInput) (req *request.Request, output *CreateCustomerGatewayOutput) {
	op := &request.Operation{
		Name:       opCreateCustomerGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateCustomerGatewayInput{}
	}

	output = &CreateCustomerGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateCustomerGateway API operation for Amazon Elastic Compute Cloud.
//
// Provides information to AWS about your VPN customer gateway device. The customer
// gateway is the appliance at your end of the VPN connection. (The device on
// the AWS side of the VPN connection is the virtual private gateway.) You must
// provide the Internet-routable IP address of the customer gateway's external
// interface. The IP address must be static and may be behind a device performing
// network address translation (NAT).
//
// For devices that use Border Gateway Protocol (BGP), you can also provide
// the device's BGP Autonomous System Number (ASN). You can use an existing
// ASN assigned to your network. If you don't have an ASN already, you can use
// a private ASN (in the 64512 - 65534 range).
//
// Amazon EC2 supports all 2-byte ASN numbers in the range of 1 - 65534, with
// the exception of 7224, which is reserved in the us-east-1 region, and 9059,
// which is reserved in the eu-west-1 region.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// You cannot create more than one customer gateway with the same VPN type,
// IP address, and BGP ASN parameter values. If you run an identical request
// more than one time, the first request creates the customer gateway, and subsequent
// requests return information about the existing customer gateway. The subsequent
// requests do not create new customer gateway resources.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateCustomerGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateCustomerGateway
func (c *EC2) CreateCustomerGateway(input *CreateCustomerGatewayInput) (*CreateCustomerGatewayOutput, error) {
	req, out := c.CreateCustomerGatewayRequest(input)
	return out, req.Send()
}

// CreateCustomerGatewayWithContext is the same as CreateCustomerGateway with the addition of
// the ability to pass a context and additional request options.
//
// See CreateCustomerGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateCustomerGatewayWithContext(ctx aws.Context, input *CreateCustomerGatewayInput, opts ...request.Option) (*CreateCustomerGatewayOutput, error) {
	req, out := c.CreateCustomerGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateDefaultSubnet = "CreateDefaultSubnet"

// CreateDefaultSubnetRequest generates a "aws/request.Request" representing the
// client's request for the CreateDefaultSubnet operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateDefaultSubnet for more information on using the CreateDefaultSubnet
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateDefaultSubnetRequest method.
//    req, resp := client.CreateDefaultSubnetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateDefaultSubnet
func (c *EC2) CreateDefaultSubnetRequest(input *CreateDefaultSubnetInput) (req *request.Request, output *CreateDefaultSubnetOutput) {
	op := &request.Operation{
		Name:       opCreateDefaultSubnet,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateDefaultSubnetInput{}
	}

	output = &CreateDefaultSubnetOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateDefaultSubnet API operation for Amazon Elastic Compute Cloud.
//
// Creates a default subnet with a size /20 IPv4 CIDR block in the specified
// Availability Zone in your default VPC. You can have only one default subnet
// per Availability Zone. For more information, see Creating a Default Subnet
// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/default-vpc.html#create-default-subnet)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateDefaultSubnet for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateDefaultSubnet
func (c *EC2) CreateDefaultSubnet(input *CreateDefaultSubnetInput) (*CreateDefaultSubnetOutput, error) {
	req, out := c.CreateDefaultSubnetRequest(input)
	return out, req.Send()
}

// CreateDefaultSubnetWithContext is the same as CreateDefaultSubnet with the addition of
// the ability to pass a context and additional request options.
//
// See CreateDefaultSubnet for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateDefaultSubnetWithContext(ctx aws.Context, input *CreateDefaultSubnetInput, opts ...request.Option) (*CreateDefaultSubnetOutput, error) {
	req, out := c.CreateDefaultSubnetRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateDefaultVpc = "CreateDefaultVpc"

// CreateDefaultVpcRequest generates a "aws/request.Request" representing the
// client's request for the CreateDefaultVpc operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateDefaultVpc for more information on using the CreateDefaultVpc
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateDefaultVpcRequest method.
//    req, resp := client.CreateDefaultVpcRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateDefaultVpc
func (c *EC2) CreateDefaultVpcRequest(input *CreateDefaultVpcInput) (req *request.Request, output *CreateDefaultVpcOutput) {
	op := &request.Operation{
		Name:       opCreateDefaultVpc,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateDefaultVpcInput{}
	}

	output = &CreateDefaultVpcOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateDefaultVpc API operation for Amazon Elastic Compute Cloud.
//
// Creates a default VPC with a size /16 IPv4 CIDR block and a default subnet
// in each Availability Zone. For more information about the components of a
// default VPC, see Default VPC and Default Subnets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/default-vpc.html)
// in the Amazon Virtual Private Cloud User Guide. You cannot specify the components
// of the default VPC yourself.
//
// If you deleted your previous default VPC, you can create a default VPC. You
// cannot have more than one default VPC per Region.
//
// If your account supports EC2-Classic, you cannot use this action to create
// a default VPC in a Region that supports EC2-Classic. If you want a default
// VPC in a Region that supports EC2-Classic, see "I really want a default VPC
// for my existing EC2 account. Is that possible?" in the Default VPCs FAQ (http://aws.amazon.com/vpc/faqs/#Default_VPCs).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateDefaultVpc for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateDefaultVpc
func (c *EC2) CreateDefaultVpc(input *CreateDefaultVpcInput) (*CreateDefaultVpcOutput, error) {
	req, out := c.CreateDefaultVpcRequest(input)
	return out, req.Send()
}

// CreateDefaultVpcWithContext is the same as CreateDefaultVpc with the addition of
// the ability to pass a context and additional request options.
//
// See CreateDefaultVpc for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateDefaultVpcWithContext(ctx aws.Context, input *CreateDefaultVpcInput, opts ...request.Option) (*CreateDefaultVpcOutput, error) {
	req, out := c.CreateDefaultVpcRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateDhcpOptions = "CreateDhcpOptions"

// CreateDhcpOptionsRequest generates a "aws/request.Request" representing the
// client's request for the CreateDhcpOptions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateDhcpOptions for more information on using the CreateDhcpOptions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateDhcpOptionsRequest method.
//    req, resp := client.CreateDhcpOptionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateDhcpOptions
func (c *EC2) CreateDhcpOptionsRequest(input *CreateDhcpOptionsInput) (req *request.Request, output *CreateDhcpOptionsOutput) {
	op := &request.Operation{
		Name:       opCreateDhcpOptions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateDhcpOptionsInput{}
	}

	output = &CreateDhcpOptionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateDhcpOptions API operation for Amazon Elastic Compute Cloud.
//
// Creates a set of DHCP options for your VPC. After creating the set, you must
// associate it with the VPC, causing all existing and new instances that you
// launch in the VPC to use this set of DHCP options. The following are the
// individual DHCP options you can specify. For more information about the options,
// see RFC 2132 (http://www.ietf.org/rfc/rfc2132.txt).
//
//    * domain-name-servers - The IP addresses of up to four domain name servers,
//    or AmazonProvidedDNS. The default DHCP option set specifies AmazonProvidedDNS.
//    If specifying more than one domain name server, specify the IP addresses
//    in a single parameter, separated by commas. ITo have your instance to
//    receive a custom DNS hostname as specified in domain-name, you must set
//    domain-name-servers to a custom DNS server.
//
//    * domain-name - If you're using AmazonProvidedDNS in us-east-1, specify
//    ec2.internal. If you're using AmazonProvidedDNS in another region, specify
//    region.compute.internal (for example, ap-northeast-1.compute.internal).
//    Otherwise, specify a domain name (for example, MyCompany.com). This value
//    is used to complete unqualified DNS hostnames. Important: Some Linux operating
//    systems accept multiple domain names separated by spaces. However, Windows
//    and other Linux operating systems treat the value as a single domain,
//    which results in unexpected behavior. If your DHCP options set is associated
//    with a VPC that has instances with multiple operating systems, specify
//    only one domain name.
//
//    * ntp-servers - The IP addresses of up to four Network Time Protocol (NTP)
//    servers.
//
//    * netbios-name-servers - The IP addresses of up to four NetBIOS name servers.
//
//    * netbios-node-type - The NetBIOS node type (1, 2, 4, or 8). We recommend
//    that you specify 2 (broadcast and multicast are not currently supported).
//    For more information about these node types, see RFC 2132 (http://www.ietf.org/rfc/rfc2132.txt).
//
// Your VPC automatically starts out with a set of DHCP options that includes
// only a DNS server that we provide (AmazonProvidedDNS). If you create a set
// of options, and if your VPC has an internet gateway, make sure to set the
// domain-name-servers option either to AmazonProvidedDNS or to a domain name
// server of your choice. For more information, see DHCP Options Sets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_DHCP_Options.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateDhcpOptions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateDhcpOptions
func (c *EC2) CreateDhcpOptions(input *CreateDhcpOptionsInput) (*CreateDhcpOptionsOutput, error) {
	req, out := c.CreateDhcpOptionsRequest(input)
	return out, req.Send()
}

// CreateDhcpOptionsWithContext is the same as CreateDhcpOptions with the addition of
// the ability to pass a context and additional request options.
//
// See CreateDhcpOptions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateDhcpOptionsWithContext(ctx aws.Context, input *CreateDhcpOptionsInput, opts ...request.Option) (*CreateDhcpOptionsOutput, error) {
	req, out := c.CreateDhcpOptionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateEgressOnlyInternetGateway = "CreateEgressOnlyInternetGateway"

// CreateEgressOnlyInternetGatewayRequest generates a "aws/request.Request" representing the
// client's request for the CreateEgressOnlyInternetGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateEgressOnlyInternetGateway for more information on using the CreateEgressOnlyInternetGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateEgressOnlyInternetGatewayRequest method.
//    req, resp := client.CreateEgressOnlyInternetGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateEgressOnlyInternetGateway
func (c *EC2) CreateEgressOnlyInternetGatewayRequest(input *CreateEgressOnlyInternetGatewayInput) (req *request.Request, output *CreateEgressOnlyInternetGatewayOutput) {
	op := &request.Operation{
		Name:       opCreateEgressOnlyInternetGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateEgressOnlyInternetGatewayInput{}
	}

	output = &CreateEgressOnlyInternetGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateEgressOnlyInternetGateway API operation for Amazon Elastic Compute Cloud.
//
// [IPv6 only] Creates an egress-only internet gateway for your VPC. An egress-only
// internet gateway is used to enable outbound communication over IPv6 from
// instances in your VPC to the internet, and prevents hosts outside of your
// VPC from initiating an IPv6 connection with your instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateEgressOnlyInternetGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateEgressOnlyInternetGateway
func (c *EC2) CreateEgressOnlyInternetGateway(input *CreateEgressOnlyInternetGatewayInput) (*CreateEgressOnlyInternetGatewayOutput, error) {
	req, out := c.CreateEgressOnlyInternetGatewayRequest(input)
	return out, req.Send()
}

// CreateEgressOnlyInternetGatewayWithContext is the same as CreateEgressOnlyInternetGateway with the addition of
// the ability to pass a context and additional request options.
//
// See CreateEgressOnlyInternetGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateEgressOnlyInternetGatewayWithContext(ctx aws.Context, input *CreateEgressOnlyInternetGatewayInput, opts ...request.Option) (*CreateEgressOnlyInternetGatewayOutput, error) {
	req, out := c.CreateEgressOnlyInternetGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateFleet = "CreateFleet"

// CreateFleetRequest generates a "aws/request.Request" representing the
// client's request for the CreateFleet operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateFleet for more information on using the CreateFleet
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateFleetRequest method.
//    req, resp := client.CreateFleetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateFleet
func (c *EC2) CreateFleetRequest(input *CreateFleetInput) (req *request.Request, output *CreateFleetOutput) {
	op := &request.Operation{
		Name:       opCreateFleet,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateFleetInput{}
	}

	output = &CreateFleetOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateFleet API operation for Amazon Elastic Compute Cloud.
//
// Launches an EC2 Fleet.
//
// You can create a single EC2 Fleet that includes multiple launch specifications
// that vary by instance type, AMI, Availability Zone, or subnet.
//
// For more information, see Launching an EC2 Fleet (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateFleet for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateFleet
func (c *EC2) CreateFleet(input *CreateFleetInput) (*CreateFleetOutput, error) {
	req, out := c.CreateFleetRequest(input)
	return out, req.Send()
}

// CreateFleetWithContext is the same as CreateFleet with the addition of
// the ability to pass a context and additional request options.
//
// See CreateFleet for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateFleetWithContext(ctx aws.Context, input *CreateFleetInput, opts ...request.Option) (*CreateFleetOutput, error) {
	req, out := c.CreateFleetRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateFlowLogs = "CreateFlowLogs"

// CreateFlowLogsRequest generates a "aws/request.Request" representing the
// client's request for the CreateFlowLogs operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateFlowLogs for more information on using the CreateFlowLogs
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateFlowLogsRequest method.
//    req, resp := client.CreateFlowLogsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateFlowLogs
func (c *EC2) CreateFlowLogsRequest(input *CreateFlowLogsInput) (req *request.Request, output *CreateFlowLogsOutput) {
	op := &request.Operation{
		Name:       opCreateFlowLogs,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateFlowLogsInput{}
	}

	output = &CreateFlowLogsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateFlowLogs API operation for Amazon Elastic Compute Cloud.
//
// Creates one or more flow logs to capture information about IP traffic for
// a specific network interface, subnet, or VPC.
//
// Flow log data for a monitored network interface is recorded as flow log records,
// which are log events consisting of fields that describe the traffic flow.
// For more information, see Flow Log Records (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html#flow-log-records)
// in the Amazon Virtual Private Cloud User Guide.
//
// When publishing to CloudWatch Logs, flow log records are published to a log
// group, and each network interface has a unique log stream in the log group.
// When publishing to Amazon S3, flow log records for all of the monitored network
// interfaces are published to a single log file object that is stored in the
// specified bucket.
//
// For more information, see VPC Flow Logs (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateFlowLogs for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateFlowLogs
func (c *EC2) CreateFlowLogs(input *CreateFlowLogsInput) (*CreateFlowLogsOutput, error) {
	req, out := c.CreateFlowLogsRequest(input)
	return out, req.Send()
}

// CreateFlowLogsWithContext is the same as CreateFlowLogs with the addition of
// the ability to pass a context and additional request options.
//
// See CreateFlowLogs for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateFlowLogsWithContext(ctx aws.Context, input *CreateFlowLogsInput, opts ...request.Option) (*CreateFlowLogsOutput, error) {
	req, out := c.CreateFlowLogsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateFpgaImage = "CreateFpgaImage"

// CreateFpgaImageRequest generates a "aws/request.Request" representing the
// client's request for the CreateFpgaImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateFpgaImage for more information on using the CreateFpgaImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateFpgaImageRequest method.
//    req, resp := client.CreateFpgaImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateFpgaImage
func (c *EC2) CreateFpgaImageRequest(input *CreateFpgaImageInput) (req *request.Request, output *CreateFpgaImageOutput) {
	op := &request.Operation{
		Name:       opCreateFpgaImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateFpgaImageInput{}
	}

	output = &CreateFpgaImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateFpgaImage API operation for Amazon Elastic Compute Cloud.
//
// Creates an Amazon FPGA Image (AFI) from the specified design checkpoint (DCP).
//
// The create operation is asynchronous. To verify that the AFI is ready for
// use, check the output logs.
//
// An AFI contains the FPGA bitstream that is ready to download to an FPGA.
// You can securely deploy an AFI on one or more FPGA-accelerated instances.
// For more information, see the AWS FPGA Hardware Development Kit (https://github.com/aws/aws-fpga/).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateFpgaImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateFpgaImage
func (c *EC2) CreateFpgaImage(input *CreateFpgaImageInput) (*CreateFpgaImageOutput, error) {
	req, out := c.CreateFpgaImageRequest(input)
	return out, req.Send()
}

// CreateFpgaImageWithContext is the same as CreateFpgaImage with the addition of
// the ability to pass a context and additional request options.
//
// See CreateFpgaImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateFpgaImageWithContext(ctx aws.Context, input *CreateFpgaImageInput, opts ...request.Option) (*CreateFpgaImageOutput, error) {
	req, out := c.CreateFpgaImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateImage = "CreateImage"

// CreateImageRequest generates a "aws/request.Request" representing the
// client's request for the CreateImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateImage for more information on using the CreateImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateImageRequest method.
//    req, resp := client.CreateImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateImage
func (c *EC2) CreateImageRequest(input *CreateImageInput) (req *request.Request, output *CreateImageOutput) {
	op := &request.Operation{
		Name:       opCreateImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateImageInput{}
	}

	output = &CreateImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateImage API operation for Amazon Elastic Compute Cloud.
//
// Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance that
// is either running or stopped.
//
// If you customized your instance with instance store volumes or EBS volumes
// in addition to the root device volume, the new AMI contains block device
// mapping information for those volumes. When you launch an instance from this
// new AMI, the instance automatically launches with those additional volumes.
//
// For more information, see Creating Amazon EBS-Backed Linux AMIs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateImage
func (c *EC2) CreateImage(input *CreateImageInput) (*CreateImageOutput, error) {
	req, out := c.CreateImageRequest(input)
	return out, req.Send()
}

// CreateImageWithContext is the same as CreateImage with the addition of
// the ability to pass a context and additional request options.
//
// See CreateImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateImageWithContext(ctx aws.Context, input *CreateImageInput, opts ...request.Option) (*CreateImageOutput, error) {
	req, out := c.CreateImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateInstanceExportTask = "CreateInstanceExportTask"

// CreateInstanceExportTaskRequest generates a "aws/request.Request" representing the
// client's request for the CreateInstanceExportTask operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateInstanceExportTask for more information on using the CreateInstanceExportTask
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateInstanceExportTaskRequest method.
//    req, resp := client.CreateInstanceExportTaskRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateInstanceExportTask
func (c *EC2) CreateInstanceExportTaskRequest(input *CreateInstanceExportTaskInput) (req *request.Request, output *CreateInstanceExportTaskOutput) {
	op := &request.Operation{
		Name:       opCreateInstanceExportTask,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateInstanceExportTaskInput{}
	}

	output = &CreateInstanceExportTaskOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateInstanceExportTask API operation for Amazon Elastic Compute Cloud.
//
// Exports a running or stopped instance to an S3 bucket.
//
// For information about the supported operating systems, image formats, and
// known limitations for the types of instances you can export, see Exporting
// an Instance as a VM Using VM Import/Export (https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html)
// in the VM Import/Export User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateInstanceExportTask for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateInstanceExportTask
func (c *EC2) CreateInstanceExportTask(input *CreateInstanceExportTaskInput) (*CreateInstanceExportTaskOutput, error) {
	req, out := c.CreateInstanceExportTaskRequest(input)
	return out, req.Send()
}

// CreateInstanceExportTaskWithContext is the same as CreateInstanceExportTask with the addition of
// the ability to pass a context and additional request options.
//
// See CreateInstanceExportTask for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateInstanceExportTaskWithContext(ctx aws.Context, input *CreateInstanceExportTaskInput, opts ...request.Option) (*CreateInstanceExportTaskOutput, error) {
	req, out := c.CreateInstanceExportTaskRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateInternetGateway = "CreateInternetGateway"

// CreateInternetGatewayRequest generates a "aws/request.Request" representing the
// client's request for the CreateInternetGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateInternetGateway for more information on using the CreateInternetGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateInternetGatewayRequest method.
//    req, resp := client.CreateInternetGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateInternetGateway
func (c *EC2) CreateInternetGatewayRequest(input *CreateInternetGatewayInput) (req *request.Request, output *CreateInternetGatewayOutput) {
	op := &request.Operation{
		Name:       opCreateInternetGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateInternetGatewayInput{}
	}

	output = &CreateInternetGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateInternetGateway API operation for Amazon Elastic Compute Cloud.
//
// Creates an internet gateway for use with a VPC. After creating the internet
// gateway, you attach it to a VPC using AttachInternetGateway.
//
// For more information about your VPC and internet gateway, see the Amazon
// Virtual Private Cloud User Guide (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateInternetGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateInternetGateway
func (c *EC2) CreateInternetGateway(input *CreateInternetGatewayInput) (*CreateInternetGatewayOutput, error) {
	req, out := c.CreateInternetGatewayRequest(input)
	return out, req.Send()
}

// CreateInternetGatewayWithContext is the same as CreateInternetGateway with the addition of
// the ability to pass a context and additional request options.
//
// See CreateInternetGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateInternetGatewayWithContext(ctx aws.Context, input *CreateInternetGatewayInput, opts ...request.Option) (*CreateInternetGatewayOutput, error) {
	req, out := c.CreateInternetGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateKeyPair = "CreateKeyPair"

// CreateKeyPairRequest generates a "aws/request.Request" representing the
// client's request for the CreateKeyPair operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateKeyPair for more information on using the CreateKeyPair
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateKeyPairRequest method.
//    req, resp := client.CreateKeyPairRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateKeyPair
func (c *EC2) CreateKeyPairRequest(input *CreateKeyPairInput) (req *request.Request, output *CreateKeyPairOutput) {
	op := &request.Operation{
		Name:       opCreateKeyPair,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateKeyPairInput{}
	}

	output = &CreateKeyPairOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateKeyPair API operation for Amazon Elastic Compute Cloud.
//
// Creates a 2048-bit RSA key pair with the specified name. Amazon EC2 stores
// the public key and displays the private key for you to save to a file. The
// private key is returned as an unencrypted PEM encoded PKCS#1 private key.
// If a key with the specified name already exists, Amazon EC2 returns an error.
//
// You can have up to five thousand key pairs per region.
//
// The key pair returned to you is available only in the region in which you
// create it. If you prefer, you can create your own key pair using a third-party
// tool and upload it to any region using ImportKeyPair.
//
// For more information, see Key Pairs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateKeyPair for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateKeyPair
func (c *EC2) CreateKeyPair(input *CreateKeyPairInput) (*CreateKeyPairOutput, error) {
	req, out := c.CreateKeyPairRequest(input)
	return out, req.Send()
}

// CreateKeyPairWithContext is the same as CreateKeyPair with the addition of
// the ability to pass a context and additional request options.
//
// See CreateKeyPair for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateKeyPairWithContext(ctx aws.Context, input *CreateKeyPairInput, opts ...request.Option) (*CreateKeyPairOutput, error) {
	req, out := c.CreateKeyPairRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateLaunchTemplate = "CreateLaunchTemplate"

// CreateLaunchTemplateRequest generates a "aws/request.Request" representing the
// client's request for the CreateLaunchTemplate operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateLaunchTemplate for more information on using the CreateLaunchTemplate
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateLaunchTemplateRequest method.
//    req, resp := client.CreateLaunchTemplateRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateLaunchTemplate
func (c *EC2) CreateLaunchTemplateRequest(input *CreateLaunchTemplateInput) (req *request.Request, output *CreateLaunchTemplateOutput) {
	op := &request.Operation{
		Name:       opCreateLaunchTemplate,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateLaunchTemplateInput{}
	}

	output = &CreateLaunchTemplateOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateLaunchTemplate API operation for Amazon Elastic Compute Cloud.
//
// Creates a launch template. A launch template contains the parameters to launch
// an instance. When you launch an instance using RunInstances, you can specify
// a launch template instead of providing the launch parameters in the request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateLaunchTemplate for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateLaunchTemplate
func (c *EC2) CreateLaunchTemplate(input *CreateLaunchTemplateInput) (*CreateLaunchTemplateOutput, error) {
	req, out := c.CreateLaunchTemplateRequest(input)
	return out, req.Send()
}

// CreateLaunchTemplateWithContext is the same as CreateLaunchTemplate with the addition of
// the ability to pass a context and additional request options.
//
// See CreateLaunchTemplate for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateLaunchTemplateWithContext(ctx aws.Context, input *CreateLaunchTemplateInput, opts ...request.Option) (*CreateLaunchTemplateOutput, error) {
	req, out := c.CreateLaunchTemplateRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateLaunchTemplateVersion = "CreateLaunchTemplateVersion"

// CreateLaunchTemplateVersionRequest generates a "aws/request.Request" representing the
// client's request for the CreateLaunchTemplateVersion operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateLaunchTemplateVersion for more information on using the CreateLaunchTemplateVersion
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateLaunchTemplateVersionRequest method.
//    req, resp := client.CreateLaunchTemplateVersionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateLaunchTemplateVersion
func (c *EC2) CreateLaunchTemplateVersionRequest(input *CreateLaunchTemplateVersionInput) (req *request.Request, output *CreateLaunchTemplateVersionOutput) {
	op := &request.Operation{
		Name:       opCreateLaunchTemplateVersion,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateLaunchTemplateVersionInput{}
	}

	output = &CreateLaunchTemplateVersionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateLaunchTemplateVersion API operation for Amazon Elastic Compute Cloud.
//
// Creates a new version for a launch template. You can specify an existing
// version of launch template from which to base the new version.
//
// Launch template versions are numbered in the order in which they are created.
// You cannot specify, change, or replace the numbering of launch template versions.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateLaunchTemplateVersion for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateLaunchTemplateVersion
func (c *EC2) CreateLaunchTemplateVersion(input *CreateLaunchTemplateVersionInput) (*CreateLaunchTemplateVersionOutput, error) {
	req, out := c.CreateLaunchTemplateVersionRequest(input)
	return out, req.Send()
}

// CreateLaunchTemplateVersionWithContext is the same as CreateLaunchTemplateVersion with the addition of
// the ability to pass a context and additional request options.
//
// See CreateLaunchTemplateVersion for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateLaunchTemplateVersionWithContext(ctx aws.Context, input *CreateLaunchTemplateVersionInput, opts ...request.Option) (*CreateLaunchTemplateVersionOutput, error) {
	req, out := c.CreateLaunchTemplateVersionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateNatGateway = "CreateNatGateway"

// CreateNatGatewayRequest generates a "aws/request.Request" representing the
// client's request for the CreateNatGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateNatGateway for more information on using the CreateNatGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateNatGatewayRequest method.
//    req, resp := client.CreateNatGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNatGateway
func (c *EC2) CreateNatGatewayRequest(input *CreateNatGatewayInput) (req *request.Request, output *CreateNatGatewayOutput) {
	op := &request.Operation{
		Name:       opCreateNatGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateNatGatewayInput{}
	}

	output = &CreateNatGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateNatGateway API operation for Amazon Elastic Compute Cloud.
//
// Creates a NAT gateway in the specified public subnet. This action creates
// a network interface in the specified subnet with a private IP address from
// the IP address range of the subnet. Internet-bound traffic from a private
// subnet can be routed to the NAT gateway, therefore enabling instances in
// the private subnet to connect to the internet. For more information, see
// NAT Gateways (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateNatGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNatGateway
func (c *EC2) CreateNatGateway(input *CreateNatGatewayInput) (*CreateNatGatewayOutput, error) {
	req, out := c.CreateNatGatewayRequest(input)
	return out, req.Send()
}

// CreateNatGatewayWithContext is the same as CreateNatGateway with the addition of
// the ability to pass a context and additional request options.
//
// See CreateNatGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateNatGatewayWithContext(ctx aws.Context, input *CreateNatGatewayInput, opts ...request.Option) (*CreateNatGatewayOutput, error) {
	req, out := c.CreateNatGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateNetworkAcl = "CreateNetworkAcl"

// CreateNetworkAclRequest generates a "aws/request.Request" representing the
// client's request for the CreateNetworkAcl operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateNetworkAcl for more information on using the CreateNetworkAcl
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateNetworkAclRequest method.
//    req, resp := client.CreateNetworkAclRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkAcl
func (c *EC2) CreateNetworkAclRequest(input *CreateNetworkAclInput) (req *request.Request, output *CreateNetworkAclOutput) {
	op := &request.Operation{
		Name:       opCreateNetworkAcl,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateNetworkAclInput{}
	}

	output = &CreateNetworkAclOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateNetworkAcl API operation for Amazon Elastic Compute Cloud.
//
// Creates a network ACL in a VPC. Network ACLs provide an optional layer of
// security (in addition to security groups) for the instances in your VPC.
//
// For more information, see Network ACLs (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateNetworkAcl for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkAcl
func (c *EC2) CreateNetworkAcl(input *CreateNetworkAclInput) (*CreateNetworkAclOutput, error) {
	req, out := c.CreateNetworkAclRequest(input)
	return out, req.Send()
}

// CreateNetworkAclWithContext is the same as CreateNetworkAcl with the addition of
// the ability to pass a context and additional request options.
//
// See CreateNetworkAcl for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateNetworkAclWithContext(ctx aws.Context, input *CreateNetworkAclInput, opts ...request.Option) (*CreateNetworkAclOutput, error) {
	req, out := c.CreateNetworkAclRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateNetworkAclEntry = "CreateNetworkAclEntry"

// CreateNetworkAclEntryRequest generates a "aws/request.Request" representing the
// client's request for the CreateNetworkAclEntry operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateNetworkAclEntry for more information on using the CreateNetworkAclEntry
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateNetworkAclEntryRequest method.
//    req, resp := client.CreateNetworkAclEntryRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkAclEntry
func (c *EC2) CreateNetworkAclEntryRequest(input *CreateNetworkAclEntryInput) (req *request.Request, output *CreateNetworkAclEntryOutput) {
	op := &request.Operation{
		Name:       opCreateNetworkAclEntry,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateNetworkAclEntryInput{}
	}

	output = &CreateNetworkAclEntryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// CreateNetworkAclEntry API operation for Amazon Elastic Compute Cloud.
//
// Creates an entry (a rule) in a network ACL with the specified rule number.
// Each network ACL has a set of numbered ingress rules and a separate set of
// numbered egress rules. When determining whether a packet should be allowed
// in or out of a subnet associated with the ACL, we process the entries in
// the ACL according to the rule numbers, in ascending order. Each network ACL
// has a set of ingress rules and a separate set of egress rules.
//
// We recommend that you leave room between the rule numbers (for example, 100,
// 110, 120, ...), and not number them one right after the other (for example,
// 101, 102, 103, ...). This makes it easier to add a rule between existing
// ones without having to renumber the rules.
//
// After you add an entry, you can't modify it; you must either replace it,
// or create an entry and delete the old one.
//
// For more information about network ACLs, see Network ACLs (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateNetworkAclEntry for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkAclEntry
func (c *EC2) CreateNetworkAclEntry(input *CreateNetworkAclEntryInput) (*CreateNetworkAclEntryOutput, error) {
	req, out := c.CreateNetworkAclEntryRequest(input)
	return out, req.Send()
}

// CreateNetworkAclEntryWithContext is the same as CreateNetworkAclEntry with the addition of
// the ability to pass a context and additional request options.
//
// See CreateNetworkAclEntry for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateNetworkAclEntryWithContext(ctx aws.Context, input *CreateNetworkAclEntryInput, opts ...request.Option) (*CreateNetworkAclEntryOutput, error) {
	req, out := c.CreateNetworkAclEntryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateNetworkInterface = "CreateNetworkInterface"

// CreateNetworkInterfaceRequest generates a "aws/request.Request" representing the
// client's request for the CreateNetworkInterface operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateNetworkInterface for more information on using the CreateNetworkInterface
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateNetworkInterfaceRequest method.
//    req, resp := client.CreateNetworkInterfaceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkInterface
func (c *EC2) CreateNetworkInterfaceRequest(input *CreateNetworkInterfaceInput) (req *request.Request, output *CreateNetworkInterfaceOutput) {
	op := &request.Operation{
		Name:       opCreateNetworkInterface,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateNetworkInterfaceInput{}
	}

	output = &CreateNetworkInterfaceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateNetworkInterface API operation for Amazon Elastic Compute Cloud.
//
// Creates a network interface in the specified subnet.
//
// For more information about network interfaces, see Elastic Network Interfaces
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html) in the
// Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateNetworkInterface for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkInterface
func (c *EC2) CreateNetworkInterface(input *CreateNetworkInterfaceInput) (*CreateNetworkInterfaceOutput, error) {
	req, out := c.CreateNetworkInterfaceRequest(input)
	return out, req.Send()
}

// CreateNetworkInterfaceWithContext is the same as CreateNetworkInterface with the addition of
// the ability to pass a context and additional request options.
//
// See CreateNetworkInterface for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateNetworkInterfaceWithContext(ctx aws.Context, input *CreateNetworkInterfaceInput, opts ...request.Option) (*CreateNetworkInterfaceOutput, error) {
	req, out := c.CreateNetworkInterfaceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateNetworkInterfacePermission = "CreateNetworkInterfacePermission"

// CreateNetworkInterfacePermissionRequest generates a "aws/request.Request" representing the
// client's request for the CreateNetworkInterfacePermission operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateNetworkInterfacePermission for more information on using the CreateNetworkInterfacePermission
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateNetworkInterfacePermissionRequest method.
//    req, resp := client.CreateNetworkInterfacePermissionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkInterfacePermission
func (c *EC2) CreateNetworkInterfacePermissionRequest(input *CreateNetworkInterfacePermissionInput) (req *request.Request, output *CreateNetworkInterfacePermissionOutput) {
	op := &request.Operation{
		Name:       opCreateNetworkInterfacePermission,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateNetworkInterfacePermissionInput{}
	}

	output = &CreateNetworkInterfacePermissionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateNetworkInterfacePermission API operation for Amazon Elastic Compute Cloud.
//
// Grants an AWS-authorized account permission to attach the specified network
// interface to an instance in their account.
//
// You can grant permission to a single AWS account only, and only one account
// at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateNetworkInterfacePermission for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateNetworkInterfacePermission
func (c *EC2) CreateNetworkInterfacePermission(input *CreateNetworkInterfacePermissionInput) (*CreateNetworkInterfacePermissionOutput, error) {
	req, out := c.CreateNetworkInterfacePermissionRequest(input)
	return out, req.Send()
}

// CreateNetworkInterfacePermissionWithContext is the same as CreateNetworkInterfacePermission with the addition of
// the ability to pass a context and additional request options.
//
// See CreateNetworkInterfacePermission for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateNetworkInterfacePermissionWithContext(ctx aws.Context, input *CreateNetworkInterfacePermissionInput, opts ...request.Option) (*CreateNetworkInterfacePermissionOutput, error) {
	req, out := c.CreateNetworkInterfacePermissionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreatePlacementGroup = "CreatePlacementGroup"

// CreatePlacementGroupRequest generates a "aws/request.Request" representing the
// client's request for the CreatePlacementGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreatePlacementGroup for more information on using the CreatePlacementGroup
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreatePlacementGroupRequest method.
//    req, resp := client.CreatePlacementGroupRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreatePlacementGroup
func (c *EC2) CreatePlacementGroupRequest(input *CreatePlacementGroupInput) (req *request.Request, output *CreatePlacementGroupOutput) {
	op := &request.Operation{
		Name:       opCreatePlacementGroup,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreatePlacementGroupInput{}
	}

	output = &CreatePlacementGroupOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// CreatePlacementGroup API operation for Amazon Elastic Compute Cloud.
//
// Creates a placement group in which to launch instances. The strategy of the
// placement group determines how the instances are organized within the group.
//
// A cluster placement group is a logical grouping of instances within a single
// Availability Zone that benefit from low network latency, high network throughput.
// A spread placement group places instances on distinct hardware. A partition
// placement group places groups of instances in different partitions, where
// instances in one partition do not share the same hardware with instances
// in another partition.
//
// For more information, see Placement Groups (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreatePlacementGroup for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreatePlacementGroup
func (c *EC2) CreatePlacementGroup(input *CreatePlacementGroupInput) (*CreatePlacementGroupOutput, error) {
	req, out := c.CreatePlacementGroupRequest(input)
	return out, req.Send()
}

// CreatePlacementGroupWithContext is the same as CreatePlacementGroup with the addition of
// the ability to pass a context and additional request options.
//
// See CreatePlacementGroup for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreatePlacementGroupWithContext(ctx aws.Context, input *CreatePlacementGroupInput, opts ...request.Option) (*CreatePlacementGroupOutput, error) {
	req, out := c.CreatePlacementGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateReservedInstancesListing = "CreateReservedInstancesListing"

// CreateReservedInstancesListingRequest generates a "aws/request.Request" representing the
// client's request for the CreateReservedInstancesListing operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateReservedInstancesListing for more information on using the CreateReservedInstancesListing
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateReservedInstancesListingRequest method.
//    req, resp := client.CreateReservedInstancesListingRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateReservedInstancesListing
func (c *EC2) CreateReservedInstancesListingRequest(input *CreateReservedInstancesListingInput) (req *request.Request, output *CreateReservedInstancesListingOutput) {
	op := &request.Operation{
		Name:       opCreateReservedInstancesListing,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateReservedInstancesListingInput{}
	}

	output = &CreateReservedInstancesListingOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateReservedInstancesListing API operation for Amazon Elastic Compute Cloud.
//
// Creates a listing for Amazon EC2 Standard Reserved Instances to be sold in
// the Reserved Instance Marketplace. You can submit one Standard Reserved Instance
// listing at a time. To get a list of your Standard Reserved Instances, you
// can use the DescribeReservedInstances operation.
//
// Only Standard Reserved Instances with a capacity reservation can be sold
// in the Reserved Instance Marketplace. Convertible Reserved Instances and
// Standard Reserved Instances with a regional benefit cannot be sold.
//
// The Reserved Instance Marketplace matches sellers who want to resell Standard
// Reserved Instance capacity that they no longer need with buyers who want
// to purchase additional capacity. Reserved Instances bought and sold through
// the Reserved Instance Marketplace work like any other Reserved Instances.
//
// To sell your Standard Reserved Instances, you must first register as a seller
// in the Reserved Instance Marketplace. After completing the registration process,
// you can create a Reserved Instance Marketplace listing of some or all of
// your Standard Reserved Instances, and specify the upfront price to receive
// for them. Your Standard Reserved Instance listings then become available
// for purchase. To view the details of your Standard Reserved Instance listing,
// you can use the DescribeReservedInstancesListings operation.
//
// For more information, see Reserved Instance Marketplace (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateReservedInstancesListing for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateReservedInstancesListing
func (c *EC2) CreateReservedInstancesListing(input *CreateReservedInstancesListingInput) (*CreateReservedInstancesListingOutput, error) {
	req, out := c.CreateReservedInstancesListingRequest(input)
	return out, req.Send()
}

// CreateReservedInstancesListingWithContext is the same as CreateReservedInstancesListing with the addition of
// the ability to pass a context and additional request options.
//
// See CreateReservedInstancesListing for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateReservedInstancesListingWithContext(ctx aws.Context, input *CreateReservedInstancesListingInput, opts ...request.Option) (*CreateReservedInstancesListingOutput, error) {
	req, out := c.CreateReservedInstancesListingRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateRoute = "CreateRoute"

// CreateRouteRequest generates a "aws/request.Request" representing the
// client's request for the CreateRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateRoute for more information on using the CreateRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateRouteRequest method.
//    req, resp := client.CreateRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateRoute
func (c *EC2) CreateRouteRequest(input *CreateRouteInput) (req *request.Request, output *CreateRouteOutput) {
	op := &request.Operation{
		Name:       opCreateRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateRouteInput{}
	}

	output = &CreateRouteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateRoute API operation for Amazon Elastic Compute Cloud.
//
// Creates a route in a route table within a VPC.
//
// You must specify one of the following targets: internet gateway or virtual
// private gateway, NAT instance, NAT gateway, VPC peering connection, network
// interface, or egress-only internet gateway.
//
// When determining how to route traffic, we use the route with the most specific
// match. For example, traffic is destined for the IPv4 address 192.0.2.3, and
// the route table includes the following two IPv4 routes:
//
//    * 192.0.2.0/24 (goes to some target A)
//
//    * 192.0.2.0/28 (goes to some target B)
//
// Both routes apply to the traffic destined for 192.0.2.3. However, the second
// route in the list covers a smaller number of IP addresses and is therefore
// more specific, so we use that route to determine where to target the traffic.
//
// For more information about route tables, see Route Tables (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateRoute
func (c *EC2) CreateRoute(input *CreateRouteInput) (*CreateRouteOutput, error) {
	req, out := c.CreateRouteRequest(input)
	return out, req.Send()
}

// CreateRouteWithContext is the same as CreateRoute with the addition of
// the ability to pass a context and additional request options.
//
// See CreateRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateRouteWithContext(ctx aws.Context, input *CreateRouteInput, opts ...request.Option) (*CreateRouteOutput, error) {
	req, out := c.CreateRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateRouteTable = "CreateRouteTable"

// CreateRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the CreateRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateRouteTable for more information on using the CreateRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateRouteTableRequest method.
//    req, resp := client.CreateRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateRouteTable
func (c *EC2) CreateRouteTableRequest(input *CreateRouteTableInput) (req *request.Request, output *CreateRouteTableOutput) {
	op := &request.Operation{
		Name:       opCreateRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateRouteTableInput{}
	}

	output = &CreateRouteTableOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Creates a route table for the specified VPC. After you create a route table,
// you can add routes and associate the table with a subnet.
//
// For more information, see Route Tables (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateRouteTable
func (c *EC2) CreateRouteTable(input *CreateRouteTableInput) (*CreateRouteTableOutput, error) {
	req, out := c.CreateRouteTableRequest(input)
	return out, req.Send()
}

// CreateRouteTableWithContext is the same as CreateRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See CreateRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateRouteTableWithContext(ctx aws.Context, input *CreateRouteTableInput, opts ...request.Option) (*CreateRouteTableOutput, error) {
	req, out := c.CreateRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateSecurityGroup = "CreateSecurityGroup"

// CreateSecurityGroupRequest generates a "aws/request.Request" representing the
// client's request for the CreateSecurityGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateSecurityGroup for more information on using the CreateSecurityGroup
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateSecurityGroupRequest method.
//    req, resp := client.CreateSecurityGroupRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSecurityGroup
func (c *EC2) CreateSecurityGroupRequest(input *CreateSecurityGroupInput) (req *request.Request, output *CreateSecurityGroupOutput) {
	op := &request.Operation{
		Name:       opCreateSecurityGroup,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateSecurityGroupInput{}
	}

	output = &CreateSecurityGroupOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateSecurityGroup API operation for Amazon Elastic Compute Cloud.
//
// Creates a security group.
//
// A security group is for use with instances either in the EC2-Classic platform
// or in a specific VPC. For more information, see Amazon EC2 Security Groups
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)
// in the Amazon Elastic Compute Cloud User Guide and Security Groups for Your
// VPC (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// EC2-Classic: You can have up to 500 security groups.
//
// EC2-VPC: You can create up to 500 security groups per VPC.
//
// When you create a security group, you specify a friendly name of your choice.
// You can have a security group for use in EC2-Classic with the same name as
// a security group for use in a VPC. However, you can't have two security groups
// for use in EC2-Classic with the same name or two security groups for use
// in a VPC with the same name.
//
// You have a default security group for use in EC2-Classic and a default security
// group for use in your VPC. If you don't specify a security group when you
// launch an instance, the instance is launched into the appropriate default
// security group. A default security group includes a default rule that grants
// instances unrestricted network access to each other.
//
// You can add or remove rules from your security groups using AuthorizeSecurityGroupIngress,
// AuthorizeSecurityGroupEgress, RevokeSecurityGroupIngress, and RevokeSecurityGroupEgress.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateSecurityGroup for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSecurityGroup
func (c *EC2) CreateSecurityGroup(input *CreateSecurityGroupInput) (*CreateSecurityGroupOutput, error) {
	req, out := c.CreateSecurityGroupRequest(input)
	return out, req.Send()
}

// CreateSecurityGroupWithContext is the same as CreateSecurityGroup with the addition of
// the ability to pass a context and additional request options.
//
// See CreateSecurityGroup for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateSecurityGroupWithContext(ctx aws.Context, input *CreateSecurityGroupInput, opts ...request.Option) (*CreateSecurityGroupOutput, error) {
	req, out := c.CreateSecurityGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateSnapshot = "CreateSnapshot"

// CreateSnapshotRequest generates a "aws/request.Request" representing the
// client's request for the CreateSnapshot operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateSnapshot for more information on using the CreateSnapshot
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateSnapshotRequest method.
//    req, resp := client.CreateSnapshotRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSnapshot
func (c *EC2) CreateSnapshotRequest(input *CreateSnapshotInput) (req *request.Request, output *Snapshot) {
	op := &request.Operation{
		Name:       opCreateSnapshot,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateSnapshotInput{}
	}

	output = &Snapshot{}
	req = c.newRequest(op, input, output)
	return
}

// CreateSnapshot API operation for Amazon Elastic Compute Cloud.
//
// Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use
// snapshots for backups, to make copies of EBS volumes, and to save data before
// shutting down an instance.
//
// When a snapshot is created, any AWS Marketplace product codes that are associated
// with the source volume are propagated to the snapshot.
//
// You can take a snapshot of an attached volume that is in use. However, snapshots
// only capture data that has been written to your EBS volume at the time the
// snapshot command is issued; this may exclude any data that has been cached
// by any applications or the operating system. If you can pause any file systems
// on the volume long enough to take a snapshot, your snapshot should be complete.
// However, if you cannot pause all file writes to the volume, you should unmount
// the volume from within the instance, issue the snapshot command, and then
// remount the volume to ensure a consistent and complete snapshot. You may
// remount and use your volume while the snapshot status is pending.
//
// To create a snapshot for EBS volumes that serve as root devices, you should
// stop the instance before taking the snapshot.
//
// Snapshots that are taken from encrypted volumes are automatically encrypted.
// Volumes that are created from encrypted snapshots are also automatically
// encrypted. Your encrypted volumes and any associated snapshots always remain
// protected.
//
// You can tag your snapshots during creation. For more information, see Tagging
// Your Amazon EC2 Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For more information, see Amazon Elastic Block Store (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html)
// and Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateSnapshot for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSnapshot
func (c *EC2) CreateSnapshot(input *CreateSnapshotInput) (*Snapshot, error) {
	req, out := c.CreateSnapshotRequest(input)
	return out, req.Send()
}

// CreateSnapshotWithContext is the same as CreateSnapshot with the addition of
// the ability to pass a context and additional request options.
//
// See CreateSnapshot for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateSnapshotWithContext(ctx aws.Context, input *CreateSnapshotInput, opts ...request.Option) (*Snapshot, error) {
	req, out := c.CreateSnapshotRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateSpotDatafeedSubscription = "CreateSpotDatafeedSubscription"

// CreateSpotDatafeedSubscriptionRequest generates a "aws/request.Request" representing the
// client's request for the CreateSpotDatafeedSubscription operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateSpotDatafeedSubscription for more information on using the CreateSpotDatafeedSubscription
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateSpotDatafeedSubscriptionRequest method.
//    req, resp := client.CreateSpotDatafeedSubscriptionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSpotDatafeedSubscription
func (c *EC2) CreateSpotDatafeedSubscriptionRequest(input *CreateSpotDatafeedSubscriptionInput) (req *request.Request, output *CreateSpotDatafeedSubscriptionOutput) {
	op := &request.Operation{
		Name:       opCreateSpotDatafeedSubscription,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateSpotDatafeedSubscriptionInput{}
	}

	output = &CreateSpotDatafeedSubscriptionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateSpotDatafeedSubscription API operation for Amazon Elastic Compute Cloud.
//
// Creates a data feed for Spot Instances, enabling you to view Spot Instance
// usage logs. You can create one data feed per AWS account. For more information,
// see Spot Instance Data Feed (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-data-feeds.html)
// in the Amazon EC2 User Guide for Linux Instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateSpotDatafeedSubscription for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSpotDatafeedSubscription
func (c *EC2) CreateSpotDatafeedSubscription(input *CreateSpotDatafeedSubscriptionInput) (*CreateSpotDatafeedSubscriptionOutput, error) {
	req, out := c.CreateSpotDatafeedSubscriptionRequest(input)
	return out, req.Send()
}

// CreateSpotDatafeedSubscriptionWithContext is the same as CreateSpotDatafeedSubscription with the addition of
// the ability to pass a context and additional request options.
//
// See CreateSpotDatafeedSubscription for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateSpotDatafeedSubscriptionWithContext(ctx aws.Context, input *CreateSpotDatafeedSubscriptionInput, opts ...request.Option) (*CreateSpotDatafeedSubscriptionOutput, error) {
	req, out := c.CreateSpotDatafeedSubscriptionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateSubnet = "CreateSubnet"

// CreateSubnetRequest generates a "aws/request.Request" representing the
// client's request for the CreateSubnet operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateSubnet for more information on using the CreateSubnet
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateSubnetRequest method.
//    req, resp := client.CreateSubnetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSubnet
func (c *EC2) CreateSubnetRequest(input *CreateSubnetInput) (req *request.Request, output *CreateSubnetOutput) {
	op := &request.Operation{
		Name:       opCreateSubnet,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateSubnetInput{}
	}

	output = &CreateSubnetOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateSubnet API operation for Amazon Elastic Compute Cloud.
//
// Creates a subnet in an existing VPC.
//
// When you create each subnet, you provide the VPC ID and IPv4 CIDR block for
// the subnet. After you create a subnet, you can't change its CIDR block. The
// size of the subnet's IPv4 CIDR block can be the same as a VPC's IPv4 CIDR
// block, or a subset of a VPC's IPv4 CIDR block. If you create more than one
// subnet in a VPC, the subnets' CIDR blocks must not overlap. The smallest
// IPv4 subnet (and VPC) you can create uses a /28 netmask (16 IPv4 addresses),
// and the largest uses a /16 netmask (65,536 IPv4 addresses).
//
// If you've associated an IPv6 CIDR block with your VPC, you can create a subnet
// with an IPv6 CIDR block that uses a /64 prefix length.
//
// AWS reserves both the first four and the last IPv4 address in each subnet's
// CIDR block. They're not available for use.
//
// If you add more than one subnet to a VPC, they're set up in a star topology
// with a logical router in the middle.
//
// If you launch an instance in a VPC using an Amazon EBS-backed AMI, the IP
// address doesn't change if you stop and restart the instance (unlike a similar
// instance launched outside a VPC, which gets a new IP address when restarted).
// It's therefore possible to have a subnet with no running instances (they're
// all stopped), but no remaining IP addresses available.
//
// For more information about subnets, see Your VPC and Subnets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateSubnet for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateSubnet
func (c *EC2) CreateSubnet(input *CreateSubnetInput) (*CreateSubnetOutput, error) {
	req, out := c.CreateSubnetRequest(input)
	return out, req.Send()
}

// CreateSubnetWithContext is the same as CreateSubnet with the addition of
// the ability to pass a context and additional request options.
//
// See CreateSubnet for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateSubnetWithContext(ctx aws.Context, input *CreateSubnetInput, opts ...request.Option) (*CreateSubnetOutput, error) {
	req, out := c.CreateSubnetRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateTags = "CreateTags"

// CreateTagsRequest generates a "aws/request.Request" representing the
// client's request for the CreateTags operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateTags for more information on using the CreateTags
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateTagsRequest method.
//    req, resp := client.CreateTagsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTags
func (c *EC2) CreateTagsRequest(input *CreateTagsInput) (req *request.Request, output *CreateTagsOutput) {
	op := &request.Operation{
		Name:       opCreateTags,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateTagsInput{}
	}

	output = &CreateTagsOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// CreateTags API operation for Amazon Elastic Compute Cloud.
//
// Adds or overwrites one or more tags for the specified Amazon EC2 resource
// or resources. Each resource can have a maximum of 50 tags. Each tag consists
// of a key and optional value. Tag keys must be unique per resource.
//
// For more information about tags, see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)
// in the Amazon Elastic Compute Cloud User Guide. For more information about
// creating IAM policies that control users' access to resources based on tags,
// see Supported Resource-Level Permissions for Amazon EC2 API Actions (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateTags for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTags
func (c *EC2) CreateTags(input *CreateTagsInput) (*CreateTagsOutput, error) {
	req, out := c.CreateTagsRequest(input)
	return out, req.Send()
}

// CreateTagsWithContext is the same as CreateTags with the addition of
// the ability to pass a context and additional request options.
//
// See CreateTags for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateTagsWithContext(ctx aws.Context, input *CreateTagsInput, opts ...request.Option) (*CreateTagsOutput, error) {
	req, out := c.CreateTagsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateTransitGateway = "CreateTransitGateway"

// CreateTransitGatewayRequest generates a "aws/request.Request" representing the
// client's request for the CreateTransitGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateTransitGateway for more information on using the CreateTransitGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateTransitGatewayRequest method.
//    req, resp := client.CreateTransitGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGateway
func (c *EC2) CreateTransitGatewayRequest(input *CreateTransitGatewayInput) (req *request.Request, output *CreateTransitGatewayOutput) {
	op := &request.Operation{
		Name:       opCreateTransitGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateTransitGatewayInput{}
	}

	output = &CreateTransitGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateTransitGateway API operation for Amazon Elastic Compute Cloud.
//
// Creates a transit gateway.
//
// You can use a transit gateway to interconnect your virtual private clouds
// (VPC) and on-premises networks. After the transit gateway enters the available
// state, you can attach your VPCs and VPN connections to the transit gateway.
//
// To attach your VPCs, use CreateTransitGatewayVpcAttachment.
//
// To attach a VPN connection, use CreateCustomerGateway to create a customer
// gateway and specify the ID of the customer gateway and the ID of the transit
// gateway in a call to CreateVpnConnection.
//
// When you create a transit gateway, we create a default transit gateway route
// table and use it as the default association route table and the default propagation
// route table. You can use CreateTransitGatewayRouteTable to create additional
// transit gateway route tables. If you disable automatic route propagation,
// we do not create a default transit gateway route table. You can use EnableTransitGatewayRouteTablePropagation
// to propagate routes from a resource attachment to a transit gateway route
// table. If you disable automatic associations, you can use AssociateTransitGatewayRouteTable
// to associate a resource attachment with a transit gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateTransitGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGateway
func (c *EC2) CreateTransitGateway(input *CreateTransitGatewayInput) (*CreateTransitGatewayOutput, error) {
	req, out := c.CreateTransitGatewayRequest(input)
	return out, req.Send()
}

// CreateTransitGatewayWithContext is the same as CreateTransitGateway with the addition of
// the ability to pass a context and additional request options.
//
// See CreateTransitGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateTransitGatewayWithContext(ctx aws.Context, input *CreateTransitGatewayInput, opts ...request.Option) (*CreateTransitGatewayOutput, error) {
	req, out := c.CreateTransitGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateTransitGatewayRoute = "CreateTransitGatewayRoute"

// CreateTransitGatewayRouteRequest generates a "aws/request.Request" representing the
// client's request for the CreateTransitGatewayRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateTransitGatewayRoute for more information on using the CreateTransitGatewayRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateTransitGatewayRouteRequest method.
//    req, resp := client.CreateTransitGatewayRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayRoute
func (c *EC2) CreateTransitGatewayRouteRequest(input *CreateTransitGatewayRouteInput) (req *request.Request, output *CreateTransitGatewayRouteOutput) {
	op := &request.Operation{
		Name:       opCreateTransitGatewayRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateTransitGatewayRouteInput{}
	}

	output = &CreateTransitGatewayRouteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateTransitGatewayRoute API operation for Amazon Elastic Compute Cloud.
//
// Creates a static route for the specified transit gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateTransitGatewayRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayRoute
func (c *EC2) CreateTransitGatewayRoute(input *CreateTransitGatewayRouteInput) (*CreateTransitGatewayRouteOutput, error) {
	req, out := c.CreateTransitGatewayRouteRequest(input)
	return out, req.Send()
}

// CreateTransitGatewayRouteWithContext is the same as CreateTransitGatewayRoute with the addition of
// the ability to pass a context and additional request options.
//
// See CreateTransitGatewayRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateTransitGatewayRouteWithContext(ctx aws.Context, input *CreateTransitGatewayRouteInput, opts ...request.Option) (*CreateTransitGatewayRouteOutput, error) {
	req, out := c.CreateTransitGatewayRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateTransitGatewayRouteTable = "CreateTransitGatewayRouteTable"

// CreateTransitGatewayRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the CreateTransitGatewayRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateTransitGatewayRouteTable for more information on using the CreateTransitGatewayRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateTransitGatewayRouteTableRequest method.
//    req, resp := client.CreateTransitGatewayRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayRouteTable
func (c *EC2) CreateTransitGatewayRouteTableRequest(input *CreateTransitGatewayRouteTableInput) (req *request.Request, output *CreateTransitGatewayRouteTableOutput) {
	op := &request.Operation{
		Name:       opCreateTransitGatewayRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateTransitGatewayRouteTableInput{}
	}

	output = &CreateTransitGatewayRouteTableOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateTransitGatewayRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Creates a route table for the specified transit gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateTransitGatewayRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayRouteTable
func (c *EC2) CreateTransitGatewayRouteTable(input *CreateTransitGatewayRouteTableInput) (*CreateTransitGatewayRouteTableOutput, error) {
	req, out := c.CreateTransitGatewayRouteTableRequest(input)
	return out, req.Send()
}

// CreateTransitGatewayRouteTableWithContext is the same as CreateTransitGatewayRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See CreateTransitGatewayRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateTransitGatewayRouteTableWithContext(ctx aws.Context, input *CreateTransitGatewayRouteTableInput, opts ...request.Option) (*CreateTransitGatewayRouteTableOutput, error) {
	req, out := c.CreateTransitGatewayRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateTransitGatewayVpcAttachment = "CreateTransitGatewayVpcAttachment"

// CreateTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the
// client's request for the CreateTransitGatewayVpcAttachment operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateTransitGatewayVpcAttachment for more information on using the CreateTransitGatewayVpcAttachment
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateTransitGatewayVpcAttachmentRequest method.
//    req, resp := client.CreateTransitGatewayVpcAttachmentRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayVpcAttachment
func (c *EC2) CreateTransitGatewayVpcAttachmentRequest(input *CreateTransitGatewayVpcAttachmentInput) (req *request.Request, output *CreateTransitGatewayVpcAttachmentOutput) {
	op := &request.Operation{
		Name:       opCreateTransitGatewayVpcAttachment,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateTransitGatewayVpcAttachmentInput{}
	}

	output = &CreateTransitGatewayVpcAttachmentOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateTransitGatewayVpcAttachment API operation for Amazon Elastic Compute Cloud.
//
// Attaches the specified VPC to the specified transit gateway.
//
// If you attach a VPC with a CIDR range that overlaps the CIDR range of a VPC
// that is already attached, the new VPC CIDR range is not propagated to the
// default propagation route table.
//
// To send VPC traffic to an attached transit gateway, add a route to the VPC
// route table using CreateRoute.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateTransitGatewayVpcAttachment for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateTransitGatewayVpcAttachment
func (c *EC2) CreateTransitGatewayVpcAttachment(input *CreateTransitGatewayVpcAttachmentInput) (*CreateTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.CreateTransitGatewayVpcAttachmentRequest(input)
	return out, req.Send()
}

// CreateTransitGatewayVpcAttachmentWithContext is the same as CreateTransitGatewayVpcAttachment with the addition of
// the ability to pass a context and additional request options.
//
// See CreateTransitGatewayVpcAttachment for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateTransitGatewayVpcAttachmentWithContext(ctx aws.Context, input *CreateTransitGatewayVpcAttachmentInput, opts ...request.Option) (*CreateTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.CreateTransitGatewayVpcAttachmentRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVolume = "CreateVolume"

// CreateVolumeRequest generates a "aws/request.Request" representing the
// client's request for the CreateVolume operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVolume for more information on using the CreateVolume
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVolumeRequest method.
//    req, resp := client.CreateVolumeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVolume
func (c *EC2) CreateVolumeRequest(input *CreateVolumeInput) (req *request.Request, output *Volume) {
	op := &request.Operation{
		Name:       opCreateVolume,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVolumeInput{}
	}

	output = &Volume{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVolume API operation for Amazon Elastic Compute Cloud.
//
// Creates an EBS volume that can be attached to an instance in the same Availability
// Zone. The volume is created in the regional endpoint that you send the HTTP
// request to. For more information see Regions and Endpoints (https://docs.aws.amazon.com/general/latest/gr/rande.html).
//
// You can create a new empty volume or restore a volume from an EBS snapshot.
// Any AWS Marketplace product codes from the snapshot are propagated to the
// volume.
//
// You can create encrypted volumes with the Encrypted parameter. Encrypted
// volumes may only be attached to instances that support Amazon EBS encryption.
// Volumes that are created from encrypted snapshots are also automatically
// encrypted. For more information, see Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// You can tag your volumes during creation. For more information, see Tagging
// Your Amazon EC2 Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For more information, see Creating an Amazon EBS Volume (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-volume.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVolume for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVolume
func (c *EC2) CreateVolume(input *CreateVolumeInput) (*Volume, error) {
	req, out := c.CreateVolumeRequest(input)
	return out, req.Send()
}

// CreateVolumeWithContext is the same as CreateVolume with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVolume for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVolumeWithContext(ctx aws.Context, input *CreateVolumeInput, opts ...request.Option) (*Volume, error) {
	req, out := c.CreateVolumeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpc = "CreateVpc"

// CreateVpcRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpc operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpc for more information on using the CreateVpc
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpcRequest method.
//    req, resp := client.CreateVpcRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpc
func (c *EC2) CreateVpcRequest(input *CreateVpcInput) (req *request.Request, output *CreateVpcOutput) {
	op := &request.Operation{
		Name:       opCreateVpc,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpcInput{}
	}

	output = &CreateVpcOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpc API operation for Amazon Elastic Compute Cloud.
//
// Creates a VPC with the specified IPv4 CIDR block. The smallest VPC you can
// create uses a /28 netmask (16 IPv4 addresses), and the largest uses a /16
// netmask (65,536 IPv4 addresses). For more information about how large to
// make your VPC, see Your VPC and Subnets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// You can optionally request an Amazon-provided IPv6 CIDR block for the VPC.
// The IPv6 CIDR block uses a /56 prefix length, and is allocated from Amazon's
// pool of IPv6 addresses. You cannot choose the IPv6 range for your VPC.
//
// By default, each instance you launch in the VPC has the default DHCP options,
// which include only a default DNS server that we provide (AmazonProvidedDNS).
// For more information, see DHCP Options Sets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_DHCP_Options.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// You can specify the instance tenancy value for the VPC when you create it.
// You can't change this value for the VPC after you create it. For more information,
// see Dedicated Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpc for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpc
func (c *EC2) CreateVpc(input *CreateVpcInput) (*CreateVpcOutput, error) {
	req, out := c.CreateVpcRequest(input)
	return out, req.Send()
}

// CreateVpcWithContext is the same as CreateVpc with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpc for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpcWithContext(ctx aws.Context, input *CreateVpcInput, opts ...request.Option) (*CreateVpcOutput, error) {
	req, out := c.CreateVpcRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpcEndpoint = "CreateVpcEndpoint"

// CreateVpcEndpointRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpcEndpoint operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpcEndpoint for more information on using the CreateVpcEndpoint
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpcEndpointRequest method.
//    req, resp := client.CreateVpcEndpointRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcEndpoint
func (c *EC2) CreateVpcEndpointRequest(input *CreateVpcEndpointInput) (req *request.Request, output *CreateVpcEndpointOutput) {
	op := &request.Operation{
		Name:       opCreateVpcEndpoint,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpcEndpointInput{}
	}

	output = &CreateVpcEndpointOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpcEndpoint API operation for Amazon Elastic Compute Cloud.
//
// Creates a VPC endpoint for a specified service. An endpoint enables you to
// create a private connection between your VPC and the service. The service
// may be provided by AWS, an AWS Marketplace partner, or another AWS account.
// For more information, see VPC Endpoints (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// A gateway endpoint serves as a target for a route in your route table for
// traffic destined for the AWS service. You can specify an endpoint policy
// to attach to the endpoint that will control access to the service from your
// VPC. You can also specify the VPC route tables that use the endpoint.
//
// An interface endpoint is a network interface in your subnet that serves as
// an endpoint for communicating with the specified service. You can specify
// the subnets in which to create an endpoint, and the security groups to associate
// with the endpoint network interface.
//
// Use DescribeVpcEndpointServices to get a list of supported services.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpcEndpoint for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcEndpoint
func (c *EC2) CreateVpcEndpoint(input *CreateVpcEndpointInput) (*CreateVpcEndpointOutput, error) {
	req, out := c.CreateVpcEndpointRequest(input)
	return out, req.Send()
}

// CreateVpcEndpointWithContext is the same as CreateVpcEndpoint with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpcEndpoint for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpcEndpointWithContext(ctx aws.Context, input *CreateVpcEndpointInput, opts ...request.Option) (*CreateVpcEndpointOutput, error) {
	req, out := c.CreateVpcEndpointRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpcEndpointConnectionNotification = "CreateVpcEndpointConnectionNotification"

// CreateVpcEndpointConnectionNotificationRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpcEndpointConnectionNotification operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpcEndpointConnectionNotification for more information on using the CreateVpcEndpointConnectionNotification
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpcEndpointConnectionNotificationRequest method.
//    req, resp := client.CreateVpcEndpointConnectionNotificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcEndpointConnectionNotification
func (c *EC2) CreateVpcEndpointConnectionNotificationRequest(input *CreateVpcEndpointConnectionNotificationInput) (req *request.Request, output *CreateVpcEndpointConnectionNotificationOutput) {
	op := &request.Operation{
		Name:       opCreateVpcEndpointConnectionNotification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpcEndpointConnectionNotificationInput{}
	}

	output = &CreateVpcEndpointConnectionNotificationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpcEndpointConnectionNotification API operation for Amazon Elastic Compute Cloud.
//
// Creates a connection notification for a specified VPC endpoint or VPC endpoint
// service. A connection notification notifies you of specific endpoint events.
// You must create an SNS topic to receive notifications. For more information,
// see Create a Topic (https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html)
// in the Amazon Simple Notification Service Developer Guide.
//
// You can create a connection notification for interface endpoints only.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpcEndpointConnectionNotification for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcEndpointConnectionNotification
func (c *EC2) CreateVpcEndpointConnectionNotification(input *CreateVpcEndpointConnectionNotificationInput) (*CreateVpcEndpointConnectionNotificationOutput, error) {
	req, out := c.CreateVpcEndpointConnectionNotificationRequest(input)
	return out, req.Send()
}

// CreateVpcEndpointConnectionNotificationWithContext is the same as CreateVpcEndpointConnectionNotification with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpcEndpointConnectionNotification for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpcEndpointConnectionNotificationWithContext(ctx aws.Context, input *CreateVpcEndpointConnectionNotificationInput, opts ...request.Option) (*CreateVpcEndpointConnectionNotificationOutput, error) {
	req, out := c.CreateVpcEndpointConnectionNotificationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpcEndpointServiceConfiguration = "CreateVpcEndpointServiceConfiguration"

// CreateVpcEndpointServiceConfigurationRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpcEndpointServiceConfiguration operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpcEndpointServiceConfiguration for more information on using the CreateVpcEndpointServiceConfiguration
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpcEndpointServiceConfigurationRequest method.
//    req, resp := client.CreateVpcEndpointServiceConfigurationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcEndpointServiceConfiguration
func (c *EC2) CreateVpcEndpointServiceConfigurationRequest(input *CreateVpcEndpointServiceConfigurationInput) (req *request.Request, output *CreateVpcEndpointServiceConfigurationOutput) {
	op := &request.Operation{
		Name:       opCreateVpcEndpointServiceConfiguration,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpcEndpointServiceConfigurationInput{}
	}

	output = &CreateVpcEndpointServiceConfigurationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpcEndpointServiceConfiguration API operation for Amazon Elastic Compute Cloud.
//
// Creates a VPC endpoint service configuration to which service consumers (AWS
// accounts, IAM users, and IAM roles) can connect. Service consumers can create
// an interface VPC endpoint to connect to your service.
//
// To create an endpoint service configuration, you must first create a Network
// Load Balancer for your service. For more information, see VPC Endpoint Services
// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/endpoint-service.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpcEndpointServiceConfiguration for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcEndpointServiceConfiguration
func (c *EC2) CreateVpcEndpointServiceConfiguration(input *CreateVpcEndpointServiceConfigurationInput) (*CreateVpcEndpointServiceConfigurationOutput, error) {
	req, out := c.CreateVpcEndpointServiceConfigurationRequest(input)
	return out, req.Send()
}

// CreateVpcEndpointServiceConfigurationWithContext is the same as CreateVpcEndpointServiceConfiguration with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpcEndpointServiceConfiguration for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpcEndpointServiceConfigurationWithContext(ctx aws.Context, input *CreateVpcEndpointServiceConfigurationInput, opts ...request.Option) (*CreateVpcEndpointServiceConfigurationOutput, error) {
	req, out := c.CreateVpcEndpointServiceConfigurationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpcPeeringConnection = "CreateVpcPeeringConnection"

// CreateVpcPeeringConnectionRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpcPeeringConnection operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpcPeeringConnection for more information on using the CreateVpcPeeringConnection
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpcPeeringConnectionRequest method.
//    req, resp := client.CreateVpcPeeringConnectionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcPeeringConnection
func (c *EC2) CreateVpcPeeringConnectionRequest(input *CreateVpcPeeringConnectionInput) (req *request.Request, output *CreateVpcPeeringConnectionOutput) {
	op := &request.Operation{
		Name:       opCreateVpcPeeringConnection,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpcPeeringConnectionInput{}
	}

	output = &CreateVpcPeeringConnectionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpcPeeringConnection API operation for Amazon Elastic Compute Cloud.
//
// Requests a VPC peering connection between two VPCs: a requester VPC that
// you own and an accepter VPC with which to create the connection. The accepter
// VPC can belong to another AWS account and can be in a different Region to
// the requester VPC. The requester VPC and accepter VPC cannot have overlapping
// CIDR blocks.
//
// Limitations and rules apply to a VPC peering connection. For more information,
// see the limitations (https://docs.aws.amazon.com/AmazonVPC/latest/PeeringGuide/vpc-peering-basics.html#vpc-peering-limitations)
// section in the VPC Peering Guide.
//
// The owner of the accepter VPC must accept the peering request to activate
// the peering connection. The VPC peering connection request expires after
// 7 days, after which it cannot be accepted or rejected.
//
// If you create a VPC peering connection request between VPCs with overlapping
// CIDR blocks, the VPC peering connection has a status of failed.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpcPeeringConnection for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpcPeeringConnection
func (c *EC2) CreateVpcPeeringConnection(input *CreateVpcPeeringConnectionInput) (*CreateVpcPeeringConnectionOutput, error) {
	req, out := c.CreateVpcPeeringConnectionRequest(input)
	return out, req.Send()
}

// CreateVpcPeeringConnectionWithContext is the same as CreateVpcPeeringConnection with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpcPeeringConnection for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpcPeeringConnectionWithContext(ctx aws.Context, input *CreateVpcPeeringConnectionInput, opts ...request.Option) (*CreateVpcPeeringConnectionOutput, error) {
	req, out := c.CreateVpcPeeringConnectionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpnConnection = "CreateVpnConnection"

// CreateVpnConnectionRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpnConnection operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpnConnection for more information on using the CreateVpnConnection
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpnConnectionRequest method.
//    req, resp := client.CreateVpnConnectionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpnConnection
func (c *EC2) CreateVpnConnectionRequest(input *CreateVpnConnectionInput) (req *request.Request, output *CreateVpnConnectionOutput) {
	op := &request.Operation{
		Name:       opCreateVpnConnection,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpnConnectionInput{}
	}

	output = &CreateVpnConnectionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpnConnection API operation for Amazon Elastic Compute Cloud.
//
// Creates a VPN connection between an existing virtual private gateway and
// a VPN customer gateway. The only supported connection type is ipsec.1.
//
// The response includes information that you need to give to your network administrator
// to configure your customer gateway.
//
// We strongly recommend that you use HTTPS when calling this operation because
// the response contains sensitive cryptographic information for configuring
// your customer gateway.
//
// If you decide to shut down your VPN connection for any reason and later create
// a new VPN connection, you must reconfigure your customer gateway with the
// new information returned from this call.
//
// This is an idempotent operation. If you perform the operation more than once,
// Amazon EC2 doesn't return an error.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpnConnection for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpnConnection
func (c *EC2) CreateVpnConnection(input *CreateVpnConnectionInput) (*CreateVpnConnectionOutput, error) {
	req, out := c.CreateVpnConnectionRequest(input)
	return out, req.Send()
}

// CreateVpnConnectionWithContext is the same as CreateVpnConnection with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpnConnection for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpnConnectionWithContext(ctx aws.Context, input *CreateVpnConnectionInput, opts ...request.Option) (*CreateVpnConnectionOutput, error) {
	req, out := c.CreateVpnConnectionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpnConnectionRoute = "CreateVpnConnectionRoute"

// CreateVpnConnectionRouteRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpnConnectionRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpnConnectionRoute for more information on using the CreateVpnConnectionRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpnConnectionRouteRequest method.
//    req, resp := client.CreateVpnConnectionRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpnConnectionRoute
func (c *EC2) CreateVpnConnectionRouteRequest(input *CreateVpnConnectionRouteInput) (req *request.Request, output *CreateVpnConnectionRouteOutput) {
	op := &request.Operation{
		Name:       opCreateVpnConnectionRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpnConnectionRouteInput{}
	}

	output = &CreateVpnConnectionRouteOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// CreateVpnConnectionRoute API operation for Amazon Elastic Compute Cloud.
//
// Creates a static route associated with a VPN connection between an existing
// virtual private gateway and a VPN customer gateway. The static route allows
// traffic to be routed from the virtual private gateway to the VPN customer
// gateway.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpnConnectionRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpnConnectionRoute
func (c *EC2) CreateVpnConnectionRoute(input *CreateVpnConnectionRouteInput) (*CreateVpnConnectionRouteOutput, error) {
	req, out := c.CreateVpnConnectionRouteRequest(input)
	return out, req.Send()
}

// CreateVpnConnectionRouteWithContext is the same as CreateVpnConnectionRoute with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpnConnectionRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpnConnectionRouteWithContext(ctx aws.Context, input *CreateVpnConnectionRouteInput, opts ...request.Option) (*CreateVpnConnectionRouteOutput, error) {
	req, out := c.CreateVpnConnectionRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opCreateVpnGateway = "CreateVpnGateway"

// CreateVpnGatewayRequest generates a "aws/request.Request" representing the
// client's request for the CreateVpnGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See CreateVpnGateway for more information on using the CreateVpnGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the CreateVpnGatewayRequest method.
//    req, resp := client.CreateVpnGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpnGateway
func (c *EC2) CreateVpnGatewayRequest(input *CreateVpnGatewayInput) (req *request.Request, output *CreateVpnGatewayOutput) {
	op := &request.Operation{
		Name:       opCreateVpnGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateVpnGatewayInput{}
	}

	output = &CreateVpnGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// CreateVpnGateway API operation for Amazon Elastic Compute Cloud.
//
// Creates a virtual private gateway. A virtual private gateway is the endpoint
// on the VPC side of your VPN connection. You can create a virtual private
// gateway before creating the VPC itself.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation CreateVpnGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/CreateVpnGateway
func (c *EC2) CreateVpnGateway(input *CreateVpnGatewayInput) (*CreateVpnGatewayOutput, error) {
	req, out := c.CreateVpnGatewayRequest(input)
	return out, req.Send()
}

// CreateVpnGatewayWithContext is the same as CreateVpnGateway with the addition of
// the ability to pass a context and additional request options.
//
// See CreateVpnGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) CreateVpnGatewayWithContext(ctx aws.Context, input *CreateVpnGatewayInput, opts ...request.Option) (*CreateVpnGatewayOutput, error) {
	req, out := c.CreateVpnGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteClientVpnEndpoint = "DeleteClientVpnEndpoint"

// DeleteClientVpnEndpointRequest generates a "aws/request.Request" representing the
// client's request for the DeleteClientVpnEndpoint operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteClientVpnEndpoint for more information on using the DeleteClientVpnEndpoint
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteClientVpnEndpointRequest method.
//    req, resp := client.DeleteClientVpnEndpointRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteClientVpnEndpoint
func (c *EC2) DeleteClientVpnEndpointRequest(input *DeleteClientVpnEndpointInput) (req *request.Request, output *DeleteClientVpnEndpointOutput) {
	op := &request.Operation{
		Name:       opDeleteClientVpnEndpoint,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteClientVpnEndpointInput{}
	}

	output = &DeleteClientVpnEndpointOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteClientVpnEndpoint API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified Client VPN endpoint. You must disassociate all target
// networks before you can delete a Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteClientVpnEndpoint for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteClientVpnEndpoint
func (c *EC2) DeleteClientVpnEndpoint(input *DeleteClientVpnEndpointInput) (*DeleteClientVpnEndpointOutput, error) {
	req, out := c.DeleteClientVpnEndpointRequest(input)
	return out, req.Send()
}

// DeleteClientVpnEndpointWithContext is the same as DeleteClientVpnEndpoint with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteClientVpnEndpoint for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteClientVpnEndpointWithContext(ctx aws.Context, input *DeleteClientVpnEndpointInput, opts ...request.Option) (*DeleteClientVpnEndpointOutput, error) {
	req, out := c.DeleteClientVpnEndpointRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteClientVpnRoute = "DeleteClientVpnRoute"

// DeleteClientVpnRouteRequest generates a "aws/request.Request" representing the
// client's request for the DeleteClientVpnRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteClientVpnRoute for more information on using the DeleteClientVpnRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteClientVpnRouteRequest method.
//    req, resp := client.DeleteClientVpnRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteClientVpnRoute
func (c *EC2) DeleteClientVpnRouteRequest(input *DeleteClientVpnRouteInput) (req *request.Request, output *DeleteClientVpnRouteOutput) {
	op := &request.Operation{
		Name:       opDeleteClientVpnRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteClientVpnRouteInput{}
	}

	output = &DeleteClientVpnRouteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteClientVpnRoute API operation for Amazon Elastic Compute Cloud.
//
// Deletes a route from a Client VPN endpoint. You can only delete routes that
// you manually added using the CreateClientVpnRoute action. You cannot delete
// routes that were automatically added when associating a subnet. To remove
// routes that have been automatically added, disassociate the target subnet
// from the Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteClientVpnRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteClientVpnRoute
func (c *EC2) DeleteClientVpnRoute(input *DeleteClientVpnRouteInput) (*DeleteClientVpnRouteOutput, error) {
	req, out := c.DeleteClientVpnRouteRequest(input)
	return out, req.Send()
}

// DeleteClientVpnRouteWithContext is the same as DeleteClientVpnRoute with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteClientVpnRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteClientVpnRouteWithContext(ctx aws.Context, input *DeleteClientVpnRouteInput, opts ...request.Option) (*DeleteClientVpnRouteOutput, error) {
	req, out := c.DeleteClientVpnRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteCustomerGateway = "DeleteCustomerGateway"

// DeleteCustomerGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DeleteCustomerGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteCustomerGateway for more information on using the DeleteCustomerGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteCustomerGatewayRequest method.
//    req, resp := client.DeleteCustomerGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteCustomerGateway
func (c *EC2) DeleteCustomerGatewayRequest(input *DeleteCustomerGatewayInput) (req *request.Request, output *DeleteCustomerGatewayOutput) {
	op := &request.Operation{
		Name:       opDeleteCustomerGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteCustomerGatewayInput{}
	}

	output = &DeleteCustomerGatewayOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteCustomerGateway API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified customer gateway. You must delete the VPN connection
// before you can delete the customer gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteCustomerGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteCustomerGateway
func (c *EC2) DeleteCustomerGateway(input *DeleteCustomerGatewayInput) (*DeleteCustomerGatewayOutput, error) {
	req, out := c.DeleteCustomerGatewayRequest(input)
	return out, req.Send()
}

// DeleteCustomerGatewayWithContext is the same as DeleteCustomerGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteCustomerGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteCustomerGatewayWithContext(ctx aws.Context, input *DeleteCustomerGatewayInput, opts ...request.Option) (*DeleteCustomerGatewayOutput, error) {
	req, out := c.DeleteCustomerGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteDhcpOptions = "DeleteDhcpOptions"

// DeleteDhcpOptionsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteDhcpOptions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteDhcpOptions for more information on using the DeleteDhcpOptions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteDhcpOptionsRequest method.
//    req, resp := client.DeleteDhcpOptionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteDhcpOptions
func (c *EC2) DeleteDhcpOptionsRequest(input *DeleteDhcpOptionsInput) (req *request.Request, output *DeleteDhcpOptionsOutput) {
	op := &request.Operation{
		Name:       opDeleteDhcpOptions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteDhcpOptionsInput{}
	}

	output = &DeleteDhcpOptionsOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteDhcpOptions API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified set of DHCP options. You must disassociate the set
// of DHCP options before you can delete it. You can disassociate the set of
// DHCP options by associating either a new set of options or the default set
// of options with the VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteDhcpOptions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteDhcpOptions
func (c *EC2) DeleteDhcpOptions(input *DeleteDhcpOptionsInput) (*DeleteDhcpOptionsOutput, error) {
	req, out := c.DeleteDhcpOptionsRequest(input)
	return out, req.Send()
}

// DeleteDhcpOptionsWithContext is the same as DeleteDhcpOptions with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteDhcpOptions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteDhcpOptionsWithContext(ctx aws.Context, input *DeleteDhcpOptionsInput, opts ...request.Option) (*DeleteDhcpOptionsOutput, error) {
	req, out := c.DeleteDhcpOptionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteEgressOnlyInternetGateway = "DeleteEgressOnlyInternetGateway"

// DeleteEgressOnlyInternetGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DeleteEgressOnlyInternetGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteEgressOnlyInternetGateway for more information on using the DeleteEgressOnlyInternetGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteEgressOnlyInternetGatewayRequest method.
//    req, resp := client.DeleteEgressOnlyInternetGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteEgressOnlyInternetGateway
func (c *EC2) DeleteEgressOnlyInternetGatewayRequest(input *DeleteEgressOnlyInternetGatewayInput) (req *request.Request, output *DeleteEgressOnlyInternetGatewayOutput) {
	op := &request.Operation{
		Name:       opDeleteEgressOnlyInternetGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteEgressOnlyInternetGatewayInput{}
	}

	output = &DeleteEgressOnlyInternetGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteEgressOnlyInternetGateway API operation for Amazon Elastic Compute Cloud.
//
// Deletes an egress-only internet gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteEgressOnlyInternetGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteEgressOnlyInternetGateway
func (c *EC2) DeleteEgressOnlyInternetGateway(input *DeleteEgressOnlyInternetGatewayInput) (*DeleteEgressOnlyInternetGatewayOutput, error) {
	req, out := c.DeleteEgressOnlyInternetGatewayRequest(input)
	return out, req.Send()
}

// DeleteEgressOnlyInternetGatewayWithContext is the same as DeleteEgressOnlyInternetGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteEgressOnlyInternetGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteEgressOnlyInternetGatewayWithContext(ctx aws.Context, input *DeleteEgressOnlyInternetGatewayInput, opts ...request.Option) (*DeleteEgressOnlyInternetGatewayOutput, error) {
	req, out := c.DeleteEgressOnlyInternetGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteFleets = "DeleteFleets"

// DeleteFleetsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteFleets operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteFleets for more information on using the DeleteFleets
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteFleetsRequest method.
//    req, resp := client.DeleteFleetsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteFleets
func (c *EC2) DeleteFleetsRequest(input *DeleteFleetsInput) (req *request.Request, output *DeleteFleetsOutput) {
	op := &request.Operation{
		Name:       opDeleteFleets,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteFleetsInput{}
	}

	output = &DeleteFleetsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteFleets API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified EC2 Fleet.
//
// After you delete an EC2 Fleet, it launches no new instances. You must specify
// whether an EC2 Fleet should also terminate its instances. If you terminate
// the instances, the EC2 Fleet enters the deleted_terminating state. Otherwise,
// the EC2 Fleet enters the deleted_running state, and the instances continue
// to run until they are interrupted or you terminate them manually.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteFleets for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteFleets
func (c *EC2) DeleteFleets(input *DeleteFleetsInput) (*DeleteFleetsOutput, error) {
	req, out := c.DeleteFleetsRequest(input)
	return out, req.Send()
}

// DeleteFleetsWithContext is the same as DeleteFleets with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteFleets for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteFleetsWithContext(ctx aws.Context, input *DeleteFleetsInput, opts ...request.Option) (*DeleteFleetsOutput, error) {
	req, out := c.DeleteFleetsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteFlowLogs = "DeleteFlowLogs"

// DeleteFlowLogsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteFlowLogs operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteFlowLogs for more information on using the DeleteFlowLogs
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteFlowLogsRequest method.
//    req, resp := client.DeleteFlowLogsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteFlowLogs
func (c *EC2) DeleteFlowLogsRequest(input *DeleteFlowLogsInput) (req *request.Request, output *DeleteFlowLogsOutput) {
	op := &request.Operation{
		Name:       opDeleteFlowLogs,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteFlowLogsInput{}
	}

	output = &DeleteFlowLogsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteFlowLogs API operation for Amazon Elastic Compute Cloud.
//
// Deletes one or more flow logs.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteFlowLogs for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteFlowLogs
func (c *EC2) DeleteFlowLogs(input *DeleteFlowLogsInput) (*DeleteFlowLogsOutput, error) {
	req, out := c.DeleteFlowLogsRequest(input)
	return out, req.Send()
}

// DeleteFlowLogsWithContext is the same as DeleteFlowLogs with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteFlowLogs for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteFlowLogsWithContext(ctx aws.Context, input *DeleteFlowLogsInput, opts ...request.Option) (*DeleteFlowLogsOutput, error) {
	req, out := c.DeleteFlowLogsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteFpgaImage = "DeleteFpgaImage"

// DeleteFpgaImageRequest generates a "aws/request.Request" representing the
// client's request for the DeleteFpgaImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteFpgaImage for more information on using the DeleteFpgaImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteFpgaImageRequest method.
//    req, resp := client.DeleteFpgaImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteFpgaImage
func (c *EC2) DeleteFpgaImageRequest(input *DeleteFpgaImageInput) (req *request.Request, output *DeleteFpgaImageOutput) {
	op := &request.Operation{
		Name:       opDeleteFpgaImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteFpgaImageInput{}
	}

	output = &DeleteFpgaImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteFpgaImage API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified Amazon FPGA Image (AFI).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteFpgaImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteFpgaImage
func (c *EC2) DeleteFpgaImage(input *DeleteFpgaImageInput) (*DeleteFpgaImageOutput, error) {
	req, out := c.DeleteFpgaImageRequest(input)
	return out, req.Send()
}

// DeleteFpgaImageWithContext is the same as DeleteFpgaImage with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteFpgaImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteFpgaImageWithContext(ctx aws.Context, input *DeleteFpgaImageInput, opts ...request.Option) (*DeleteFpgaImageOutput, error) {
	req, out := c.DeleteFpgaImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteInternetGateway = "DeleteInternetGateway"

// DeleteInternetGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DeleteInternetGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteInternetGateway for more information on using the DeleteInternetGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteInternetGatewayRequest method.
//    req, resp := client.DeleteInternetGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteInternetGateway
func (c *EC2) DeleteInternetGatewayRequest(input *DeleteInternetGatewayInput) (req *request.Request, output *DeleteInternetGatewayOutput) {
	op := &request.Operation{
		Name:       opDeleteInternetGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteInternetGatewayInput{}
	}

	output = &DeleteInternetGatewayOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteInternetGateway API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified internet gateway. You must detach the internet gateway
// from the VPC before you can delete it.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteInternetGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteInternetGateway
func (c *EC2) DeleteInternetGateway(input *DeleteInternetGatewayInput) (*DeleteInternetGatewayOutput, error) {
	req, out := c.DeleteInternetGatewayRequest(input)
	return out, req.Send()
}

// DeleteInternetGatewayWithContext is the same as DeleteInternetGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteInternetGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteInternetGatewayWithContext(ctx aws.Context, input *DeleteInternetGatewayInput, opts ...request.Option) (*DeleteInternetGatewayOutput, error) {
	req, out := c.DeleteInternetGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteKeyPair = "DeleteKeyPair"

// DeleteKeyPairRequest generates a "aws/request.Request" representing the
// client's request for the DeleteKeyPair operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteKeyPair for more information on using the DeleteKeyPair
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteKeyPairRequest method.
//    req, resp := client.DeleteKeyPairRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteKeyPair
func (c *EC2) DeleteKeyPairRequest(input *DeleteKeyPairInput) (req *request.Request, output *DeleteKeyPairOutput) {
	op := &request.Operation{
		Name:       opDeleteKeyPair,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteKeyPairInput{}
	}

	output = &DeleteKeyPairOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteKeyPair API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified key pair, by removing the public key from Amazon EC2.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteKeyPair for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteKeyPair
func (c *EC2) DeleteKeyPair(input *DeleteKeyPairInput) (*DeleteKeyPairOutput, error) {
	req, out := c.DeleteKeyPairRequest(input)
	return out, req.Send()
}

// DeleteKeyPairWithContext is the same as DeleteKeyPair with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteKeyPair for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteKeyPairWithContext(ctx aws.Context, input *DeleteKeyPairInput, opts ...request.Option) (*DeleteKeyPairOutput, error) {
	req, out := c.DeleteKeyPairRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteLaunchTemplate = "DeleteLaunchTemplate"

// DeleteLaunchTemplateRequest generates a "aws/request.Request" representing the
// client's request for the DeleteLaunchTemplate operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteLaunchTemplate for more information on using the DeleteLaunchTemplate
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteLaunchTemplateRequest method.
//    req, resp := client.DeleteLaunchTemplateRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteLaunchTemplate
func (c *EC2) DeleteLaunchTemplateRequest(input *DeleteLaunchTemplateInput) (req *request.Request, output *DeleteLaunchTemplateOutput) {
	op := &request.Operation{
		Name:       opDeleteLaunchTemplate,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteLaunchTemplateInput{}
	}

	output = &DeleteLaunchTemplateOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteLaunchTemplate API operation for Amazon Elastic Compute Cloud.
//
// Deletes a launch template. Deleting a launch template deletes all of its
// versions.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteLaunchTemplate for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteLaunchTemplate
func (c *EC2) DeleteLaunchTemplate(input *DeleteLaunchTemplateInput) (*DeleteLaunchTemplateOutput, error) {
	req, out := c.DeleteLaunchTemplateRequest(input)
	return out, req.Send()
}

// DeleteLaunchTemplateWithContext is the same as DeleteLaunchTemplate with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteLaunchTemplate for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteLaunchTemplateWithContext(ctx aws.Context, input *DeleteLaunchTemplateInput, opts ...request.Option) (*DeleteLaunchTemplateOutput, error) {
	req, out := c.DeleteLaunchTemplateRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteLaunchTemplateVersions = "DeleteLaunchTemplateVersions"

// DeleteLaunchTemplateVersionsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteLaunchTemplateVersions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteLaunchTemplateVersions for more information on using the DeleteLaunchTemplateVersions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteLaunchTemplateVersionsRequest method.
//    req, resp := client.DeleteLaunchTemplateVersionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteLaunchTemplateVersions
func (c *EC2) DeleteLaunchTemplateVersionsRequest(input *DeleteLaunchTemplateVersionsInput) (req *request.Request, output *DeleteLaunchTemplateVersionsOutput) {
	op := &request.Operation{
		Name:       opDeleteLaunchTemplateVersions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteLaunchTemplateVersionsInput{}
	}

	output = &DeleteLaunchTemplateVersionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteLaunchTemplateVersions API operation for Amazon Elastic Compute Cloud.
//
// Deletes one or more versions of a launch template. You cannot delete the
// default version of a launch template; you must first assign a different version
// as the default. If the default version is the only version for the launch
// template, you must delete the entire launch template using DeleteLaunchTemplate.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteLaunchTemplateVersions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteLaunchTemplateVersions
func (c *EC2) DeleteLaunchTemplateVersions(input *DeleteLaunchTemplateVersionsInput) (*DeleteLaunchTemplateVersionsOutput, error) {
	req, out := c.DeleteLaunchTemplateVersionsRequest(input)
	return out, req.Send()
}

// DeleteLaunchTemplateVersionsWithContext is the same as DeleteLaunchTemplateVersions with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteLaunchTemplateVersions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteLaunchTemplateVersionsWithContext(ctx aws.Context, input *DeleteLaunchTemplateVersionsInput, opts ...request.Option) (*DeleteLaunchTemplateVersionsOutput, error) {
	req, out := c.DeleteLaunchTemplateVersionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteNatGateway = "DeleteNatGateway"

// DeleteNatGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DeleteNatGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteNatGateway for more information on using the DeleteNatGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteNatGatewayRequest method.
//    req, resp := client.DeleteNatGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNatGateway
func (c *EC2) DeleteNatGatewayRequest(input *DeleteNatGatewayInput) (req *request.Request, output *DeleteNatGatewayOutput) {
	op := &request.Operation{
		Name:       opDeleteNatGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteNatGatewayInput{}
	}

	output = &DeleteNatGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteNatGateway API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified NAT gateway. Deleting a NAT gateway disassociates its
// Elastic IP address, but does not release the address from your account. Deleting
// a NAT gateway does not delete any NAT gateway routes in your route tables.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteNatGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNatGateway
func (c *EC2) DeleteNatGateway(input *DeleteNatGatewayInput) (*DeleteNatGatewayOutput, error) {
	req, out := c.DeleteNatGatewayRequest(input)
	return out, req.Send()
}

// DeleteNatGatewayWithContext is the same as DeleteNatGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteNatGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteNatGatewayWithContext(ctx aws.Context, input *DeleteNatGatewayInput, opts ...request.Option) (*DeleteNatGatewayOutput, error) {
	req, out := c.DeleteNatGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteNetworkAcl = "DeleteNetworkAcl"

// DeleteNetworkAclRequest generates a "aws/request.Request" representing the
// client's request for the DeleteNetworkAcl operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteNetworkAcl for more information on using the DeleteNetworkAcl
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteNetworkAclRequest method.
//    req, resp := client.DeleteNetworkAclRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkAcl
func (c *EC2) DeleteNetworkAclRequest(input *DeleteNetworkAclInput) (req *request.Request, output *DeleteNetworkAclOutput) {
	op := &request.Operation{
		Name:       opDeleteNetworkAcl,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteNetworkAclInput{}
	}

	output = &DeleteNetworkAclOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteNetworkAcl API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified network ACL. You can't delete the ACL if it's associated
// with any subnets. You can't delete the default network ACL.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteNetworkAcl for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkAcl
func (c *EC2) DeleteNetworkAcl(input *DeleteNetworkAclInput) (*DeleteNetworkAclOutput, error) {
	req, out := c.DeleteNetworkAclRequest(input)
	return out, req.Send()
}

// DeleteNetworkAclWithContext is the same as DeleteNetworkAcl with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteNetworkAcl for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteNetworkAclWithContext(ctx aws.Context, input *DeleteNetworkAclInput, opts ...request.Option) (*DeleteNetworkAclOutput, error) {
	req, out := c.DeleteNetworkAclRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteNetworkAclEntry = "DeleteNetworkAclEntry"

// DeleteNetworkAclEntryRequest generates a "aws/request.Request" representing the
// client's request for the DeleteNetworkAclEntry operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteNetworkAclEntry for more information on using the DeleteNetworkAclEntry
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteNetworkAclEntryRequest method.
//    req, resp := client.DeleteNetworkAclEntryRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkAclEntry
func (c *EC2) DeleteNetworkAclEntryRequest(input *DeleteNetworkAclEntryInput) (req *request.Request, output *DeleteNetworkAclEntryOutput) {
	op := &request.Operation{
		Name:       opDeleteNetworkAclEntry,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteNetworkAclEntryInput{}
	}

	output = &DeleteNetworkAclEntryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteNetworkAclEntry API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified ingress or egress entry (rule) from the specified network
// ACL.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteNetworkAclEntry for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkAclEntry
func (c *EC2) DeleteNetworkAclEntry(input *DeleteNetworkAclEntryInput) (*DeleteNetworkAclEntryOutput, error) {
	req, out := c.DeleteNetworkAclEntryRequest(input)
	return out, req.Send()
}

// DeleteNetworkAclEntryWithContext is the same as DeleteNetworkAclEntry with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteNetworkAclEntry for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteNetworkAclEntryWithContext(ctx aws.Context, input *DeleteNetworkAclEntryInput, opts ...request.Option) (*DeleteNetworkAclEntryOutput, error) {
	req, out := c.DeleteNetworkAclEntryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteNetworkInterface = "DeleteNetworkInterface"

// DeleteNetworkInterfaceRequest generates a "aws/request.Request" representing the
// client's request for the DeleteNetworkInterface operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteNetworkInterface for more information on using the DeleteNetworkInterface
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteNetworkInterfaceRequest method.
//    req, resp := client.DeleteNetworkInterfaceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkInterface
func (c *EC2) DeleteNetworkInterfaceRequest(input *DeleteNetworkInterfaceInput) (req *request.Request, output *DeleteNetworkInterfaceOutput) {
	op := &request.Operation{
		Name:       opDeleteNetworkInterface,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteNetworkInterfaceInput{}
	}

	output = &DeleteNetworkInterfaceOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteNetworkInterface API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified network interface. You must detach the network interface
// before you can delete it.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteNetworkInterface for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkInterface
func (c *EC2) DeleteNetworkInterface(input *DeleteNetworkInterfaceInput) (*DeleteNetworkInterfaceOutput, error) {
	req, out := c.DeleteNetworkInterfaceRequest(input)
	return out, req.Send()
}

// DeleteNetworkInterfaceWithContext is the same as DeleteNetworkInterface with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteNetworkInterface for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteNetworkInterfaceWithContext(ctx aws.Context, input *DeleteNetworkInterfaceInput, opts ...request.Option) (*DeleteNetworkInterfaceOutput, error) {
	req, out := c.DeleteNetworkInterfaceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteNetworkInterfacePermission = "DeleteNetworkInterfacePermission"

// DeleteNetworkInterfacePermissionRequest generates a "aws/request.Request" representing the
// client's request for the DeleteNetworkInterfacePermission operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteNetworkInterfacePermission for more information on using the DeleteNetworkInterfacePermission
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteNetworkInterfacePermissionRequest method.
//    req, resp := client.DeleteNetworkInterfacePermissionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkInterfacePermission
func (c *EC2) DeleteNetworkInterfacePermissionRequest(input *DeleteNetworkInterfacePermissionInput) (req *request.Request, output *DeleteNetworkInterfacePermissionOutput) {
	op := &request.Operation{
		Name:       opDeleteNetworkInterfacePermission,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteNetworkInterfacePermissionInput{}
	}

	output = &DeleteNetworkInterfacePermissionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteNetworkInterfacePermission API operation for Amazon Elastic Compute Cloud.
//
// Deletes a permission for a network interface. By default, you cannot delete
// the permission if the account for which you're removing the permission has
// attached the network interface to an instance. However, you can force delete
// the permission, regardless of any attachment.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteNetworkInterfacePermission for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteNetworkInterfacePermission
func (c *EC2) DeleteNetworkInterfacePermission(input *DeleteNetworkInterfacePermissionInput) (*DeleteNetworkInterfacePermissionOutput, error) {
	req, out := c.DeleteNetworkInterfacePermissionRequest(input)
	return out, req.Send()
}

// DeleteNetworkInterfacePermissionWithContext is the same as DeleteNetworkInterfacePermission with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteNetworkInterfacePermission for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteNetworkInterfacePermissionWithContext(ctx aws.Context, input *DeleteNetworkInterfacePermissionInput, opts ...request.Option) (*DeleteNetworkInterfacePermissionOutput, error) {
	req, out := c.DeleteNetworkInterfacePermissionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeletePlacementGroup = "DeletePlacementGroup"

// DeletePlacementGroupRequest generates a "aws/request.Request" representing the
// client's request for the DeletePlacementGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeletePlacementGroup for more information on using the DeletePlacementGroup
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeletePlacementGroupRequest method.
//    req, resp := client.DeletePlacementGroupRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeletePlacementGroup
func (c *EC2) DeletePlacementGroupRequest(input *DeletePlacementGroupInput) (req *request.Request, output *DeletePlacementGroupOutput) {
	op := &request.Operation{
		Name:       opDeletePlacementGroup,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeletePlacementGroupInput{}
	}

	output = &DeletePlacementGroupOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeletePlacementGroup API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified placement group. You must terminate all instances in
// the placement group before you can delete the placement group. For more information,
// see Placement Groups (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeletePlacementGroup for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeletePlacementGroup
func (c *EC2) DeletePlacementGroup(input *DeletePlacementGroupInput) (*DeletePlacementGroupOutput, error) {
	req, out := c.DeletePlacementGroupRequest(input)
	return out, req.Send()
}

// DeletePlacementGroupWithContext is the same as DeletePlacementGroup with the addition of
// the ability to pass a context and additional request options.
//
// See DeletePlacementGroup for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeletePlacementGroupWithContext(ctx aws.Context, input *DeletePlacementGroupInput, opts ...request.Option) (*DeletePlacementGroupOutput, error) {
	req, out := c.DeletePlacementGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteRoute = "DeleteRoute"

// DeleteRouteRequest generates a "aws/request.Request" representing the
// client's request for the DeleteRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteRoute for more information on using the DeleteRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteRouteRequest method.
//    req, resp := client.DeleteRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteRoute
func (c *EC2) DeleteRouteRequest(input *DeleteRouteInput) (req *request.Request, output *DeleteRouteOutput) {
	op := &request.Operation{
		Name:       opDeleteRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteRouteInput{}
	}

	output = &DeleteRouteOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteRoute API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified route from the specified route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteRoute
func (c *EC2) DeleteRoute(input *DeleteRouteInput) (*DeleteRouteOutput, error) {
	req, out := c.DeleteRouteRequest(input)
	return out, req.Send()
}

// DeleteRouteWithContext is the same as DeleteRoute with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteRouteWithContext(ctx aws.Context, input *DeleteRouteInput, opts ...request.Option) (*DeleteRouteOutput, error) {
	req, out := c.DeleteRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteRouteTable = "DeleteRouteTable"

// DeleteRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the DeleteRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteRouteTable for more information on using the DeleteRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteRouteTableRequest method.
//    req, resp := client.DeleteRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteRouteTable
func (c *EC2) DeleteRouteTableRequest(input *DeleteRouteTableInput) (req *request.Request, output *DeleteRouteTableOutput) {
	op := &request.Operation{
		Name:       opDeleteRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteRouteTableInput{}
	}

	output = &DeleteRouteTableOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified route table. You must disassociate the route table
// from any subnets before you can delete it. You can't delete the main route
// table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteRouteTable
func (c *EC2) DeleteRouteTable(input *DeleteRouteTableInput) (*DeleteRouteTableOutput, error) {
	req, out := c.DeleteRouteTableRequest(input)
	return out, req.Send()
}

// DeleteRouteTableWithContext is the same as DeleteRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteRouteTableWithContext(ctx aws.Context, input *DeleteRouteTableInput, opts ...request.Option) (*DeleteRouteTableOutput, error) {
	req, out := c.DeleteRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteSecurityGroup = "DeleteSecurityGroup"

// DeleteSecurityGroupRequest generates a "aws/request.Request" representing the
// client's request for the DeleteSecurityGroup operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteSecurityGroup for more information on using the DeleteSecurityGroup
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteSecurityGroupRequest method.
//    req, resp := client.DeleteSecurityGroupRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSecurityGroup
func (c *EC2) DeleteSecurityGroupRequest(input *DeleteSecurityGroupInput) (req *request.Request, output *DeleteSecurityGroupOutput) {
	op := &request.Operation{
		Name:       opDeleteSecurityGroup,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteSecurityGroupInput{}
	}

	output = &DeleteSecurityGroupOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteSecurityGroup API operation for Amazon Elastic Compute Cloud.
//
// Deletes a security group.
//
// If you attempt to delete a security group that is associated with an instance,
// or is referenced by another security group, the operation fails with InvalidGroup.InUse
// in EC2-Classic or DependencyViolation in EC2-VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteSecurityGroup for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSecurityGroup
func (c *EC2) DeleteSecurityGroup(input *DeleteSecurityGroupInput) (*DeleteSecurityGroupOutput, error) {
	req, out := c.DeleteSecurityGroupRequest(input)
	return out, req.Send()
}

// DeleteSecurityGroupWithContext is the same as DeleteSecurityGroup with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteSecurityGroup for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteSecurityGroupWithContext(ctx aws.Context, input *DeleteSecurityGroupInput, opts ...request.Option) (*DeleteSecurityGroupOutput, error) {
	req, out := c.DeleteSecurityGroupRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteSnapshot = "DeleteSnapshot"

// DeleteSnapshotRequest generates a "aws/request.Request" representing the
// client's request for the DeleteSnapshot operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteSnapshot for more information on using the DeleteSnapshot
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteSnapshotRequest method.
//    req, resp := client.DeleteSnapshotRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSnapshot
func (c *EC2) DeleteSnapshotRequest(input *DeleteSnapshotInput) (req *request.Request, output *DeleteSnapshotOutput) {
	op := &request.Operation{
		Name:       opDeleteSnapshot,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteSnapshotInput{}
	}

	output = &DeleteSnapshotOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteSnapshot API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified snapshot.
//
// When you make periodic snapshots of a volume, the snapshots are incremental,
// and only the blocks on the device that have changed since your last snapshot
// are saved in the new snapshot. When you delete a snapshot, only the data
// not needed for any other snapshot is removed. So regardless of which prior
// snapshots have been deleted, all active snapshots will have access to all
// the information needed to restore the volume.
//
// You cannot delete a snapshot of the root device of an EBS volume used by
// a registered AMI. You must first de-register the AMI before you can delete
// the snapshot.
//
// For more information, see Deleting an Amazon EBS Snapshot (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-deleting-snapshot.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteSnapshot for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSnapshot
func (c *EC2) DeleteSnapshot(input *DeleteSnapshotInput) (*DeleteSnapshotOutput, error) {
	req, out := c.DeleteSnapshotRequest(input)
	return out, req.Send()
}

// DeleteSnapshotWithContext is the same as DeleteSnapshot with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteSnapshot for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteSnapshotWithContext(ctx aws.Context, input *DeleteSnapshotInput, opts ...request.Option) (*DeleteSnapshotOutput, error) {
	req, out := c.DeleteSnapshotRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteSpotDatafeedSubscription = "DeleteSpotDatafeedSubscription"

// DeleteSpotDatafeedSubscriptionRequest generates a "aws/request.Request" representing the
// client's request for the DeleteSpotDatafeedSubscription operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteSpotDatafeedSubscription for more information on using the DeleteSpotDatafeedSubscription
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteSpotDatafeedSubscriptionRequest method.
//    req, resp := client.DeleteSpotDatafeedSubscriptionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSpotDatafeedSubscription
func (c *EC2) DeleteSpotDatafeedSubscriptionRequest(input *DeleteSpotDatafeedSubscriptionInput) (req *request.Request, output *DeleteSpotDatafeedSubscriptionOutput) {
	op := &request.Operation{
		Name:       opDeleteSpotDatafeedSubscription,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteSpotDatafeedSubscriptionInput{}
	}

	output = &DeleteSpotDatafeedSubscriptionOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteSpotDatafeedSubscription API operation for Amazon Elastic Compute Cloud.
//
// Deletes the data feed for Spot Instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteSpotDatafeedSubscription for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSpotDatafeedSubscription
func (c *EC2) DeleteSpotDatafeedSubscription(input *DeleteSpotDatafeedSubscriptionInput) (*DeleteSpotDatafeedSubscriptionOutput, error) {
	req, out := c.DeleteSpotDatafeedSubscriptionRequest(input)
	return out, req.Send()
}

// DeleteSpotDatafeedSubscriptionWithContext is the same as DeleteSpotDatafeedSubscription with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteSpotDatafeedSubscription for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteSpotDatafeedSubscriptionWithContext(ctx aws.Context, input *DeleteSpotDatafeedSubscriptionInput, opts ...request.Option) (*DeleteSpotDatafeedSubscriptionOutput, error) {
	req, out := c.DeleteSpotDatafeedSubscriptionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteSubnet = "DeleteSubnet"

// DeleteSubnetRequest generates a "aws/request.Request" representing the
// client's request for the DeleteSubnet operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteSubnet for more information on using the DeleteSubnet
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteSubnetRequest method.
//    req, resp := client.DeleteSubnetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSubnet
func (c *EC2) DeleteSubnetRequest(input *DeleteSubnetInput) (req *request.Request, output *DeleteSubnetOutput) {
	op := &request.Operation{
		Name:       opDeleteSubnet,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteSubnetInput{}
	}

	output = &DeleteSubnetOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteSubnet API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified subnet. You must terminate all running instances in
// the subnet before you can delete the subnet.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteSubnet for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteSubnet
func (c *EC2) DeleteSubnet(input *DeleteSubnetInput) (*DeleteSubnetOutput, error) {
	req, out := c.DeleteSubnetRequest(input)
	return out, req.Send()
}

// DeleteSubnetWithContext is the same as DeleteSubnet with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteSubnet for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteSubnetWithContext(ctx aws.Context, input *DeleteSubnetInput, opts ...request.Option) (*DeleteSubnetOutput, error) {
	req, out := c.DeleteSubnetRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteTags = "DeleteTags"

// DeleteTagsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteTags operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteTags for more information on using the DeleteTags
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteTagsRequest method.
//    req, resp := client.DeleteTagsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTags
func (c *EC2) DeleteTagsRequest(input *DeleteTagsInput) (req *request.Request, output *DeleteTagsOutput) {
	op := &request.Operation{
		Name:       opDeleteTags,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteTagsInput{}
	}

	output = &DeleteTagsOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteTags API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified set of tags from the specified set of resources.
//
// To list the current tags, use DescribeTags. For more information about tags,
// see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteTags for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTags
func (c *EC2) DeleteTags(input *DeleteTagsInput) (*DeleteTagsOutput, error) {
	req, out := c.DeleteTagsRequest(input)
	return out, req.Send()
}

// DeleteTagsWithContext is the same as DeleteTags with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteTags for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteTagsWithContext(ctx aws.Context, input *DeleteTagsInput, opts ...request.Option) (*DeleteTagsOutput, error) {
	req, out := c.DeleteTagsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteTransitGateway = "DeleteTransitGateway"

// DeleteTransitGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DeleteTransitGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteTransitGateway for more information on using the DeleteTransitGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteTransitGatewayRequest method.
//    req, resp := client.DeleteTransitGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGateway
func (c *EC2) DeleteTransitGatewayRequest(input *DeleteTransitGatewayInput) (req *request.Request, output *DeleteTransitGatewayOutput) {
	op := &request.Operation{
		Name:       opDeleteTransitGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteTransitGatewayInput{}
	}

	output = &DeleteTransitGatewayOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteTransitGateway API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified transit gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteTransitGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGateway
func (c *EC2) DeleteTransitGateway(input *DeleteTransitGatewayInput) (*DeleteTransitGatewayOutput, error) {
	req, out := c.DeleteTransitGatewayRequest(input)
	return out, req.Send()
}

// DeleteTransitGatewayWithContext is the same as DeleteTransitGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteTransitGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteTransitGatewayWithContext(ctx aws.Context, input *DeleteTransitGatewayInput, opts ...request.Option) (*DeleteTransitGatewayOutput, error) {
	req, out := c.DeleteTransitGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteTransitGatewayRoute = "DeleteTransitGatewayRoute"

// DeleteTransitGatewayRouteRequest generates a "aws/request.Request" representing the
// client's request for the DeleteTransitGatewayRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteTransitGatewayRoute for more information on using the DeleteTransitGatewayRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteTransitGatewayRouteRequest method.
//    req, resp := client.DeleteTransitGatewayRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayRoute
func (c *EC2) DeleteTransitGatewayRouteRequest(input *DeleteTransitGatewayRouteInput) (req *request.Request, output *DeleteTransitGatewayRouteOutput) {
	op := &request.Operation{
		Name:       opDeleteTransitGatewayRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteTransitGatewayRouteInput{}
	}

	output = &DeleteTransitGatewayRouteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteTransitGatewayRoute API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified route from the specified transit gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteTransitGatewayRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayRoute
func (c *EC2) DeleteTransitGatewayRoute(input *DeleteTransitGatewayRouteInput) (*DeleteTransitGatewayRouteOutput, error) {
	req, out := c.DeleteTransitGatewayRouteRequest(input)
	return out, req.Send()
}

// DeleteTransitGatewayRouteWithContext is the same as DeleteTransitGatewayRoute with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteTransitGatewayRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteTransitGatewayRouteWithContext(ctx aws.Context, input *DeleteTransitGatewayRouteInput, opts ...request.Option) (*DeleteTransitGatewayRouteOutput, error) {
	req, out := c.DeleteTransitGatewayRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteTransitGatewayRouteTable = "DeleteTransitGatewayRouteTable"

// DeleteTransitGatewayRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the DeleteTransitGatewayRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteTransitGatewayRouteTable for more information on using the DeleteTransitGatewayRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteTransitGatewayRouteTableRequest method.
//    req, resp := client.DeleteTransitGatewayRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayRouteTable
func (c *EC2) DeleteTransitGatewayRouteTableRequest(input *DeleteTransitGatewayRouteTableInput) (req *request.Request, output *DeleteTransitGatewayRouteTableOutput) {
	op := &request.Operation{
		Name:       opDeleteTransitGatewayRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteTransitGatewayRouteTableInput{}
	}

	output = &DeleteTransitGatewayRouteTableOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteTransitGatewayRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified transit gateway route table. You must disassociate
// the route table from any transit gateway route tables before you can delete
// it.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteTransitGatewayRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayRouteTable
func (c *EC2) DeleteTransitGatewayRouteTable(input *DeleteTransitGatewayRouteTableInput) (*DeleteTransitGatewayRouteTableOutput, error) {
	req, out := c.DeleteTransitGatewayRouteTableRequest(input)
	return out, req.Send()
}

// DeleteTransitGatewayRouteTableWithContext is the same as DeleteTransitGatewayRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteTransitGatewayRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteTransitGatewayRouteTableWithContext(ctx aws.Context, input *DeleteTransitGatewayRouteTableInput, opts ...request.Option) (*DeleteTransitGatewayRouteTableOutput, error) {
	req, out := c.DeleteTransitGatewayRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteTransitGatewayVpcAttachment = "DeleteTransitGatewayVpcAttachment"

// DeleteTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the
// client's request for the DeleteTransitGatewayVpcAttachment operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteTransitGatewayVpcAttachment for more information on using the DeleteTransitGatewayVpcAttachment
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteTransitGatewayVpcAttachmentRequest method.
//    req, resp := client.DeleteTransitGatewayVpcAttachmentRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayVpcAttachment
func (c *EC2) DeleteTransitGatewayVpcAttachmentRequest(input *DeleteTransitGatewayVpcAttachmentInput) (req *request.Request, output *DeleteTransitGatewayVpcAttachmentOutput) {
	op := &request.Operation{
		Name:       opDeleteTransitGatewayVpcAttachment,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteTransitGatewayVpcAttachmentInput{}
	}

	output = &DeleteTransitGatewayVpcAttachmentOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteTransitGatewayVpcAttachment API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified VPC attachment.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteTransitGatewayVpcAttachment for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteTransitGatewayVpcAttachment
func (c *EC2) DeleteTransitGatewayVpcAttachment(input *DeleteTransitGatewayVpcAttachmentInput) (*DeleteTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.DeleteTransitGatewayVpcAttachmentRequest(input)
	return out, req.Send()
}

// DeleteTransitGatewayVpcAttachmentWithContext is the same as DeleteTransitGatewayVpcAttachment with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteTransitGatewayVpcAttachment for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteTransitGatewayVpcAttachmentWithContext(ctx aws.Context, input *DeleteTransitGatewayVpcAttachmentInput, opts ...request.Option) (*DeleteTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.DeleteTransitGatewayVpcAttachmentRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVolume = "DeleteVolume"

// DeleteVolumeRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVolume operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVolume for more information on using the DeleteVolume
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVolumeRequest method.
//    req, resp := client.DeleteVolumeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVolume
func (c *EC2) DeleteVolumeRequest(input *DeleteVolumeInput) (req *request.Request, output *DeleteVolumeOutput) {
	op := &request.Operation{
		Name:       opDeleteVolume,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVolumeInput{}
	}

	output = &DeleteVolumeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteVolume API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified EBS volume. The volume must be in the available state
// (not attached to an instance).
//
// The volume can remain in the deleting state for several minutes.
//
// For more information, see Deleting an Amazon EBS Volume (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-deleting-volume.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVolume for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVolume
func (c *EC2) DeleteVolume(input *DeleteVolumeInput) (*DeleteVolumeOutput, error) {
	req, out := c.DeleteVolumeRequest(input)
	return out, req.Send()
}

// DeleteVolumeWithContext is the same as DeleteVolume with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVolume for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVolumeWithContext(ctx aws.Context, input *DeleteVolumeInput, opts ...request.Option) (*DeleteVolumeOutput, error) {
	req, out := c.DeleteVolumeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpc = "DeleteVpc"

// DeleteVpcRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpc operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpc for more information on using the DeleteVpc
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpcRequest method.
//    req, resp := client.DeleteVpcRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpc
func (c *EC2) DeleteVpcRequest(input *DeleteVpcInput) (req *request.Request, output *DeleteVpcOutput) {
	op := &request.Operation{
		Name:       opDeleteVpc,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpcInput{}
	}

	output = &DeleteVpcOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteVpc API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified VPC. You must detach or delete all gateways and resources
// that are associated with the VPC before you can delete it. For example, you
// must terminate all instances running in the VPC, delete all security groups
// associated with the VPC (except the default one), delete all route tables
// associated with the VPC (except the default one), and so on.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpc for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpc
func (c *EC2) DeleteVpc(input *DeleteVpcInput) (*DeleteVpcOutput, error) {
	req, out := c.DeleteVpcRequest(input)
	return out, req.Send()
}

// DeleteVpcWithContext is the same as DeleteVpc with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpc for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpcWithContext(ctx aws.Context, input *DeleteVpcInput, opts ...request.Option) (*DeleteVpcOutput, error) {
	req, out := c.DeleteVpcRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpcEndpointConnectionNotifications = "DeleteVpcEndpointConnectionNotifications"

// DeleteVpcEndpointConnectionNotificationsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpcEndpointConnectionNotifications operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpcEndpointConnectionNotifications for more information on using the DeleteVpcEndpointConnectionNotifications
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpcEndpointConnectionNotificationsRequest method.
//    req, resp := client.DeleteVpcEndpointConnectionNotificationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcEndpointConnectionNotifications
func (c *EC2) DeleteVpcEndpointConnectionNotificationsRequest(input *DeleteVpcEndpointConnectionNotificationsInput) (req *request.Request, output *DeleteVpcEndpointConnectionNotificationsOutput) {
	op := &request.Operation{
		Name:       opDeleteVpcEndpointConnectionNotifications,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpcEndpointConnectionNotificationsInput{}
	}

	output = &DeleteVpcEndpointConnectionNotificationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteVpcEndpointConnectionNotifications API operation for Amazon Elastic Compute Cloud.
//
// Deletes one or more VPC endpoint connection notifications.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpcEndpointConnectionNotifications for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcEndpointConnectionNotifications
func (c *EC2) DeleteVpcEndpointConnectionNotifications(input *DeleteVpcEndpointConnectionNotificationsInput) (*DeleteVpcEndpointConnectionNotificationsOutput, error) {
	req, out := c.DeleteVpcEndpointConnectionNotificationsRequest(input)
	return out, req.Send()
}

// DeleteVpcEndpointConnectionNotificationsWithContext is the same as DeleteVpcEndpointConnectionNotifications with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpcEndpointConnectionNotifications for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpcEndpointConnectionNotificationsWithContext(ctx aws.Context, input *DeleteVpcEndpointConnectionNotificationsInput, opts ...request.Option) (*DeleteVpcEndpointConnectionNotificationsOutput, error) {
	req, out := c.DeleteVpcEndpointConnectionNotificationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpcEndpointServiceConfigurations = "DeleteVpcEndpointServiceConfigurations"

// DeleteVpcEndpointServiceConfigurationsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpcEndpointServiceConfigurations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpcEndpointServiceConfigurations for more information on using the DeleteVpcEndpointServiceConfigurations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpcEndpointServiceConfigurationsRequest method.
//    req, resp := client.DeleteVpcEndpointServiceConfigurationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcEndpointServiceConfigurations
func (c *EC2) DeleteVpcEndpointServiceConfigurationsRequest(input *DeleteVpcEndpointServiceConfigurationsInput) (req *request.Request, output *DeleteVpcEndpointServiceConfigurationsOutput) {
	op := &request.Operation{
		Name:       opDeleteVpcEndpointServiceConfigurations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpcEndpointServiceConfigurationsInput{}
	}

	output = &DeleteVpcEndpointServiceConfigurationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteVpcEndpointServiceConfigurations API operation for Amazon Elastic Compute Cloud.
//
// Deletes one or more VPC endpoint service configurations in your account.
// Before you delete the endpoint service configuration, you must reject any
// Available or PendingAcceptance interface endpoint connections that are attached
// to the service.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpcEndpointServiceConfigurations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcEndpointServiceConfigurations
func (c *EC2) DeleteVpcEndpointServiceConfigurations(input *DeleteVpcEndpointServiceConfigurationsInput) (*DeleteVpcEndpointServiceConfigurationsOutput, error) {
	req, out := c.DeleteVpcEndpointServiceConfigurationsRequest(input)
	return out, req.Send()
}

// DeleteVpcEndpointServiceConfigurationsWithContext is the same as DeleteVpcEndpointServiceConfigurations with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpcEndpointServiceConfigurations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpcEndpointServiceConfigurationsWithContext(ctx aws.Context, input *DeleteVpcEndpointServiceConfigurationsInput, opts ...request.Option) (*DeleteVpcEndpointServiceConfigurationsOutput, error) {
	req, out := c.DeleteVpcEndpointServiceConfigurationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpcEndpoints = "DeleteVpcEndpoints"

// DeleteVpcEndpointsRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpcEndpoints operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpcEndpoints for more information on using the DeleteVpcEndpoints
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpcEndpointsRequest method.
//    req, resp := client.DeleteVpcEndpointsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcEndpoints
func (c *EC2) DeleteVpcEndpointsRequest(input *DeleteVpcEndpointsInput) (req *request.Request, output *DeleteVpcEndpointsOutput) {
	op := &request.Operation{
		Name:       opDeleteVpcEndpoints,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpcEndpointsInput{}
	}

	output = &DeleteVpcEndpointsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteVpcEndpoints API operation for Amazon Elastic Compute Cloud.
//
// Deletes one or more specified VPC endpoints. Deleting a gateway endpoint
// also deletes the endpoint routes in the route tables that were associated
// with the endpoint. Deleting an interface endpoint deletes the endpoint network
// interfaces.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpcEndpoints for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcEndpoints
func (c *EC2) DeleteVpcEndpoints(input *DeleteVpcEndpointsInput) (*DeleteVpcEndpointsOutput, error) {
	req, out := c.DeleteVpcEndpointsRequest(input)
	return out, req.Send()
}

// DeleteVpcEndpointsWithContext is the same as DeleteVpcEndpoints with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpcEndpoints for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpcEndpointsWithContext(ctx aws.Context, input *DeleteVpcEndpointsInput, opts ...request.Option) (*DeleteVpcEndpointsOutput, error) {
	req, out := c.DeleteVpcEndpointsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpcPeeringConnection = "DeleteVpcPeeringConnection"

// DeleteVpcPeeringConnectionRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpcPeeringConnection operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpcPeeringConnection for more information on using the DeleteVpcPeeringConnection
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpcPeeringConnectionRequest method.
//    req, resp := client.DeleteVpcPeeringConnectionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcPeeringConnection
func (c *EC2) DeleteVpcPeeringConnectionRequest(input *DeleteVpcPeeringConnectionInput) (req *request.Request, output *DeleteVpcPeeringConnectionOutput) {
	op := &request.Operation{
		Name:       opDeleteVpcPeeringConnection,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpcPeeringConnectionInput{}
	}

	output = &DeleteVpcPeeringConnectionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeleteVpcPeeringConnection API operation for Amazon Elastic Compute Cloud.
//
// Deletes a VPC peering connection. Either the owner of the requester VPC or
// the owner of the accepter VPC can delete the VPC peering connection if it's
// in the active state. The owner of the requester VPC can delete a VPC peering
// connection in the pending-acceptance state. You cannot delete a VPC peering
// connection that's in the failed state.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpcPeeringConnection for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpcPeeringConnection
func (c *EC2) DeleteVpcPeeringConnection(input *DeleteVpcPeeringConnectionInput) (*DeleteVpcPeeringConnectionOutput, error) {
	req, out := c.DeleteVpcPeeringConnectionRequest(input)
	return out, req.Send()
}

// DeleteVpcPeeringConnectionWithContext is the same as DeleteVpcPeeringConnection with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpcPeeringConnection for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpcPeeringConnectionWithContext(ctx aws.Context, input *DeleteVpcPeeringConnectionInput, opts ...request.Option) (*DeleteVpcPeeringConnectionOutput, error) {
	req, out := c.DeleteVpcPeeringConnectionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpnConnection = "DeleteVpnConnection"

// DeleteVpnConnectionRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpnConnection operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpnConnection for more information on using the DeleteVpnConnection
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpnConnectionRequest method.
//    req, resp := client.DeleteVpnConnectionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpnConnection
func (c *EC2) DeleteVpnConnectionRequest(input *DeleteVpnConnectionInput) (req *request.Request, output *DeleteVpnConnectionOutput) {
	op := &request.Operation{
		Name:       opDeleteVpnConnection,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpnConnectionInput{}
	}

	output = &DeleteVpnConnectionOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteVpnConnection API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified VPN connection.
//
// If you're deleting the VPC and its associated components, we recommend that
// you detach the virtual private gateway from the VPC and delete the VPC before
// deleting the VPN connection. If you believe that the tunnel credentials for
// your VPN connection have been compromised, you can delete the VPN connection
// and create a new one that has new keys, without needing to delete the VPC
// or virtual private gateway. If you create a new VPN connection, you must
// reconfigure the customer gateway using the new configuration information
// returned with the new VPN connection ID.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpnConnection for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpnConnection
func (c *EC2) DeleteVpnConnection(input *DeleteVpnConnectionInput) (*DeleteVpnConnectionOutput, error) {
	req, out := c.DeleteVpnConnectionRequest(input)
	return out, req.Send()
}

// DeleteVpnConnectionWithContext is the same as DeleteVpnConnection with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpnConnection for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpnConnectionWithContext(ctx aws.Context, input *DeleteVpnConnectionInput, opts ...request.Option) (*DeleteVpnConnectionOutput, error) {
	req, out := c.DeleteVpnConnectionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpnConnectionRoute = "DeleteVpnConnectionRoute"

// DeleteVpnConnectionRouteRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpnConnectionRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpnConnectionRoute for more information on using the DeleteVpnConnectionRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpnConnectionRouteRequest method.
//    req, resp := client.DeleteVpnConnectionRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpnConnectionRoute
func (c *EC2) DeleteVpnConnectionRouteRequest(input *DeleteVpnConnectionRouteInput) (req *request.Request, output *DeleteVpnConnectionRouteOutput) {
	op := &request.Operation{
		Name:       opDeleteVpnConnectionRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpnConnectionRouteInput{}
	}

	output = &DeleteVpnConnectionRouteOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteVpnConnectionRoute API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified static route associated with a VPN connection between
// an existing virtual private gateway and a VPN customer gateway. The static
// route allows traffic to be routed from the virtual private gateway to the
// VPN customer gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpnConnectionRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpnConnectionRoute
func (c *EC2) DeleteVpnConnectionRoute(input *DeleteVpnConnectionRouteInput) (*DeleteVpnConnectionRouteOutput, error) {
	req, out := c.DeleteVpnConnectionRouteRequest(input)
	return out, req.Send()
}

// DeleteVpnConnectionRouteWithContext is the same as DeleteVpnConnectionRoute with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpnConnectionRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpnConnectionRouteWithContext(ctx aws.Context, input *DeleteVpnConnectionRouteInput, opts ...request.Option) (*DeleteVpnConnectionRouteOutput, error) {
	req, out := c.DeleteVpnConnectionRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeleteVpnGateway = "DeleteVpnGateway"

// DeleteVpnGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DeleteVpnGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeleteVpnGateway for more information on using the DeleteVpnGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeleteVpnGatewayRequest method.
//    req, resp := client.DeleteVpnGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpnGateway
func (c *EC2) DeleteVpnGatewayRequest(input *DeleteVpnGatewayInput) (req *request.Request, output *DeleteVpnGatewayOutput) {
	op := &request.Operation{
		Name:       opDeleteVpnGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteVpnGatewayInput{}
	}

	output = &DeleteVpnGatewayOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeleteVpnGateway API operation for Amazon Elastic Compute Cloud.
//
// Deletes the specified virtual private gateway. We recommend that before you
// delete a virtual private gateway, you detach it from the VPC and delete the
// VPN connection. Note that you don't need to delete the virtual private gateway
// if you plan to delete and recreate the VPN connection between your VPC and
// your network.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeleteVpnGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeleteVpnGateway
func (c *EC2) DeleteVpnGateway(input *DeleteVpnGatewayInput) (*DeleteVpnGatewayOutput, error) {
	req, out := c.DeleteVpnGatewayRequest(input)
	return out, req.Send()
}

// DeleteVpnGatewayWithContext is the same as DeleteVpnGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DeleteVpnGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeleteVpnGatewayWithContext(ctx aws.Context, input *DeleteVpnGatewayInput, opts ...request.Option) (*DeleteVpnGatewayOutput, error) {
	req, out := c.DeleteVpnGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeprovisionByoipCidr = "DeprovisionByoipCidr"

// DeprovisionByoipCidrRequest generates a "aws/request.Request" representing the
// client's request for the DeprovisionByoipCidr operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeprovisionByoipCidr for more information on using the DeprovisionByoipCidr
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeprovisionByoipCidrRequest method.
//    req, resp := client.DeprovisionByoipCidrRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeprovisionByoipCidr
func (c *EC2) DeprovisionByoipCidrRequest(input *DeprovisionByoipCidrInput) (req *request.Request, output *DeprovisionByoipCidrOutput) {
	op := &request.Operation{
		Name:       opDeprovisionByoipCidr,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeprovisionByoipCidrInput{}
	}

	output = &DeprovisionByoipCidrOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DeprovisionByoipCidr API operation for Amazon Elastic Compute Cloud.
//
// Releases the specified address range that you provisioned for use with your
// AWS resources through bring your own IP addresses (BYOIP) and deletes the
// corresponding address pool.
//
// Before you can release an address range, you must stop advertising it using
// WithdrawByoipCidr and you must not have any IP addresses allocated from its
// address range.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeprovisionByoipCidr for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeprovisionByoipCidr
func (c *EC2) DeprovisionByoipCidr(input *DeprovisionByoipCidrInput) (*DeprovisionByoipCidrOutput, error) {
	req, out := c.DeprovisionByoipCidrRequest(input)
	return out, req.Send()
}

// DeprovisionByoipCidrWithContext is the same as DeprovisionByoipCidr with the addition of
// the ability to pass a context and additional request options.
//
// See DeprovisionByoipCidr for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeprovisionByoipCidrWithContext(ctx aws.Context, input *DeprovisionByoipCidrInput, opts ...request.Option) (*DeprovisionByoipCidrOutput, error) {
	req, out := c.DeprovisionByoipCidrRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDeregisterImage = "DeregisterImage"

// DeregisterImageRequest generates a "aws/request.Request" representing the
// client's request for the DeregisterImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DeregisterImage for more information on using the DeregisterImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DeregisterImageRequest method.
//    req, resp := client.DeregisterImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeregisterImage
func (c *EC2) DeregisterImageRequest(input *DeregisterImageInput) (req *request.Request, output *DeregisterImageOutput) {
	op := &request.Operation{
		Name:       opDeregisterImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeregisterImageInput{}
	}

	output = &DeregisterImageOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DeregisterImage API operation for Amazon Elastic Compute Cloud.
//
// Deregisters the specified AMI. After you deregister an AMI, it can't be used
// to launch new instances; however, it doesn't affect any instances that you've
// already launched from the AMI. You'll continue to incur usage costs for those
// instances until you terminate them.
//
// When you deregister an Amazon EBS-backed AMI, it doesn't affect the snapshot
// that was created for the root volume of the instance during the AMI creation
// process. When you deregister an instance store-backed AMI, it doesn't affect
// the files that you uploaded to Amazon S3 when you created the AMI.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DeregisterImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DeregisterImage
func (c *EC2) DeregisterImage(input *DeregisterImageInput) (*DeregisterImageOutput, error) {
	req, out := c.DeregisterImageRequest(input)
	return out, req.Send()
}

// DeregisterImageWithContext is the same as DeregisterImage with the addition of
// the ability to pass a context and additional request options.
//
// See DeregisterImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DeregisterImageWithContext(ctx aws.Context, input *DeregisterImageInput, opts ...request.Option) (*DeregisterImageOutput, error) {
	req, out := c.DeregisterImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeAccountAttributes = "DescribeAccountAttributes"

// DescribeAccountAttributesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeAccountAttributes operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeAccountAttributes for more information on using the DescribeAccountAttributes
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeAccountAttributesRequest method.
//    req, resp := client.DescribeAccountAttributesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAccountAttributes
func (c *EC2) DescribeAccountAttributesRequest(input *DescribeAccountAttributesInput) (req *request.Request, output *DescribeAccountAttributesOutput) {
	op := &request.Operation{
		Name:       opDescribeAccountAttributes,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeAccountAttributesInput{}
	}

	output = &DescribeAccountAttributesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeAccountAttributes API operation for Amazon Elastic Compute Cloud.
//
// Describes attributes of your AWS account. The following are the supported
// account attributes:
//
//    * supported-platforms: Indicates whether your account can launch instances
//    into EC2-Classic and EC2-VPC, or only into EC2-VPC.
//
//    * default-vpc: The ID of the default VPC for your account, or none.
//
//    * max-instances: The maximum number of On-Demand Instances that you can
//    run.
//
//    * vpc-max-security-groups-per-interface: The maximum number of security
//    groups that you can assign to a network interface.
//
//    * max-elastic-ips: The maximum number of Elastic IP addresses that you
//    can allocate for use with EC2-Classic.
//
//    * vpc-max-elastic-ips: The maximum number of Elastic IP addresses that
//    you can allocate for use with EC2-VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeAccountAttributes for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAccountAttributes
func (c *EC2) DescribeAccountAttributes(input *DescribeAccountAttributesInput) (*DescribeAccountAttributesOutput, error) {
	req, out := c.DescribeAccountAttributesRequest(input)
	return out, req.Send()
}

// DescribeAccountAttributesWithContext is the same as DescribeAccountAttributes with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeAccountAttributes for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeAccountAttributesWithContext(ctx aws.Context, input *DescribeAccountAttributesInput, opts ...request.Option) (*DescribeAccountAttributesOutput, error) {
	req, out := c.DescribeAccountAttributesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeAddresses = "DescribeAddresses"

// DescribeAddressesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeAddresses operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeAddresses for more information on using the DescribeAddresses
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeAddressesRequest method.
//    req, resp := client.DescribeAddressesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAddresses
func (c *EC2) DescribeAddressesRequest(input *DescribeAddressesInput) (req *request.Request, output *DescribeAddressesOutput) {
	op := &request.Operation{
		Name:       opDescribeAddresses,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeAddressesInput{}
	}

	output = &DescribeAddressesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeAddresses API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your Elastic IP addresses.
//
// An Elastic IP address is for use in either the EC2-Classic platform or in
// a VPC. For more information, see Elastic IP Addresses (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeAddresses for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAddresses
func (c *EC2) DescribeAddresses(input *DescribeAddressesInput) (*DescribeAddressesOutput, error) {
	req, out := c.DescribeAddressesRequest(input)
	return out, req.Send()
}

// DescribeAddressesWithContext is the same as DescribeAddresses with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeAddresses for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeAddressesWithContext(ctx aws.Context, input *DescribeAddressesInput, opts ...request.Option) (*DescribeAddressesOutput, error) {
	req, out := c.DescribeAddressesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeAggregateIdFormat = "DescribeAggregateIdFormat"

// DescribeAggregateIdFormatRequest generates a "aws/request.Request" representing the
// client's request for the DescribeAggregateIdFormat operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeAggregateIdFormat for more information on using the DescribeAggregateIdFormat
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeAggregateIdFormatRequest method.
//    req, resp := client.DescribeAggregateIdFormatRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAggregateIdFormat
func (c *EC2) DescribeAggregateIdFormatRequest(input *DescribeAggregateIdFormatInput) (req *request.Request, output *DescribeAggregateIdFormatOutput) {
	op := &request.Operation{
		Name:       opDescribeAggregateIdFormat,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeAggregateIdFormatInput{}
	}

	output = &DescribeAggregateIdFormatOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeAggregateIdFormat API operation for Amazon Elastic Compute Cloud.
//
// Describes the longer ID format settings for all resource types in a specific
// region. This request is useful for performing a quick audit to determine
// whether a specific region is fully opted in for longer IDs (17-character
// IDs).
//
// This request only returns information about resource types that support longer
// IDs.
//
// The following resource types support longer IDs: bundle | conversion-task
// | customer-gateway | dhcp-options | elastic-ip-allocation | elastic-ip-association
// | export-task | flow-log | image | import-task | instance | internet-gateway
// | network-acl | network-acl-association | network-interface | network-interface-attachment
// | prefix-list | reservation | route-table | route-table-association | security-group
// | snapshot | subnet | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeAggregateIdFormat for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAggregateIdFormat
func (c *EC2) DescribeAggregateIdFormat(input *DescribeAggregateIdFormatInput) (*DescribeAggregateIdFormatOutput, error) {
	req, out := c.DescribeAggregateIdFormatRequest(input)
	return out, req.Send()
}

// DescribeAggregateIdFormatWithContext is the same as DescribeAggregateIdFormat with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeAggregateIdFormat for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeAggregateIdFormatWithContext(ctx aws.Context, input *DescribeAggregateIdFormatInput, opts ...request.Option) (*DescribeAggregateIdFormatOutput, error) {
	req, out := c.DescribeAggregateIdFormatRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeAvailabilityZones = "DescribeAvailabilityZones"

// DescribeAvailabilityZonesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeAvailabilityZones operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeAvailabilityZones for more information on using the DescribeAvailabilityZones
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeAvailabilityZonesRequest method.
//    req, resp := client.DescribeAvailabilityZonesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAvailabilityZones
func (c *EC2) DescribeAvailabilityZonesRequest(input *DescribeAvailabilityZonesInput) (req *request.Request, output *DescribeAvailabilityZonesOutput) {
	op := &request.Operation{
		Name:       opDescribeAvailabilityZones,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeAvailabilityZonesInput{}
	}

	output = &DescribeAvailabilityZonesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeAvailabilityZones API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of the Availability Zones that are available to you.
// The results include zones only for the region you're currently using. If
// there is an event impacting an Availability Zone, you can use this request
// to view the state and any provided message for that Availability Zone.
//
// For more information, see Regions and Availability Zones (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeAvailabilityZones for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAvailabilityZones
func (c *EC2) DescribeAvailabilityZones(input *DescribeAvailabilityZonesInput) (*DescribeAvailabilityZonesOutput, error) {
	req, out := c.DescribeAvailabilityZonesRequest(input)
	return out, req.Send()
}

// DescribeAvailabilityZonesWithContext is the same as DescribeAvailabilityZones with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeAvailabilityZones for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeAvailabilityZonesWithContext(ctx aws.Context, input *DescribeAvailabilityZonesInput, opts ...request.Option) (*DescribeAvailabilityZonesOutput, error) {
	req, out := c.DescribeAvailabilityZonesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeBundleTasks = "DescribeBundleTasks"

// DescribeBundleTasksRequest generates a "aws/request.Request" representing the
// client's request for the DescribeBundleTasks operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeBundleTasks for more information on using the DescribeBundleTasks
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeBundleTasksRequest method.
//    req, resp := client.DescribeBundleTasksRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeBundleTasks
func (c *EC2) DescribeBundleTasksRequest(input *DescribeBundleTasksInput) (req *request.Request, output *DescribeBundleTasksOutput) {
	op := &request.Operation{
		Name:       opDescribeBundleTasks,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeBundleTasksInput{}
	}

	output = &DescribeBundleTasksOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeBundleTasks API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your bundling tasks.
//
// Completed bundle tasks are listed for only a limited time. If your bundle
// task is no longer in the list, you can still register an AMI from it. Just
// use RegisterImage with the Amazon S3 bucket name and image manifest name
// you provided to the bundle task.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeBundleTasks for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeBundleTasks
func (c *EC2) DescribeBundleTasks(input *DescribeBundleTasksInput) (*DescribeBundleTasksOutput, error) {
	req, out := c.DescribeBundleTasksRequest(input)
	return out, req.Send()
}

// DescribeBundleTasksWithContext is the same as DescribeBundleTasks with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeBundleTasks for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeBundleTasksWithContext(ctx aws.Context, input *DescribeBundleTasksInput, opts ...request.Option) (*DescribeBundleTasksOutput, error) {
	req, out := c.DescribeBundleTasksRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeByoipCidrs = "DescribeByoipCidrs"

// DescribeByoipCidrsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeByoipCidrs operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeByoipCidrs for more information on using the DescribeByoipCidrs
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeByoipCidrsRequest method.
//    req, resp := client.DescribeByoipCidrsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeByoipCidrs
func (c *EC2) DescribeByoipCidrsRequest(input *DescribeByoipCidrsInput) (req *request.Request, output *DescribeByoipCidrsOutput) {
	op := &request.Operation{
		Name:       opDescribeByoipCidrs,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeByoipCidrsInput{}
	}

	output = &DescribeByoipCidrsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeByoipCidrs API operation for Amazon Elastic Compute Cloud.
//
// Describes the IP address ranges that were specified in calls to ProvisionByoipCidr.
//
// To describe the address pools that were created when you provisioned the
// address ranges, use DescribePublicIpv4Pools.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeByoipCidrs for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeByoipCidrs
func (c *EC2) DescribeByoipCidrs(input *DescribeByoipCidrsInput) (*DescribeByoipCidrsOutput, error) {
	req, out := c.DescribeByoipCidrsRequest(input)
	return out, req.Send()
}

// DescribeByoipCidrsWithContext is the same as DescribeByoipCidrs with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeByoipCidrs for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeByoipCidrsWithContext(ctx aws.Context, input *DescribeByoipCidrsInput, opts ...request.Option) (*DescribeByoipCidrsOutput, error) {
	req, out := c.DescribeByoipCidrsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeCapacityReservations = "DescribeCapacityReservations"

// DescribeCapacityReservationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeCapacityReservations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeCapacityReservations for more information on using the DescribeCapacityReservations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeCapacityReservationsRequest method.
//    req, resp := client.DescribeCapacityReservationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeCapacityReservations
func (c *EC2) DescribeCapacityReservationsRequest(input *DescribeCapacityReservationsInput) (req *request.Request, output *DescribeCapacityReservationsOutput) {
	op := &request.Operation{
		Name:       opDescribeCapacityReservations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeCapacityReservationsInput{}
	}

	output = &DescribeCapacityReservationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeCapacityReservations API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your Capacity Reservations. The results describe
// only the Capacity Reservations in the AWS Region that you're currently using.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeCapacityReservations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeCapacityReservations
func (c *EC2) DescribeCapacityReservations(input *DescribeCapacityReservationsInput) (*DescribeCapacityReservationsOutput, error) {
	req, out := c.DescribeCapacityReservationsRequest(input)
	return out, req.Send()
}

// DescribeCapacityReservationsWithContext is the same as DescribeCapacityReservations with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeCapacityReservations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeCapacityReservationsWithContext(ctx aws.Context, input *DescribeCapacityReservationsInput, opts ...request.Option) (*DescribeCapacityReservationsOutput, error) {
	req, out := c.DescribeCapacityReservationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeClassicLinkInstances = "DescribeClassicLinkInstances"

// DescribeClassicLinkInstancesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClassicLinkInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClassicLinkInstances for more information on using the DescribeClassicLinkInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClassicLinkInstancesRequest method.
//    req, resp := client.DescribeClassicLinkInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClassicLinkInstances
func (c *EC2) DescribeClassicLinkInstancesRequest(input *DescribeClassicLinkInstancesInput) (req *request.Request, output *DescribeClassicLinkInstancesOutput) {
	op := &request.Operation{
		Name:       opDescribeClassicLinkInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeClassicLinkInstancesInput{}
	}

	output = &DescribeClassicLinkInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClassicLinkInstances API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your linked EC2-Classic instances. This request
// only returns information about EC2-Classic instances linked to a VPC through
// ClassicLink. You cannot use this request to return information about other
// instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeClassicLinkInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClassicLinkInstances
func (c *EC2) DescribeClassicLinkInstances(input *DescribeClassicLinkInstancesInput) (*DescribeClassicLinkInstancesOutput, error) {
	req, out := c.DescribeClassicLinkInstancesRequest(input)
	return out, req.Send()
}

// DescribeClassicLinkInstancesWithContext is the same as DescribeClassicLinkInstances with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClassicLinkInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeClassicLinkInstancesWithContext(ctx aws.Context, input *DescribeClassicLinkInstancesInput, opts ...request.Option) (*DescribeClassicLinkInstancesOutput, error) {
	req, out := c.DescribeClassicLinkInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeClientVpnAuthorizationRules = "DescribeClientVpnAuthorizationRules"

// DescribeClientVpnAuthorizationRulesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClientVpnAuthorizationRules operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClientVpnAuthorizationRules for more information on using the DescribeClientVpnAuthorizationRules
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClientVpnAuthorizationRulesRequest method.
//    req, resp := client.DescribeClientVpnAuthorizationRulesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnAuthorizationRules
func (c *EC2) DescribeClientVpnAuthorizationRulesRequest(input *DescribeClientVpnAuthorizationRulesInput) (req *request.Request, output *DescribeClientVpnAuthorizationRulesOutput) {
	op := &request.Operation{
		Name:       opDescribeClientVpnAuthorizationRules,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeClientVpnAuthorizationRulesInput{}
	}

	output = &DescribeClientVpnAuthorizationRulesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClientVpnAuthorizationRules API operation for Amazon Elastic Compute Cloud.
//
// Describes the authorization rules for a specified Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeClientVpnAuthorizationRules for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnAuthorizationRules
func (c *EC2) DescribeClientVpnAuthorizationRules(input *DescribeClientVpnAuthorizationRulesInput) (*DescribeClientVpnAuthorizationRulesOutput, error) {
	req, out := c.DescribeClientVpnAuthorizationRulesRequest(input)
	return out, req.Send()
}

// DescribeClientVpnAuthorizationRulesWithContext is the same as DescribeClientVpnAuthorizationRules with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClientVpnAuthorizationRules for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeClientVpnAuthorizationRulesWithContext(ctx aws.Context, input *DescribeClientVpnAuthorizationRulesInput, opts ...request.Option) (*DescribeClientVpnAuthorizationRulesOutput, error) {
	req, out := c.DescribeClientVpnAuthorizationRulesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeClientVpnConnections = "DescribeClientVpnConnections"

// DescribeClientVpnConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClientVpnConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClientVpnConnections for more information on using the DescribeClientVpnConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClientVpnConnectionsRequest method.
//    req, resp := client.DescribeClientVpnConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnConnections
func (c *EC2) DescribeClientVpnConnectionsRequest(input *DescribeClientVpnConnectionsInput) (req *request.Request, output *DescribeClientVpnConnectionsOutput) {
	op := &request.Operation{
		Name:       opDescribeClientVpnConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeClientVpnConnectionsInput{}
	}

	output = &DescribeClientVpnConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClientVpnConnections API operation for Amazon Elastic Compute Cloud.
//
// Describes active client connections and connections that have been terminated
// within the last 60 minutes for the specified Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeClientVpnConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnConnections
func (c *EC2) DescribeClientVpnConnections(input *DescribeClientVpnConnectionsInput) (*DescribeClientVpnConnectionsOutput, error) {
	req, out := c.DescribeClientVpnConnectionsRequest(input)
	return out, req.Send()
}

// DescribeClientVpnConnectionsWithContext is the same as DescribeClientVpnConnections with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClientVpnConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeClientVpnConnectionsWithContext(ctx aws.Context, input *DescribeClientVpnConnectionsInput, opts ...request.Option) (*DescribeClientVpnConnectionsOutput, error) {
	req, out := c.DescribeClientVpnConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeClientVpnEndpoints = "DescribeClientVpnEndpoints"

// DescribeClientVpnEndpointsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClientVpnEndpoints operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClientVpnEndpoints for more information on using the DescribeClientVpnEndpoints
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClientVpnEndpointsRequest method.
//    req, resp := client.DescribeClientVpnEndpointsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnEndpoints
func (c *EC2) DescribeClientVpnEndpointsRequest(input *DescribeClientVpnEndpointsInput) (req *request.Request, output *DescribeClientVpnEndpointsOutput) {
	op := &request.Operation{
		Name:       opDescribeClientVpnEndpoints,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeClientVpnEndpointsInput{}
	}

	output = &DescribeClientVpnEndpointsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClientVpnEndpoints API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more Client VPN endpoints in the account.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeClientVpnEndpoints for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnEndpoints
func (c *EC2) DescribeClientVpnEndpoints(input *DescribeClientVpnEndpointsInput) (*DescribeClientVpnEndpointsOutput, error) {
	req, out := c.DescribeClientVpnEndpointsRequest(input)
	return out, req.Send()
}

// DescribeClientVpnEndpointsWithContext is the same as DescribeClientVpnEndpoints with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClientVpnEndpoints for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeClientVpnEndpointsWithContext(ctx aws.Context, input *DescribeClientVpnEndpointsInput, opts ...request.Option) (*DescribeClientVpnEndpointsOutput, error) {
	req, out := c.DescribeClientVpnEndpointsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeClientVpnRoutes = "DescribeClientVpnRoutes"

// DescribeClientVpnRoutesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClientVpnRoutes operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClientVpnRoutes for more information on using the DescribeClientVpnRoutes
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClientVpnRoutesRequest method.
//    req, resp := client.DescribeClientVpnRoutesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnRoutes
func (c *EC2) DescribeClientVpnRoutesRequest(input *DescribeClientVpnRoutesInput) (req *request.Request, output *DescribeClientVpnRoutesOutput) {
	op := &request.Operation{
		Name:       opDescribeClientVpnRoutes,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeClientVpnRoutesInput{}
	}

	output = &DescribeClientVpnRoutesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClientVpnRoutes API operation for Amazon Elastic Compute Cloud.
//
// Describes the routes for the specified Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeClientVpnRoutes for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnRoutes
func (c *EC2) DescribeClientVpnRoutes(input *DescribeClientVpnRoutesInput) (*DescribeClientVpnRoutesOutput, error) {
	req, out := c.DescribeClientVpnRoutesRequest(input)
	return out, req.Send()
}

// DescribeClientVpnRoutesWithContext is the same as DescribeClientVpnRoutes with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClientVpnRoutes for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeClientVpnRoutesWithContext(ctx aws.Context, input *DescribeClientVpnRoutesInput, opts ...request.Option) (*DescribeClientVpnRoutesOutput, error) {
	req, out := c.DescribeClientVpnRoutesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeClientVpnTargetNetworks = "DescribeClientVpnTargetNetworks"

// DescribeClientVpnTargetNetworksRequest generates a "aws/request.Request" representing the
// client's request for the DescribeClientVpnTargetNetworks operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeClientVpnTargetNetworks for more information on using the DescribeClientVpnTargetNetworks
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeClientVpnTargetNetworksRequest method.
//    req, resp := client.DescribeClientVpnTargetNetworksRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnTargetNetworks
func (c *EC2) DescribeClientVpnTargetNetworksRequest(input *DescribeClientVpnTargetNetworksInput) (req *request.Request, output *DescribeClientVpnTargetNetworksOutput) {
	op := &request.Operation{
		Name:       opDescribeClientVpnTargetNetworks,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeClientVpnTargetNetworksInput{}
	}

	output = &DescribeClientVpnTargetNetworksOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeClientVpnTargetNetworks API operation for Amazon Elastic Compute Cloud.
//
// Describes the target networks associated with the specified Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeClientVpnTargetNetworks for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeClientVpnTargetNetworks
func (c *EC2) DescribeClientVpnTargetNetworks(input *DescribeClientVpnTargetNetworksInput) (*DescribeClientVpnTargetNetworksOutput, error) {
	req, out := c.DescribeClientVpnTargetNetworksRequest(input)
	return out, req.Send()
}

// DescribeClientVpnTargetNetworksWithContext is the same as DescribeClientVpnTargetNetworks with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeClientVpnTargetNetworks for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeClientVpnTargetNetworksWithContext(ctx aws.Context, input *DescribeClientVpnTargetNetworksInput, opts ...request.Option) (*DescribeClientVpnTargetNetworksOutput, error) {
	req, out := c.DescribeClientVpnTargetNetworksRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeConversionTasks = "DescribeConversionTasks"

// DescribeConversionTasksRequest generates a "aws/request.Request" representing the
// client's request for the DescribeConversionTasks operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeConversionTasks for more information on using the DescribeConversionTasks
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeConversionTasksRequest method.
//    req, resp := client.DescribeConversionTasksRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeConversionTasks
func (c *EC2) DescribeConversionTasksRequest(input *DescribeConversionTasksInput) (req *request.Request, output *DescribeConversionTasksOutput) {
	op := &request.Operation{
		Name:       opDescribeConversionTasks,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeConversionTasksInput{}
	}

	output = &DescribeConversionTasksOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeConversionTasks API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your conversion tasks. For more information, see
// the VM Import/Export User Guide (https://docs.aws.amazon.com/vm-import/latest/userguide/).
//
// For information about the import manifest referenced by this API action,
// see VM Import Manifest (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeConversionTasks for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeConversionTasks
func (c *EC2) DescribeConversionTasks(input *DescribeConversionTasksInput) (*DescribeConversionTasksOutput, error) {
	req, out := c.DescribeConversionTasksRequest(input)
	return out, req.Send()
}

// DescribeConversionTasksWithContext is the same as DescribeConversionTasks with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeConversionTasks for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeConversionTasksWithContext(ctx aws.Context, input *DescribeConversionTasksInput, opts ...request.Option) (*DescribeConversionTasksOutput, error) {
	req, out := c.DescribeConversionTasksRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeCustomerGateways = "DescribeCustomerGateways"

// DescribeCustomerGatewaysRequest generates a "aws/request.Request" representing the
// client's request for the DescribeCustomerGateways operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeCustomerGateways for more information on using the DescribeCustomerGateways
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeCustomerGatewaysRequest method.
//    req, resp := client.DescribeCustomerGatewaysRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeCustomerGateways
func (c *EC2) DescribeCustomerGatewaysRequest(input *DescribeCustomerGatewaysInput) (req *request.Request, output *DescribeCustomerGatewaysOutput) {
	op := &request.Operation{
		Name:       opDescribeCustomerGateways,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeCustomerGatewaysInput{}
	}

	output = &DescribeCustomerGatewaysOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeCustomerGateways API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your VPN customer gateways.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeCustomerGateways for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeCustomerGateways
func (c *EC2) DescribeCustomerGateways(input *DescribeCustomerGatewaysInput) (*DescribeCustomerGatewaysOutput, error) {
	req, out := c.DescribeCustomerGatewaysRequest(input)
	return out, req.Send()
}

// DescribeCustomerGatewaysWithContext is the same as DescribeCustomerGateways with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeCustomerGateways for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeCustomerGatewaysWithContext(ctx aws.Context, input *DescribeCustomerGatewaysInput, opts ...request.Option) (*DescribeCustomerGatewaysOutput, error) {
	req, out := c.DescribeCustomerGatewaysRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeDhcpOptions = "DescribeDhcpOptions"

// DescribeDhcpOptionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeDhcpOptions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeDhcpOptions for more information on using the DescribeDhcpOptions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeDhcpOptionsRequest method.
//    req, resp := client.DescribeDhcpOptionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeDhcpOptions
func (c *EC2) DescribeDhcpOptionsRequest(input *DescribeDhcpOptionsInput) (req *request.Request, output *DescribeDhcpOptionsOutput) {
	op := &request.Operation{
		Name:       opDescribeDhcpOptions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeDhcpOptionsInput{}
	}

	output = &DescribeDhcpOptionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeDhcpOptions API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your DHCP options sets.
//
// For more information, see DHCP Options Sets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_DHCP_Options.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeDhcpOptions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeDhcpOptions
func (c *EC2) DescribeDhcpOptions(input *DescribeDhcpOptionsInput) (*DescribeDhcpOptionsOutput, error) {
	req, out := c.DescribeDhcpOptionsRequest(input)
	return out, req.Send()
}

// DescribeDhcpOptionsWithContext is the same as DescribeDhcpOptions with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeDhcpOptions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeDhcpOptionsWithContext(ctx aws.Context, input *DescribeDhcpOptionsInput, opts ...request.Option) (*DescribeDhcpOptionsOutput, error) {
	req, out := c.DescribeDhcpOptionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeEgressOnlyInternetGateways = "DescribeEgressOnlyInternetGateways"

// DescribeEgressOnlyInternetGatewaysRequest generates a "aws/request.Request" representing the
// client's request for the DescribeEgressOnlyInternetGateways operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeEgressOnlyInternetGateways for more information on using the DescribeEgressOnlyInternetGateways
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeEgressOnlyInternetGatewaysRequest method.
//    req, resp := client.DescribeEgressOnlyInternetGatewaysRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeEgressOnlyInternetGateways
func (c *EC2) DescribeEgressOnlyInternetGatewaysRequest(input *DescribeEgressOnlyInternetGatewaysInput) (req *request.Request, output *DescribeEgressOnlyInternetGatewaysOutput) {
	op := &request.Operation{
		Name:       opDescribeEgressOnlyInternetGateways,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeEgressOnlyInternetGatewaysInput{}
	}

	output = &DescribeEgressOnlyInternetGatewaysOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeEgressOnlyInternetGateways API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your egress-only internet gateways.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeEgressOnlyInternetGateways for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeEgressOnlyInternetGateways
func (c *EC2) DescribeEgressOnlyInternetGateways(input *DescribeEgressOnlyInternetGatewaysInput) (*DescribeEgressOnlyInternetGatewaysOutput, error) {
	req, out := c.DescribeEgressOnlyInternetGatewaysRequest(input)
	return out, req.Send()
}

// DescribeEgressOnlyInternetGatewaysWithContext is the same as DescribeEgressOnlyInternetGateways with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeEgressOnlyInternetGateways for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeEgressOnlyInternetGatewaysWithContext(ctx aws.Context, input *DescribeEgressOnlyInternetGatewaysInput, opts ...request.Option) (*DescribeEgressOnlyInternetGatewaysOutput, error) {
	req, out := c.DescribeEgressOnlyInternetGatewaysRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeElasticGpus = "DescribeElasticGpus"

// DescribeElasticGpusRequest generates a "aws/request.Request" representing the
// client's request for the DescribeElasticGpus operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeElasticGpus for more information on using the DescribeElasticGpus
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeElasticGpusRequest method.
//    req, resp := client.DescribeElasticGpusRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeElasticGpus
func (c *EC2) DescribeElasticGpusRequest(input *DescribeElasticGpusInput) (req *request.Request, output *DescribeElasticGpusOutput) {
	op := &request.Operation{
		Name:       opDescribeElasticGpus,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeElasticGpusInput{}
	}

	output = &DescribeElasticGpusOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeElasticGpus API operation for Amazon Elastic Compute Cloud.
//
// Describes the Elastic Graphics accelerator associated with your instances.
// For more information about Elastic Graphics, see Amazon Elastic Graphics
// (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-graphics.html).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeElasticGpus for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeElasticGpus
func (c *EC2) DescribeElasticGpus(input *DescribeElasticGpusInput) (*DescribeElasticGpusOutput, error) {
	req, out := c.DescribeElasticGpusRequest(input)
	return out, req.Send()
}

// DescribeElasticGpusWithContext is the same as DescribeElasticGpus with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeElasticGpus for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeElasticGpusWithContext(ctx aws.Context, input *DescribeElasticGpusInput, opts ...request.Option) (*DescribeElasticGpusOutput, error) {
	req, out := c.DescribeElasticGpusRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeExportTasks = "DescribeExportTasks"

// DescribeExportTasksRequest generates a "aws/request.Request" representing the
// client's request for the DescribeExportTasks operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeExportTasks for more information on using the DescribeExportTasks
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeExportTasksRequest method.
//    req, resp := client.DescribeExportTasksRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeExportTasks
func (c *EC2) DescribeExportTasksRequest(input *DescribeExportTasksInput) (req *request.Request, output *DescribeExportTasksOutput) {
	op := &request.Operation{
		Name:       opDescribeExportTasks,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeExportTasksInput{}
	}

	output = &DescribeExportTasksOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeExportTasks API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your export tasks.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeExportTasks for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeExportTasks
func (c *EC2) DescribeExportTasks(input *DescribeExportTasksInput) (*DescribeExportTasksOutput, error) {
	req, out := c.DescribeExportTasksRequest(input)
	return out, req.Send()
}

// DescribeExportTasksWithContext is the same as DescribeExportTasks with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeExportTasks for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeExportTasksWithContext(ctx aws.Context, input *DescribeExportTasksInput, opts ...request.Option) (*DescribeExportTasksOutput, error) {
	req, out := c.DescribeExportTasksRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeFleetHistory = "DescribeFleetHistory"

// DescribeFleetHistoryRequest generates a "aws/request.Request" representing the
// client's request for the DescribeFleetHistory operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeFleetHistory for more information on using the DescribeFleetHistory
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeFleetHistoryRequest method.
//    req, resp := client.DescribeFleetHistoryRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFleetHistory
func (c *EC2) DescribeFleetHistoryRequest(input *DescribeFleetHistoryInput) (req *request.Request, output *DescribeFleetHistoryOutput) {
	op := &request.Operation{
		Name:       opDescribeFleetHistory,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeFleetHistoryInput{}
	}

	output = &DescribeFleetHistoryOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeFleetHistory API operation for Amazon Elastic Compute Cloud.
//
// Describes the events for the specified EC2 Fleet during the specified time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeFleetHistory for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFleetHistory
func (c *EC2) DescribeFleetHistory(input *DescribeFleetHistoryInput) (*DescribeFleetHistoryOutput, error) {
	req, out := c.DescribeFleetHistoryRequest(input)
	return out, req.Send()
}

// DescribeFleetHistoryWithContext is the same as DescribeFleetHistory with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeFleetHistory for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeFleetHistoryWithContext(ctx aws.Context, input *DescribeFleetHistoryInput, opts ...request.Option) (*DescribeFleetHistoryOutput, error) {
	req, out := c.DescribeFleetHistoryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeFleetInstances = "DescribeFleetInstances"

// DescribeFleetInstancesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeFleetInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeFleetInstances for more information on using the DescribeFleetInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeFleetInstancesRequest method.
//    req, resp := client.DescribeFleetInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFleetInstances
func (c *EC2) DescribeFleetInstancesRequest(input *DescribeFleetInstancesInput) (req *request.Request, output *DescribeFleetInstancesOutput) {
	op := &request.Operation{
		Name:       opDescribeFleetInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeFleetInstancesInput{}
	}

	output = &DescribeFleetInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeFleetInstances API operation for Amazon Elastic Compute Cloud.
//
// Describes the running instances for the specified EC2 Fleet.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeFleetInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFleetInstances
func (c *EC2) DescribeFleetInstances(input *DescribeFleetInstancesInput) (*DescribeFleetInstancesOutput, error) {
	req, out := c.DescribeFleetInstancesRequest(input)
	return out, req.Send()
}

// DescribeFleetInstancesWithContext is the same as DescribeFleetInstances with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeFleetInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeFleetInstancesWithContext(ctx aws.Context, input *DescribeFleetInstancesInput, opts ...request.Option) (*DescribeFleetInstancesOutput, error) {
	req, out := c.DescribeFleetInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeFleets = "DescribeFleets"

// DescribeFleetsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeFleets operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeFleets for more information on using the DescribeFleets
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeFleetsRequest method.
//    req, resp := client.DescribeFleetsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFleets
func (c *EC2) DescribeFleetsRequest(input *DescribeFleetsInput) (req *request.Request, output *DescribeFleetsOutput) {
	op := &request.Operation{
		Name:       opDescribeFleets,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeFleetsInput{}
	}

	output = &DescribeFleetsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeFleets API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your EC2 Fleets.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeFleets for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFleets
func (c *EC2) DescribeFleets(input *DescribeFleetsInput) (*DescribeFleetsOutput, error) {
	req, out := c.DescribeFleetsRequest(input)
	return out, req.Send()
}

// DescribeFleetsWithContext is the same as DescribeFleets with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeFleets for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeFleetsWithContext(ctx aws.Context, input *DescribeFleetsInput, opts ...request.Option) (*DescribeFleetsOutput, error) {
	req, out := c.DescribeFleetsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeFlowLogs = "DescribeFlowLogs"

// DescribeFlowLogsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeFlowLogs operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeFlowLogs for more information on using the DescribeFlowLogs
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeFlowLogsRequest method.
//    req, resp := client.DescribeFlowLogsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFlowLogs
func (c *EC2) DescribeFlowLogsRequest(input *DescribeFlowLogsInput) (req *request.Request, output *DescribeFlowLogsOutput) {
	op := &request.Operation{
		Name:       opDescribeFlowLogs,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeFlowLogsInput{}
	}

	output = &DescribeFlowLogsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeFlowLogs API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more flow logs. To view the information in your flow logs
// (the log streams for the network interfaces), you must use the CloudWatch
// Logs console or the CloudWatch Logs API.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeFlowLogs for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFlowLogs
func (c *EC2) DescribeFlowLogs(input *DescribeFlowLogsInput) (*DescribeFlowLogsOutput, error) {
	req, out := c.DescribeFlowLogsRequest(input)
	return out, req.Send()
}

// DescribeFlowLogsWithContext is the same as DescribeFlowLogs with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeFlowLogs for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeFlowLogsWithContext(ctx aws.Context, input *DescribeFlowLogsInput, opts ...request.Option) (*DescribeFlowLogsOutput, error) {
	req, out := c.DescribeFlowLogsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeFpgaImageAttribute = "DescribeFpgaImageAttribute"

// DescribeFpgaImageAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeFpgaImageAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeFpgaImageAttribute for more information on using the DescribeFpgaImageAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeFpgaImageAttributeRequest method.
//    req, resp := client.DescribeFpgaImageAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFpgaImageAttribute
func (c *EC2) DescribeFpgaImageAttributeRequest(input *DescribeFpgaImageAttributeInput) (req *request.Request, output *DescribeFpgaImageAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeFpgaImageAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeFpgaImageAttributeInput{}
	}

	output = &DescribeFpgaImageAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeFpgaImageAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified attribute of the specified Amazon FPGA Image (AFI).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeFpgaImageAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFpgaImageAttribute
func (c *EC2) DescribeFpgaImageAttribute(input *DescribeFpgaImageAttributeInput) (*DescribeFpgaImageAttributeOutput, error) {
	req, out := c.DescribeFpgaImageAttributeRequest(input)
	return out, req.Send()
}

// DescribeFpgaImageAttributeWithContext is the same as DescribeFpgaImageAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeFpgaImageAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeFpgaImageAttributeWithContext(ctx aws.Context, input *DescribeFpgaImageAttributeInput, opts ...request.Option) (*DescribeFpgaImageAttributeOutput, error) {
	req, out := c.DescribeFpgaImageAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeFpgaImages = "DescribeFpgaImages"

// DescribeFpgaImagesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeFpgaImages operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeFpgaImages for more information on using the DescribeFpgaImages
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeFpgaImagesRequest method.
//    req, resp := client.DescribeFpgaImagesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFpgaImages
func (c *EC2) DescribeFpgaImagesRequest(input *DescribeFpgaImagesInput) (req *request.Request, output *DescribeFpgaImagesOutput) {
	op := &request.Operation{
		Name:       opDescribeFpgaImages,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeFpgaImagesInput{}
	}

	output = &DescribeFpgaImagesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeFpgaImages API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more available Amazon FPGA Images (AFIs). These include
// public AFIs, private AFIs that you own, and AFIs owned by other AWS accounts
// for which you have load permissions.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeFpgaImages for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeFpgaImages
func (c *EC2) DescribeFpgaImages(input *DescribeFpgaImagesInput) (*DescribeFpgaImagesOutput, error) {
	req, out := c.DescribeFpgaImagesRequest(input)
	return out, req.Send()
}

// DescribeFpgaImagesWithContext is the same as DescribeFpgaImages with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeFpgaImages for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeFpgaImagesWithContext(ctx aws.Context, input *DescribeFpgaImagesInput, opts ...request.Option) (*DescribeFpgaImagesOutput, error) {
	req, out := c.DescribeFpgaImagesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeHostReservationOfferings = "DescribeHostReservationOfferings"

// DescribeHostReservationOfferingsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeHostReservationOfferings operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeHostReservationOfferings for more information on using the DescribeHostReservationOfferings
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeHostReservationOfferingsRequest method.
//    req, resp := client.DescribeHostReservationOfferingsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeHostReservationOfferings
func (c *EC2) DescribeHostReservationOfferingsRequest(input *DescribeHostReservationOfferingsInput) (req *request.Request, output *DescribeHostReservationOfferingsOutput) {
	op := &request.Operation{
		Name:       opDescribeHostReservationOfferings,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeHostReservationOfferingsInput{}
	}

	output = &DescribeHostReservationOfferingsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeHostReservationOfferings API operation for Amazon Elastic Compute Cloud.
//
// Describes the Dedicated Host reservations that are available to purchase.
//
// The results describe all the Dedicated Host reservation offerings, including
// offerings that may not match the instance family and Region of your Dedicated
// Hosts. When purchasing an offering, ensure that the instance family and Region
// of the offering matches that of the Dedicated Hosts with which it is to be
// associated. For more information about supported instance types, see Dedicated
// Hosts Overview (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeHostReservationOfferings for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeHostReservationOfferings
func (c *EC2) DescribeHostReservationOfferings(input *DescribeHostReservationOfferingsInput) (*DescribeHostReservationOfferingsOutput, error) {
	req, out := c.DescribeHostReservationOfferingsRequest(input)
	return out, req.Send()
}

// DescribeHostReservationOfferingsWithContext is the same as DescribeHostReservationOfferings with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeHostReservationOfferings for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeHostReservationOfferingsWithContext(ctx aws.Context, input *DescribeHostReservationOfferingsInput, opts ...request.Option) (*DescribeHostReservationOfferingsOutput, error) {
	req, out := c.DescribeHostReservationOfferingsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeHostReservations = "DescribeHostReservations"

// DescribeHostReservationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeHostReservations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeHostReservations for more information on using the DescribeHostReservations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeHostReservationsRequest method.
//    req, resp := client.DescribeHostReservationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeHostReservations
func (c *EC2) DescribeHostReservationsRequest(input *DescribeHostReservationsInput) (req *request.Request, output *DescribeHostReservationsOutput) {
	op := &request.Operation{
		Name:       opDescribeHostReservations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeHostReservationsInput{}
	}

	output = &DescribeHostReservationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeHostReservations API operation for Amazon Elastic Compute Cloud.
//
// Describes reservations that are associated with Dedicated Hosts in your account.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeHostReservations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeHostReservations
func (c *EC2) DescribeHostReservations(input *DescribeHostReservationsInput) (*DescribeHostReservationsOutput, error) {
	req, out := c.DescribeHostReservationsRequest(input)
	return out, req.Send()
}

// DescribeHostReservationsWithContext is the same as DescribeHostReservations with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeHostReservations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeHostReservationsWithContext(ctx aws.Context, input *DescribeHostReservationsInput, opts ...request.Option) (*DescribeHostReservationsOutput, error) {
	req, out := c.DescribeHostReservationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeHosts = "DescribeHosts"

// DescribeHostsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeHosts operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeHosts for more information on using the DescribeHosts
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeHostsRequest method.
//    req, resp := client.DescribeHostsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeHosts
func (c *EC2) DescribeHostsRequest(input *DescribeHostsInput) (req *request.Request, output *DescribeHostsOutput) {
	op := &request.Operation{
		Name:       opDescribeHosts,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeHostsInput{}
	}

	output = &DescribeHostsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeHosts API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your Dedicated Hosts.
//
// The results describe only the Dedicated Hosts in the Region you're currently
// using. All listed instances consume capacity on your Dedicated Host. Dedicated
// Hosts that have recently been released are listed with the state released.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeHosts for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeHosts
func (c *EC2) DescribeHosts(input *DescribeHostsInput) (*DescribeHostsOutput, error) {
	req, out := c.DescribeHostsRequest(input)
	return out, req.Send()
}

// DescribeHostsWithContext is the same as DescribeHosts with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeHosts for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeHostsWithContext(ctx aws.Context, input *DescribeHostsInput, opts ...request.Option) (*DescribeHostsOutput, error) {
	req, out := c.DescribeHostsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeIamInstanceProfileAssociations = "DescribeIamInstanceProfileAssociations"

// DescribeIamInstanceProfileAssociationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeIamInstanceProfileAssociations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeIamInstanceProfileAssociations for more information on using the DescribeIamInstanceProfileAssociations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeIamInstanceProfileAssociationsRequest method.
//    req, resp := client.DescribeIamInstanceProfileAssociationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeIamInstanceProfileAssociations
func (c *EC2) DescribeIamInstanceProfileAssociationsRequest(input *DescribeIamInstanceProfileAssociationsInput) (req *request.Request, output *DescribeIamInstanceProfileAssociationsOutput) {
	op := &request.Operation{
		Name:       opDescribeIamInstanceProfileAssociations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeIamInstanceProfileAssociationsInput{}
	}

	output = &DescribeIamInstanceProfileAssociationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeIamInstanceProfileAssociations API operation for Amazon Elastic Compute Cloud.
//
// Describes your IAM instance profile associations.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeIamInstanceProfileAssociations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeIamInstanceProfileAssociations
func (c *EC2) DescribeIamInstanceProfileAssociations(input *DescribeIamInstanceProfileAssociationsInput) (*DescribeIamInstanceProfileAssociationsOutput, error) {
	req, out := c.DescribeIamInstanceProfileAssociationsRequest(input)
	return out, req.Send()
}

// DescribeIamInstanceProfileAssociationsWithContext is the same as DescribeIamInstanceProfileAssociations with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeIamInstanceProfileAssociations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeIamInstanceProfileAssociationsWithContext(ctx aws.Context, input *DescribeIamInstanceProfileAssociationsInput, opts ...request.Option) (*DescribeIamInstanceProfileAssociationsOutput, error) {
	req, out := c.DescribeIamInstanceProfileAssociationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeIdFormat = "DescribeIdFormat"

// DescribeIdFormatRequest generates a "aws/request.Request" representing the
// client's request for the DescribeIdFormat operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeIdFormat for more information on using the DescribeIdFormat
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeIdFormatRequest method.
//    req, resp := client.DescribeIdFormatRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeIdFormat
func (c *EC2) DescribeIdFormatRequest(input *DescribeIdFormatInput) (req *request.Request, output *DescribeIdFormatOutput) {
	op := &request.Operation{
		Name:       opDescribeIdFormat,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeIdFormatInput{}
	}

	output = &DescribeIdFormatOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeIdFormat API operation for Amazon Elastic Compute Cloud.
//
// Describes the ID format settings for your resources on a per-region basis,
// for example, to view which resource types are enabled for longer IDs. This
// request only returns information about resource types whose ID formats can
// be modified; it does not return information about other resource types.
//
// The following resource types support longer IDs: bundle | conversion-task
// | customer-gateway | dhcp-options | elastic-ip-allocation | elastic-ip-association
// | export-task | flow-log | image | import-task | instance | internet-gateway
// | network-acl | network-acl-association | network-interface | network-interface-attachment
// | prefix-list | reservation | route-table | route-table-association | security-group
// | snapshot | subnet | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway.
//
// These settings apply to the IAM user who makes the request; they do not apply
// to the entire AWS account. By default, an IAM user defaults to the same settings
// as the root user, unless they explicitly override the settings by running
// the ModifyIdFormat command. Resources created with longer IDs are visible
// to all IAM users, regardless of these settings and provided that they have
// permission to use the relevant Describe command for the resource type.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeIdFormat for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeIdFormat
func (c *EC2) DescribeIdFormat(input *DescribeIdFormatInput) (*DescribeIdFormatOutput, error) {
	req, out := c.DescribeIdFormatRequest(input)
	return out, req.Send()
}

// DescribeIdFormatWithContext is the same as DescribeIdFormat with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeIdFormat for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeIdFormatWithContext(ctx aws.Context, input *DescribeIdFormatInput, opts ...request.Option) (*DescribeIdFormatOutput, error) {
	req, out := c.DescribeIdFormatRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeIdentityIdFormat = "DescribeIdentityIdFormat"

// DescribeIdentityIdFormatRequest generates a "aws/request.Request" representing the
// client's request for the DescribeIdentityIdFormat operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeIdentityIdFormat for more information on using the DescribeIdentityIdFormat
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeIdentityIdFormatRequest method.
//    req, resp := client.DescribeIdentityIdFormatRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeIdentityIdFormat
func (c *EC2) DescribeIdentityIdFormatRequest(input *DescribeIdentityIdFormatInput) (req *request.Request, output *DescribeIdentityIdFormatOutput) {
	op := &request.Operation{
		Name:       opDescribeIdentityIdFormat,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeIdentityIdFormatInput{}
	}

	output = &DescribeIdentityIdFormatOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeIdentityIdFormat API operation for Amazon Elastic Compute Cloud.
//
// Describes the ID format settings for resources for the specified IAM user,
// IAM role, or root user. For example, you can view the resource types that
// are enabled for longer IDs. This request only returns information about resource
// types whose ID formats can be modified; it does not return information about
// other resource types. For more information, see Resource IDs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resource-ids.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// The following resource types support longer IDs: bundle | conversion-task
// | customer-gateway | dhcp-options | elastic-ip-allocation | elastic-ip-association
// | export-task | flow-log | image | import-task | instance | internet-gateway
// | network-acl | network-acl-association | network-interface | network-interface-attachment
// | prefix-list | reservation | route-table | route-table-association | security-group
// | snapshot | subnet | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway.
//
// These settings apply to the principal specified in the request. They do not
// apply to the principal that makes the request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeIdentityIdFormat for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeIdentityIdFormat
func (c *EC2) DescribeIdentityIdFormat(input *DescribeIdentityIdFormatInput) (*DescribeIdentityIdFormatOutput, error) {
	req, out := c.DescribeIdentityIdFormatRequest(input)
	return out, req.Send()
}

// DescribeIdentityIdFormatWithContext is the same as DescribeIdentityIdFormat with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeIdentityIdFormat for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeIdentityIdFormatWithContext(ctx aws.Context, input *DescribeIdentityIdFormatInput, opts ...request.Option) (*DescribeIdentityIdFormatOutput, error) {
	req, out := c.DescribeIdentityIdFormatRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeImageAttribute = "DescribeImageAttribute"

// DescribeImageAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeImageAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeImageAttribute for more information on using the DescribeImageAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeImageAttributeRequest method.
//    req, resp := client.DescribeImageAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImageAttribute
func (c *EC2) DescribeImageAttributeRequest(input *DescribeImageAttributeInput) (req *request.Request, output *DescribeImageAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeImageAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeImageAttributeInput{}
	}

	output = &DescribeImageAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeImageAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified attribute of the specified AMI. You can specify only
// one attribute at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeImageAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImageAttribute
func (c *EC2) DescribeImageAttribute(input *DescribeImageAttributeInput) (*DescribeImageAttributeOutput, error) {
	req, out := c.DescribeImageAttributeRequest(input)
	return out, req.Send()
}

// DescribeImageAttributeWithContext is the same as DescribeImageAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeImageAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeImageAttributeWithContext(ctx aws.Context, input *DescribeImageAttributeInput, opts ...request.Option) (*DescribeImageAttributeOutput, error) {
	req, out := c.DescribeImageAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeImages = "DescribeImages"

// DescribeImagesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeImages operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeImages for more information on using the DescribeImages
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeImagesRequest method.
//    req, resp := client.DescribeImagesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImages
func (c *EC2) DescribeImagesRequest(input *DescribeImagesInput) (req *request.Request, output *DescribeImagesOutput) {
	op := &request.Operation{
		Name:       opDescribeImages,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeImagesInput{}
	}

	output = &DescribeImagesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeImages API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of the images (AMIs, AKIs, and ARIs) available to you.
// Images available to you include public images, private images that you own,
// and private images owned by other AWS accounts but for which you have explicit
// launch permissions.
//
// Deregistered images are included in the returned results for an unspecified
// interval after deregistration.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeImages for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImages
func (c *EC2) DescribeImages(input *DescribeImagesInput) (*DescribeImagesOutput, error) {
	req, out := c.DescribeImagesRequest(input)
	return out, req.Send()
}

// DescribeImagesWithContext is the same as DescribeImages with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeImages for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeImagesWithContext(ctx aws.Context, input *DescribeImagesInput, opts ...request.Option) (*DescribeImagesOutput, error) {
	req, out := c.DescribeImagesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeImportImageTasks = "DescribeImportImageTasks"

// DescribeImportImageTasksRequest generates a "aws/request.Request" representing the
// client's request for the DescribeImportImageTasks operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeImportImageTasks for more information on using the DescribeImportImageTasks
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeImportImageTasksRequest method.
//    req, resp := client.DescribeImportImageTasksRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImportImageTasks
func (c *EC2) DescribeImportImageTasksRequest(input *DescribeImportImageTasksInput) (req *request.Request, output *DescribeImportImageTasksOutput) {
	op := &request.Operation{
		Name:       opDescribeImportImageTasks,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeImportImageTasksInput{}
	}

	output = &DescribeImportImageTasksOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeImportImageTasks API operation for Amazon Elastic Compute Cloud.
//
// Displays details about an import virtual machine or import snapshot tasks
// that are already created.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeImportImageTasks for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImportImageTasks
func (c *EC2) DescribeImportImageTasks(input *DescribeImportImageTasksInput) (*DescribeImportImageTasksOutput, error) {
	req, out := c.DescribeImportImageTasksRequest(input)
	return out, req.Send()
}

// DescribeImportImageTasksWithContext is the same as DescribeImportImageTasks with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeImportImageTasks for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeImportImageTasksWithContext(ctx aws.Context, input *DescribeImportImageTasksInput, opts ...request.Option) (*DescribeImportImageTasksOutput, error) {
	req, out := c.DescribeImportImageTasksRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeImportSnapshotTasks = "DescribeImportSnapshotTasks"

// DescribeImportSnapshotTasksRequest generates a "aws/request.Request" representing the
// client's request for the DescribeImportSnapshotTasks operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeImportSnapshotTasks for more information on using the DescribeImportSnapshotTasks
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeImportSnapshotTasksRequest method.
//    req, resp := client.DescribeImportSnapshotTasksRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImportSnapshotTasks
func (c *EC2) DescribeImportSnapshotTasksRequest(input *DescribeImportSnapshotTasksInput) (req *request.Request, output *DescribeImportSnapshotTasksOutput) {
	op := &request.Operation{
		Name:       opDescribeImportSnapshotTasks,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeImportSnapshotTasksInput{}
	}

	output = &DescribeImportSnapshotTasksOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeImportSnapshotTasks API operation for Amazon Elastic Compute Cloud.
//
// Describes your import snapshot tasks.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeImportSnapshotTasks for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeImportSnapshotTasks
func (c *EC2) DescribeImportSnapshotTasks(input *DescribeImportSnapshotTasksInput) (*DescribeImportSnapshotTasksOutput, error) {
	req, out := c.DescribeImportSnapshotTasksRequest(input)
	return out, req.Send()
}

// DescribeImportSnapshotTasksWithContext is the same as DescribeImportSnapshotTasks with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeImportSnapshotTasks for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeImportSnapshotTasksWithContext(ctx aws.Context, input *DescribeImportSnapshotTasksInput, opts ...request.Option) (*DescribeImportSnapshotTasksOutput, error) {
	req, out := c.DescribeImportSnapshotTasksRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeInstanceAttribute = "DescribeInstanceAttribute"

// DescribeInstanceAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeInstanceAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeInstanceAttribute for more information on using the DescribeInstanceAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeInstanceAttributeRequest method.
//    req, resp := client.DescribeInstanceAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstanceAttribute
func (c *EC2) DescribeInstanceAttributeRequest(input *DescribeInstanceAttributeInput) (req *request.Request, output *DescribeInstanceAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeInstanceAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeInstanceAttributeInput{}
	}

	output = &DescribeInstanceAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeInstanceAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified attribute of the specified instance. You can specify
// only one attribute at a time. Valid attribute values are: instanceType |
// kernel | ramdisk | userData | disableApiTermination | instanceInitiatedShutdownBehavior
// | rootDeviceName | blockDeviceMapping | productCodes | sourceDestCheck |
// groupSet | ebsOptimized | sriovNetSupport
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeInstanceAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstanceAttribute
func (c *EC2) DescribeInstanceAttribute(input *DescribeInstanceAttributeInput) (*DescribeInstanceAttributeOutput, error) {
	req, out := c.DescribeInstanceAttributeRequest(input)
	return out, req.Send()
}

// DescribeInstanceAttributeWithContext is the same as DescribeInstanceAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeInstanceAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInstanceAttributeWithContext(ctx aws.Context, input *DescribeInstanceAttributeInput, opts ...request.Option) (*DescribeInstanceAttributeOutput, error) {
	req, out := c.DescribeInstanceAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeInstanceCreditSpecifications = "DescribeInstanceCreditSpecifications"

// DescribeInstanceCreditSpecificationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeInstanceCreditSpecifications operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeInstanceCreditSpecifications for more information on using the DescribeInstanceCreditSpecifications
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeInstanceCreditSpecificationsRequest method.
//    req, resp := client.DescribeInstanceCreditSpecificationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstanceCreditSpecifications
func (c *EC2) DescribeInstanceCreditSpecificationsRequest(input *DescribeInstanceCreditSpecificationsInput) (req *request.Request, output *DescribeInstanceCreditSpecificationsOutput) {
	op := &request.Operation{
		Name:       opDescribeInstanceCreditSpecifications,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeInstanceCreditSpecificationsInput{}
	}

	output = &DescribeInstanceCreditSpecificationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeInstanceCreditSpecifications API operation for Amazon Elastic Compute Cloud.
//
// Describes the credit option for CPU usage of one or more of your T2 or T3
// instances. The credit options are standard and unlimited.
//
// If you do not specify an instance ID, Amazon EC2 returns T2 and T3 instances
// with the unlimited credit option, as well as instances that were previously
// configured as T2 or T3 with the unlimited credit option. For example, if
// you resize a T2 instance, while it is configured as unlimited, to an M4 instance,
// Amazon EC2 returns the M4 instance.
//
// If you specify one or more instance IDs, Amazon EC2 returns the credit option
// (standard or unlimited) of those instances. If you specify an instance ID
// that is not valid, such as an instance that is not a T2 or T3 instance, an
// error is returned.
//
// Recently terminated instances might appear in the returned results. This
// interval is usually less than one hour.
//
// If an Availability Zone is experiencing a service disruption and you specify
// instance IDs in the affected zone, or do not specify any instance IDs at
// all, the call fails. If you specify only instance IDs in an unaffected zone,
// the call works normally.
//
// For more information, see Burstable Performance Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeInstanceCreditSpecifications for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstanceCreditSpecifications
func (c *EC2) DescribeInstanceCreditSpecifications(input *DescribeInstanceCreditSpecificationsInput) (*DescribeInstanceCreditSpecificationsOutput, error) {
	req, out := c.DescribeInstanceCreditSpecificationsRequest(input)
	return out, req.Send()
}

// DescribeInstanceCreditSpecificationsWithContext is the same as DescribeInstanceCreditSpecifications with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeInstanceCreditSpecifications for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInstanceCreditSpecificationsWithContext(ctx aws.Context, input *DescribeInstanceCreditSpecificationsInput, opts ...request.Option) (*DescribeInstanceCreditSpecificationsOutput, error) {
	req, out := c.DescribeInstanceCreditSpecificationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeInstanceStatus = "DescribeInstanceStatus"

// DescribeInstanceStatusRequest generates a "aws/request.Request" representing the
// client's request for the DescribeInstanceStatus operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeInstanceStatus for more information on using the DescribeInstanceStatus
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeInstanceStatusRequest method.
//    req, resp := client.DescribeInstanceStatusRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstanceStatus
func (c *EC2) DescribeInstanceStatusRequest(input *DescribeInstanceStatusInput) (req *request.Request, output *DescribeInstanceStatusOutput) {
	op := &request.Operation{
		Name:       opDescribeInstanceStatus,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeInstanceStatusInput{}
	}

	output = &DescribeInstanceStatusOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeInstanceStatus API operation for Amazon Elastic Compute Cloud.
//
// Describes the status of one or more instances. By default, only running instances
// are described, unless you specifically indicate to return the status of all
// instances.
//
// Instance status includes the following components:
//
//    * Status checks - Amazon EC2 performs status checks on running EC2 instances
//    to identify hardware and software issues. For more information, see Status
//    Checks for Your Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)
//    and Troubleshooting Instances with Failed Status Checks (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html)
//    in the Amazon Elastic Compute Cloud User Guide.
//
//    * Scheduled events - Amazon EC2 can schedule events (such as reboot, stop,
//    or terminate) for your instances related to hardware issues, software
//    updates, or system maintenance. For more information, see Scheduled Events
//    for Your Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
//    in the Amazon Elastic Compute Cloud User Guide.
//
//    * Instance state - You can manage your instances from the moment you launch
//    them through their termination. For more information, see Instance Lifecycle
//    (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html)
//    in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeInstanceStatus for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstanceStatus
func (c *EC2) DescribeInstanceStatus(input *DescribeInstanceStatusInput) (*DescribeInstanceStatusOutput, error) {
	req, out := c.DescribeInstanceStatusRequest(input)
	return out, req.Send()
}

// DescribeInstanceStatusWithContext is the same as DescribeInstanceStatus with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeInstanceStatus for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInstanceStatusWithContext(ctx aws.Context, input *DescribeInstanceStatusInput, opts ...request.Option) (*DescribeInstanceStatusOutput, error) {
	req, out := c.DescribeInstanceStatusRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeInstanceStatusPages iterates over the pages of a DescribeInstanceStatus operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeInstanceStatus method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeInstanceStatus operation.
//    pageNum := 0
//    err := client.DescribeInstanceStatusPages(params,
//        func(page *DescribeInstanceStatusOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeInstanceStatusPages(input *DescribeInstanceStatusInput, fn func(*DescribeInstanceStatusOutput, bool) bool) error {
	return c.DescribeInstanceStatusPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeInstanceStatusPagesWithContext same as DescribeInstanceStatusPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInstanceStatusPagesWithContext(ctx aws.Context, input *DescribeInstanceStatusInput, fn func(*DescribeInstanceStatusOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeInstanceStatusInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeInstanceStatusRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeInstanceStatusOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeInstances = "DescribeInstances"

// DescribeInstancesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeInstances for more information on using the DescribeInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeInstancesRequest method.
//    req, resp := client.DescribeInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstances
func (c *EC2) DescribeInstancesRequest(input *DescribeInstancesInput) (req *request.Request, output *DescribeInstancesOutput) {
	op := &request.Operation{
		Name:       opDescribeInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeInstancesInput{}
	}

	output = &DescribeInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeInstances API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your instances.
//
// If you specify one or more instance IDs, Amazon EC2 returns information for
// those instances. If you do not specify instance IDs, Amazon EC2 returns information
// for all relevant instances. If you specify an instance ID that is not valid,
// an error is returned. If you specify an instance that you do not own, it
// is not included in the returned results.
//
// Recently terminated instances might appear in the returned results. This
// interval is usually less than one hour.
//
// If you describe instances in the rare case where an Availability Zone is
// experiencing a service disruption and you specify instance IDs that are in
// the affected zone, or do not specify any instance IDs at all, the call fails.
// If you describe instances and specify only instance IDs that are in an unaffected
// zone, the call works normally.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInstances
func (c *EC2) DescribeInstances(input *DescribeInstancesInput) (*DescribeInstancesOutput, error) {
	req, out := c.DescribeInstancesRequest(input)
	return out, req.Send()
}

// DescribeInstancesWithContext is the same as DescribeInstances with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInstancesWithContext(ctx aws.Context, input *DescribeInstancesInput, opts ...request.Option) (*DescribeInstancesOutput, error) {
	req, out := c.DescribeInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeInstancesPages iterates over the pages of a DescribeInstances operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeInstances method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeInstances operation.
//    pageNum := 0
//    err := client.DescribeInstancesPages(params,
//        func(page *DescribeInstancesOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeInstancesPages(input *DescribeInstancesInput, fn func(*DescribeInstancesOutput, bool) bool) error {
	return c.DescribeInstancesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeInstancesPagesWithContext same as DescribeInstancesPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInstancesPagesWithContext(ctx aws.Context, input *DescribeInstancesInput, fn func(*DescribeInstancesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeInstancesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeInstancesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeInstancesOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeInternetGateways = "DescribeInternetGateways"

// DescribeInternetGatewaysRequest generates a "aws/request.Request" representing the
// client's request for the DescribeInternetGateways operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeInternetGateways for more information on using the DescribeInternetGateways
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeInternetGatewaysRequest method.
//    req, resp := client.DescribeInternetGatewaysRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInternetGateways
func (c *EC2) DescribeInternetGatewaysRequest(input *DescribeInternetGatewaysInput) (req *request.Request, output *DescribeInternetGatewaysOutput) {
	op := &request.Operation{
		Name:       opDescribeInternetGateways,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeInternetGatewaysInput{}
	}

	output = &DescribeInternetGatewaysOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeInternetGateways API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your internet gateways.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeInternetGateways for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeInternetGateways
func (c *EC2) DescribeInternetGateways(input *DescribeInternetGatewaysInput) (*DescribeInternetGatewaysOutput, error) {
	req, out := c.DescribeInternetGatewaysRequest(input)
	return out, req.Send()
}

// DescribeInternetGatewaysWithContext is the same as DescribeInternetGateways with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeInternetGateways for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeInternetGatewaysWithContext(ctx aws.Context, input *DescribeInternetGatewaysInput, opts ...request.Option) (*DescribeInternetGatewaysOutput, error) {
	req, out := c.DescribeInternetGatewaysRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeKeyPairs = "DescribeKeyPairs"

// DescribeKeyPairsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeKeyPairs operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeKeyPairs for more information on using the DescribeKeyPairs
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeKeyPairsRequest method.
//    req, resp := client.DescribeKeyPairsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeKeyPairs
func (c *EC2) DescribeKeyPairsRequest(input *DescribeKeyPairsInput) (req *request.Request, output *DescribeKeyPairsOutput) {
	op := &request.Operation{
		Name:       opDescribeKeyPairs,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeKeyPairsInput{}
	}

	output = &DescribeKeyPairsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeKeyPairs API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your key pairs.
//
// For more information about key pairs, see Key Pairs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeKeyPairs for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeKeyPairs
func (c *EC2) DescribeKeyPairs(input *DescribeKeyPairsInput) (*DescribeKeyPairsOutput, error) {
	req, out := c.DescribeKeyPairsRequest(input)
	return out, req.Send()
}

// DescribeKeyPairsWithContext is the same as DescribeKeyPairs with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeKeyPairs for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeKeyPairsWithContext(ctx aws.Context, input *DescribeKeyPairsInput, opts ...request.Option) (*DescribeKeyPairsOutput, error) {
	req, out := c.DescribeKeyPairsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeLaunchTemplateVersions = "DescribeLaunchTemplateVersions"

// DescribeLaunchTemplateVersionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeLaunchTemplateVersions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeLaunchTemplateVersions for more information on using the DescribeLaunchTemplateVersions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeLaunchTemplateVersionsRequest method.
//    req, resp := client.DescribeLaunchTemplateVersionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeLaunchTemplateVersions
func (c *EC2) DescribeLaunchTemplateVersionsRequest(input *DescribeLaunchTemplateVersionsInput) (req *request.Request, output *DescribeLaunchTemplateVersionsOutput) {
	op := &request.Operation{
		Name:       opDescribeLaunchTemplateVersions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeLaunchTemplateVersionsInput{}
	}

	output = &DescribeLaunchTemplateVersionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeLaunchTemplateVersions API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more versions of a specified launch template. You can describe
// all versions, individual versions, or a range of versions.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeLaunchTemplateVersions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeLaunchTemplateVersions
func (c *EC2) DescribeLaunchTemplateVersions(input *DescribeLaunchTemplateVersionsInput) (*DescribeLaunchTemplateVersionsOutput, error) {
	req, out := c.DescribeLaunchTemplateVersionsRequest(input)
	return out, req.Send()
}

// DescribeLaunchTemplateVersionsWithContext is the same as DescribeLaunchTemplateVersions with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeLaunchTemplateVersions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeLaunchTemplateVersionsWithContext(ctx aws.Context, input *DescribeLaunchTemplateVersionsInput, opts ...request.Option) (*DescribeLaunchTemplateVersionsOutput, error) {
	req, out := c.DescribeLaunchTemplateVersionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeLaunchTemplates = "DescribeLaunchTemplates"

// DescribeLaunchTemplatesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeLaunchTemplates operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeLaunchTemplates for more information on using the DescribeLaunchTemplates
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeLaunchTemplatesRequest method.
//    req, resp := client.DescribeLaunchTemplatesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeLaunchTemplates
func (c *EC2) DescribeLaunchTemplatesRequest(input *DescribeLaunchTemplatesInput) (req *request.Request, output *DescribeLaunchTemplatesOutput) {
	op := &request.Operation{
		Name:       opDescribeLaunchTemplates,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeLaunchTemplatesInput{}
	}

	output = &DescribeLaunchTemplatesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeLaunchTemplates API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more launch templates.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeLaunchTemplates for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeLaunchTemplates
func (c *EC2) DescribeLaunchTemplates(input *DescribeLaunchTemplatesInput) (*DescribeLaunchTemplatesOutput, error) {
	req, out := c.DescribeLaunchTemplatesRequest(input)
	return out, req.Send()
}

// DescribeLaunchTemplatesWithContext is the same as DescribeLaunchTemplates with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeLaunchTemplates for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeLaunchTemplatesWithContext(ctx aws.Context, input *DescribeLaunchTemplatesInput, opts ...request.Option) (*DescribeLaunchTemplatesOutput, error) {
	req, out := c.DescribeLaunchTemplatesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeMovingAddresses = "DescribeMovingAddresses"

// DescribeMovingAddressesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeMovingAddresses operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeMovingAddresses for more information on using the DescribeMovingAddresses
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeMovingAddressesRequest method.
//    req, resp := client.DescribeMovingAddressesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeMovingAddresses
func (c *EC2) DescribeMovingAddressesRequest(input *DescribeMovingAddressesInput) (req *request.Request, output *DescribeMovingAddressesOutput) {
	op := &request.Operation{
		Name:       opDescribeMovingAddresses,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeMovingAddressesInput{}
	}

	output = &DescribeMovingAddressesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeMovingAddresses API operation for Amazon Elastic Compute Cloud.
//
// Describes your Elastic IP addresses that are being moved to the EC2-VPC platform,
// or that are being restored to the EC2-Classic platform. This request does
// not return information about any other Elastic IP addresses in your account.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeMovingAddresses for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeMovingAddresses
func (c *EC2) DescribeMovingAddresses(input *DescribeMovingAddressesInput) (*DescribeMovingAddressesOutput, error) {
	req, out := c.DescribeMovingAddressesRequest(input)
	return out, req.Send()
}

// DescribeMovingAddressesWithContext is the same as DescribeMovingAddresses with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeMovingAddresses for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeMovingAddressesWithContext(ctx aws.Context, input *DescribeMovingAddressesInput, opts ...request.Option) (*DescribeMovingAddressesOutput, error) {
	req, out := c.DescribeMovingAddressesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeNatGateways = "DescribeNatGateways"

// DescribeNatGatewaysRequest generates a "aws/request.Request" representing the
// client's request for the DescribeNatGateways operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeNatGateways for more information on using the DescribeNatGateways
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeNatGatewaysRequest method.
//    req, resp := client.DescribeNatGatewaysRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNatGateways
func (c *EC2) DescribeNatGatewaysRequest(input *DescribeNatGatewaysInput) (req *request.Request, output *DescribeNatGatewaysOutput) {
	op := &request.Operation{
		Name:       opDescribeNatGateways,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeNatGatewaysInput{}
	}

	output = &DescribeNatGatewaysOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeNatGateways API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your NAT gateways.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeNatGateways for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNatGateways
func (c *EC2) DescribeNatGateways(input *DescribeNatGatewaysInput) (*DescribeNatGatewaysOutput, error) {
	req, out := c.DescribeNatGatewaysRequest(input)
	return out, req.Send()
}

// DescribeNatGatewaysWithContext is the same as DescribeNatGateways with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeNatGateways for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNatGatewaysWithContext(ctx aws.Context, input *DescribeNatGatewaysInput, opts ...request.Option) (*DescribeNatGatewaysOutput, error) {
	req, out := c.DescribeNatGatewaysRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeNatGatewaysPages iterates over the pages of a DescribeNatGateways operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeNatGateways method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeNatGateways operation.
//    pageNum := 0
//    err := client.DescribeNatGatewaysPages(params,
//        func(page *DescribeNatGatewaysOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeNatGatewaysPages(input *DescribeNatGatewaysInput, fn func(*DescribeNatGatewaysOutput, bool) bool) error {
	return c.DescribeNatGatewaysPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeNatGatewaysPagesWithContext same as DescribeNatGatewaysPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNatGatewaysPagesWithContext(ctx aws.Context, input *DescribeNatGatewaysInput, fn func(*DescribeNatGatewaysOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeNatGatewaysInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeNatGatewaysRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeNatGatewaysOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeNetworkAcls = "DescribeNetworkAcls"

// DescribeNetworkAclsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeNetworkAcls operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeNetworkAcls for more information on using the DescribeNetworkAcls
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeNetworkAclsRequest method.
//    req, resp := client.DescribeNetworkAclsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkAcls
func (c *EC2) DescribeNetworkAclsRequest(input *DescribeNetworkAclsInput) (req *request.Request, output *DescribeNetworkAclsOutput) {
	op := &request.Operation{
		Name:       opDescribeNetworkAcls,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeNetworkAclsInput{}
	}

	output = &DescribeNetworkAclsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeNetworkAcls API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your network ACLs.
//
// For more information, see Network ACLs (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeNetworkAcls for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkAcls
func (c *EC2) DescribeNetworkAcls(input *DescribeNetworkAclsInput) (*DescribeNetworkAclsOutput, error) {
	req, out := c.DescribeNetworkAclsRequest(input)
	return out, req.Send()
}

// DescribeNetworkAclsWithContext is the same as DescribeNetworkAcls with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeNetworkAcls for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNetworkAclsWithContext(ctx aws.Context, input *DescribeNetworkAclsInput, opts ...request.Option) (*DescribeNetworkAclsOutput, error) {
	req, out := c.DescribeNetworkAclsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeNetworkInterfaceAttribute = "DescribeNetworkInterfaceAttribute"

// DescribeNetworkInterfaceAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeNetworkInterfaceAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeNetworkInterfaceAttribute for more information on using the DescribeNetworkInterfaceAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeNetworkInterfaceAttributeRequest method.
//    req, resp := client.DescribeNetworkInterfaceAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkInterfaceAttribute
func (c *EC2) DescribeNetworkInterfaceAttributeRequest(input *DescribeNetworkInterfaceAttributeInput) (req *request.Request, output *DescribeNetworkInterfaceAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeNetworkInterfaceAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeNetworkInterfaceAttributeInput{}
	}

	output = &DescribeNetworkInterfaceAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeNetworkInterfaceAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes a network interface attribute. You can specify only one attribute
// at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeNetworkInterfaceAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkInterfaceAttribute
func (c *EC2) DescribeNetworkInterfaceAttribute(input *DescribeNetworkInterfaceAttributeInput) (*DescribeNetworkInterfaceAttributeOutput, error) {
	req, out := c.DescribeNetworkInterfaceAttributeRequest(input)
	return out, req.Send()
}

// DescribeNetworkInterfaceAttributeWithContext is the same as DescribeNetworkInterfaceAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeNetworkInterfaceAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNetworkInterfaceAttributeWithContext(ctx aws.Context, input *DescribeNetworkInterfaceAttributeInput, opts ...request.Option) (*DescribeNetworkInterfaceAttributeOutput, error) {
	req, out := c.DescribeNetworkInterfaceAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeNetworkInterfacePermissions = "DescribeNetworkInterfacePermissions"

// DescribeNetworkInterfacePermissionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeNetworkInterfacePermissions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeNetworkInterfacePermissions for more information on using the DescribeNetworkInterfacePermissions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeNetworkInterfacePermissionsRequest method.
//    req, resp := client.DescribeNetworkInterfacePermissionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkInterfacePermissions
func (c *EC2) DescribeNetworkInterfacePermissionsRequest(input *DescribeNetworkInterfacePermissionsInput) (req *request.Request, output *DescribeNetworkInterfacePermissionsOutput) {
	op := &request.Operation{
		Name:       opDescribeNetworkInterfacePermissions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeNetworkInterfacePermissionsInput{}
	}

	output = &DescribeNetworkInterfacePermissionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeNetworkInterfacePermissions API operation for Amazon Elastic Compute Cloud.
//
// Describes the permissions for your network interfaces.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeNetworkInterfacePermissions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkInterfacePermissions
func (c *EC2) DescribeNetworkInterfacePermissions(input *DescribeNetworkInterfacePermissionsInput) (*DescribeNetworkInterfacePermissionsOutput, error) {
	req, out := c.DescribeNetworkInterfacePermissionsRequest(input)
	return out, req.Send()
}

// DescribeNetworkInterfacePermissionsWithContext is the same as DescribeNetworkInterfacePermissions with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeNetworkInterfacePermissions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNetworkInterfacePermissionsWithContext(ctx aws.Context, input *DescribeNetworkInterfacePermissionsInput, opts ...request.Option) (*DescribeNetworkInterfacePermissionsOutput, error) {
	req, out := c.DescribeNetworkInterfacePermissionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeNetworkInterfaces = "DescribeNetworkInterfaces"

// DescribeNetworkInterfacesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeNetworkInterfaces operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeNetworkInterfaces for more information on using the DescribeNetworkInterfaces
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeNetworkInterfacesRequest method.
//    req, resp := client.DescribeNetworkInterfacesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkInterfaces
func (c *EC2) DescribeNetworkInterfacesRequest(input *DescribeNetworkInterfacesInput) (req *request.Request, output *DescribeNetworkInterfacesOutput) {
	op := &request.Operation{
		Name:       opDescribeNetworkInterfaces,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeNetworkInterfacesInput{}
	}

	output = &DescribeNetworkInterfacesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeNetworkInterfaces API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your network interfaces.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeNetworkInterfaces for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeNetworkInterfaces
func (c *EC2) DescribeNetworkInterfaces(input *DescribeNetworkInterfacesInput) (*DescribeNetworkInterfacesOutput, error) {
	req, out := c.DescribeNetworkInterfacesRequest(input)
	return out, req.Send()
}

// DescribeNetworkInterfacesWithContext is the same as DescribeNetworkInterfaces with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeNetworkInterfaces for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNetworkInterfacesWithContext(ctx aws.Context, input *DescribeNetworkInterfacesInput, opts ...request.Option) (*DescribeNetworkInterfacesOutput, error) {
	req, out := c.DescribeNetworkInterfacesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeNetworkInterfacesPages iterates over the pages of a DescribeNetworkInterfaces operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeNetworkInterfaces method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeNetworkInterfaces operation.
//    pageNum := 0
//    err := client.DescribeNetworkInterfacesPages(params,
//        func(page *DescribeNetworkInterfacesOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeNetworkInterfacesPages(input *DescribeNetworkInterfacesInput, fn func(*DescribeNetworkInterfacesOutput, bool) bool) error {
	return c.DescribeNetworkInterfacesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeNetworkInterfacesPagesWithContext same as DescribeNetworkInterfacesPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeNetworkInterfacesPagesWithContext(ctx aws.Context, input *DescribeNetworkInterfacesInput, fn func(*DescribeNetworkInterfacesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeNetworkInterfacesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeNetworkInterfacesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeNetworkInterfacesOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribePlacementGroups = "DescribePlacementGroups"

// DescribePlacementGroupsRequest generates a "aws/request.Request" representing the
// client's request for the DescribePlacementGroups operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribePlacementGroups for more information on using the DescribePlacementGroups
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribePlacementGroupsRequest method.
//    req, resp := client.DescribePlacementGroupsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePlacementGroups
func (c *EC2) DescribePlacementGroupsRequest(input *DescribePlacementGroupsInput) (req *request.Request, output *DescribePlacementGroupsOutput) {
	op := &request.Operation{
		Name:       opDescribePlacementGroups,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribePlacementGroupsInput{}
	}

	output = &DescribePlacementGroupsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribePlacementGroups API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your placement groups. For more information, see
// Placement Groups (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribePlacementGroups for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePlacementGroups
func (c *EC2) DescribePlacementGroups(input *DescribePlacementGroupsInput) (*DescribePlacementGroupsOutput, error) {
	req, out := c.DescribePlacementGroupsRequest(input)
	return out, req.Send()
}

// DescribePlacementGroupsWithContext is the same as DescribePlacementGroups with the addition of
// the ability to pass a context and additional request options.
//
// See DescribePlacementGroups for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribePlacementGroupsWithContext(ctx aws.Context, input *DescribePlacementGroupsInput, opts ...request.Option) (*DescribePlacementGroupsOutput, error) {
	req, out := c.DescribePlacementGroupsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribePrefixLists = "DescribePrefixLists"

// DescribePrefixListsRequest generates a "aws/request.Request" representing the
// client's request for the DescribePrefixLists operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribePrefixLists for more information on using the DescribePrefixLists
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribePrefixListsRequest method.
//    req, resp := client.DescribePrefixListsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePrefixLists
func (c *EC2) DescribePrefixListsRequest(input *DescribePrefixListsInput) (req *request.Request, output *DescribePrefixListsOutput) {
	op := &request.Operation{
		Name:       opDescribePrefixLists,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribePrefixListsInput{}
	}

	output = &DescribePrefixListsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribePrefixLists API operation for Amazon Elastic Compute Cloud.
//
// Describes available AWS services in a prefix list format, which includes
// the prefix list name and prefix list ID of the service and the IP address
// range for the service. A prefix list ID is required for creating an outbound
// security group rule that allows traffic from a VPC to access an AWS service
// through a gateway VPC endpoint. Currently, the services that support this
// action are Amazon S3 and Amazon DynamoDB.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribePrefixLists for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePrefixLists
func (c *EC2) DescribePrefixLists(input *DescribePrefixListsInput) (*DescribePrefixListsOutput, error) {
	req, out := c.DescribePrefixListsRequest(input)
	return out, req.Send()
}

// DescribePrefixListsWithContext is the same as DescribePrefixLists with the addition of
// the ability to pass a context and additional request options.
//
// See DescribePrefixLists for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribePrefixListsWithContext(ctx aws.Context, input *DescribePrefixListsInput, opts ...request.Option) (*DescribePrefixListsOutput, error) {
	req, out := c.DescribePrefixListsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribePrincipalIdFormat = "DescribePrincipalIdFormat"

// DescribePrincipalIdFormatRequest generates a "aws/request.Request" representing the
// client's request for the DescribePrincipalIdFormat operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribePrincipalIdFormat for more information on using the DescribePrincipalIdFormat
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribePrincipalIdFormatRequest method.
//    req, resp := client.DescribePrincipalIdFormatRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePrincipalIdFormat
func (c *EC2) DescribePrincipalIdFormatRequest(input *DescribePrincipalIdFormatInput) (req *request.Request, output *DescribePrincipalIdFormatOutput) {
	op := &request.Operation{
		Name:       opDescribePrincipalIdFormat,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribePrincipalIdFormatInput{}
	}

	output = &DescribePrincipalIdFormatOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribePrincipalIdFormat API operation for Amazon Elastic Compute Cloud.
//
// Describes the ID format settings for the root user and all IAM roles and
// IAM users that have explicitly specified a longer ID (17-character ID) preference.
//
// By default, all IAM roles and IAM users default to the same ID settings as
// the root user, unless they explicitly override the settings. This request
// is useful for identifying those IAM users and IAM roles that have overridden
// the default ID settings.
//
// The following resource types support longer IDs: bundle | conversion-task
// | customer-gateway | dhcp-options | elastic-ip-allocation | elastic-ip-association
// | export-task | flow-log | image | import-task | instance | internet-gateway
// | network-acl | network-acl-association | network-interface | network-interface-attachment
// | prefix-list | reservation | route-table | route-table-association | security-group
// | snapshot | subnet | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribePrincipalIdFormat for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePrincipalIdFormat
func (c *EC2) DescribePrincipalIdFormat(input *DescribePrincipalIdFormatInput) (*DescribePrincipalIdFormatOutput, error) {
	req, out := c.DescribePrincipalIdFormatRequest(input)
	return out, req.Send()
}

// DescribePrincipalIdFormatWithContext is the same as DescribePrincipalIdFormat with the addition of
// the ability to pass a context and additional request options.
//
// See DescribePrincipalIdFormat for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribePrincipalIdFormatWithContext(ctx aws.Context, input *DescribePrincipalIdFormatInput, opts ...request.Option) (*DescribePrincipalIdFormatOutput, error) {
	req, out := c.DescribePrincipalIdFormatRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribePublicIpv4Pools = "DescribePublicIpv4Pools"

// DescribePublicIpv4PoolsRequest generates a "aws/request.Request" representing the
// client's request for the DescribePublicIpv4Pools operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribePublicIpv4Pools for more information on using the DescribePublicIpv4Pools
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribePublicIpv4PoolsRequest method.
//    req, resp := client.DescribePublicIpv4PoolsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePublicIpv4Pools
func (c *EC2) DescribePublicIpv4PoolsRequest(input *DescribePublicIpv4PoolsInput) (req *request.Request, output *DescribePublicIpv4PoolsOutput) {
	op := &request.Operation{
		Name:       opDescribePublicIpv4Pools,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribePublicIpv4PoolsInput{}
	}

	output = &DescribePublicIpv4PoolsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribePublicIpv4Pools API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified IPv4 address pools.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribePublicIpv4Pools for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribePublicIpv4Pools
func (c *EC2) DescribePublicIpv4Pools(input *DescribePublicIpv4PoolsInput) (*DescribePublicIpv4PoolsOutput, error) {
	req, out := c.DescribePublicIpv4PoolsRequest(input)
	return out, req.Send()
}

// DescribePublicIpv4PoolsWithContext is the same as DescribePublicIpv4Pools with the addition of
// the ability to pass a context and additional request options.
//
// See DescribePublicIpv4Pools for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribePublicIpv4PoolsWithContext(ctx aws.Context, input *DescribePublicIpv4PoolsInput, opts ...request.Option) (*DescribePublicIpv4PoolsOutput, error) {
	req, out := c.DescribePublicIpv4PoolsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeRegions = "DescribeRegions"

// DescribeRegionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeRegions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeRegions for more information on using the DescribeRegions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeRegionsRequest method.
//    req, resp := client.DescribeRegionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeRegions
func (c *EC2) DescribeRegionsRequest(input *DescribeRegionsInput) (req *request.Request, output *DescribeRegionsOutput) {
	op := &request.Operation{
		Name:       opDescribeRegions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeRegionsInput{}
	}

	output = &DescribeRegionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeRegions API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more regions that are currently available to you.
//
// For a list of the regions supported by Amazon EC2, see Regions and Endpoints
// (https://docs.aws.amazon.com/general/latest/gr/rande.html#ec2_region).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeRegions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeRegions
func (c *EC2) DescribeRegions(input *DescribeRegionsInput) (*DescribeRegionsOutput, error) {
	req, out := c.DescribeRegionsRequest(input)
	return out, req.Send()
}

// DescribeRegionsWithContext is the same as DescribeRegions with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeRegions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeRegionsWithContext(ctx aws.Context, input *DescribeRegionsInput, opts ...request.Option) (*DescribeRegionsOutput, error) {
	req, out := c.DescribeRegionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeReservedInstances = "DescribeReservedInstances"

// DescribeReservedInstancesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeReservedInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeReservedInstances for more information on using the DescribeReservedInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeReservedInstancesRequest method.
//    req, resp := client.DescribeReservedInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstances
func (c *EC2) DescribeReservedInstancesRequest(input *DescribeReservedInstancesInput) (req *request.Request, output *DescribeReservedInstancesOutput) {
	op := &request.Operation{
		Name:       opDescribeReservedInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeReservedInstancesInput{}
	}

	output = &DescribeReservedInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeReservedInstances API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of the Reserved Instances that you purchased.
//
// For more information about Reserved Instances, see Reserved Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts-on-demand-reserved-instances.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeReservedInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstances
func (c *EC2) DescribeReservedInstances(input *DescribeReservedInstancesInput) (*DescribeReservedInstancesOutput, error) {
	req, out := c.DescribeReservedInstancesRequest(input)
	return out, req.Send()
}

// DescribeReservedInstancesWithContext is the same as DescribeReservedInstances with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeReservedInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeReservedInstancesWithContext(ctx aws.Context, input *DescribeReservedInstancesInput, opts ...request.Option) (*DescribeReservedInstancesOutput, error) {
	req, out := c.DescribeReservedInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeReservedInstancesListings = "DescribeReservedInstancesListings"

// DescribeReservedInstancesListingsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeReservedInstancesListings operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeReservedInstancesListings for more information on using the DescribeReservedInstancesListings
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeReservedInstancesListingsRequest method.
//    req, resp := client.DescribeReservedInstancesListingsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstancesListings
func (c *EC2) DescribeReservedInstancesListingsRequest(input *DescribeReservedInstancesListingsInput) (req *request.Request, output *DescribeReservedInstancesListingsOutput) {
	op := &request.Operation{
		Name:       opDescribeReservedInstancesListings,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeReservedInstancesListingsInput{}
	}

	output = &DescribeReservedInstancesListingsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeReservedInstancesListings API operation for Amazon Elastic Compute Cloud.
//
// Describes your account's Reserved Instance listings in the Reserved Instance
// Marketplace.
//
// The Reserved Instance Marketplace matches sellers who want to resell Reserved
// Instance capacity that they no longer need with buyers who want to purchase
// additional capacity. Reserved Instances bought and sold through the Reserved
// Instance Marketplace work like any other Reserved Instances.
//
// As a seller, you choose to list some or all of your Reserved Instances, and
// you specify the upfront price to receive for them. Your Reserved Instances
// are then listed in the Reserved Instance Marketplace and are available for
// purchase.
//
// As a buyer, you specify the configuration of the Reserved Instance to purchase,
// and the Marketplace matches what you're searching for with what's available.
// The Marketplace first sells the lowest priced Reserved Instances to you,
// and continues to sell available Reserved Instance listings to you until your
// demand is met. You are charged based on the total price of all of the listings
// that you purchase.
//
// For more information, see Reserved Instance Marketplace (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeReservedInstancesListings for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstancesListings
func (c *EC2) DescribeReservedInstancesListings(input *DescribeReservedInstancesListingsInput) (*DescribeReservedInstancesListingsOutput, error) {
	req, out := c.DescribeReservedInstancesListingsRequest(input)
	return out, req.Send()
}

// DescribeReservedInstancesListingsWithContext is the same as DescribeReservedInstancesListings with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeReservedInstancesListings for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeReservedInstancesListingsWithContext(ctx aws.Context, input *DescribeReservedInstancesListingsInput, opts ...request.Option) (*DescribeReservedInstancesListingsOutput, error) {
	req, out := c.DescribeReservedInstancesListingsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeReservedInstancesModifications = "DescribeReservedInstancesModifications"

// DescribeReservedInstancesModificationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeReservedInstancesModifications operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeReservedInstancesModifications for more information on using the DescribeReservedInstancesModifications
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeReservedInstancesModificationsRequest method.
//    req, resp := client.DescribeReservedInstancesModificationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstancesModifications
func (c *EC2) DescribeReservedInstancesModificationsRequest(input *DescribeReservedInstancesModificationsInput) (req *request.Request, output *DescribeReservedInstancesModificationsOutput) {
	op := &request.Operation{
		Name:       opDescribeReservedInstancesModifications,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeReservedInstancesModificationsInput{}
	}

	output = &DescribeReservedInstancesModificationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeReservedInstancesModifications API operation for Amazon Elastic Compute Cloud.
//
// Describes the modifications made to your Reserved Instances. If no parameter
// is specified, information about all your Reserved Instances modification
// requests is returned. If a modification ID is specified, only information
// about the specific modification is returned.
//
// For more information, see Modifying Reserved Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-modifying.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeReservedInstancesModifications for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstancesModifications
func (c *EC2) DescribeReservedInstancesModifications(input *DescribeReservedInstancesModificationsInput) (*DescribeReservedInstancesModificationsOutput, error) {
	req, out := c.DescribeReservedInstancesModificationsRequest(input)
	return out, req.Send()
}

// DescribeReservedInstancesModificationsWithContext is the same as DescribeReservedInstancesModifications with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeReservedInstancesModifications for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeReservedInstancesModificationsWithContext(ctx aws.Context, input *DescribeReservedInstancesModificationsInput, opts ...request.Option) (*DescribeReservedInstancesModificationsOutput, error) {
	req, out := c.DescribeReservedInstancesModificationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeReservedInstancesModificationsPages iterates over the pages of a DescribeReservedInstancesModifications operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeReservedInstancesModifications method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeReservedInstancesModifications operation.
//    pageNum := 0
//    err := client.DescribeReservedInstancesModificationsPages(params,
//        func(page *DescribeReservedInstancesModificationsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeReservedInstancesModificationsPages(input *DescribeReservedInstancesModificationsInput, fn func(*DescribeReservedInstancesModificationsOutput, bool) bool) error {
	return c.DescribeReservedInstancesModificationsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeReservedInstancesModificationsPagesWithContext same as DescribeReservedInstancesModificationsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeReservedInstancesModificationsPagesWithContext(ctx aws.Context, input *DescribeReservedInstancesModificationsInput, fn func(*DescribeReservedInstancesModificationsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeReservedInstancesModificationsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeReservedInstancesModificationsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeReservedInstancesModificationsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeReservedInstancesOfferings = "DescribeReservedInstancesOfferings"

// DescribeReservedInstancesOfferingsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeReservedInstancesOfferings operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeReservedInstancesOfferings for more information on using the DescribeReservedInstancesOfferings
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeReservedInstancesOfferingsRequest method.
//    req, resp := client.DescribeReservedInstancesOfferingsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstancesOfferings
func (c *EC2) DescribeReservedInstancesOfferingsRequest(input *DescribeReservedInstancesOfferingsInput) (req *request.Request, output *DescribeReservedInstancesOfferingsOutput) {
	op := &request.Operation{
		Name:       opDescribeReservedInstancesOfferings,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeReservedInstancesOfferingsInput{}
	}

	output = &DescribeReservedInstancesOfferingsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeReservedInstancesOfferings API operation for Amazon Elastic Compute Cloud.
//
// Describes Reserved Instance offerings that are available for purchase. With
// Reserved Instances, you purchase the right to launch instances for a period
// of time. During that time period, you do not receive insufficient capacity
// errors, and you pay a lower usage rate than the rate charged for On-Demand
// instances for the actual time used.
//
// If you have listed your own Reserved Instances for sale in the Reserved Instance
// Marketplace, they will be excluded from these results. This is to ensure
// that you do not purchase your own Reserved Instances.
//
// For more information, see Reserved Instance Marketplace (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeReservedInstancesOfferings for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeReservedInstancesOfferings
func (c *EC2) DescribeReservedInstancesOfferings(input *DescribeReservedInstancesOfferingsInput) (*DescribeReservedInstancesOfferingsOutput, error) {
	req, out := c.DescribeReservedInstancesOfferingsRequest(input)
	return out, req.Send()
}

// DescribeReservedInstancesOfferingsWithContext is the same as DescribeReservedInstancesOfferings with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeReservedInstancesOfferings for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeReservedInstancesOfferingsWithContext(ctx aws.Context, input *DescribeReservedInstancesOfferingsInput, opts ...request.Option) (*DescribeReservedInstancesOfferingsOutput, error) {
	req, out := c.DescribeReservedInstancesOfferingsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeReservedInstancesOfferingsPages iterates over the pages of a DescribeReservedInstancesOfferings operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeReservedInstancesOfferings method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeReservedInstancesOfferings operation.
//    pageNum := 0
//    err := client.DescribeReservedInstancesOfferingsPages(params,
//        func(page *DescribeReservedInstancesOfferingsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeReservedInstancesOfferingsPages(input *DescribeReservedInstancesOfferingsInput, fn func(*DescribeReservedInstancesOfferingsOutput, bool) bool) error {
	return c.DescribeReservedInstancesOfferingsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeReservedInstancesOfferingsPagesWithContext same as DescribeReservedInstancesOfferingsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeReservedInstancesOfferingsPagesWithContext(ctx aws.Context, input *DescribeReservedInstancesOfferingsInput, fn func(*DescribeReservedInstancesOfferingsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeReservedInstancesOfferingsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeReservedInstancesOfferingsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeReservedInstancesOfferingsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeRouteTables = "DescribeRouteTables"

// DescribeRouteTablesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeRouteTables operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeRouteTables for more information on using the DescribeRouteTables
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeRouteTablesRequest method.
//    req, resp := client.DescribeRouteTablesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeRouteTables
func (c *EC2) DescribeRouteTablesRequest(input *DescribeRouteTablesInput) (req *request.Request, output *DescribeRouteTablesOutput) {
	op := &request.Operation{
		Name:       opDescribeRouteTables,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeRouteTablesInput{}
	}

	output = &DescribeRouteTablesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeRouteTables API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your route tables.
//
// Each subnet in your VPC must be associated with a route table. If a subnet
// is not explicitly associated with any route table, it is implicitly associated
// with the main route table. This command does not return the subnet ID for
// implicit associations.
//
// For more information, see Route Tables (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeRouteTables for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeRouteTables
func (c *EC2) DescribeRouteTables(input *DescribeRouteTablesInput) (*DescribeRouteTablesOutput, error) {
	req, out := c.DescribeRouteTablesRequest(input)
	return out, req.Send()
}

// DescribeRouteTablesWithContext is the same as DescribeRouteTables with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeRouteTables for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeRouteTablesWithContext(ctx aws.Context, input *DescribeRouteTablesInput, opts ...request.Option) (*DescribeRouteTablesOutput, error) {
	req, out := c.DescribeRouteTablesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeRouteTablesPages iterates over the pages of a DescribeRouteTables operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeRouteTables method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeRouteTables operation.
//    pageNum := 0
//    err := client.DescribeRouteTablesPages(params,
//        func(page *DescribeRouteTablesOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeRouteTablesPages(input *DescribeRouteTablesInput, fn func(*DescribeRouteTablesOutput, bool) bool) error {
	return c.DescribeRouteTablesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeRouteTablesPagesWithContext same as DescribeRouteTablesPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeRouteTablesPagesWithContext(ctx aws.Context, input *DescribeRouteTablesInput, fn func(*DescribeRouteTablesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeRouteTablesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeRouteTablesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeRouteTablesOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeScheduledInstanceAvailability = "DescribeScheduledInstanceAvailability"

// DescribeScheduledInstanceAvailabilityRequest generates a "aws/request.Request" representing the
// client's request for the DescribeScheduledInstanceAvailability operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeScheduledInstanceAvailability for more information on using the DescribeScheduledInstanceAvailability
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeScheduledInstanceAvailabilityRequest method.
//    req, resp := client.DescribeScheduledInstanceAvailabilityRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeScheduledInstanceAvailability
func (c *EC2) DescribeScheduledInstanceAvailabilityRequest(input *DescribeScheduledInstanceAvailabilityInput) (req *request.Request, output *DescribeScheduledInstanceAvailabilityOutput) {
	op := &request.Operation{
		Name:       opDescribeScheduledInstanceAvailability,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeScheduledInstanceAvailabilityInput{}
	}

	output = &DescribeScheduledInstanceAvailabilityOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeScheduledInstanceAvailability API operation for Amazon Elastic Compute Cloud.
//
// Finds available schedules that meet the specified criteria.
//
// You can search for an available schedule no more than 3 months in advance.
// You must meet the minimum required duration of 1,200 hours per year. For
// example, the minimum daily schedule is 4 hours, the minimum weekly schedule
// is 24 hours, and the minimum monthly schedule is 100 hours.
//
// After you find a schedule that meets your needs, call PurchaseScheduledInstances
// to purchase Scheduled Instances with that schedule.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeScheduledInstanceAvailability for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeScheduledInstanceAvailability
func (c *EC2) DescribeScheduledInstanceAvailability(input *DescribeScheduledInstanceAvailabilityInput) (*DescribeScheduledInstanceAvailabilityOutput, error) {
	req, out := c.DescribeScheduledInstanceAvailabilityRequest(input)
	return out, req.Send()
}

// DescribeScheduledInstanceAvailabilityWithContext is the same as DescribeScheduledInstanceAvailability with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeScheduledInstanceAvailability for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeScheduledInstanceAvailabilityWithContext(ctx aws.Context, input *DescribeScheduledInstanceAvailabilityInput, opts ...request.Option) (*DescribeScheduledInstanceAvailabilityOutput, error) {
	req, out := c.DescribeScheduledInstanceAvailabilityRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeScheduledInstances = "DescribeScheduledInstances"

// DescribeScheduledInstancesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeScheduledInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeScheduledInstances for more information on using the DescribeScheduledInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeScheduledInstancesRequest method.
//    req, resp := client.DescribeScheduledInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeScheduledInstances
func (c *EC2) DescribeScheduledInstancesRequest(input *DescribeScheduledInstancesInput) (req *request.Request, output *DescribeScheduledInstancesOutput) {
	op := &request.Operation{
		Name:       opDescribeScheduledInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeScheduledInstancesInput{}
	}

	output = &DescribeScheduledInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeScheduledInstances API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your Scheduled Instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeScheduledInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeScheduledInstances
func (c *EC2) DescribeScheduledInstances(input *DescribeScheduledInstancesInput) (*DescribeScheduledInstancesOutput, error) {
	req, out := c.DescribeScheduledInstancesRequest(input)
	return out, req.Send()
}

// DescribeScheduledInstancesWithContext is the same as DescribeScheduledInstances with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeScheduledInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeScheduledInstancesWithContext(ctx aws.Context, input *DescribeScheduledInstancesInput, opts ...request.Option) (*DescribeScheduledInstancesOutput, error) {
	req, out := c.DescribeScheduledInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSecurityGroupReferences = "DescribeSecurityGroupReferences"

// DescribeSecurityGroupReferencesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSecurityGroupReferences operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSecurityGroupReferences for more information on using the DescribeSecurityGroupReferences
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSecurityGroupReferencesRequest method.
//    req, resp := client.DescribeSecurityGroupReferencesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSecurityGroupReferences
func (c *EC2) DescribeSecurityGroupReferencesRequest(input *DescribeSecurityGroupReferencesInput) (req *request.Request, output *DescribeSecurityGroupReferencesOutput) {
	op := &request.Operation{
		Name:       opDescribeSecurityGroupReferences,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSecurityGroupReferencesInput{}
	}

	output = &DescribeSecurityGroupReferencesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSecurityGroupReferences API operation for Amazon Elastic Compute Cloud.
//
// [EC2-VPC only] Describes the VPCs on the other side of a VPC peering connection
// that are referencing the security groups you've specified in this request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSecurityGroupReferences for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSecurityGroupReferences
func (c *EC2) DescribeSecurityGroupReferences(input *DescribeSecurityGroupReferencesInput) (*DescribeSecurityGroupReferencesOutput, error) {
	req, out := c.DescribeSecurityGroupReferencesRequest(input)
	return out, req.Send()
}

// DescribeSecurityGroupReferencesWithContext is the same as DescribeSecurityGroupReferences with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSecurityGroupReferences for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSecurityGroupReferencesWithContext(ctx aws.Context, input *DescribeSecurityGroupReferencesInput, opts ...request.Option) (*DescribeSecurityGroupReferencesOutput, error) {
	req, out := c.DescribeSecurityGroupReferencesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSecurityGroups = "DescribeSecurityGroups"

// DescribeSecurityGroupsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSecurityGroups operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSecurityGroups for more information on using the DescribeSecurityGroups
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSecurityGroupsRequest method.
//    req, resp := client.DescribeSecurityGroupsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSecurityGroups
func (c *EC2) DescribeSecurityGroupsRequest(input *DescribeSecurityGroupsInput) (req *request.Request, output *DescribeSecurityGroupsOutput) {
	op := &request.Operation{
		Name:       opDescribeSecurityGroups,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeSecurityGroupsInput{}
	}

	output = &DescribeSecurityGroupsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSecurityGroups API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your security groups.
//
// A security group is for use with instances either in the EC2-Classic platform
// or in a specific VPC. For more information, see Amazon EC2 Security Groups
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)
// in the Amazon Elastic Compute Cloud User Guide and Security Groups for Your
// VPC (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSecurityGroups for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSecurityGroups
func (c *EC2) DescribeSecurityGroups(input *DescribeSecurityGroupsInput) (*DescribeSecurityGroupsOutput, error) {
	req, out := c.DescribeSecurityGroupsRequest(input)
	return out, req.Send()
}

// DescribeSecurityGroupsWithContext is the same as DescribeSecurityGroups with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSecurityGroups for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSecurityGroupsWithContext(ctx aws.Context, input *DescribeSecurityGroupsInput, opts ...request.Option) (*DescribeSecurityGroupsOutput, error) {
	req, out := c.DescribeSecurityGroupsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeSecurityGroupsPages iterates over the pages of a DescribeSecurityGroups operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeSecurityGroups method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeSecurityGroups operation.
//    pageNum := 0
//    err := client.DescribeSecurityGroupsPages(params,
//        func(page *DescribeSecurityGroupsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeSecurityGroupsPages(input *DescribeSecurityGroupsInput, fn func(*DescribeSecurityGroupsOutput, bool) bool) error {
	return c.DescribeSecurityGroupsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeSecurityGroupsPagesWithContext same as DescribeSecurityGroupsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSecurityGroupsPagesWithContext(ctx aws.Context, input *DescribeSecurityGroupsInput, fn func(*DescribeSecurityGroupsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeSecurityGroupsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeSecurityGroupsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeSecurityGroupsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeSnapshotAttribute = "DescribeSnapshotAttribute"

// DescribeSnapshotAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSnapshotAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSnapshotAttribute for more information on using the DescribeSnapshotAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSnapshotAttributeRequest method.
//    req, resp := client.DescribeSnapshotAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSnapshotAttribute
func (c *EC2) DescribeSnapshotAttributeRequest(input *DescribeSnapshotAttributeInput) (req *request.Request, output *DescribeSnapshotAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeSnapshotAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSnapshotAttributeInput{}
	}

	output = &DescribeSnapshotAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSnapshotAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified attribute of the specified snapshot. You can specify
// only one attribute at a time.
//
// For more information about EBS snapshots, see Amazon EBS Snapshots (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSnapshotAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSnapshotAttribute
func (c *EC2) DescribeSnapshotAttribute(input *DescribeSnapshotAttributeInput) (*DescribeSnapshotAttributeOutput, error) {
	req, out := c.DescribeSnapshotAttributeRequest(input)
	return out, req.Send()
}

// DescribeSnapshotAttributeWithContext is the same as DescribeSnapshotAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSnapshotAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSnapshotAttributeWithContext(ctx aws.Context, input *DescribeSnapshotAttributeInput, opts ...request.Option) (*DescribeSnapshotAttributeOutput, error) {
	req, out := c.DescribeSnapshotAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSnapshots = "DescribeSnapshots"

// DescribeSnapshotsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSnapshots operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSnapshots for more information on using the DescribeSnapshots
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSnapshotsRequest method.
//    req, resp := client.DescribeSnapshotsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSnapshots
func (c *EC2) DescribeSnapshotsRequest(input *DescribeSnapshotsInput) (req *request.Request, output *DescribeSnapshotsOutput) {
	op := &request.Operation{
		Name:       opDescribeSnapshots,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeSnapshotsInput{}
	}

	output = &DescribeSnapshotsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSnapshots API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of the EBS snapshots available to you. Available snapshots
// include public snapshots available for any AWS account to launch, private
// snapshots that you own, and private snapshots owned by another AWS account
// but for which you've been given explicit create volume permissions.
//
// The create volume permissions fall into the following categories:
//
//    * public: The owner of the snapshot granted create volume permissions
//    for the snapshot to the all group. All AWS accounts have create volume
//    permissions for these snapshots.
//
//    * explicit: The owner of the snapshot granted create volume permissions
//    to a specific AWS account.
//
//    * implicit: An AWS account has implicit create volume permissions for
//    all snapshots it owns.
//
// The list of snapshots returned can be modified by specifying snapshot IDs,
// snapshot owners, or AWS accounts with create volume permissions. If no options
// are specified, Amazon EC2 returns all snapshots for which you have create
// volume permissions.
//
// If you specify one or more snapshot IDs, only snapshots that have the specified
// IDs are returned. If you specify an invalid snapshot ID, an error is returned.
// If you specify a snapshot ID for which you do not have access, it is not
// included in the returned results.
//
// If you specify one or more snapshot owners using the OwnerIds option, only
// snapshots from the specified owners and for which you have access are returned.
// The results can include the AWS account IDs of the specified owners, amazon
// for snapshots owned by Amazon, or self for snapshots that you own.
//
// If you specify a list of restorable users, only snapshots with create snapshot
// permissions for those users are returned. You can specify AWS account IDs
// (if you own the snapshots), self for snapshots for which you own or have
// explicit permissions, or all for public snapshots.
//
// If you are describing a long list of snapshots, you can paginate the output
// to make the list more manageable. The MaxResults parameter sets the maximum
// number of results returned in a single page. If the list of results exceeds
// your MaxResults value, then that number of results is returned along with
// a NextToken value that can be passed to a subsequent DescribeSnapshots request
// to retrieve the remaining results.
//
// For more information about EBS snapshots, see Amazon EBS Snapshots (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSnapshots for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSnapshots
func (c *EC2) DescribeSnapshots(input *DescribeSnapshotsInput) (*DescribeSnapshotsOutput, error) {
	req, out := c.DescribeSnapshotsRequest(input)
	return out, req.Send()
}

// DescribeSnapshotsWithContext is the same as DescribeSnapshots with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSnapshots for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSnapshotsWithContext(ctx aws.Context, input *DescribeSnapshotsInput, opts ...request.Option) (*DescribeSnapshotsOutput, error) {
	req, out := c.DescribeSnapshotsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeSnapshotsPages iterates over the pages of a DescribeSnapshots operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeSnapshots method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeSnapshots operation.
//    pageNum := 0
//    err := client.DescribeSnapshotsPages(params,
//        func(page *DescribeSnapshotsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeSnapshotsPages(input *DescribeSnapshotsInput, fn func(*DescribeSnapshotsOutput, bool) bool) error {
	return c.DescribeSnapshotsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeSnapshotsPagesWithContext same as DescribeSnapshotsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSnapshotsPagesWithContext(ctx aws.Context, input *DescribeSnapshotsInput, fn func(*DescribeSnapshotsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeSnapshotsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeSnapshotsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeSnapshotsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeSpotDatafeedSubscription = "DescribeSpotDatafeedSubscription"

// DescribeSpotDatafeedSubscriptionRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSpotDatafeedSubscription operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSpotDatafeedSubscription for more information on using the DescribeSpotDatafeedSubscription
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSpotDatafeedSubscriptionRequest method.
//    req, resp := client.DescribeSpotDatafeedSubscriptionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotDatafeedSubscription
func (c *EC2) DescribeSpotDatafeedSubscriptionRequest(input *DescribeSpotDatafeedSubscriptionInput) (req *request.Request, output *DescribeSpotDatafeedSubscriptionOutput) {
	op := &request.Operation{
		Name:       opDescribeSpotDatafeedSubscription,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSpotDatafeedSubscriptionInput{}
	}

	output = &DescribeSpotDatafeedSubscriptionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSpotDatafeedSubscription API operation for Amazon Elastic Compute Cloud.
//
// Describes the data feed for Spot Instances. For more information, see Spot
// Instance Data Feed (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-data-feeds.html)
// in the Amazon EC2 User Guide for Linux Instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSpotDatafeedSubscription for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotDatafeedSubscription
func (c *EC2) DescribeSpotDatafeedSubscription(input *DescribeSpotDatafeedSubscriptionInput) (*DescribeSpotDatafeedSubscriptionOutput, error) {
	req, out := c.DescribeSpotDatafeedSubscriptionRequest(input)
	return out, req.Send()
}

// DescribeSpotDatafeedSubscriptionWithContext is the same as DescribeSpotDatafeedSubscription with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSpotDatafeedSubscription for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotDatafeedSubscriptionWithContext(ctx aws.Context, input *DescribeSpotDatafeedSubscriptionInput, opts ...request.Option) (*DescribeSpotDatafeedSubscriptionOutput, error) {
	req, out := c.DescribeSpotDatafeedSubscriptionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSpotFleetInstances = "DescribeSpotFleetInstances"

// DescribeSpotFleetInstancesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSpotFleetInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSpotFleetInstances for more information on using the DescribeSpotFleetInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSpotFleetInstancesRequest method.
//    req, resp := client.DescribeSpotFleetInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotFleetInstances
func (c *EC2) DescribeSpotFleetInstancesRequest(input *DescribeSpotFleetInstancesInput) (req *request.Request, output *DescribeSpotFleetInstancesOutput) {
	op := &request.Operation{
		Name:       opDescribeSpotFleetInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSpotFleetInstancesInput{}
	}

	output = &DescribeSpotFleetInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSpotFleetInstances API operation for Amazon Elastic Compute Cloud.
//
// Describes the running instances for the specified Spot Fleet.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSpotFleetInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotFleetInstances
func (c *EC2) DescribeSpotFleetInstances(input *DescribeSpotFleetInstancesInput) (*DescribeSpotFleetInstancesOutput, error) {
	req, out := c.DescribeSpotFleetInstancesRequest(input)
	return out, req.Send()
}

// DescribeSpotFleetInstancesWithContext is the same as DescribeSpotFleetInstances with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSpotFleetInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotFleetInstancesWithContext(ctx aws.Context, input *DescribeSpotFleetInstancesInput, opts ...request.Option) (*DescribeSpotFleetInstancesOutput, error) {
	req, out := c.DescribeSpotFleetInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSpotFleetRequestHistory = "DescribeSpotFleetRequestHistory"

// DescribeSpotFleetRequestHistoryRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSpotFleetRequestHistory operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSpotFleetRequestHistory for more information on using the DescribeSpotFleetRequestHistory
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSpotFleetRequestHistoryRequest method.
//    req, resp := client.DescribeSpotFleetRequestHistoryRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotFleetRequestHistory
func (c *EC2) DescribeSpotFleetRequestHistoryRequest(input *DescribeSpotFleetRequestHistoryInput) (req *request.Request, output *DescribeSpotFleetRequestHistoryOutput) {
	op := &request.Operation{
		Name:       opDescribeSpotFleetRequestHistory,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSpotFleetRequestHistoryInput{}
	}

	output = &DescribeSpotFleetRequestHistoryOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSpotFleetRequestHistory API operation for Amazon Elastic Compute Cloud.
//
// Describes the events for the specified Spot Fleet request during the specified
// time.
//
// Spot Fleet events are delayed by up to 30 seconds before they can be described.
// This ensures that you can query by the last evaluated time and not miss a
// recorded event. Spot Fleet events are available for 48 hours.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSpotFleetRequestHistory for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotFleetRequestHistory
func (c *EC2) DescribeSpotFleetRequestHistory(input *DescribeSpotFleetRequestHistoryInput) (*DescribeSpotFleetRequestHistoryOutput, error) {
	req, out := c.DescribeSpotFleetRequestHistoryRequest(input)
	return out, req.Send()
}

// DescribeSpotFleetRequestHistoryWithContext is the same as DescribeSpotFleetRequestHistory with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSpotFleetRequestHistory for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotFleetRequestHistoryWithContext(ctx aws.Context, input *DescribeSpotFleetRequestHistoryInput, opts ...request.Option) (*DescribeSpotFleetRequestHistoryOutput, error) {
	req, out := c.DescribeSpotFleetRequestHistoryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSpotFleetRequests = "DescribeSpotFleetRequests"

// DescribeSpotFleetRequestsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSpotFleetRequests operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSpotFleetRequests for more information on using the DescribeSpotFleetRequests
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSpotFleetRequestsRequest method.
//    req, resp := client.DescribeSpotFleetRequestsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotFleetRequests
func (c *EC2) DescribeSpotFleetRequestsRequest(input *DescribeSpotFleetRequestsInput) (req *request.Request, output *DescribeSpotFleetRequestsOutput) {
	op := &request.Operation{
		Name:       opDescribeSpotFleetRequests,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeSpotFleetRequestsInput{}
	}

	output = &DescribeSpotFleetRequestsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSpotFleetRequests API operation for Amazon Elastic Compute Cloud.
//
// Describes your Spot Fleet requests.
//
// Spot Fleet requests are deleted 48 hours after they are canceled and their
// instances are terminated.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSpotFleetRequests for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotFleetRequests
func (c *EC2) DescribeSpotFleetRequests(input *DescribeSpotFleetRequestsInput) (*DescribeSpotFleetRequestsOutput, error) {
	req, out := c.DescribeSpotFleetRequestsRequest(input)
	return out, req.Send()
}

// DescribeSpotFleetRequestsWithContext is the same as DescribeSpotFleetRequests with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSpotFleetRequests for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotFleetRequestsWithContext(ctx aws.Context, input *DescribeSpotFleetRequestsInput, opts ...request.Option) (*DescribeSpotFleetRequestsOutput, error) {
	req, out := c.DescribeSpotFleetRequestsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeSpotFleetRequestsPages iterates over the pages of a DescribeSpotFleetRequests operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeSpotFleetRequests method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeSpotFleetRequests operation.
//    pageNum := 0
//    err := client.DescribeSpotFleetRequestsPages(params,
//        func(page *DescribeSpotFleetRequestsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeSpotFleetRequestsPages(input *DescribeSpotFleetRequestsInput, fn func(*DescribeSpotFleetRequestsOutput, bool) bool) error {
	return c.DescribeSpotFleetRequestsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeSpotFleetRequestsPagesWithContext same as DescribeSpotFleetRequestsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotFleetRequestsPagesWithContext(ctx aws.Context, input *DescribeSpotFleetRequestsInput, fn func(*DescribeSpotFleetRequestsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeSpotFleetRequestsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeSpotFleetRequestsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeSpotFleetRequestsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeSpotInstanceRequests = "DescribeSpotInstanceRequests"

// DescribeSpotInstanceRequestsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSpotInstanceRequests operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSpotInstanceRequests for more information on using the DescribeSpotInstanceRequests
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSpotInstanceRequestsRequest method.
//    req, resp := client.DescribeSpotInstanceRequestsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotInstanceRequests
func (c *EC2) DescribeSpotInstanceRequestsRequest(input *DescribeSpotInstanceRequestsInput) (req *request.Request, output *DescribeSpotInstanceRequestsOutput) {
	op := &request.Operation{
		Name:       opDescribeSpotInstanceRequests,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSpotInstanceRequestsInput{}
	}

	output = &DescribeSpotInstanceRequestsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSpotInstanceRequests API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified Spot Instance requests.
//
// You can use DescribeSpotInstanceRequests to find a running Spot Instance
// by examining the response. If the status of the Spot Instance is fulfilled,
// the instance ID appears in the response and contains the identifier of the
// instance. Alternatively, you can use DescribeInstances with a filter to look
// for instances where the instance lifecycle is spot.
//
// We recommend that you set MaxResults to a value between 5 and 1000 to limit
// the number of results returned. This paginates the output, which makes the
// list more manageable and returns the results faster. If the list of results
// exceeds your MaxResults value, then that number of results is returned along
// with a NextToken value that can be passed to a subsequent DescribeSpotInstanceRequests
// request to retrieve the remaining results.
//
// Spot Instance requests are deleted four hours after they are canceled and
// their instances are terminated.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSpotInstanceRequests for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotInstanceRequests
func (c *EC2) DescribeSpotInstanceRequests(input *DescribeSpotInstanceRequestsInput) (*DescribeSpotInstanceRequestsOutput, error) {
	req, out := c.DescribeSpotInstanceRequestsRequest(input)
	return out, req.Send()
}

// DescribeSpotInstanceRequestsWithContext is the same as DescribeSpotInstanceRequests with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSpotInstanceRequests for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotInstanceRequestsWithContext(ctx aws.Context, input *DescribeSpotInstanceRequestsInput, opts ...request.Option) (*DescribeSpotInstanceRequestsOutput, error) {
	req, out := c.DescribeSpotInstanceRequestsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSpotPriceHistory = "DescribeSpotPriceHistory"

// DescribeSpotPriceHistoryRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSpotPriceHistory operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSpotPriceHistory for more information on using the DescribeSpotPriceHistory
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSpotPriceHistoryRequest method.
//    req, resp := client.DescribeSpotPriceHistoryRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotPriceHistory
func (c *EC2) DescribeSpotPriceHistoryRequest(input *DescribeSpotPriceHistoryInput) (req *request.Request, output *DescribeSpotPriceHistoryOutput) {
	op := &request.Operation{
		Name:       opDescribeSpotPriceHistory,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeSpotPriceHistoryInput{}
	}

	output = &DescribeSpotPriceHistoryOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSpotPriceHistory API operation for Amazon Elastic Compute Cloud.
//
// Describes the Spot price history. For more information, see Spot Instance
// Pricing History (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances-history.html)
// in the Amazon EC2 User Guide for Linux Instances.
//
// When you specify a start and end time, this operation returns the prices
// of the instance types within the time range that you specified and the time
// when the price changed. The price is valid within the time period that you
// specified; the response merely indicates the last time that the price changed.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSpotPriceHistory for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSpotPriceHistory
func (c *EC2) DescribeSpotPriceHistory(input *DescribeSpotPriceHistoryInput) (*DescribeSpotPriceHistoryOutput, error) {
	req, out := c.DescribeSpotPriceHistoryRequest(input)
	return out, req.Send()
}

// DescribeSpotPriceHistoryWithContext is the same as DescribeSpotPriceHistory with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSpotPriceHistory for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotPriceHistoryWithContext(ctx aws.Context, input *DescribeSpotPriceHistoryInput, opts ...request.Option) (*DescribeSpotPriceHistoryOutput, error) {
	req, out := c.DescribeSpotPriceHistoryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeSpotPriceHistoryPages iterates over the pages of a DescribeSpotPriceHistory operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeSpotPriceHistory method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeSpotPriceHistory operation.
//    pageNum := 0
//    err := client.DescribeSpotPriceHistoryPages(params,
//        func(page *DescribeSpotPriceHistoryOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeSpotPriceHistoryPages(input *DescribeSpotPriceHistoryInput, fn func(*DescribeSpotPriceHistoryOutput, bool) bool) error {
	return c.DescribeSpotPriceHistoryPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeSpotPriceHistoryPagesWithContext same as DescribeSpotPriceHistoryPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSpotPriceHistoryPagesWithContext(ctx aws.Context, input *DescribeSpotPriceHistoryInput, fn func(*DescribeSpotPriceHistoryOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeSpotPriceHistoryInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeSpotPriceHistoryRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeSpotPriceHistoryOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeStaleSecurityGroups = "DescribeStaleSecurityGroups"

// DescribeStaleSecurityGroupsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeStaleSecurityGroups operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeStaleSecurityGroups for more information on using the DescribeStaleSecurityGroups
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeStaleSecurityGroupsRequest method.
//    req, resp := client.DescribeStaleSecurityGroupsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeStaleSecurityGroups
func (c *EC2) DescribeStaleSecurityGroupsRequest(input *DescribeStaleSecurityGroupsInput) (req *request.Request, output *DescribeStaleSecurityGroupsOutput) {
	op := &request.Operation{
		Name:       opDescribeStaleSecurityGroups,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeStaleSecurityGroupsInput{}
	}

	output = &DescribeStaleSecurityGroupsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeStaleSecurityGroups API operation for Amazon Elastic Compute Cloud.
//
// [EC2-VPC only] Describes the stale security group rules for security groups
// in a specified VPC. Rules are stale when they reference a deleted security
// group in a peer VPC, or a security group in a peer VPC for which the VPC
// peering connection has been deleted.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeStaleSecurityGroups for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeStaleSecurityGroups
func (c *EC2) DescribeStaleSecurityGroups(input *DescribeStaleSecurityGroupsInput) (*DescribeStaleSecurityGroupsOutput, error) {
	req, out := c.DescribeStaleSecurityGroupsRequest(input)
	return out, req.Send()
}

// DescribeStaleSecurityGroupsWithContext is the same as DescribeStaleSecurityGroups with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeStaleSecurityGroups for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeStaleSecurityGroupsWithContext(ctx aws.Context, input *DescribeStaleSecurityGroupsInput, opts ...request.Option) (*DescribeStaleSecurityGroupsOutput, error) {
	req, out := c.DescribeStaleSecurityGroupsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeSubnets = "DescribeSubnets"

// DescribeSubnetsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSubnets operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeSubnets for more information on using the DescribeSubnets
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeSubnetsRequest method.
//    req, resp := client.DescribeSubnetsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSubnets
func (c *EC2) DescribeSubnetsRequest(input *DescribeSubnetsInput) (req *request.Request, output *DescribeSubnetsOutput) {
	op := &request.Operation{
		Name:       opDescribeSubnets,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSubnetsInput{}
	}

	output = &DescribeSubnetsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeSubnets API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your subnets.
//
// For more information, see Your VPC and Subnets (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeSubnets for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeSubnets
func (c *EC2) DescribeSubnets(input *DescribeSubnetsInput) (*DescribeSubnetsOutput, error) {
	req, out := c.DescribeSubnetsRequest(input)
	return out, req.Send()
}

// DescribeSubnetsWithContext is the same as DescribeSubnets with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeSubnets for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeSubnetsWithContext(ctx aws.Context, input *DescribeSubnetsInput, opts ...request.Option) (*DescribeSubnetsOutput, error) {
	req, out := c.DescribeSubnetsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeTags = "DescribeTags"

// DescribeTagsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeTags operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeTags for more information on using the DescribeTags
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeTagsRequest method.
//    req, resp := client.DescribeTagsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTags
func (c *EC2) DescribeTagsRequest(input *DescribeTagsInput) (req *request.Request, output *DescribeTagsOutput) {
	op := &request.Operation{
		Name:       opDescribeTags,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeTagsInput{}
	}

	output = &DescribeTagsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeTags API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of the tags for your EC2 resources.
//
// For more information about tags, see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeTags for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTags
func (c *EC2) DescribeTags(input *DescribeTagsInput) (*DescribeTagsOutput, error) {
	req, out := c.DescribeTagsRequest(input)
	return out, req.Send()
}

// DescribeTagsWithContext is the same as DescribeTags with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeTags for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeTagsWithContext(ctx aws.Context, input *DescribeTagsInput, opts ...request.Option) (*DescribeTagsOutput, error) {
	req, out := c.DescribeTagsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeTagsPages iterates over the pages of a DescribeTags operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeTags method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeTags operation.
//    pageNum := 0
//    err := client.DescribeTagsPages(params,
//        func(page *DescribeTagsOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeTagsPages(input *DescribeTagsInput, fn func(*DescribeTagsOutput, bool) bool) error {
	return c.DescribeTagsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeTagsPagesWithContext same as DescribeTagsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeTagsPagesWithContext(ctx aws.Context, input *DescribeTagsInput, fn func(*DescribeTagsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeTagsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeTagsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeTagsOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeTransitGatewayAttachments = "DescribeTransitGatewayAttachments"

// DescribeTransitGatewayAttachmentsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeTransitGatewayAttachments operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeTransitGatewayAttachments for more information on using the DescribeTransitGatewayAttachments
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeTransitGatewayAttachmentsRequest method.
//    req, resp := client.DescribeTransitGatewayAttachmentsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayAttachments
func (c *EC2) DescribeTransitGatewayAttachmentsRequest(input *DescribeTransitGatewayAttachmentsInput) (req *request.Request, output *DescribeTransitGatewayAttachmentsOutput) {
	op := &request.Operation{
		Name:       opDescribeTransitGatewayAttachments,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeTransitGatewayAttachmentsInput{}
	}

	output = &DescribeTransitGatewayAttachmentsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeTransitGatewayAttachments API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more attachments between resources and transit gateways.
// By default, all attachments are described. Alternatively, you can filter
// the results by attachment ID, attachment state, resource ID, or resource
// owner.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeTransitGatewayAttachments for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayAttachments
func (c *EC2) DescribeTransitGatewayAttachments(input *DescribeTransitGatewayAttachmentsInput) (*DescribeTransitGatewayAttachmentsOutput, error) {
	req, out := c.DescribeTransitGatewayAttachmentsRequest(input)
	return out, req.Send()
}

// DescribeTransitGatewayAttachmentsWithContext is the same as DescribeTransitGatewayAttachments with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeTransitGatewayAttachments for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeTransitGatewayAttachmentsWithContext(ctx aws.Context, input *DescribeTransitGatewayAttachmentsInput, opts ...request.Option) (*DescribeTransitGatewayAttachmentsOutput, error) {
	req, out := c.DescribeTransitGatewayAttachmentsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeTransitGatewayRouteTables = "DescribeTransitGatewayRouteTables"

// DescribeTransitGatewayRouteTablesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeTransitGatewayRouteTables operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeTransitGatewayRouteTables for more information on using the DescribeTransitGatewayRouteTables
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeTransitGatewayRouteTablesRequest method.
//    req, resp := client.DescribeTransitGatewayRouteTablesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayRouteTables
func (c *EC2) DescribeTransitGatewayRouteTablesRequest(input *DescribeTransitGatewayRouteTablesInput) (req *request.Request, output *DescribeTransitGatewayRouteTablesOutput) {
	op := &request.Operation{
		Name:       opDescribeTransitGatewayRouteTables,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeTransitGatewayRouteTablesInput{}
	}

	output = &DescribeTransitGatewayRouteTablesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeTransitGatewayRouteTables API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more transit gateway route tables. By default, all transit
// gateway route tables are described. Alternatively, you can filter the results.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeTransitGatewayRouteTables for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayRouteTables
func (c *EC2) DescribeTransitGatewayRouteTables(input *DescribeTransitGatewayRouteTablesInput) (*DescribeTransitGatewayRouteTablesOutput, error) {
	req, out := c.DescribeTransitGatewayRouteTablesRequest(input)
	return out, req.Send()
}

// DescribeTransitGatewayRouteTablesWithContext is the same as DescribeTransitGatewayRouteTables with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeTransitGatewayRouteTables for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeTransitGatewayRouteTablesWithContext(ctx aws.Context, input *DescribeTransitGatewayRouteTablesInput, opts ...request.Option) (*DescribeTransitGatewayRouteTablesOutput, error) {
	req, out := c.DescribeTransitGatewayRouteTablesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeTransitGatewayVpcAttachments = "DescribeTransitGatewayVpcAttachments"

// DescribeTransitGatewayVpcAttachmentsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeTransitGatewayVpcAttachments operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeTransitGatewayVpcAttachments for more information on using the DescribeTransitGatewayVpcAttachments
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeTransitGatewayVpcAttachmentsRequest method.
//    req, resp := client.DescribeTransitGatewayVpcAttachmentsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayVpcAttachments
func (c *EC2) DescribeTransitGatewayVpcAttachmentsRequest(input *DescribeTransitGatewayVpcAttachmentsInput) (req *request.Request, output *DescribeTransitGatewayVpcAttachmentsOutput) {
	op := &request.Operation{
		Name:       opDescribeTransitGatewayVpcAttachments,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeTransitGatewayVpcAttachmentsInput{}
	}

	output = &DescribeTransitGatewayVpcAttachmentsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeTransitGatewayVpcAttachments API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more VPC attachments. By default, all VPC attachments are
// described. Alternatively, you can filter the results.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeTransitGatewayVpcAttachments for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGatewayVpcAttachments
func (c *EC2) DescribeTransitGatewayVpcAttachments(input *DescribeTransitGatewayVpcAttachmentsInput) (*DescribeTransitGatewayVpcAttachmentsOutput, error) {
	req, out := c.DescribeTransitGatewayVpcAttachmentsRequest(input)
	return out, req.Send()
}

// DescribeTransitGatewayVpcAttachmentsWithContext is the same as DescribeTransitGatewayVpcAttachments with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeTransitGatewayVpcAttachments for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeTransitGatewayVpcAttachmentsWithContext(ctx aws.Context, input *DescribeTransitGatewayVpcAttachmentsInput, opts ...request.Option) (*DescribeTransitGatewayVpcAttachmentsOutput, error) {
	req, out := c.DescribeTransitGatewayVpcAttachmentsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeTransitGateways = "DescribeTransitGateways"

// DescribeTransitGatewaysRequest generates a "aws/request.Request" representing the
// client's request for the DescribeTransitGateways operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeTransitGateways for more information on using the DescribeTransitGateways
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeTransitGatewaysRequest method.
//    req, resp := client.DescribeTransitGatewaysRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGateways
func (c *EC2) DescribeTransitGatewaysRequest(input *DescribeTransitGatewaysInput) (req *request.Request, output *DescribeTransitGatewaysOutput) {
	op := &request.Operation{
		Name:       opDescribeTransitGateways,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeTransitGatewaysInput{}
	}

	output = &DescribeTransitGatewaysOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeTransitGateways API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more transit gateways. By default, all transit gateways
// are described. Alternatively, you can filter the results.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeTransitGateways for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeTransitGateways
func (c *EC2) DescribeTransitGateways(input *DescribeTransitGatewaysInput) (*DescribeTransitGatewaysOutput, error) {
	req, out := c.DescribeTransitGatewaysRequest(input)
	return out, req.Send()
}

// DescribeTransitGatewaysWithContext is the same as DescribeTransitGateways with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeTransitGateways for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeTransitGatewaysWithContext(ctx aws.Context, input *DescribeTransitGatewaysInput, opts ...request.Option) (*DescribeTransitGatewaysOutput, error) {
	req, out := c.DescribeTransitGatewaysRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVolumeAttribute = "DescribeVolumeAttribute"

// DescribeVolumeAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVolumeAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVolumeAttribute for more information on using the DescribeVolumeAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVolumeAttributeRequest method.
//    req, resp := client.DescribeVolumeAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumeAttribute
func (c *EC2) DescribeVolumeAttributeRequest(input *DescribeVolumeAttributeInput) (req *request.Request, output *DescribeVolumeAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeVolumeAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVolumeAttributeInput{}
	}

	output = &DescribeVolumeAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVolumeAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified attribute of the specified volume. You can specify
// only one attribute at a time.
//
// For more information about EBS volumes, see Amazon EBS Volumes (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumes.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVolumeAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumeAttribute
func (c *EC2) DescribeVolumeAttribute(input *DescribeVolumeAttributeInput) (*DescribeVolumeAttributeOutput, error) {
	req, out := c.DescribeVolumeAttributeRequest(input)
	return out, req.Send()
}

// DescribeVolumeAttributeWithContext is the same as DescribeVolumeAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVolumeAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVolumeAttributeWithContext(ctx aws.Context, input *DescribeVolumeAttributeInput, opts ...request.Option) (*DescribeVolumeAttributeOutput, error) {
	req, out := c.DescribeVolumeAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVolumeStatus = "DescribeVolumeStatus"

// DescribeVolumeStatusRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVolumeStatus operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVolumeStatus for more information on using the DescribeVolumeStatus
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVolumeStatusRequest method.
//    req, resp := client.DescribeVolumeStatusRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumeStatus
func (c *EC2) DescribeVolumeStatusRequest(input *DescribeVolumeStatusInput) (req *request.Request, output *DescribeVolumeStatusOutput) {
	op := &request.Operation{
		Name:       opDescribeVolumeStatus,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeVolumeStatusInput{}
	}

	output = &DescribeVolumeStatusOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVolumeStatus API operation for Amazon Elastic Compute Cloud.
//
// Describes the status of the specified volumes. Volume status provides the
// result of the checks performed on your volumes to determine events that can
// impair the performance of your volumes. The performance of a volume can be
// affected if an issue occurs on the volume's underlying host. If the volume's
// underlying host experiences a power outage or system issue, after the system
// is restored, there could be data inconsistencies on the volume. Volume events
// notify you if this occurs. Volume actions notify you if any action needs
// to be taken in response to the event.
//
// The DescribeVolumeStatus operation provides the following information about
// the specified volumes:
//
// Status: Reflects the current status of the volume. The possible values are
// ok, impaired , warning, or insufficient-data. If all checks pass, the overall
// status of the volume is ok. If the check fails, the overall status is impaired.
// If the status is insufficient-data, then the checks may still be taking place
// on your volume at the time. We recommend that you retry the request. For
// more information about volume status, see Monitoring the Status of Your Volumes
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-volume-status.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Events: Reflect the cause of a volume status and may require you to take
// action. For example, if your volume returns an impaired status, then the
// volume event might be potential-data-inconsistency. This means that your
// volume has been affected by an issue with the underlying host, has all I/O
// operations disabled, and may have inconsistent data.
//
// Actions: Reflect the actions you may have to take in response to an event.
// For example, if the status of the volume is impaired and the volume event
// shows potential-data-inconsistency, then the action shows enable-volume-io.
// This means that you may want to enable the I/O operations for the volume
// by calling the EnableVolumeIO action and then check the volume for data consistency.
//
// Volume status is based on the volume status checks, and does not reflect
// the volume state. Therefore, volume status does not indicate volumes in the
// error state (for example, when a volume is incapable of accepting I/O.)
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVolumeStatus for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumeStatus
func (c *EC2) DescribeVolumeStatus(input *DescribeVolumeStatusInput) (*DescribeVolumeStatusOutput, error) {
	req, out := c.DescribeVolumeStatusRequest(input)
	return out, req.Send()
}

// DescribeVolumeStatusWithContext is the same as DescribeVolumeStatus with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVolumeStatus for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVolumeStatusWithContext(ctx aws.Context, input *DescribeVolumeStatusInput, opts ...request.Option) (*DescribeVolumeStatusOutput, error) {
	req, out := c.DescribeVolumeStatusRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeVolumeStatusPages iterates over the pages of a DescribeVolumeStatus operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeVolumeStatus method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeVolumeStatus operation.
//    pageNum := 0
//    err := client.DescribeVolumeStatusPages(params,
//        func(page *DescribeVolumeStatusOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeVolumeStatusPages(input *DescribeVolumeStatusInput, fn func(*DescribeVolumeStatusOutput, bool) bool) error {
	return c.DescribeVolumeStatusPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeVolumeStatusPagesWithContext same as DescribeVolumeStatusPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVolumeStatusPagesWithContext(ctx aws.Context, input *DescribeVolumeStatusInput, fn func(*DescribeVolumeStatusOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeVolumeStatusInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeVolumeStatusRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeVolumeStatusOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeVolumes = "DescribeVolumes"

// DescribeVolumesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVolumes operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVolumes for more information on using the DescribeVolumes
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVolumesRequest method.
//    req, resp := client.DescribeVolumesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumes
func (c *EC2) DescribeVolumesRequest(input *DescribeVolumesInput) (req *request.Request, output *DescribeVolumesOutput) {
	op := &request.Operation{
		Name:       opDescribeVolumes,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeVolumesInput{}
	}

	output = &DescribeVolumesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVolumes API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified EBS volumes.
//
// If you are describing a long list of volumes, you can paginate the output
// to make the list more manageable. The MaxResults parameter sets the maximum
// number of results returned in a single page. If the list of results exceeds
// your MaxResults value, then that number of results is returned along with
// a NextToken value that can be passed to a subsequent DescribeVolumes request
// to retrieve the remaining results.
//
// For more information about EBS volumes, see Amazon EBS Volumes (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumes.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVolumes for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumes
func (c *EC2) DescribeVolumes(input *DescribeVolumesInput) (*DescribeVolumesOutput, error) {
	req, out := c.DescribeVolumesRequest(input)
	return out, req.Send()
}

// DescribeVolumesWithContext is the same as DescribeVolumes with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVolumes for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVolumesWithContext(ctx aws.Context, input *DescribeVolumesInput, opts ...request.Option) (*DescribeVolumesOutput, error) {
	req, out := c.DescribeVolumesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeVolumesPages iterates over the pages of a DescribeVolumes operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeVolumes method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//    // Example iterating over at most 3 pages of a DescribeVolumes operation.
//    pageNum := 0
//    err := client.DescribeVolumesPages(params,
//        func(page *DescribeVolumesOutput, lastPage bool) bool {
//            pageNum++
//            fmt.Println(page)
//            return pageNum <= 3
//        })
//
func (c *EC2) DescribeVolumesPages(input *DescribeVolumesInput, fn func(*DescribeVolumesOutput, bool) bool) error {
	return c.DescribeVolumesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeVolumesPagesWithContext same as DescribeVolumesPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVolumesPagesWithContext(ctx aws.Context, input *DescribeVolumesInput, fn func(*DescribeVolumesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeVolumesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeVolumesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	cont := true
	for p.Next() && cont {
		cont = fn(p.Page().(*DescribeVolumesOutput), !p.HasNextPage())
	}
	return p.Err()
}

const opDescribeVolumesModifications = "DescribeVolumesModifications"

// DescribeVolumesModificationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVolumesModifications operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVolumesModifications for more information on using the DescribeVolumesModifications
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVolumesModificationsRequest method.
//    req, resp := client.DescribeVolumesModificationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumesModifications
func (c *EC2) DescribeVolumesModificationsRequest(input *DescribeVolumesModificationsInput) (req *request.Request, output *DescribeVolumesModificationsOutput) {
	op := &request.Operation{
		Name:       opDescribeVolumesModifications,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVolumesModificationsInput{}
	}

	output = &DescribeVolumesModificationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVolumesModifications API operation for Amazon Elastic Compute Cloud.
//
// Reports the current modification status of EBS volumes.
//
// Current-generation EBS volumes support modification of attributes including
// type, size, and (for io1 volumes) IOPS provisioning while either attached
// to or detached from an instance. Following an action from the API or the
// console to modify a volume, the status of the modification may be modifying,
// optimizing, completed, or failed. If a volume has never been modified, then
// certain elements of the returned VolumeModification objects are null.
//
// You can also use CloudWatch Events to check the status of a modification
// to an EBS volume. For information about CloudWatch Events, see the Amazon
// CloudWatch Events User Guide (https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/).
// For more information, see Monitoring Volume Modifications" (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html#monitoring_mods)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVolumesModifications for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVolumesModifications
func (c *EC2) DescribeVolumesModifications(input *DescribeVolumesModificationsInput) (*DescribeVolumesModificationsOutput, error) {
	req, out := c.DescribeVolumesModificationsRequest(input)
	return out, req.Send()
}

// DescribeVolumesModificationsWithContext is the same as DescribeVolumesModifications with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVolumesModifications for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVolumesModificationsWithContext(ctx aws.Context, input *DescribeVolumesModificationsInput, opts ...request.Option) (*DescribeVolumesModificationsOutput, error) {
	req, out := c.DescribeVolumesModificationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcAttribute = "DescribeVpcAttribute"

// DescribeVpcAttributeRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcAttribute for more information on using the DescribeVpcAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcAttributeRequest method.
//    req, resp := client.DescribeVpcAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcAttribute
func (c *EC2) DescribeVpcAttributeRequest(input *DescribeVpcAttributeInput) (req *request.Request, output *DescribeVpcAttributeOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcAttributeInput{}
	}

	output = &DescribeVpcAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcAttribute API operation for Amazon Elastic Compute Cloud.
//
// Describes the specified attribute of the specified VPC. You can specify only
// one attribute at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcAttribute
func (c *EC2) DescribeVpcAttribute(input *DescribeVpcAttributeInput) (*DescribeVpcAttributeOutput, error) {
	req, out := c.DescribeVpcAttributeRequest(input)
	return out, req.Send()
}

// DescribeVpcAttributeWithContext is the same as DescribeVpcAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcAttributeWithContext(ctx aws.Context, input *DescribeVpcAttributeInput, opts ...request.Option) (*DescribeVpcAttributeOutput, error) {
	req, out := c.DescribeVpcAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcClassicLink = "DescribeVpcClassicLink"

// DescribeVpcClassicLinkRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcClassicLink operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcClassicLink for more information on using the DescribeVpcClassicLink
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcClassicLinkRequest method.
//    req, resp := client.DescribeVpcClassicLinkRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcClassicLink
func (c *EC2) DescribeVpcClassicLinkRequest(input *DescribeVpcClassicLinkInput) (req *request.Request, output *DescribeVpcClassicLinkOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcClassicLink,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcClassicLinkInput{}
	}

	output = &DescribeVpcClassicLinkOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcClassicLink API operation for Amazon Elastic Compute Cloud.
//
// Describes the ClassicLink status of one or more VPCs.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcClassicLink for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcClassicLink
func (c *EC2) DescribeVpcClassicLink(input *DescribeVpcClassicLinkInput) (*DescribeVpcClassicLinkOutput, error) {
	req, out := c.DescribeVpcClassicLinkRequest(input)
	return out, req.Send()
}

// DescribeVpcClassicLinkWithContext is the same as DescribeVpcClassicLink with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcClassicLink for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcClassicLinkWithContext(ctx aws.Context, input *DescribeVpcClassicLinkInput, opts ...request.Option) (*DescribeVpcClassicLinkOutput, error) {
	req, out := c.DescribeVpcClassicLinkRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcClassicLinkDnsSupport = "DescribeVpcClassicLinkDnsSupport"

// DescribeVpcClassicLinkDnsSupportRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcClassicLinkDnsSupport operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcClassicLinkDnsSupport for more information on using the DescribeVpcClassicLinkDnsSupport
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcClassicLinkDnsSupportRequest method.
//    req, resp := client.DescribeVpcClassicLinkDnsSupportRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcClassicLinkDnsSupport
func (c *EC2) DescribeVpcClassicLinkDnsSupportRequest(input *DescribeVpcClassicLinkDnsSupportInput) (req *request.Request, output *DescribeVpcClassicLinkDnsSupportOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcClassicLinkDnsSupport,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcClassicLinkDnsSupportInput{}
	}

	output = &DescribeVpcClassicLinkDnsSupportOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcClassicLinkDnsSupport API operation for Amazon Elastic Compute Cloud.
//
// Describes the ClassicLink DNS support status of one or more VPCs. If enabled,
// the DNS hostname of a linked EC2-Classic instance resolves to its private
// IP address when addressed from an instance in the VPC to which it's linked.
// Similarly, the DNS hostname of an instance in a VPC resolves to its private
// IP address when addressed from a linked EC2-Classic instance. For more information,
// see ClassicLink (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcClassicLinkDnsSupport for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcClassicLinkDnsSupport
func (c *EC2) DescribeVpcClassicLinkDnsSupport(input *DescribeVpcClassicLinkDnsSupportInput) (*DescribeVpcClassicLinkDnsSupportOutput, error) {
	req, out := c.DescribeVpcClassicLinkDnsSupportRequest(input)
	return out, req.Send()
}

// DescribeVpcClassicLinkDnsSupportWithContext is the same as DescribeVpcClassicLinkDnsSupport with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcClassicLinkDnsSupport for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcClassicLinkDnsSupportWithContext(ctx aws.Context, input *DescribeVpcClassicLinkDnsSupportInput, opts ...request.Option) (*DescribeVpcClassicLinkDnsSupportOutput, error) {
	req, out := c.DescribeVpcClassicLinkDnsSupportRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcEndpointConnectionNotifications = "DescribeVpcEndpointConnectionNotifications"

// DescribeVpcEndpointConnectionNotificationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcEndpointConnectionNotifications operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcEndpointConnectionNotifications for more information on using the DescribeVpcEndpointConnectionNotifications
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcEndpointConnectionNotificationsRequest method.
//    req, resp := client.DescribeVpcEndpointConnectionNotificationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointConnectionNotifications
func (c *EC2) DescribeVpcEndpointConnectionNotificationsRequest(input *DescribeVpcEndpointConnectionNotificationsInput) (req *request.Request, output *DescribeVpcEndpointConnectionNotificationsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcEndpointConnectionNotifications,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcEndpointConnectionNotificationsInput{}
	}

	output = &DescribeVpcEndpointConnectionNotificationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcEndpointConnectionNotifications API operation for Amazon Elastic Compute Cloud.
//
// Describes the connection notifications for VPC endpoints and VPC endpoint
// services.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcEndpointConnectionNotifications for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointConnectionNotifications
func (c *EC2) DescribeVpcEndpointConnectionNotifications(input *DescribeVpcEndpointConnectionNotificationsInput) (*DescribeVpcEndpointConnectionNotificationsOutput, error) {
	req, out := c.DescribeVpcEndpointConnectionNotificationsRequest(input)
	return out, req.Send()
}

// DescribeVpcEndpointConnectionNotificationsWithContext is the same as DescribeVpcEndpointConnectionNotifications with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcEndpointConnectionNotifications for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcEndpointConnectionNotificationsWithContext(ctx aws.Context, input *DescribeVpcEndpointConnectionNotificationsInput, opts ...request.Option) (*DescribeVpcEndpointConnectionNotificationsOutput, error) {
	req, out := c.DescribeVpcEndpointConnectionNotificationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcEndpointConnections = "DescribeVpcEndpointConnections"

// DescribeVpcEndpointConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcEndpointConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcEndpointConnections for more information on using the DescribeVpcEndpointConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcEndpointConnectionsRequest method.
//    req, resp := client.DescribeVpcEndpointConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointConnections
func (c *EC2) DescribeVpcEndpointConnectionsRequest(input *DescribeVpcEndpointConnectionsInput) (req *request.Request, output *DescribeVpcEndpointConnectionsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcEndpointConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcEndpointConnectionsInput{}
	}

	output = &DescribeVpcEndpointConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcEndpointConnections API operation for Amazon Elastic Compute Cloud.
//
// Describes the VPC endpoint connections to your VPC endpoint services, including
// any endpoints that are pending your acceptance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcEndpointConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointConnections
func (c *EC2) DescribeVpcEndpointConnections(input *DescribeVpcEndpointConnectionsInput) (*DescribeVpcEndpointConnectionsOutput, error) {
	req, out := c.DescribeVpcEndpointConnectionsRequest(input)
	return out, req.Send()
}

// DescribeVpcEndpointConnectionsWithContext is the same as DescribeVpcEndpointConnections with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcEndpointConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcEndpointConnectionsWithContext(ctx aws.Context, input *DescribeVpcEndpointConnectionsInput, opts ...request.Option) (*DescribeVpcEndpointConnectionsOutput, error) {
	req, out := c.DescribeVpcEndpointConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcEndpointServiceConfigurations = "DescribeVpcEndpointServiceConfigurations"

// DescribeVpcEndpointServiceConfigurationsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcEndpointServiceConfigurations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcEndpointServiceConfigurations for more information on using the DescribeVpcEndpointServiceConfigurations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcEndpointServiceConfigurationsRequest method.
//    req, resp := client.DescribeVpcEndpointServiceConfigurationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointServiceConfigurations
func (c *EC2) DescribeVpcEndpointServiceConfigurationsRequest(input *DescribeVpcEndpointServiceConfigurationsInput) (req *request.Request, output *DescribeVpcEndpointServiceConfigurationsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcEndpointServiceConfigurations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcEndpointServiceConfigurationsInput{}
	}

	output = &DescribeVpcEndpointServiceConfigurationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcEndpointServiceConfigurations API operation for Amazon Elastic Compute Cloud.
//
// Describes the VPC endpoint service configurations in your account (your services).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcEndpointServiceConfigurations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointServiceConfigurations
func (c *EC2) DescribeVpcEndpointServiceConfigurations(input *DescribeVpcEndpointServiceConfigurationsInput) (*DescribeVpcEndpointServiceConfigurationsOutput, error) {
	req, out := c.DescribeVpcEndpointServiceConfigurationsRequest(input)
	return out, req.Send()
}

// DescribeVpcEndpointServiceConfigurationsWithContext is the same as DescribeVpcEndpointServiceConfigurations with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcEndpointServiceConfigurations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcEndpointServiceConfigurationsWithContext(ctx aws.Context, input *DescribeVpcEndpointServiceConfigurationsInput, opts ...request.Option) (*DescribeVpcEndpointServiceConfigurationsOutput, error) {
	req, out := c.DescribeVpcEndpointServiceConfigurationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcEndpointServicePermissions = "DescribeVpcEndpointServicePermissions"

// DescribeVpcEndpointServicePermissionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcEndpointServicePermissions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcEndpointServicePermissions for more information on using the DescribeVpcEndpointServicePermissions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcEndpointServicePermissionsRequest method.
//    req, resp := client.DescribeVpcEndpointServicePermissionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointServicePermissions
func (c *EC2) DescribeVpcEndpointServicePermissionsRequest(input *DescribeVpcEndpointServicePermissionsInput) (req *request.Request, output *DescribeVpcEndpointServicePermissionsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcEndpointServicePermissions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcEndpointServicePermissionsInput{}
	}

	output = &DescribeVpcEndpointServicePermissionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcEndpointServicePermissions API operation for Amazon Elastic Compute Cloud.
//
// Describes the principals (service consumers) that are permitted to discover
// your VPC endpoint service.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcEndpointServicePermissions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointServicePermissions
func (c *EC2) DescribeVpcEndpointServicePermissions(input *DescribeVpcEndpointServicePermissionsInput) (*DescribeVpcEndpointServicePermissionsOutput, error) {
	req, out := c.DescribeVpcEndpointServicePermissionsRequest(input)
	return out, req.Send()
}

// DescribeVpcEndpointServicePermissionsWithContext is the same as DescribeVpcEndpointServicePermissions with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcEndpointServicePermissions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcEndpointServicePermissionsWithContext(ctx aws.Context, input *DescribeVpcEndpointServicePermissionsInput, opts ...request.Option) (*DescribeVpcEndpointServicePermissionsOutput, error) {
	req, out := c.DescribeVpcEndpointServicePermissionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcEndpointServices = "DescribeVpcEndpointServices"

// DescribeVpcEndpointServicesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcEndpointServices operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcEndpointServices for more information on using the DescribeVpcEndpointServices
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcEndpointServicesRequest method.
//    req, resp := client.DescribeVpcEndpointServicesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointServices
func (c *EC2) DescribeVpcEndpointServicesRequest(input *DescribeVpcEndpointServicesInput) (req *request.Request, output *DescribeVpcEndpointServicesOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcEndpointServices,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcEndpointServicesInput{}
	}

	output = &DescribeVpcEndpointServicesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcEndpointServices API operation for Amazon Elastic Compute Cloud.
//
// Describes available services to which you can create a VPC endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcEndpointServices for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpointServices
func (c *EC2) DescribeVpcEndpointServices(input *DescribeVpcEndpointServicesInput) (*DescribeVpcEndpointServicesOutput, error) {
	req, out := c.DescribeVpcEndpointServicesRequest(input)
	return out, req.Send()
}

// DescribeVpcEndpointServicesWithContext is the same as DescribeVpcEndpointServices with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcEndpointServices for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcEndpointServicesWithContext(ctx aws.Context, input *DescribeVpcEndpointServicesInput, opts ...request.Option) (*DescribeVpcEndpointServicesOutput, error) {
	req, out := c.DescribeVpcEndpointServicesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcEndpoints = "DescribeVpcEndpoints"

// DescribeVpcEndpointsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcEndpoints operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcEndpoints for more information on using the DescribeVpcEndpoints
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcEndpointsRequest method.
//    req, resp := client.DescribeVpcEndpointsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpoints
func (c *EC2) DescribeVpcEndpointsRequest(input *DescribeVpcEndpointsInput) (req *request.Request, output *DescribeVpcEndpointsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcEndpoints,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcEndpointsInput{}
	}

	output = &DescribeVpcEndpointsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcEndpoints API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your VPC endpoints.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcEndpoints for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcEndpoints
func (c *EC2) DescribeVpcEndpoints(input *DescribeVpcEndpointsInput) (*DescribeVpcEndpointsOutput, error) {
	req, out := c.DescribeVpcEndpointsRequest(input)
	return out, req.Send()
}

// DescribeVpcEndpointsWithContext is the same as DescribeVpcEndpoints with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcEndpoints for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcEndpointsWithContext(ctx aws.Context, input *DescribeVpcEndpointsInput, opts ...request.Option) (*DescribeVpcEndpointsOutput, error) {
	req, out := c.DescribeVpcEndpointsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcPeeringConnections = "DescribeVpcPeeringConnections"

// DescribeVpcPeeringConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcPeeringConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcPeeringConnections for more information on using the DescribeVpcPeeringConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcPeeringConnectionsRequest method.
//    req, resp := client.DescribeVpcPeeringConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcPeeringConnections
func (c *EC2) DescribeVpcPeeringConnectionsRequest(input *DescribeVpcPeeringConnectionsInput) (req *request.Request, output *DescribeVpcPeeringConnectionsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcPeeringConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcPeeringConnectionsInput{}
	}

	output = &DescribeVpcPeeringConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcPeeringConnections API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your VPC peering connections.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcPeeringConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcPeeringConnections
func (c *EC2) DescribeVpcPeeringConnections(input *DescribeVpcPeeringConnectionsInput) (*DescribeVpcPeeringConnectionsOutput, error) {
	req, out := c.DescribeVpcPeeringConnectionsRequest(input)
	return out, req.Send()
}

// DescribeVpcPeeringConnectionsWithContext is the same as DescribeVpcPeeringConnections with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcPeeringConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcPeeringConnectionsWithContext(ctx aws.Context, input *DescribeVpcPeeringConnectionsInput, opts ...request.Option) (*DescribeVpcPeeringConnectionsOutput, error) {
	req, out := c.DescribeVpcPeeringConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpcs = "DescribeVpcs"

// DescribeVpcsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpcs operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpcs for more information on using the DescribeVpcs
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpcsRequest method.
//    req, resp := client.DescribeVpcsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcs
func (c *EC2) DescribeVpcsRequest(input *DescribeVpcsInput) (req *request.Request, output *DescribeVpcsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpcs,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpcsInput{}
	}

	output = &DescribeVpcsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpcs API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your VPCs.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpcs for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpcs
func (c *EC2) DescribeVpcs(input *DescribeVpcsInput) (*DescribeVpcsOutput, error) {
	req, out := c.DescribeVpcsRequest(input)
	return out, req.Send()
}

// DescribeVpcsWithContext is the same as DescribeVpcs with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpcs for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpcsWithContext(ctx aws.Context, input *DescribeVpcsInput, opts ...request.Option) (*DescribeVpcsOutput, error) {
	req, out := c.DescribeVpcsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpnConnections = "DescribeVpnConnections"

// DescribeVpnConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpnConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpnConnections for more information on using the DescribeVpnConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpnConnectionsRequest method.
//    req, resp := client.DescribeVpnConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpnConnections
func (c *EC2) DescribeVpnConnectionsRequest(input *DescribeVpnConnectionsInput) (req *request.Request, output *DescribeVpnConnectionsOutput) {
	op := &request.Operation{
		Name:       opDescribeVpnConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpnConnectionsInput{}
	}

	output = &DescribeVpnConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpnConnections API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your VPN connections.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpnConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpnConnections
func (c *EC2) DescribeVpnConnections(input *DescribeVpnConnectionsInput) (*DescribeVpnConnectionsOutput, error) {
	req, out := c.DescribeVpnConnectionsRequest(input)
	return out, req.Send()
}

// DescribeVpnConnectionsWithContext is the same as DescribeVpnConnections with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpnConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpnConnectionsWithContext(ctx aws.Context, input *DescribeVpnConnectionsInput, opts ...request.Option) (*DescribeVpnConnectionsOutput, error) {
	req, out := c.DescribeVpnConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDescribeVpnGateways = "DescribeVpnGateways"

// DescribeVpnGatewaysRequest generates a "aws/request.Request" representing the
// client's request for the DescribeVpnGateways operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeVpnGateways for more information on using the DescribeVpnGateways
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DescribeVpnGatewaysRequest method.
//    req, resp := client.DescribeVpnGatewaysRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpnGateways
func (c *EC2) DescribeVpnGatewaysRequest(input *DescribeVpnGatewaysInput) (req *request.Request, output *DescribeVpnGatewaysOutput) {
	op := &request.Operation{
		Name:       opDescribeVpnGateways,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeVpnGatewaysInput{}
	}

	output = &DescribeVpnGatewaysOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeVpnGateways API operation for Amazon Elastic Compute Cloud.
//
// Describes one or more of your virtual private gateways.
//
// For more information, see AWS Site-to-Site VPN (https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)
// in the AWS Site-to-Site VPN User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DescribeVpnGateways for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeVpnGateways
func (c *EC2) DescribeVpnGateways(input *DescribeVpnGatewaysInput) (*DescribeVpnGatewaysOutput, error) {
	req, out := c.DescribeVpnGatewaysRequest(input)
	return out, req.Send()
}

// DescribeVpnGatewaysWithContext is the same as DescribeVpnGateways with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeVpnGateways for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DescribeVpnGatewaysWithContext(ctx aws.Context, input *DescribeVpnGatewaysInput, opts ...request.Option) (*DescribeVpnGatewaysOutput, error) {
	req, out := c.DescribeVpnGatewaysRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDetachClassicLinkVpc = "DetachClassicLinkVpc"

// DetachClassicLinkVpcRequest generates a "aws/request.Request" representing the
// client's request for the DetachClassicLinkVpc operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DetachClassicLinkVpc for more information on using the DetachClassicLinkVpc
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DetachClassicLinkVpcRequest method.
//    req, resp := client.DetachClassicLinkVpcRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachClassicLinkVpc
func (c *EC2) DetachClassicLinkVpcRequest(input *DetachClassicLinkVpcInput) (req *request.Request, output *DetachClassicLinkVpcOutput) {
	op := &request.Operation{
		Name:       opDetachClassicLinkVpc,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DetachClassicLinkVpcInput{}
	}

	output = &DetachClassicLinkVpcOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DetachClassicLinkVpc API operation for Amazon Elastic Compute Cloud.
//
// Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance
// has been unlinked, the VPC security groups are no longer associated with
// it. An instance is automatically unlinked from a VPC when it's stopped.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DetachClassicLinkVpc for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachClassicLinkVpc
func (c *EC2) DetachClassicLinkVpc(input *DetachClassicLinkVpcInput) (*DetachClassicLinkVpcOutput, error) {
	req, out := c.DetachClassicLinkVpcRequest(input)
	return out, req.Send()
}

// DetachClassicLinkVpcWithContext is the same as DetachClassicLinkVpc with the addition of
// the ability to pass a context and additional request options.
//
// See DetachClassicLinkVpc for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DetachClassicLinkVpcWithContext(ctx aws.Context, input *DetachClassicLinkVpcInput, opts ...request.Option) (*DetachClassicLinkVpcOutput, error) {
	req, out := c.DetachClassicLinkVpcRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDetachInternetGateway = "DetachInternetGateway"

// DetachInternetGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DetachInternetGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DetachInternetGateway for more information on using the DetachInternetGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DetachInternetGatewayRequest method.
//    req, resp := client.DetachInternetGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachInternetGateway
func (c *EC2) DetachInternetGatewayRequest(input *DetachInternetGatewayInput) (req *request.Request, output *DetachInternetGatewayOutput) {
	op := &request.Operation{
		Name:       opDetachInternetGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DetachInternetGatewayInput{}
	}

	output = &DetachInternetGatewayOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DetachInternetGateway API operation for Amazon Elastic Compute Cloud.
//
// Detaches an internet gateway from a VPC, disabling connectivity between the
// internet and the VPC. The VPC must not contain any running instances with
// Elastic IP addresses or public IPv4 addresses.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DetachInternetGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachInternetGateway
func (c *EC2) DetachInternetGateway(input *DetachInternetGatewayInput) (*DetachInternetGatewayOutput, error) {
	req, out := c.DetachInternetGatewayRequest(input)
	return out, req.Send()
}

// DetachInternetGatewayWithContext is the same as DetachInternetGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DetachInternetGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DetachInternetGatewayWithContext(ctx aws.Context, input *DetachInternetGatewayInput, opts ...request.Option) (*DetachInternetGatewayOutput, error) {
	req, out := c.DetachInternetGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDetachNetworkInterface = "DetachNetworkInterface"

// DetachNetworkInterfaceRequest generates a "aws/request.Request" representing the
// client's request for the DetachNetworkInterface operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DetachNetworkInterface for more information on using the DetachNetworkInterface
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DetachNetworkInterfaceRequest method.
//    req, resp := client.DetachNetworkInterfaceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachNetworkInterface
func (c *EC2) DetachNetworkInterfaceRequest(input *DetachNetworkInterfaceInput) (req *request.Request, output *DetachNetworkInterfaceOutput) {
	op := &request.Operation{
		Name:       opDetachNetworkInterface,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DetachNetworkInterfaceInput{}
	}

	output = &DetachNetworkInterfaceOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DetachNetworkInterface API operation for Amazon Elastic Compute Cloud.
//
// Detaches a network interface from an instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DetachNetworkInterface for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachNetworkInterface
func (c *EC2) DetachNetworkInterface(input *DetachNetworkInterfaceInput) (*DetachNetworkInterfaceOutput, error) {
	req, out := c.DetachNetworkInterfaceRequest(input)
	return out, req.Send()
}

// DetachNetworkInterfaceWithContext is the same as DetachNetworkInterface with the addition of
// the ability to pass a context and additional request options.
//
// See DetachNetworkInterface for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DetachNetworkInterfaceWithContext(ctx aws.Context, input *DetachNetworkInterfaceInput, opts ...request.Option) (*DetachNetworkInterfaceOutput, error) {
	req, out := c.DetachNetworkInterfaceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDetachVolume = "DetachVolume"

// DetachVolumeRequest generates a "aws/request.Request" representing the
// client's request for the DetachVolume operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DetachVolume for more information on using the DetachVolume
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DetachVolumeRequest method.
//    req, resp := client.DetachVolumeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachVolume
func (c *EC2) DetachVolumeRequest(input *DetachVolumeInput) (req *request.Request, output *VolumeAttachment) {
	op := &request.Operation{
		Name:       opDetachVolume,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DetachVolumeInput{}
	}

	output = &VolumeAttachment{}
	req = c.newRequest(op, input, output)
	return
}

// DetachVolume API operation for Amazon Elastic Compute Cloud.
//
// Detaches an EBS volume from an instance. Make sure to unmount any file systems
// on the device within your operating system before detaching the volume. Failure
// to do so can result in the volume becoming stuck in the busy state while
// detaching. If this happens, detachment can be delayed indefinitely until
// you unmount the volume, force detachment, reboot the instance, or all three.
// If an EBS volume is the root device of an instance, it can't be detached
// while the instance is running. To detach the root volume, stop the instance
// first.
//
// When a volume with an AWS Marketplace product code is detached from an instance,
// the product code is no longer associated with the instance.
//
// For more information, see Detaching an Amazon EBS Volume (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-detaching-volume.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DetachVolume for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachVolume
func (c *EC2) DetachVolume(input *DetachVolumeInput) (*VolumeAttachment, error) {
	req, out := c.DetachVolumeRequest(input)
	return out, req.Send()
}

// DetachVolumeWithContext is the same as DetachVolume with the addition of
// the ability to pass a context and additional request options.
//
// See DetachVolume for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DetachVolumeWithContext(ctx aws.Context, input *DetachVolumeInput, opts ...request.Option) (*VolumeAttachment, error) {
	req, out := c.DetachVolumeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDetachVpnGateway = "DetachVpnGateway"

// DetachVpnGatewayRequest generates a "aws/request.Request" representing the
// client's request for the DetachVpnGateway operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DetachVpnGateway for more information on using the DetachVpnGateway
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DetachVpnGatewayRequest method.
//    req, resp := client.DetachVpnGatewayRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachVpnGateway
func (c *EC2) DetachVpnGatewayRequest(input *DetachVpnGatewayInput) (req *request.Request, output *DetachVpnGatewayOutput) {
	op := &request.Operation{
		Name:       opDetachVpnGateway,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DetachVpnGatewayInput{}
	}

	output = &DetachVpnGatewayOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DetachVpnGateway API operation for Amazon Elastic Compute Cloud.
//
// Detaches a virtual private gateway from a VPC. You do this if you're planning
// to turn off the VPC and not use it anymore. You can confirm a virtual private
// gateway has been completely detached from a VPC by describing the virtual
// private gateway (any attachments to the virtual private gateway are also
// described).
//
// You must wait for the attachment's state to switch to detached before you
// can delete the VPC or attach a different VPC to the virtual private gateway.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DetachVpnGateway for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DetachVpnGateway
func (c *EC2) DetachVpnGateway(input *DetachVpnGatewayInput) (*DetachVpnGatewayOutput, error) {
	req, out := c.DetachVpnGatewayRequest(input)
	return out, req.Send()
}

// DetachVpnGatewayWithContext is the same as DetachVpnGateway with the addition of
// the ability to pass a context and additional request options.
//
// See DetachVpnGateway for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DetachVpnGatewayWithContext(ctx aws.Context, input *DetachVpnGatewayInput, opts ...request.Option) (*DetachVpnGatewayOutput, error) {
	req, out := c.DetachVpnGatewayRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisableTransitGatewayRouteTablePropagation = "DisableTransitGatewayRouteTablePropagation"

// DisableTransitGatewayRouteTablePropagationRequest generates a "aws/request.Request" representing the
// client's request for the DisableTransitGatewayRouteTablePropagation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisableTransitGatewayRouteTablePropagation for more information on using the DisableTransitGatewayRouteTablePropagation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisableTransitGatewayRouteTablePropagationRequest method.
//    req, resp := client.DisableTransitGatewayRouteTablePropagationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableTransitGatewayRouteTablePropagation
func (c *EC2) DisableTransitGatewayRouteTablePropagationRequest(input *DisableTransitGatewayRouteTablePropagationInput) (req *request.Request, output *DisableTransitGatewayRouteTablePropagationOutput) {
	op := &request.Operation{
		Name:       opDisableTransitGatewayRouteTablePropagation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisableTransitGatewayRouteTablePropagationInput{}
	}

	output = &DisableTransitGatewayRouteTablePropagationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisableTransitGatewayRouteTablePropagation API operation for Amazon Elastic Compute Cloud.
//
// Disables the specified resource attachment from propagating routes to the
// specified propagation route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisableTransitGatewayRouteTablePropagation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableTransitGatewayRouteTablePropagation
func (c *EC2) DisableTransitGatewayRouteTablePropagation(input *DisableTransitGatewayRouteTablePropagationInput) (*DisableTransitGatewayRouteTablePropagationOutput, error) {
	req, out := c.DisableTransitGatewayRouteTablePropagationRequest(input)
	return out, req.Send()
}

// DisableTransitGatewayRouteTablePropagationWithContext is the same as DisableTransitGatewayRouteTablePropagation with the addition of
// the ability to pass a context and additional request options.
//
// See DisableTransitGatewayRouteTablePropagation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisableTransitGatewayRouteTablePropagationWithContext(ctx aws.Context, input *DisableTransitGatewayRouteTablePropagationInput, opts ...request.Option) (*DisableTransitGatewayRouteTablePropagationOutput, error) {
	req, out := c.DisableTransitGatewayRouteTablePropagationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisableVgwRoutePropagation = "DisableVgwRoutePropagation"

// DisableVgwRoutePropagationRequest generates a "aws/request.Request" representing the
// client's request for the DisableVgwRoutePropagation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisableVgwRoutePropagation for more information on using the DisableVgwRoutePropagation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisableVgwRoutePropagationRequest method.
//    req, resp := client.DisableVgwRoutePropagationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableVgwRoutePropagation
func (c *EC2) DisableVgwRoutePropagationRequest(input *DisableVgwRoutePropagationInput) (req *request.Request, output *DisableVgwRoutePropagationOutput) {
	op := &request.Operation{
		Name:       opDisableVgwRoutePropagation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisableVgwRoutePropagationInput{}
	}

	output = &DisableVgwRoutePropagationOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DisableVgwRoutePropagation API operation for Amazon Elastic Compute Cloud.
//
// Disables a virtual private gateway (VGW) from propagating routes to a specified
// route table of a VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisableVgwRoutePropagation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableVgwRoutePropagation
func (c *EC2) DisableVgwRoutePropagation(input *DisableVgwRoutePropagationInput) (*DisableVgwRoutePropagationOutput, error) {
	req, out := c.DisableVgwRoutePropagationRequest(input)
	return out, req.Send()
}

// DisableVgwRoutePropagationWithContext is the same as DisableVgwRoutePropagation with the addition of
// the ability to pass a context and additional request options.
//
// See DisableVgwRoutePropagation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisableVgwRoutePropagationWithContext(ctx aws.Context, input *DisableVgwRoutePropagationInput, opts ...request.Option) (*DisableVgwRoutePropagationOutput, error) {
	req, out := c.DisableVgwRoutePropagationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisableVpcClassicLink = "DisableVpcClassicLink"

// DisableVpcClassicLinkRequest generates a "aws/request.Request" representing the
// client's request for the DisableVpcClassicLink operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisableVpcClassicLink for more information on using the DisableVpcClassicLink
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisableVpcClassicLinkRequest method.
//    req, resp := client.DisableVpcClassicLinkRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableVpcClassicLink
func (c *EC2) DisableVpcClassicLinkRequest(input *DisableVpcClassicLinkInput) (req *request.Request, output *DisableVpcClassicLinkOutput) {
	op := &request.Operation{
		Name:       opDisableVpcClassicLink,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisableVpcClassicLinkInput{}
	}

	output = &DisableVpcClassicLinkOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisableVpcClassicLink API operation for Amazon Elastic Compute Cloud.
//
// Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC
// that has EC2-Classic instances linked to it.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisableVpcClassicLink for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableVpcClassicLink
func (c *EC2) DisableVpcClassicLink(input *DisableVpcClassicLinkInput) (*DisableVpcClassicLinkOutput, error) {
	req, out := c.DisableVpcClassicLinkRequest(input)
	return out, req.Send()
}

// DisableVpcClassicLinkWithContext is the same as DisableVpcClassicLink with the addition of
// the ability to pass a context and additional request options.
//
// See DisableVpcClassicLink for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisableVpcClassicLinkWithContext(ctx aws.Context, input *DisableVpcClassicLinkInput, opts ...request.Option) (*DisableVpcClassicLinkOutput, error) {
	req, out := c.DisableVpcClassicLinkRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisableVpcClassicLinkDnsSupport = "DisableVpcClassicLinkDnsSupport"

// DisableVpcClassicLinkDnsSupportRequest generates a "aws/request.Request" representing the
// client's request for the DisableVpcClassicLinkDnsSupport operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisableVpcClassicLinkDnsSupport for more information on using the DisableVpcClassicLinkDnsSupport
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisableVpcClassicLinkDnsSupportRequest method.
//    req, resp := client.DisableVpcClassicLinkDnsSupportRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableVpcClassicLinkDnsSupport
func (c *EC2) DisableVpcClassicLinkDnsSupportRequest(input *DisableVpcClassicLinkDnsSupportInput) (req *request.Request, output *DisableVpcClassicLinkDnsSupportOutput) {
	op := &request.Operation{
		Name:       opDisableVpcClassicLinkDnsSupport,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisableVpcClassicLinkDnsSupportInput{}
	}

	output = &DisableVpcClassicLinkDnsSupportOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisableVpcClassicLinkDnsSupport API operation for Amazon Elastic Compute Cloud.
//
// Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve
// to public IP addresses when addressed between a linked EC2-Classic instance
// and instances in the VPC to which it's linked. For more information, see
// ClassicLink (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisableVpcClassicLinkDnsSupport for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisableVpcClassicLinkDnsSupport
func (c *EC2) DisableVpcClassicLinkDnsSupport(input *DisableVpcClassicLinkDnsSupportInput) (*DisableVpcClassicLinkDnsSupportOutput, error) {
	req, out := c.DisableVpcClassicLinkDnsSupportRequest(input)
	return out, req.Send()
}

// DisableVpcClassicLinkDnsSupportWithContext is the same as DisableVpcClassicLinkDnsSupport with the addition of
// the ability to pass a context and additional request options.
//
// See DisableVpcClassicLinkDnsSupport for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisableVpcClassicLinkDnsSupportWithContext(ctx aws.Context, input *DisableVpcClassicLinkDnsSupportInput, opts ...request.Option) (*DisableVpcClassicLinkDnsSupportOutput, error) {
	req, out := c.DisableVpcClassicLinkDnsSupportRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateAddress = "DisassociateAddress"

// DisassociateAddressRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateAddress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateAddress for more information on using the DisassociateAddress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateAddressRequest method.
//    req, resp := client.DisassociateAddressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateAddress
func (c *EC2) DisassociateAddressRequest(input *DisassociateAddressInput) (req *request.Request, output *DisassociateAddressOutput) {
	op := &request.Operation{
		Name:       opDisassociateAddress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateAddressInput{}
	}

	output = &DisassociateAddressOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DisassociateAddress API operation for Amazon Elastic Compute Cloud.
//
// Disassociates an Elastic IP address from the instance or network interface
// it's associated with.
//
// An Elastic IP address is for use in either the EC2-Classic platform or in
// a VPC. For more information, see Elastic IP Addresses (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// This is an idempotent operation. If you perform the operation more than once,
// Amazon EC2 doesn't return an error.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateAddress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateAddress
func (c *EC2) DisassociateAddress(input *DisassociateAddressInput) (*DisassociateAddressOutput, error) {
	req, out := c.DisassociateAddressRequest(input)
	return out, req.Send()
}

// DisassociateAddressWithContext is the same as DisassociateAddress with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateAddress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateAddressWithContext(ctx aws.Context, input *DisassociateAddressInput, opts ...request.Option) (*DisassociateAddressOutput, error) {
	req, out := c.DisassociateAddressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateClientVpnTargetNetwork = "DisassociateClientVpnTargetNetwork"

// DisassociateClientVpnTargetNetworkRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateClientVpnTargetNetwork operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateClientVpnTargetNetwork for more information on using the DisassociateClientVpnTargetNetwork
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateClientVpnTargetNetworkRequest method.
//    req, resp := client.DisassociateClientVpnTargetNetworkRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateClientVpnTargetNetwork
func (c *EC2) DisassociateClientVpnTargetNetworkRequest(input *DisassociateClientVpnTargetNetworkInput) (req *request.Request, output *DisassociateClientVpnTargetNetworkOutput) {
	op := &request.Operation{
		Name:       opDisassociateClientVpnTargetNetwork,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateClientVpnTargetNetworkInput{}
	}

	output = &DisassociateClientVpnTargetNetworkOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisassociateClientVpnTargetNetwork API operation for Amazon Elastic Compute Cloud.
//
// Disassociates a target network from the specified Client VPN endpoint. When
// you disassociate the last target network from a Client VPN, the following
// happens:
//
//    * The route that was automatically added for the VPC is deleted
//
//    * All active client connections are terminated
//
//    * New client connections are disallowed
//
//    * The Client VPN endpoint's status changes to pending-associate
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateClientVpnTargetNetwork for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateClientVpnTargetNetwork
func (c *EC2) DisassociateClientVpnTargetNetwork(input *DisassociateClientVpnTargetNetworkInput) (*DisassociateClientVpnTargetNetworkOutput, error) {
	req, out := c.DisassociateClientVpnTargetNetworkRequest(input)
	return out, req.Send()
}

// DisassociateClientVpnTargetNetworkWithContext is the same as DisassociateClientVpnTargetNetwork with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateClientVpnTargetNetwork for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateClientVpnTargetNetworkWithContext(ctx aws.Context, input *DisassociateClientVpnTargetNetworkInput, opts ...request.Option) (*DisassociateClientVpnTargetNetworkOutput, error) {
	req, out := c.DisassociateClientVpnTargetNetworkRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateIamInstanceProfile = "DisassociateIamInstanceProfile"

// DisassociateIamInstanceProfileRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateIamInstanceProfile operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateIamInstanceProfile for more information on using the DisassociateIamInstanceProfile
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateIamInstanceProfileRequest method.
//    req, resp := client.DisassociateIamInstanceProfileRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateIamInstanceProfile
func (c *EC2) DisassociateIamInstanceProfileRequest(input *DisassociateIamInstanceProfileInput) (req *request.Request, output *DisassociateIamInstanceProfileOutput) {
	op := &request.Operation{
		Name:       opDisassociateIamInstanceProfile,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateIamInstanceProfileInput{}
	}

	output = &DisassociateIamInstanceProfileOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisassociateIamInstanceProfile API operation for Amazon Elastic Compute Cloud.
//
// Disassociates an IAM instance profile from a running or stopped instance.
//
// Use DescribeIamInstanceProfileAssociations to get the association ID.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateIamInstanceProfile for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateIamInstanceProfile
func (c *EC2) DisassociateIamInstanceProfile(input *DisassociateIamInstanceProfileInput) (*DisassociateIamInstanceProfileOutput, error) {
	req, out := c.DisassociateIamInstanceProfileRequest(input)
	return out, req.Send()
}

// DisassociateIamInstanceProfileWithContext is the same as DisassociateIamInstanceProfile with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateIamInstanceProfile for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateIamInstanceProfileWithContext(ctx aws.Context, input *DisassociateIamInstanceProfileInput, opts ...request.Option) (*DisassociateIamInstanceProfileOutput, error) {
	req, out := c.DisassociateIamInstanceProfileRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateRouteTable = "DisassociateRouteTable"

// DisassociateRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateRouteTable for more information on using the DisassociateRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateRouteTableRequest method.
//    req, resp := client.DisassociateRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateRouteTable
func (c *EC2) DisassociateRouteTableRequest(input *DisassociateRouteTableInput) (req *request.Request, output *DisassociateRouteTableOutput) {
	op := &request.Operation{
		Name:       opDisassociateRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateRouteTableInput{}
	}

	output = &DisassociateRouteTableOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// DisassociateRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Disassociates a subnet from a route table.
//
// After you perform this action, the subnet no longer uses the routes in the
// route table. Instead, it uses the routes in the VPC's main route table. For
// more information about route tables, see Route Tables (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateRouteTable
func (c *EC2) DisassociateRouteTable(input *DisassociateRouteTableInput) (*DisassociateRouteTableOutput, error) {
	req, out := c.DisassociateRouteTableRequest(input)
	return out, req.Send()
}

// DisassociateRouteTableWithContext is the same as DisassociateRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateRouteTableWithContext(ctx aws.Context, input *DisassociateRouteTableInput, opts ...request.Option) (*DisassociateRouteTableOutput, error) {
	req, out := c.DisassociateRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateSubnetCidrBlock = "DisassociateSubnetCidrBlock"

// DisassociateSubnetCidrBlockRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateSubnetCidrBlock operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateSubnetCidrBlock for more information on using the DisassociateSubnetCidrBlock
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateSubnetCidrBlockRequest method.
//    req, resp := client.DisassociateSubnetCidrBlockRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateSubnetCidrBlock
func (c *EC2) DisassociateSubnetCidrBlockRequest(input *DisassociateSubnetCidrBlockInput) (req *request.Request, output *DisassociateSubnetCidrBlockOutput) {
	op := &request.Operation{
		Name:       opDisassociateSubnetCidrBlock,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateSubnetCidrBlockInput{}
	}

	output = &DisassociateSubnetCidrBlockOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisassociateSubnetCidrBlock API operation for Amazon Elastic Compute Cloud.
//
// Disassociates a CIDR block from a subnet. Currently, you can disassociate
// an IPv6 CIDR block only. You must detach or delete all gateways and resources
// that are associated with the CIDR block before you can disassociate it.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateSubnetCidrBlock for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateSubnetCidrBlock
func (c *EC2) DisassociateSubnetCidrBlock(input *DisassociateSubnetCidrBlockInput) (*DisassociateSubnetCidrBlockOutput, error) {
	req, out := c.DisassociateSubnetCidrBlockRequest(input)
	return out, req.Send()
}

// DisassociateSubnetCidrBlockWithContext is the same as DisassociateSubnetCidrBlock with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateSubnetCidrBlock for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateSubnetCidrBlockWithContext(ctx aws.Context, input *DisassociateSubnetCidrBlockInput, opts ...request.Option) (*DisassociateSubnetCidrBlockOutput, error) {
	req, out := c.DisassociateSubnetCidrBlockRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateTransitGatewayRouteTable = "DisassociateTransitGatewayRouteTable"

// DisassociateTransitGatewayRouteTableRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateTransitGatewayRouteTable operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateTransitGatewayRouteTable for more information on using the DisassociateTransitGatewayRouteTable
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateTransitGatewayRouteTableRequest method.
//    req, resp := client.DisassociateTransitGatewayRouteTableRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateTransitGatewayRouteTable
func (c *EC2) DisassociateTransitGatewayRouteTableRequest(input *DisassociateTransitGatewayRouteTableInput) (req *request.Request, output *DisassociateTransitGatewayRouteTableOutput) {
	op := &request.Operation{
		Name:       opDisassociateTransitGatewayRouteTable,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateTransitGatewayRouteTableInput{}
	}

	output = &DisassociateTransitGatewayRouteTableOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisassociateTransitGatewayRouteTable API operation for Amazon Elastic Compute Cloud.
//
// Disassociates a resource attachment from a transit gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateTransitGatewayRouteTable for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateTransitGatewayRouteTable
func (c *EC2) DisassociateTransitGatewayRouteTable(input *DisassociateTransitGatewayRouteTableInput) (*DisassociateTransitGatewayRouteTableOutput, error) {
	req, out := c.DisassociateTransitGatewayRouteTableRequest(input)
	return out, req.Send()
}

// DisassociateTransitGatewayRouteTableWithContext is the same as DisassociateTransitGatewayRouteTable with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateTransitGatewayRouteTable for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateTransitGatewayRouteTableWithContext(ctx aws.Context, input *DisassociateTransitGatewayRouteTableInput, opts ...request.Option) (*DisassociateTransitGatewayRouteTableOutput, error) {
	req, out := c.DisassociateTransitGatewayRouteTableRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opDisassociateVpcCidrBlock = "DisassociateVpcCidrBlock"

// DisassociateVpcCidrBlockRequest generates a "aws/request.Request" representing the
// client's request for the DisassociateVpcCidrBlock operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DisassociateVpcCidrBlock for more information on using the DisassociateVpcCidrBlock
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the DisassociateVpcCidrBlockRequest method.
//    req, resp := client.DisassociateVpcCidrBlockRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateVpcCidrBlock
func (c *EC2) DisassociateVpcCidrBlockRequest(input *DisassociateVpcCidrBlockInput) (req *request.Request, output *DisassociateVpcCidrBlockOutput) {
	op := &request.Operation{
		Name:       opDisassociateVpcCidrBlock,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisassociateVpcCidrBlockInput{}
	}

	output = &DisassociateVpcCidrBlockOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DisassociateVpcCidrBlock API operation for Amazon Elastic Compute Cloud.
//
// Disassociates a CIDR block from a VPC. To disassociate the CIDR block, you
// must specify its association ID. You can get the association ID by using
// DescribeVpcs. You must detach or delete all gateways and resources that are
// associated with the CIDR block before you can disassociate it.
//
// You cannot disassociate the CIDR block with which you originally created
// the VPC (the primary CIDR block).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation DisassociateVpcCidrBlock for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DisassociateVpcCidrBlock
func (c *EC2) DisassociateVpcCidrBlock(input *DisassociateVpcCidrBlockInput) (*DisassociateVpcCidrBlockOutput, error) {
	req, out := c.DisassociateVpcCidrBlockRequest(input)
	return out, req.Send()
}

// DisassociateVpcCidrBlockWithContext is the same as DisassociateVpcCidrBlock with the addition of
// the ability to pass a context and additional request options.
//
// See DisassociateVpcCidrBlock for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) DisassociateVpcCidrBlockWithContext(ctx aws.Context, input *DisassociateVpcCidrBlockInput, opts ...request.Option) (*DisassociateVpcCidrBlockOutput, error) {
	req, out := c.DisassociateVpcCidrBlockRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opEnableTransitGatewayRouteTablePropagation = "EnableTransitGatewayRouteTablePropagation"

// EnableTransitGatewayRouteTablePropagationRequest generates a "aws/request.Request" representing the
// client's request for the EnableTransitGatewayRouteTablePropagation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See EnableTransitGatewayRouteTablePropagation for more information on using the EnableTransitGatewayRouteTablePropagation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the EnableTransitGatewayRouteTablePropagationRequest method.
//    req, resp := client.EnableTransitGatewayRouteTablePropagationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableTransitGatewayRouteTablePropagation
func (c *EC2) EnableTransitGatewayRouteTablePropagationRequest(input *EnableTransitGatewayRouteTablePropagationInput) (req *request.Request, output *EnableTransitGatewayRouteTablePropagationOutput) {
	op := &request.Operation{
		Name:       opEnableTransitGatewayRouteTablePropagation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &EnableTransitGatewayRouteTablePropagationInput{}
	}

	output = &EnableTransitGatewayRouteTablePropagationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// EnableTransitGatewayRouteTablePropagation API operation for Amazon Elastic Compute Cloud.
//
// Enables the specified attachment to propagate routes to the specified propagation
// route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation EnableTransitGatewayRouteTablePropagation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableTransitGatewayRouteTablePropagation
func (c *EC2) EnableTransitGatewayRouteTablePropagation(input *EnableTransitGatewayRouteTablePropagationInput) (*EnableTransitGatewayRouteTablePropagationOutput, error) {
	req, out := c.EnableTransitGatewayRouteTablePropagationRequest(input)
	return out, req.Send()
}

// EnableTransitGatewayRouteTablePropagationWithContext is the same as EnableTransitGatewayRouteTablePropagation with the addition of
// the ability to pass a context and additional request options.
//
// See EnableTransitGatewayRouteTablePropagation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) EnableTransitGatewayRouteTablePropagationWithContext(ctx aws.Context, input *EnableTransitGatewayRouteTablePropagationInput, opts ...request.Option) (*EnableTransitGatewayRouteTablePropagationOutput, error) {
	req, out := c.EnableTransitGatewayRouteTablePropagationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opEnableVgwRoutePropagation = "EnableVgwRoutePropagation"

// EnableVgwRoutePropagationRequest generates a "aws/request.Request" representing the
// client's request for the EnableVgwRoutePropagation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See EnableVgwRoutePropagation for more information on using the EnableVgwRoutePropagation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the EnableVgwRoutePropagationRequest method.
//    req, resp := client.EnableVgwRoutePropagationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVgwRoutePropagation
func (c *EC2) EnableVgwRoutePropagationRequest(input *EnableVgwRoutePropagationInput) (req *request.Request, output *EnableVgwRoutePropagationOutput) {
	op := &request.Operation{
		Name:       opEnableVgwRoutePropagation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &EnableVgwRoutePropagationInput{}
	}

	output = &EnableVgwRoutePropagationOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// EnableVgwRoutePropagation API operation for Amazon Elastic Compute Cloud.
//
// Enables a virtual private gateway (VGW) to propagate routes to the specified
// route table of a VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation EnableVgwRoutePropagation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVgwRoutePropagation
func (c *EC2) EnableVgwRoutePropagation(input *EnableVgwRoutePropagationInput) (*EnableVgwRoutePropagationOutput, error) {
	req, out := c.EnableVgwRoutePropagationRequest(input)
	return out, req.Send()
}

// EnableVgwRoutePropagationWithContext is the same as EnableVgwRoutePropagation with the addition of
// the ability to pass a context and additional request options.
//
// See EnableVgwRoutePropagation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) EnableVgwRoutePropagationWithContext(ctx aws.Context, input *EnableVgwRoutePropagationInput, opts ...request.Option) (*EnableVgwRoutePropagationOutput, error) {
	req, out := c.EnableVgwRoutePropagationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opEnableVolumeIO = "EnableVolumeIO"

// EnableVolumeIORequest generates a "aws/request.Request" representing the
// client's request for the EnableVolumeIO operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See EnableVolumeIO for more information on using the EnableVolumeIO
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the EnableVolumeIORequest method.
//    req, resp := client.EnableVolumeIORequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVolumeIO
func (c *EC2) EnableVolumeIORequest(input *EnableVolumeIOInput) (req *request.Request, output *EnableVolumeIOOutput) {
	op := &request.Operation{
		Name:       opEnableVolumeIO,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &EnableVolumeIOInput{}
	}

	output = &EnableVolumeIOOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// EnableVolumeIO API operation for Amazon Elastic Compute Cloud.
//
// Enables I/O operations for a volume that had I/O operations disabled because
// the data on the volume was potentially inconsistent.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation EnableVolumeIO for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVolumeIO
func (c *EC2) EnableVolumeIO(input *EnableVolumeIOInput) (*EnableVolumeIOOutput, error) {
	req, out := c.EnableVolumeIORequest(input)
	return out, req.Send()
}

// EnableVolumeIOWithContext is the same as EnableVolumeIO with the addition of
// the ability to pass a context and additional request options.
//
// See EnableVolumeIO for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) EnableVolumeIOWithContext(ctx aws.Context, input *EnableVolumeIOInput, opts ...request.Option) (*EnableVolumeIOOutput, error) {
	req, out := c.EnableVolumeIORequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opEnableVpcClassicLink = "EnableVpcClassicLink"

// EnableVpcClassicLinkRequest generates a "aws/request.Request" representing the
// client's request for the EnableVpcClassicLink operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See EnableVpcClassicLink for more information on using the EnableVpcClassicLink
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the EnableVpcClassicLinkRequest method.
//    req, resp := client.EnableVpcClassicLinkRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVpcClassicLink
func (c *EC2) EnableVpcClassicLinkRequest(input *EnableVpcClassicLinkInput) (req *request.Request, output *EnableVpcClassicLinkOutput) {
	op := &request.Operation{
		Name:       opEnableVpcClassicLink,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &EnableVpcClassicLinkInput{}
	}

	output = &EnableVpcClassicLinkOutput{}
	req = c.newRequest(op, input, output)
	return
}

// EnableVpcClassicLink API operation for Amazon Elastic Compute Cloud.
//
// Enables a VPC for ClassicLink. You can then link EC2-Classic instances to
// your ClassicLink-enabled VPC to allow communication over private IP addresses.
// You cannot enable your VPC for ClassicLink if any of your VPC route tables
// have existing routes for address ranges within the 10.0.0.0/8 IP address
// range, excluding local routes for VPCs in the 10.0.0.0/16 and 10.1.0.0/16
// IP address ranges. For more information, see ClassicLink (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation EnableVpcClassicLink for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVpcClassicLink
func (c *EC2) EnableVpcClassicLink(input *EnableVpcClassicLinkInput) (*EnableVpcClassicLinkOutput, error) {
	req, out := c.EnableVpcClassicLinkRequest(input)
	return out, req.Send()
}

// EnableVpcClassicLinkWithContext is the same as EnableVpcClassicLink with the addition of
// the ability to pass a context and additional request options.
//
// See EnableVpcClassicLink for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) EnableVpcClassicLinkWithContext(ctx aws.Context, input *EnableVpcClassicLinkInput, opts ...request.Option) (*EnableVpcClassicLinkOutput, error) {
	req, out := c.EnableVpcClassicLinkRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opEnableVpcClassicLinkDnsSupport = "EnableVpcClassicLinkDnsSupport"

// EnableVpcClassicLinkDnsSupportRequest generates a "aws/request.Request" representing the
// client's request for the EnableVpcClassicLinkDnsSupport operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See EnableVpcClassicLinkDnsSupport for more information on using the EnableVpcClassicLinkDnsSupport
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the EnableVpcClassicLinkDnsSupportRequest method.
//    req, resp := client.EnableVpcClassicLinkDnsSupportRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVpcClassicLinkDnsSupport
func (c *EC2) EnableVpcClassicLinkDnsSupportRequest(input *EnableVpcClassicLinkDnsSupportInput) (req *request.Request, output *EnableVpcClassicLinkDnsSupportOutput) {
	op := &request.Operation{
		Name:       opEnableVpcClassicLinkDnsSupport,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &EnableVpcClassicLinkDnsSupportInput{}
	}

	output = &EnableVpcClassicLinkDnsSupportOutput{}
	req = c.newRequest(op, input, output)
	return
}

// EnableVpcClassicLinkDnsSupport API operation for Amazon Elastic Compute Cloud.
//
// Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled,
// the DNS hostname of a linked EC2-Classic instance resolves to its private
// IP address when addressed from an instance in the VPC to which it's linked.
// Similarly, the DNS hostname of an instance in a VPC resolves to its private
// IP address when addressed from a linked EC2-Classic instance. For more information,
// see ClassicLink (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation EnableVpcClassicLinkDnsSupport for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/EnableVpcClassicLinkDnsSupport
func (c *EC2) EnableVpcClassicLinkDnsSupport(input *EnableVpcClassicLinkDnsSupportInput) (*EnableVpcClassicLinkDnsSupportOutput, error) {
	req, out := c.EnableVpcClassicLinkDnsSupportRequest(input)
	return out, req.Send()
}

// EnableVpcClassicLinkDnsSupportWithContext is the same as EnableVpcClassicLinkDnsSupport with the addition of
// the ability to pass a context and additional request options.
//
// See EnableVpcClassicLinkDnsSupport for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) EnableVpcClassicLinkDnsSupportWithContext(ctx aws.Context, input *EnableVpcClassicLinkDnsSupportInput, opts ...request.Option) (*EnableVpcClassicLinkDnsSupportOutput, error) {
	req, out := c.EnableVpcClassicLinkDnsSupportRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opExportClientVpnClientCertificateRevocationList = "ExportClientVpnClientCertificateRevocationList"

// ExportClientVpnClientCertificateRevocationListRequest generates a "aws/request.Request" representing the
// client's request for the ExportClientVpnClientCertificateRevocationList operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ExportClientVpnClientCertificateRevocationList for more information on using the ExportClientVpnClientCertificateRevocationList
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ExportClientVpnClientCertificateRevocationListRequest method.
//    req, resp := client.ExportClientVpnClientCertificateRevocationListRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ExportClientVpnClientCertificateRevocationList
func (c *EC2) ExportClientVpnClientCertificateRevocationListRequest(input *ExportClientVpnClientCertificateRevocationListInput) (req *request.Request, output *ExportClientVpnClientCertificateRevocationListOutput) {
	op := &request.Operation{
		Name:       opExportClientVpnClientCertificateRevocationList,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ExportClientVpnClientCertificateRevocationListInput{}
	}

	output = &ExportClientVpnClientCertificateRevocationListOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ExportClientVpnClientCertificateRevocationList API operation for Amazon Elastic Compute Cloud.
//
// Downloads the client certificate revocation list for the specified Client
// VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ExportClientVpnClientCertificateRevocationList for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ExportClientVpnClientCertificateRevocationList
func (c *EC2) ExportClientVpnClientCertificateRevocationList(input *ExportClientVpnClientCertificateRevocationListInput) (*ExportClientVpnClientCertificateRevocationListOutput, error) {
	req, out := c.ExportClientVpnClientCertificateRevocationListRequest(input)
	return out, req.Send()
}

// ExportClientVpnClientCertificateRevocationListWithContext is the same as ExportClientVpnClientCertificateRevocationList with the addition of
// the ability to pass a context and additional request options.
//
// See ExportClientVpnClientCertificateRevocationList for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ExportClientVpnClientCertificateRevocationListWithContext(ctx aws.Context, input *ExportClientVpnClientCertificateRevocationListInput, opts ...request.Option) (*ExportClientVpnClientCertificateRevocationListOutput, error) {
	req, out := c.ExportClientVpnClientCertificateRevocationListRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opExportClientVpnClientConfiguration = "ExportClientVpnClientConfiguration"

// ExportClientVpnClientConfigurationRequest generates a "aws/request.Request" representing the
// client's request for the ExportClientVpnClientConfiguration operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ExportClientVpnClientConfiguration for more information on using the ExportClientVpnClientConfiguration
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ExportClientVpnClientConfigurationRequest method.
//    req, resp := client.ExportClientVpnClientConfigurationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ExportClientVpnClientConfiguration
func (c *EC2) ExportClientVpnClientConfigurationRequest(input *ExportClientVpnClientConfigurationInput) (req *request.Request, output *ExportClientVpnClientConfigurationOutput) {
	op := &request.Operation{
		Name:       opExportClientVpnClientConfiguration,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ExportClientVpnClientConfigurationInput{}
	}

	output = &ExportClientVpnClientConfigurationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ExportClientVpnClientConfiguration API operation for Amazon Elastic Compute Cloud.
//
// Downloads the contents of the Client VPN endpoint configuration file for
// the specified Client VPN endpoint. The Client VPN endpoint configuration
// file includes the Client VPN endpoint and certificate information clients
// need to establish a connection with the Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ExportClientVpnClientConfiguration for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ExportClientVpnClientConfiguration
func (c *EC2) ExportClientVpnClientConfiguration(input *ExportClientVpnClientConfigurationInput) (*ExportClientVpnClientConfigurationOutput, error) {
	req, out := c.ExportClientVpnClientConfigurationRequest(input)
	return out, req.Send()
}

// ExportClientVpnClientConfigurationWithContext is the same as ExportClientVpnClientConfiguration with the addition of
// the ability to pass a context and additional request options.
//
// See ExportClientVpnClientConfiguration for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ExportClientVpnClientConfigurationWithContext(ctx aws.Context, input *ExportClientVpnClientConfigurationInput, opts ...request.Option) (*ExportClientVpnClientConfigurationOutput, error) {
	req, out := c.ExportClientVpnClientConfigurationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opExportTransitGatewayRoutes = "ExportTransitGatewayRoutes"

// ExportTransitGatewayRoutesRequest generates a "aws/request.Request" representing the
// client's request for the ExportTransitGatewayRoutes operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ExportTransitGatewayRoutes for more information on using the ExportTransitGatewayRoutes
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ExportTransitGatewayRoutesRequest method.
//    req, resp := client.ExportTransitGatewayRoutesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ExportTransitGatewayRoutes
func (c *EC2) ExportTransitGatewayRoutesRequest(input *ExportTransitGatewayRoutesInput) (req *request.Request, output *ExportTransitGatewayRoutesOutput) {
	op := &request.Operation{
		Name:       opExportTransitGatewayRoutes,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ExportTransitGatewayRoutesInput{}
	}

	output = &ExportTransitGatewayRoutesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ExportTransitGatewayRoutes API operation for Amazon Elastic Compute Cloud.
//
// Exports routes from the specified transit gateway route table to the specified
// S3 bucket. By default, all routes are exported. Alternatively, you can filter
// by CIDR range.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ExportTransitGatewayRoutes for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ExportTransitGatewayRoutes
func (c *EC2) ExportTransitGatewayRoutes(input *ExportTransitGatewayRoutesInput) (*ExportTransitGatewayRoutesOutput, error) {
	req, out := c.ExportTransitGatewayRoutesRequest(input)
	return out, req.Send()
}

// ExportTransitGatewayRoutesWithContext is the same as ExportTransitGatewayRoutes with the addition of
// the ability to pass a context and additional request options.
//
// See ExportTransitGatewayRoutes for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ExportTransitGatewayRoutesWithContext(ctx aws.Context, input *ExportTransitGatewayRoutesInput, opts ...request.Option) (*ExportTransitGatewayRoutesOutput, error) {
	req, out := c.ExportTransitGatewayRoutesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetConsoleOutput = "GetConsoleOutput"

// GetConsoleOutputRequest generates a "aws/request.Request" representing the
// client's request for the GetConsoleOutput operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetConsoleOutput for more information on using the GetConsoleOutput
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetConsoleOutputRequest method.
//    req, resp := client.GetConsoleOutputRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetConsoleOutput
func (c *EC2) GetConsoleOutputRequest(input *GetConsoleOutputInput) (req *request.Request, output *GetConsoleOutputOutput) {
	op := &request.Operation{
		Name:       opGetConsoleOutput,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetConsoleOutputInput{}
	}

	output = &GetConsoleOutputOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetConsoleOutput API operation for Amazon Elastic Compute Cloud.
//
// Gets the console output for the specified instance. For Linux instances,
// the instance console output displays the exact console output that would
// normally be displayed on a physical monitor attached to a computer. For Windows
// instances, the instance console output includes the last three system event
// log errors.
//
// By default, the console output returns buffered information that was posted
// shortly after an instance transition state (start, stop, reboot, or terminate).
// This information is available for at least one hour after the most recent
// post. Only the most recent 64 KB of console output is available.
//
// You can optionally retrieve the latest serial console output at any time
// during the instance lifecycle. This option is supported on instance types
// that use the Nitro hypervisor.
//
// For more information, see Instance Console Output (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-console.html#instance-console-console-output)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetConsoleOutput for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetConsoleOutput
func (c *EC2) GetConsoleOutput(input *GetConsoleOutputInput) (*GetConsoleOutputOutput, error) {
	req, out := c.GetConsoleOutputRequest(input)
	return out, req.Send()
}

// GetConsoleOutputWithContext is the same as GetConsoleOutput with the addition of
// the ability to pass a context and additional request options.
//
// See GetConsoleOutput for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetConsoleOutputWithContext(ctx aws.Context, input *GetConsoleOutputInput, opts ...request.Option) (*GetConsoleOutputOutput, error) {
	req, out := c.GetConsoleOutputRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetConsoleScreenshot = "GetConsoleScreenshot"

// GetConsoleScreenshotRequest generates a "aws/request.Request" representing the
// client's request for the GetConsoleScreenshot operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetConsoleScreenshot for more information on using the GetConsoleScreenshot
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetConsoleScreenshotRequest method.
//    req, resp := client.GetConsoleScreenshotRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetConsoleScreenshot
func (c *EC2) GetConsoleScreenshotRequest(input *GetConsoleScreenshotInput) (req *request.Request, output *GetConsoleScreenshotOutput) {
	op := &request.Operation{
		Name:       opGetConsoleScreenshot,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetConsoleScreenshotInput{}
	}

	output = &GetConsoleScreenshotOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetConsoleScreenshot API operation for Amazon Elastic Compute Cloud.
//
// Retrieve a JPG-format screenshot of a running instance to help with troubleshooting.
//
// The returned content is Base64-encoded.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetConsoleScreenshot for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetConsoleScreenshot
func (c *EC2) GetConsoleScreenshot(input *GetConsoleScreenshotInput) (*GetConsoleScreenshotOutput, error) {
	req, out := c.GetConsoleScreenshotRequest(input)
	return out, req.Send()
}

// GetConsoleScreenshotWithContext is the same as GetConsoleScreenshot with the addition of
// the ability to pass a context and additional request options.
//
// See GetConsoleScreenshot for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetConsoleScreenshotWithContext(ctx aws.Context, input *GetConsoleScreenshotInput, opts ...request.Option) (*GetConsoleScreenshotOutput, error) {
	req, out := c.GetConsoleScreenshotRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetHostReservationPurchasePreview = "GetHostReservationPurchasePreview"

// GetHostReservationPurchasePreviewRequest generates a "aws/request.Request" representing the
// client's request for the GetHostReservationPurchasePreview operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetHostReservationPurchasePreview for more information on using the GetHostReservationPurchasePreview
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetHostReservationPurchasePreviewRequest method.
//    req, resp := client.GetHostReservationPurchasePreviewRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetHostReservationPurchasePreview
func (c *EC2) GetHostReservationPurchasePreviewRequest(input *GetHostReservationPurchasePreviewInput) (req *request.Request, output *GetHostReservationPurchasePreviewOutput) {
	op := &request.Operation{
		Name:       opGetHostReservationPurchasePreview,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetHostReservationPurchasePreviewInput{}
	}

	output = &GetHostReservationPurchasePreviewOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetHostReservationPurchasePreview API operation for Amazon Elastic Compute Cloud.
//
// Preview a reservation purchase with configurations that match those of your
// Dedicated Host. You must have active Dedicated Hosts in your account before
// you purchase a reservation.
//
// This is a preview of the PurchaseHostReservation action and does not result
// in the offering being purchased.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetHostReservationPurchasePreview for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetHostReservationPurchasePreview
func (c *EC2) GetHostReservationPurchasePreview(input *GetHostReservationPurchasePreviewInput) (*GetHostReservationPurchasePreviewOutput, error) {
	req, out := c.GetHostReservationPurchasePreviewRequest(input)
	return out, req.Send()
}

// GetHostReservationPurchasePreviewWithContext is the same as GetHostReservationPurchasePreview with the addition of
// the ability to pass a context and additional request options.
//
// See GetHostReservationPurchasePreview for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetHostReservationPurchasePreviewWithContext(ctx aws.Context, input *GetHostReservationPurchasePreviewInput, opts ...request.Option) (*GetHostReservationPurchasePreviewOutput, error) {
	req, out := c.GetHostReservationPurchasePreviewRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetLaunchTemplateData = "GetLaunchTemplateData"

// GetLaunchTemplateDataRequest generates a "aws/request.Request" representing the
// client's request for the GetLaunchTemplateData operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetLaunchTemplateData for more information on using the GetLaunchTemplateData
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetLaunchTemplateDataRequest method.
//    req, resp := client.GetLaunchTemplateDataRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetLaunchTemplateData
func (c *EC2) GetLaunchTemplateDataRequest(input *GetLaunchTemplateDataInput) (req *request.Request, output *GetLaunchTemplateDataOutput) {
	op := &request.Operation{
		Name:       opGetLaunchTemplateData,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetLaunchTemplateDataInput{}
	}

	output = &GetLaunchTemplateDataOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetLaunchTemplateData API operation for Amazon Elastic Compute Cloud.
//
// Retrieves the configuration data of the specified instance. You can use this
// data to create a launch template.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetLaunchTemplateData for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetLaunchTemplateData
func (c *EC2) GetLaunchTemplateData(input *GetLaunchTemplateDataInput) (*GetLaunchTemplateDataOutput, error) {
	req, out := c.GetLaunchTemplateDataRequest(input)
	return out, req.Send()
}

// GetLaunchTemplateDataWithContext is the same as GetLaunchTemplateData with the addition of
// the ability to pass a context and additional request options.
//
// See GetLaunchTemplateData for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetLaunchTemplateDataWithContext(ctx aws.Context, input *GetLaunchTemplateDataInput, opts ...request.Option) (*GetLaunchTemplateDataOutput, error) {
	req, out := c.GetLaunchTemplateDataRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetPasswordData = "GetPasswordData"

// GetPasswordDataRequest generates a "aws/request.Request" representing the
// client's request for the GetPasswordData operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetPasswordData for more information on using the GetPasswordData
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetPasswordDataRequest method.
//    req, resp := client.GetPasswordDataRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetPasswordData
func (c *EC2) GetPasswordDataRequest(input *GetPasswordDataInput) (req *request.Request, output *GetPasswordDataOutput) {
	op := &request.Operation{
		Name:       opGetPasswordData,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetPasswordDataInput{}
	}

	output = &GetPasswordDataOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetPasswordData API operation for Amazon Elastic Compute Cloud.
//
// Retrieves the encrypted administrator password for a running Windows instance.
//
// The Windows password is generated at boot by the EC2Config service or EC2Launch
// scripts (Windows Server 2016 and later). This usually only happens the first
// time an instance is launched. For more information, see EC2Config (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/UsingConfig_WinAMI.html)
// and EC2Launch (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2launch.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For the EC2Config service, the password is not generated for rebundled AMIs
// unless Ec2SetPassword is enabled before bundling.
//
// The password is encrypted using the key pair that you specified when you
// launched the instance. You must provide the corresponding key pair file.
//
// When you launch an instance, password generation and encryption may take
// a few minutes. If you try to retrieve the password before it's available,
// the output returns an empty string. We recommend that you wait up to 15 minutes
// after launching an instance before trying to retrieve the generated password.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetPasswordData for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetPasswordData
func (c *EC2) GetPasswordData(input *GetPasswordDataInput) (*GetPasswordDataOutput, error) {
	req, out := c.GetPasswordDataRequest(input)
	return out, req.Send()
}

// GetPasswordDataWithContext is the same as GetPasswordData with the addition of
// the ability to pass a context and additional request options.
//
// See GetPasswordData for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetPasswordDataWithContext(ctx aws.Context, input *GetPasswordDataInput, opts ...request.Option) (*GetPasswordDataOutput, error) {
	req, out := c.GetPasswordDataRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetReservedInstancesExchangeQuote = "GetReservedInstancesExchangeQuote"

// GetReservedInstancesExchangeQuoteRequest generates a "aws/request.Request" representing the
// client's request for the GetReservedInstancesExchangeQuote operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetReservedInstancesExchangeQuote for more information on using the GetReservedInstancesExchangeQuote
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetReservedInstancesExchangeQuoteRequest method.
//    req, resp := client.GetReservedInstancesExchangeQuoteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetReservedInstancesExchangeQuote
func (c *EC2) GetReservedInstancesExchangeQuoteRequest(input *GetReservedInstancesExchangeQuoteInput) (req *request.Request, output *GetReservedInstancesExchangeQuoteOutput) {
	op := &request.Operation{
		Name:       opGetReservedInstancesExchangeQuote,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetReservedInstancesExchangeQuoteInput{}
	}

	output = &GetReservedInstancesExchangeQuoteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetReservedInstancesExchangeQuote API operation for Amazon Elastic Compute Cloud.
//
// Returns a quote and exchange information for exchanging one or more specified
// Convertible Reserved Instances for a new Convertible Reserved Instance. If
// the exchange cannot be performed, the reason is returned in the response.
// Use AcceptReservedInstancesExchangeQuote to perform the exchange.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetReservedInstancesExchangeQuote for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetReservedInstancesExchangeQuote
func (c *EC2) GetReservedInstancesExchangeQuote(input *GetReservedInstancesExchangeQuoteInput) (*GetReservedInstancesExchangeQuoteOutput, error) {
	req, out := c.GetReservedInstancesExchangeQuoteRequest(input)
	return out, req.Send()
}

// GetReservedInstancesExchangeQuoteWithContext is the same as GetReservedInstancesExchangeQuote with the addition of
// the ability to pass a context and additional request options.
//
// See GetReservedInstancesExchangeQuote for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetReservedInstancesExchangeQuoteWithContext(ctx aws.Context, input *GetReservedInstancesExchangeQuoteInput, opts ...request.Option) (*GetReservedInstancesExchangeQuoteOutput, error) {
	req, out := c.GetReservedInstancesExchangeQuoteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetTransitGatewayAttachmentPropagations = "GetTransitGatewayAttachmentPropagations"

// GetTransitGatewayAttachmentPropagationsRequest generates a "aws/request.Request" representing the
// client's request for the GetTransitGatewayAttachmentPropagations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetTransitGatewayAttachmentPropagations for more information on using the GetTransitGatewayAttachmentPropagations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetTransitGatewayAttachmentPropagationsRequest method.
//    req, resp := client.GetTransitGatewayAttachmentPropagationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayAttachmentPropagations
func (c *EC2) GetTransitGatewayAttachmentPropagationsRequest(input *GetTransitGatewayAttachmentPropagationsInput) (req *request.Request, output *GetTransitGatewayAttachmentPropagationsOutput) {
	op := &request.Operation{
		Name:       opGetTransitGatewayAttachmentPropagations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetTransitGatewayAttachmentPropagationsInput{}
	}

	output = &GetTransitGatewayAttachmentPropagationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetTransitGatewayAttachmentPropagations API operation for Amazon Elastic Compute Cloud.
//
// Lists the route tables to which the specified resource attachment propagates
// routes.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetTransitGatewayAttachmentPropagations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayAttachmentPropagations
func (c *EC2) GetTransitGatewayAttachmentPropagations(input *GetTransitGatewayAttachmentPropagationsInput) (*GetTransitGatewayAttachmentPropagationsOutput, error) {
	req, out := c.GetTransitGatewayAttachmentPropagationsRequest(input)
	return out, req.Send()
}

// GetTransitGatewayAttachmentPropagationsWithContext is the same as GetTransitGatewayAttachmentPropagations with the addition of
// the ability to pass a context and additional request options.
//
// See GetTransitGatewayAttachmentPropagations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetTransitGatewayAttachmentPropagationsWithContext(ctx aws.Context, input *GetTransitGatewayAttachmentPropagationsInput, opts ...request.Option) (*GetTransitGatewayAttachmentPropagationsOutput, error) {
	req, out := c.GetTransitGatewayAttachmentPropagationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetTransitGatewayRouteTableAssociations = "GetTransitGatewayRouteTableAssociations"

// GetTransitGatewayRouteTableAssociationsRequest generates a "aws/request.Request" representing the
// client's request for the GetTransitGatewayRouteTableAssociations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetTransitGatewayRouteTableAssociations for more information on using the GetTransitGatewayRouteTableAssociations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetTransitGatewayRouteTableAssociationsRequest method.
//    req, resp := client.GetTransitGatewayRouteTableAssociationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayRouteTableAssociations
func (c *EC2) GetTransitGatewayRouteTableAssociationsRequest(input *GetTransitGatewayRouteTableAssociationsInput) (req *request.Request, output *GetTransitGatewayRouteTableAssociationsOutput) {
	op := &request.Operation{
		Name:       opGetTransitGatewayRouteTableAssociations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetTransitGatewayRouteTableAssociationsInput{}
	}

	output = &GetTransitGatewayRouteTableAssociationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetTransitGatewayRouteTableAssociations API operation for Amazon Elastic Compute Cloud.
//
// Gets information about the associations for the specified transit gateway
// route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetTransitGatewayRouteTableAssociations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayRouteTableAssociations
func (c *EC2) GetTransitGatewayRouteTableAssociations(input *GetTransitGatewayRouteTableAssociationsInput) (*GetTransitGatewayRouteTableAssociationsOutput, error) {
	req, out := c.GetTransitGatewayRouteTableAssociationsRequest(input)
	return out, req.Send()
}

// GetTransitGatewayRouteTableAssociationsWithContext is the same as GetTransitGatewayRouteTableAssociations with the addition of
// the ability to pass a context and additional request options.
//
// See GetTransitGatewayRouteTableAssociations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetTransitGatewayRouteTableAssociationsWithContext(ctx aws.Context, input *GetTransitGatewayRouteTableAssociationsInput, opts ...request.Option) (*GetTransitGatewayRouteTableAssociationsOutput, error) {
	req, out := c.GetTransitGatewayRouteTableAssociationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetTransitGatewayRouteTablePropagations = "GetTransitGatewayRouteTablePropagations"

// GetTransitGatewayRouteTablePropagationsRequest generates a "aws/request.Request" representing the
// client's request for the GetTransitGatewayRouteTablePropagations operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetTransitGatewayRouteTablePropagations for more information on using the GetTransitGatewayRouteTablePropagations
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the GetTransitGatewayRouteTablePropagationsRequest method.
//    req, resp := client.GetTransitGatewayRouteTablePropagationsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayRouteTablePropagations
func (c *EC2) GetTransitGatewayRouteTablePropagationsRequest(input *GetTransitGatewayRouteTablePropagationsInput) (req *request.Request, output *GetTransitGatewayRouteTablePropagationsOutput) {
	op := &request.Operation{
		Name:       opGetTransitGatewayRouteTablePropagations,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetTransitGatewayRouteTablePropagationsInput{}
	}

	output = &GetTransitGatewayRouteTablePropagationsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetTransitGatewayRouteTablePropagations API operation for Amazon Elastic Compute Cloud.
//
// Gets information about the route table propagations for the specified transit
// gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation GetTransitGatewayRouteTablePropagations for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/GetTransitGatewayRouteTablePropagations
func (c *EC2) GetTransitGatewayRouteTablePropagations(input *GetTransitGatewayRouteTablePropagationsInput) (*GetTransitGatewayRouteTablePropagationsOutput, error) {
	req, out := c.GetTransitGatewayRouteTablePropagationsRequest(input)
	return out, req.Send()
}

// GetTransitGatewayRouteTablePropagationsWithContext is the same as GetTransitGatewayRouteTablePropagations with the addition of
// the ability to pass a context and additional request options.
//
// See GetTransitGatewayRouteTablePropagations for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) GetTransitGatewayRouteTablePropagationsWithContext(ctx aws.Context, input *GetTransitGatewayRouteTablePropagationsInput, opts ...request.Option) (*GetTransitGatewayRouteTablePropagationsOutput, error) {
	req, out := c.GetTransitGatewayRouteTablePropagationsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opImportClientVpnClientCertificateRevocationList = "ImportClientVpnClientCertificateRevocationList"

// ImportClientVpnClientCertificateRevocationListRequest generates a "aws/request.Request" representing the
// client's request for the ImportClientVpnClientCertificateRevocationList operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ImportClientVpnClientCertificateRevocationList for more information on using the ImportClientVpnClientCertificateRevocationList
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ImportClientVpnClientCertificateRevocationListRequest method.
//    req, resp := client.ImportClientVpnClientCertificateRevocationListRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportClientVpnClientCertificateRevocationList
func (c *EC2) ImportClientVpnClientCertificateRevocationListRequest(input *ImportClientVpnClientCertificateRevocationListInput) (req *request.Request, output *ImportClientVpnClientCertificateRevocationListOutput) {
	op := &request.Operation{
		Name:       opImportClientVpnClientCertificateRevocationList,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ImportClientVpnClientCertificateRevocationListInput{}
	}

	output = &ImportClientVpnClientCertificateRevocationListOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ImportClientVpnClientCertificateRevocationList API operation for Amazon Elastic Compute Cloud.
//
// Uploads a client certificate revocation list to the specified Client VPN
// endpoint. Uploading a client certificate revocation list overwrites the existing
// client certificate revocation list.
//
// Uploading a client certificate revocation list resets existing client connections.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ImportClientVpnClientCertificateRevocationList for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportClientVpnClientCertificateRevocationList
func (c *EC2) ImportClientVpnClientCertificateRevocationList(input *ImportClientVpnClientCertificateRevocationListInput) (*ImportClientVpnClientCertificateRevocationListOutput, error) {
	req, out := c.ImportClientVpnClientCertificateRevocationListRequest(input)
	return out, req.Send()
}

// ImportClientVpnClientCertificateRevocationListWithContext is the same as ImportClientVpnClientCertificateRevocationList with the addition of
// the ability to pass a context and additional request options.
//
// See ImportClientVpnClientCertificateRevocationList for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ImportClientVpnClientCertificateRevocationListWithContext(ctx aws.Context, input *ImportClientVpnClientCertificateRevocationListInput, opts ...request.Option) (*ImportClientVpnClientCertificateRevocationListOutput, error) {
	req, out := c.ImportClientVpnClientCertificateRevocationListRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opImportImage = "ImportImage"

// ImportImageRequest generates a "aws/request.Request" representing the
// client's request for the ImportImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ImportImage for more information on using the ImportImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ImportImageRequest method.
//    req, resp := client.ImportImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportImage
func (c *EC2) ImportImageRequest(input *ImportImageInput) (req *request.Request, output *ImportImageOutput) {
	op := &request.Operation{
		Name:       opImportImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ImportImageInput{}
	}

	output = &ImportImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ImportImage API operation for Amazon Elastic Compute Cloud.
//
// Import single or multi-volume disk images or EBS snapshots into an Amazon
// Machine Image (AMI). For more information, see Importing a VM as an Image
// Using VM Import/Export (https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html)
// in the VM Import/Export User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ImportImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportImage
func (c *EC2) ImportImage(input *ImportImageInput) (*ImportImageOutput, error) {
	req, out := c.ImportImageRequest(input)
	return out, req.Send()
}

// ImportImageWithContext is the same as ImportImage with the addition of
// the ability to pass a context and additional request options.
//
// See ImportImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ImportImageWithContext(ctx aws.Context, input *ImportImageInput, opts ...request.Option) (*ImportImageOutput, error) {
	req, out := c.ImportImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opImportInstance = "ImportInstance"

// ImportInstanceRequest generates a "aws/request.Request" representing the
// client's request for the ImportInstance operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ImportInstance for more information on using the ImportInstance
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ImportInstanceRequest method.
//    req, resp := client.ImportInstanceRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportInstance
func (c *EC2) ImportInstanceRequest(input *ImportInstanceInput) (req *request.Request, output *ImportInstanceOutput) {
	op := &request.Operation{
		Name:       opImportInstance,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ImportInstanceInput{}
	}

	output = &ImportInstanceOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ImportInstance API operation for Amazon Elastic Compute Cloud.
//
// Creates an import instance task using metadata from the specified disk image.
// ImportInstance only supports single-volume VMs. To import multi-volume VMs,
// use ImportImage. For more information, see Importing a Virtual Machine Using
// the Amazon EC2 CLI (https://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-cli-vmimport-export.html).
//
// For information about the import manifest referenced by this API action,
// see VM Import Manifest (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ImportInstance for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportInstance
func (c *EC2) ImportInstance(input *ImportInstanceInput) (*ImportInstanceOutput, error) {
	req, out := c.ImportInstanceRequest(input)
	return out, req.Send()
}

// ImportInstanceWithContext is the same as ImportInstance with the addition of
// the ability to pass a context and additional request options.
//
// See ImportInstance for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ImportInstanceWithContext(ctx aws.Context, input *ImportInstanceInput, opts ...request.Option) (*ImportInstanceOutput, error) {
	req, out := c.ImportInstanceRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opImportKeyPair = "ImportKeyPair"

// ImportKeyPairRequest generates a "aws/request.Request" representing the
// client's request for the ImportKeyPair operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ImportKeyPair for more information on using the ImportKeyPair
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ImportKeyPairRequest method.
//    req, resp := client.ImportKeyPairRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportKeyPair
func (c *EC2) ImportKeyPairRequest(input *ImportKeyPairInput) (req *request.Request, output *ImportKeyPairOutput) {
	op := &request.Operation{
		Name:       opImportKeyPair,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ImportKeyPairInput{}
	}

	output = &ImportKeyPairOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ImportKeyPair API operation for Amazon Elastic Compute Cloud.
//
// Imports the public key from an RSA key pair that you created with a third-party
// tool. Compare this with CreateKeyPair, in which AWS creates the key pair
// and gives the keys to you (AWS keeps a copy of the public key). With ImportKeyPair,
// you create the key pair and give AWS just the public key. The private key
// is never transferred between you and AWS.
//
// For more information about key pairs, see Key Pairs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ImportKeyPair for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportKeyPair
func (c *EC2) ImportKeyPair(input *ImportKeyPairInput) (*ImportKeyPairOutput, error) {
	req, out := c.ImportKeyPairRequest(input)
	return out, req.Send()
}

// ImportKeyPairWithContext is the same as ImportKeyPair with the addition of
// the ability to pass a context and additional request options.
//
// See ImportKeyPair for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ImportKeyPairWithContext(ctx aws.Context, input *ImportKeyPairInput, opts ...request.Option) (*ImportKeyPairOutput, error) {
	req, out := c.ImportKeyPairRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opImportSnapshot = "ImportSnapshot"

// ImportSnapshotRequest generates a "aws/request.Request" representing the
// client's request for the ImportSnapshot operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ImportSnapshot for more information on using the ImportSnapshot
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ImportSnapshotRequest method.
//    req, resp := client.ImportSnapshotRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportSnapshot
func (c *EC2) ImportSnapshotRequest(input *ImportSnapshotInput) (req *request.Request, output *ImportSnapshotOutput) {
	op := &request.Operation{
		Name:       opImportSnapshot,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ImportSnapshotInput{}
	}

	output = &ImportSnapshotOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ImportSnapshot API operation for Amazon Elastic Compute Cloud.
//
// Imports a disk into an EBS snapshot.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ImportSnapshot for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportSnapshot
func (c *EC2) ImportSnapshot(input *ImportSnapshotInput) (*ImportSnapshotOutput, error) {
	req, out := c.ImportSnapshotRequest(input)
	return out, req.Send()
}

// ImportSnapshotWithContext is the same as ImportSnapshot with the addition of
// the ability to pass a context and additional request options.
//
// See ImportSnapshot for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ImportSnapshotWithContext(ctx aws.Context, input *ImportSnapshotInput, opts ...request.Option) (*ImportSnapshotOutput, error) {
	req, out := c.ImportSnapshotRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opImportVolume = "ImportVolume"

// ImportVolumeRequest generates a "aws/request.Request" representing the
// client's request for the ImportVolume operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ImportVolume for more information on using the ImportVolume
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ImportVolumeRequest method.
//    req, resp := client.ImportVolumeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportVolume
func (c *EC2) ImportVolumeRequest(input *ImportVolumeInput) (req *request.Request, output *ImportVolumeOutput) {
	op := &request.Operation{
		Name:       opImportVolume,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ImportVolumeInput{}
	}

	output = &ImportVolumeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ImportVolume API operation for Amazon Elastic Compute Cloud.
//
// Creates an import volume task using metadata from the specified disk image.For
// more information, see Importing Disks to Amazon EBS (https://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/importing-your-volumes-into-amazon-ebs.html).
//
// For information about the import manifest referenced by this API action,
// see VM Import Manifest (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ImportVolume for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ImportVolume
func (c *EC2) ImportVolume(input *ImportVolumeInput) (*ImportVolumeOutput, error) {
	req, out := c.ImportVolumeRequest(input)
	return out, req.Send()
}

// ImportVolumeWithContext is the same as ImportVolume with the addition of
// the ability to pass a context and additional request options.
//
// See ImportVolume for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ImportVolumeWithContext(ctx aws.Context, input *ImportVolumeInput, opts ...request.Option) (*ImportVolumeOutput, error) {
	req, out := c.ImportVolumeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyCapacityReservation = "ModifyCapacityReservation"

// ModifyCapacityReservationRequest generates a "aws/request.Request" representing the
// client's request for the ModifyCapacityReservation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyCapacityReservation for more information on using the ModifyCapacityReservation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyCapacityReservationRequest method.
//    req, resp := client.ModifyCapacityReservationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyCapacityReservation
func (c *EC2) ModifyCapacityReservationRequest(input *ModifyCapacityReservationInput) (req *request.Request, output *ModifyCapacityReservationOutput) {
	op := &request.Operation{
		Name:       opModifyCapacityReservation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyCapacityReservationInput{}
	}

	output = &ModifyCapacityReservationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyCapacityReservation API operation for Amazon Elastic Compute Cloud.
//
// Modifies a Capacity Reservation's capacity and the conditions under which
// it is to be released. You cannot change a Capacity Reservation's instance
// type, EBS optimization, instance store settings, platform, Availability Zone,
// or instance eligibility. If you need to modify any of these attributes, we
// recommend that you cancel the Capacity Reservation, and then create a new
// one with the required attributes.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyCapacityReservation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyCapacityReservation
func (c *EC2) ModifyCapacityReservation(input *ModifyCapacityReservationInput) (*ModifyCapacityReservationOutput, error) {
	req, out := c.ModifyCapacityReservationRequest(input)
	return out, req.Send()
}

// ModifyCapacityReservationWithContext is the same as ModifyCapacityReservation with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyCapacityReservation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyCapacityReservationWithContext(ctx aws.Context, input *ModifyCapacityReservationInput, opts ...request.Option) (*ModifyCapacityReservationOutput, error) {
	req, out := c.ModifyCapacityReservationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyClientVpnEndpoint = "ModifyClientVpnEndpoint"

// ModifyClientVpnEndpointRequest generates a "aws/request.Request" representing the
// client's request for the ModifyClientVpnEndpoint operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyClientVpnEndpoint for more information on using the ModifyClientVpnEndpoint
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyClientVpnEndpointRequest method.
//    req, resp := client.ModifyClientVpnEndpointRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyClientVpnEndpoint
func (c *EC2) ModifyClientVpnEndpointRequest(input *ModifyClientVpnEndpointInput) (req *request.Request, output *ModifyClientVpnEndpointOutput) {
	op := &request.Operation{
		Name:       opModifyClientVpnEndpoint,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyClientVpnEndpointInput{}
	}

	output = &ModifyClientVpnEndpointOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyClientVpnEndpoint API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified Client VPN endpoint. You can only modify an endpoint's
// server certificate information, client connection logging information, DNS
// server, and description. Modifying the DNS server resets existing client
// connections.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyClientVpnEndpoint for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyClientVpnEndpoint
func (c *EC2) ModifyClientVpnEndpoint(input *ModifyClientVpnEndpointInput) (*ModifyClientVpnEndpointOutput, error) {
	req, out := c.ModifyClientVpnEndpointRequest(input)
	return out, req.Send()
}

// ModifyClientVpnEndpointWithContext is the same as ModifyClientVpnEndpoint with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyClientVpnEndpoint for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyClientVpnEndpointWithContext(ctx aws.Context, input *ModifyClientVpnEndpointInput, opts ...request.Option) (*ModifyClientVpnEndpointOutput, error) {
	req, out := c.ModifyClientVpnEndpointRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyFleet = "ModifyFleet"

// ModifyFleetRequest generates a "aws/request.Request" representing the
// client's request for the ModifyFleet operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyFleet for more information on using the ModifyFleet
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyFleetRequest method.
//    req, resp := client.ModifyFleetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyFleet
func (c *EC2) ModifyFleetRequest(input *ModifyFleetInput) (req *request.Request, output *ModifyFleetOutput) {
	op := &request.Operation{
		Name:       opModifyFleet,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyFleetInput{}
	}

	output = &ModifyFleetOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyFleet API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified EC2 Fleet.
//
// While the EC2 Fleet is being modified, it is in the modifying state.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyFleet for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyFleet
func (c *EC2) ModifyFleet(input *ModifyFleetInput) (*ModifyFleetOutput, error) {
	req, out := c.ModifyFleetRequest(input)
	return out, req.Send()
}

// ModifyFleetWithContext is the same as ModifyFleet with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyFleet for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyFleetWithContext(ctx aws.Context, input *ModifyFleetInput, opts ...request.Option) (*ModifyFleetOutput, error) {
	req, out := c.ModifyFleetRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyFpgaImageAttribute = "ModifyFpgaImageAttribute"

// ModifyFpgaImageAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyFpgaImageAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyFpgaImageAttribute for more information on using the ModifyFpgaImageAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyFpgaImageAttributeRequest method.
//    req, resp := client.ModifyFpgaImageAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyFpgaImageAttribute
func (c *EC2) ModifyFpgaImageAttributeRequest(input *ModifyFpgaImageAttributeInput) (req *request.Request, output *ModifyFpgaImageAttributeOutput) {
	op := &request.Operation{
		Name:       opModifyFpgaImageAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyFpgaImageAttributeInput{}
	}

	output = &ModifyFpgaImageAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyFpgaImageAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified attribute of the specified Amazon FPGA Image (AFI).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyFpgaImageAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyFpgaImageAttribute
func (c *EC2) ModifyFpgaImageAttribute(input *ModifyFpgaImageAttributeInput) (*ModifyFpgaImageAttributeOutput, error) {
	req, out := c.ModifyFpgaImageAttributeRequest(input)
	return out, req.Send()
}

// ModifyFpgaImageAttributeWithContext is the same as ModifyFpgaImageAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyFpgaImageAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyFpgaImageAttributeWithContext(ctx aws.Context, input *ModifyFpgaImageAttributeInput, opts ...request.Option) (*ModifyFpgaImageAttributeOutput, error) {
	req, out := c.ModifyFpgaImageAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyHosts = "ModifyHosts"

// ModifyHostsRequest generates a "aws/request.Request" representing the
// client's request for the ModifyHosts operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyHosts for more information on using the ModifyHosts
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyHostsRequest method.
//    req, resp := client.ModifyHostsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyHosts
func (c *EC2) ModifyHostsRequest(input *ModifyHostsInput) (req *request.Request, output *ModifyHostsOutput) {
	op := &request.Operation{
		Name:       opModifyHosts,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyHostsInput{}
	}

	output = &ModifyHostsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyHosts API operation for Amazon Elastic Compute Cloud.
//
// Modify the auto-placement setting of a Dedicated Host. When auto-placement
// is enabled, any instances that you launch with a tenancy of host but without
// a specific host ID are placed onto any available Dedicated Host in your account
// that has auto-placement enabled. When auto-placement is disabled, you need
// to provide a host ID to have the instance launch onto a specific host. If
// no host ID is provided, the instance is launched onto a suitable host with
// auto-placement enabled.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyHosts for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyHosts
func (c *EC2) ModifyHosts(input *ModifyHostsInput) (*ModifyHostsOutput, error) {
	req, out := c.ModifyHostsRequest(input)
	return out, req.Send()
}

// ModifyHostsWithContext is the same as ModifyHosts with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyHosts for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyHostsWithContext(ctx aws.Context, input *ModifyHostsInput, opts ...request.Option) (*ModifyHostsOutput, error) {
	req, out := c.ModifyHostsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyIdFormat = "ModifyIdFormat"

// ModifyIdFormatRequest generates a "aws/request.Request" representing the
// client's request for the ModifyIdFormat operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyIdFormat for more information on using the ModifyIdFormat
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyIdFormatRequest method.
//    req, resp := client.ModifyIdFormatRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyIdFormat
func (c *EC2) ModifyIdFormatRequest(input *ModifyIdFormatInput) (req *request.Request, output *ModifyIdFormatOutput) {
	op := &request.Operation{
		Name:       opModifyIdFormat,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyIdFormatInput{}
	}

	output = &ModifyIdFormatOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyIdFormat API operation for Amazon Elastic Compute Cloud.
//
// Modifies the ID format for the specified resource on a per-region basis.
// You can specify that resources should receive longer IDs (17-character IDs)
// when they are created.
//
// This request can only be used to modify longer ID settings for resource types
// that are within the opt-in period. Resources currently in their opt-in period
// include: bundle | conversion-task | customer-gateway | dhcp-options | elastic-ip-allocation
// | elastic-ip-association | export-task | flow-log | image | import-task |
// internet-gateway | network-acl | network-acl-association | network-interface
// | network-interface-attachment | prefix-list | route-table | route-table-association
// | security-group | subnet | subnet-cidr-block-association | vpc | vpc-cidr-block-association
// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway.
//
// This setting applies to the IAM user who makes the request; it does not apply
// to the entire AWS account. By default, an IAM user defaults to the same settings
// as the root user. If you're using this action as the root user, then these
// settings apply to the entire account, unless an IAM user explicitly overrides
// these settings for themselves. For more information, see Resource IDs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resource-ids.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Resources created with longer IDs are visible to all IAM roles and users,
// regardless of these settings and provided that they have permission to use
// the relevant Describe command for the resource type.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyIdFormat for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyIdFormat
func (c *EC2) ModifyIdFormat(input *ModifyIdFormatInput) (*ModifyIdFormatOutput, error) {
	req, out := c.ModifyIdFormatRequest(input)
	return out, req.Send()
}

// ModifyIdFormatWithContext is the same as ModifyIdFormat with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyIdFormat for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyIdFormatWithContext(ctx aws.Context, input *ModifyIdFormatInput, opts ...request.Option) (*ModifyIdFormatOutput, error) {
	req, out := c.ModifyIdFormatRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyIdentityIdFormat = "ModifyIdentityIdFormat"

// ModifyIdentityIdFormatRequest generates a "aws/request.Request" representing the
// client's request for the ModifyIdentityIdFormat operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyIdentityIdFormat for more information on using the ModifyIdentityIdFormat
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyIdentityIdFormatRequest method.
//    req, resp := client.ModifyIdentityIdFormatRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyIdentityIdFormat
func (c *EC2) ModifyIdentityIdFormatRequest(input *ModifyIdentityIdFormatInput) (req *request.Request, output *ModifyIdentityIdFormatOutput) {
	op := &request.Operation{
		Name:       opModifyIdentityIdFormat,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyIdentityIdFormatInput{}
	}

	output = &ModifyIdentityIdFormatOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyIdentityIdFormat API operation for Amazon Elastic Compute Cloud.
//
// Modifies the ID format of a resource for a specified IAM user, IAM role,
// or the root user for an account; or all IAM users, IAM roles, and the root
// user for an account. You can specify that resources should receive longer
// IDs (17-character IDs) when they are created.
//
// This request can only be used to modify longer ID settings for resource types
// that are within the opt-in period. Resources currently in their opt-in period
// include: bundle | conversion-task | customer-gateway | dhcp-options | elastic-ip-allocation
// | elastic-ip-association | export-task | flow-log | image | import-task |
// internet-gateway | network-acl | network-acl-association | network-interface
// | network-interface-attachment | prefix-list | route-table | route-table-association
// | security-group | subnet | subnet-cidr-block-association | vpc | vpc-cidr-block-association
// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway.
//
// For more information, see Resource IDs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resource-ids.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// This setting applies to the principal specified in the request; it does not
// apply to the principal that makes the request.
//
// Resources created with longer IDs are visible to all IAM roles and users,
// regardless of these settings and provided that they have permission to use
// the relevant Describe command for the resource type.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyIdentityIdFormat for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyIdentityIdFormat
func (c *EC2) ModifyIdentityIdFormat(input *ModifyIdentityIdFormatInput) (*ModifyIdentityIdFormatOutput, error) {
	req, out := c.ModifyIdentityIdFormatRequest(input)
	return out, req.Send()
}

// ModifyIdentityIdFormatWithContext is the same as ModifyIdentityIdFormat with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyIdentityIdFormat for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyIdentityIdFormatWithContext(ctx aws.Context, input *ModifyIdentityIdFormatInput, opts ...request.Option) (*ModifyIdentityIdFormatOutput, error) {
	req, out := c.ModifyIdentityIdFormatRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyImageAttribute = "ModifyImageAttribute"

// ModifyImageAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyImageAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyImageAttribute for more information on using the ModifyImageAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyImageAttributeRequest method.
//    req, resp := client.ModifyImageAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyImageAttribute
func (c *EC2) ModifyImageAttributeRequest(input *ModifyImageAttributeInput) (req *request.Request, output *ModifyImageAttributeOutput) {
	op := &request.Operation{
		Name:       opModifyImageAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyImageAttributeInput{}
	}

	output = &ModifyImageAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyImageAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified attribute of the specified AMI. You can specify only
// one attribute at a time. You can use the Attribute parameter to specify the
// attribute or one of the following parameters: Description, LaunchPermission,
// or ProductCode.
//
// AWS Marketplace product codes cannot be modified. Images with an AWS Marketplace
// product code cannot be made public.
//
// To enable the SriovNetSupport enhanced networking attribute of an image,
// enable SriovNetSupport on an instance and create an AMI from the instance.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyImageAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyImageAttribute
func (c *EC2) ModifyImageAttribute(input *ModifyImageAttributeInput) (*ModifyImageAttributeOutput, error) {
	req, out := c.ModifyImageAttributeRequest(input)
	return out, req.Send()
}

// ModifyImageAttributeWithContext is the same as ModifyImageAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyImageAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyImageAttributeWithContext(ctx aws.Context, input *ModifyImageAttributeInput, opts ...request.Option) (*ModifyImageAttributeOutput, error) {
	req, out := c.ModifyImageAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyInstanceAttribute = "ModifyInstanceAttribute"

// ModifyInstanceAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyInstanceAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyInstanceAttribute for more information on using the ModifyInstanceAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyInstanceAttributeRequest method.
//    req, resp := client.ModifyInstanceAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstanceAttribute
func (c *EC2) ModifyInstanceAttributeRequest(input *ModifyInstanceAttributeInput) (req *request.Request, output *ModifyInstanceAttributeOutput) {
	op := &request.Operation{
		Name:       opModifyInstanceAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyInstanceAttributeInput{}
	}

	output = &ModifyInstanceAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyInstanceAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified attribute of the specified instance. You can specify
// only one attribute at a time.
//
// Note: Using this action to change the security groups associated with an
// elastic network interface (ENI) attached to an instance in a VPC can result
// in an error if the instance has more than one ENI. To change the security
// groups associated with an ENI attached to an instance that has multiple ENIs,
// we recommend that you use the ModifyNetworkInterfaceAttribute action.
//
// To modify some attributes, the instance must be stopped. For more information,
// see Modifying Attributes of a Stopped Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_ChangingAttributesWhileInstanceStopped.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyInstanceAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstanceAttribute
func (c *EC2) ModifyInstanceAttribute(input *ModifyInstanceAttributeInput) (*ModifyInstanceAttributeOutput, error) {
	req, out := c.ModifyInstanceAttributeRequest(input)
	return out, req.Send()
}

// ModifyInstanceAttributeWithContext is the same as ModifyInstanceAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyInstanceAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyInstanceAttributeWithContext(ctx aws.Context, input *ModifyInstanceAttributeInput, opts ...request.Option) (*ModifyInstanceAttributeOutput, error) {
	req, out := c.ModifyInstanceAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyInstanceCapacityReservationAttributes = "ModifyInstanceCapacityReservationAttributes"

// ModifyInstanceCapacityReservationAttributesRequest generates a "aws/request.Request" representing the
// client's request for the ModifyInstanceCapacityReservationAttributes operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyInstanceCapacityReservationAttributes for more information on using the ModifyInstanceCapacityReservationAttributes
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyInstanceCapacityReservationAttributesRequest method.
//    req, resp := client.ModifyInstanceCapacityReservationAttributesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstanceCapacityReservationAttributes
func (c *EC2) ModifyInstanceCapacityReservationAttributesRequest(input *ModifyInstanceCapacityReservationAttributesInput) (req *request.Request, output *ModifyInstanceCapacityReservationAttributesOutput) {
	op := &request.Operation{
		Name:       opModifyInstanceCapacityReservationAttributes,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyInstanceCapacityReservationAttributesInput{}
	}

	output = &ModifyInstanceCapacityReservationAttributesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyInstanceCapacityReservationAttributes API operation for Amazon Elastic Compute Cloud.
//
// Modifies the Capacity Reservation settings for a stopped instance. Use this
// action to configure an instance to target a specific Capacity Reservation,
// run in any open Capacity Reservation with matching attributes, or run On-Demand
// Instance capacity.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyInstanceCapacityReservationAttributes for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstanceCapacityReservationAttributes
func (c *EC2) ModifyInstanceCapacityReservationAttributes(input *ModifyInstanceCapacityReservationAttributesInput) (*ModifyInstanceCapacityReservationAttributesOutput, error) {
	req, out := c.ModifyInstanceCapacityReservationAttributesRequest(input)
	return out, req.Send()
}

// ModifyInstanceCapacityReservationAttributesWithContext is the same as ModifyInstanceCapacityReservationAttributes with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyInstanceCapacityReservationAttributes for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyInstanceCapacityReservationAttributesWithContext(ctx aws.Context, input *ModifyInstanceCapacityReservationAttributesInput, opts ...request.Option) (*ModifyInstanceCapacityReservationAttributesOutput, error) {
	req, out := c.ModifyInstanceCapacityReservationAttributesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyInstanceCreditSpecification = "ModifyInstanceCreditSpecification"

// ModifyInstanceCreditSpecificationRequest generates a "aws/request.Request" representing the
// client's request for the ModifyInstanceCreditSpecification operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyInstanceCreditSpecification for more information on using the ModifyInstanceCreditSpecification
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyInstanceCreditSpecificationRequest method.
//    req, resp := client.ModifyInstanceCreditSpecificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstanceCreditSpecification
func (c *EC2) ModifyInstanceCreditSpecificationRequest(input *ModifyInstanceCreditSpecificationInput) (req *request.Request, output *ModifyInstanceCreditSpecificationOutput) {
	op := &request.Operation{
		Name:       opModifyInstanceCreditSpecification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyInstanceCreditSpecificationInput{}
	}

	output = &ModifyInstanceCreditSpecificationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyInstanceCreditSpecification API operation for Amazon Elastic Compute Cloud.
//
// Modifies the credit option for CPU usage on a running or stopped T2 or T3
// instance. The credit options are standard and unlimited.
//
// For more information, see Burstable Performance Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyInstanceCreditSpecification for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstanceCreditSpecification
func (c *EC2) ModifyInstanceCreditSpecification(input *ModifyInstanceCreditSpecificationInput) (*ModifyInstanceCreditSpecificationOutput, error) {
	req, out := c.ModifyInstanceCreditSpecificationRequest(input)
	return out, req.Send()
}

// ModifyInstanceCreditSpecificationWithContext is the same as ModifyInstanceCreditSpecification with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyInstanceCreditSpecification for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyInstanceCreditSpecificationWithContext(ctx aws.Context, input *ModifyInstanceCreditSpecificationInput, opts ...request.Option) (*ModifyInstanceCreditSpecificationOutput, error) {
	req, out := c.ModifyInstanceCreditSpecificationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyInstancePlacement = "ModifyInstancePlacement"

// ModifyInstancePlacementRequest generates a "aws/request.Request" representing the
// client's request for the ModifyInstancePlacement operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyInstancePlacement for more information on using the ModifyInstancePlacement
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyInstancePlacementRequest method.
//    req, resp := client.ModifyInstancePlacementRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstancePlacement
func (c *EC2) ModifyInstancePlacementRequest(input *ModifyInstancePlacementInput) (req *request.Request, output *ModifyInstancePlacementOutput) {
	op := &request.Operation{
		Name:       opModifyInstancePlacement,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyInstancePlacementInput{}
	}

	output = &ModifyInstancePlacementOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyInstancePlacement API operation for Amazon Elastic Compute Cloud.
//
// Modifies the placement attributes for a specified instance. You can do the
// following:
//
//    * Modify the affinity between an instance and a Dedicated Host (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html).
//    When affinity is set to host and the instance is not associated with a
//    specific Dedicated Host, the next time the instance is launched, it is
//    automatically associated with the host on which it lands. If the instance
//    is restarted or rebooted, this relationship persists.
//
//    * Change the Dedicated Host with which an instance is associated.
//
//    * Change the instance tenancy of an instance from host to dedicated, or
//    from dedicated to host.
//
//    * Move an instance to or from a placement group (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html).
//
// At least one attribute for affinity, host ID, tenancy, or placement group
// name must be specified in the request. Affinity and tenancy can be modified
// in the same request.
//
// To modify the host ID, tenancy, placement group, or partition for an instance,
// the instance must be in the stopped state.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyInstancePlacement for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyInstancePlacement
func (c *EC2) ModifyInstancePlacement(input *ModifyInstancePlacementInput) (*ModifyInstancePlacementOutput, error) {
	req, out := c.ModifyInstancePlacementRequest(input)
	return out, req.Send()
}

// ModifyInstancePlacementWithContext is the same as ModifyInstancePlacement with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyInstancePlacement for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyInstancePlacementWithContext(ctx aws.Context, input *ModifyInstancePlacementInput, opts ...request.Option) (*ModifyInstancePlacementOutput, error) {
	req, out := c.ModifyInstancePlacementRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyLaunchTemplate = "ModifyLaunchTemplate"

// ModifyLaunchTemplateRequest generates a "aws/request.Request" representing the
// client's request for the ModifyLaunchTemplate operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyLaunchTemplate for more information on using the ModifyLaunchTemplate
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyLaunchTemplateRequest method.
//    req, resp := client.ModifyLaunchTemplateRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyLaunchTemplate
func (c *EC2) ModifyLaunchTemplateRequest(input *ModifyLaunchTemplateInput) (req *request.Request, output *ModifyLaunchTemplateOutput) {
	op := &request.Operation{
		Name:       opModifyLaunchTemplate,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyLaunchTemplateInput{}
	}

	output = &ModifyLaunchTemplateOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyLaunchTemplate API operation for Amazon Elastic Compute Cloud.
//
// Modifies a launch template. You can specify which version of the launch template
// to set as the default version. When launching an instance, the default version
// applies when a launch template version is not specified.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyLaunchTemplate for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyLaunchTemplate
func (c *EC2) ModifyLaunchTemplate(input *ModifyLaunchTemplateInput) (*ModifyLaunchTemplateOutput, error) {
	req, out := c.ModifyLaunchTemplateRequest(input)
	return out, req.Send()
}

// ModifyLaunchTemplateWithContext is the same as ModifyLaunchTemplate with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyLaunchTemplate for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyLaunchTemplateWithContext(ctx aws.Context, input *ModifyLaunchTemplateInput, opts ...request.Option) (*ModifyLaunchTemplateOutput, error) {
	req, out := c.ModifyLaunchTemplateRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyNetworkInterfaceAttribute = "ModifyNetworkInterfaceAttribute"

// ModifyNetworkInterfaceAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyNetworkInterfaceAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyNetworkInterfaceAttribute for more information on using the ModifyNetworkInterfaceAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyNetworkInterfaceAttributeRequest method.
//    req, resp := client.ModifyNetworkInterfaceAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyNetworkInterfaceAttribute
func (c *EC2) ModifyNetworkInterfaceAttributeRequest(input *ModifyNetworkInterfaceAttributeInput) (req *request.Request, output *ModifyNetworkInterfaceAttributeOutput) {
	op := &request.Operation{
		Name:       opModifyNetworkInterfaceAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyNetworkInterfaceAttributeInput{}
	}

	output = &ModifyNetworkInterfaceAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyNetworkInterfaceAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified network interface attribute. You can specify only
// one attribute at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyNetworkInterfaceAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyNetworkInterfaceAttribute
func (c *EC2) ModifyNetworkInterfaceAttribute(input *ModifyNetworkInterfaceAttributeInput) (*ModifyNetworkInterfaceAttributeOutput, error) {
	req, out := c.ModifyNetworkInterfaceAttributeRequest(input)
	return out, req.Send()
}

// ModifyNetworkInterfaceAttributeWithContext is the same as ModifyNetworkInterfaceAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyNetworkInterfaceAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyNetworkInterfaceAttributeWithContext(ctx aws.Context, input *ModifyNetworkInterfaceAttributeInput, opts ...request.Option) (*ModifyNetworkInterfaceAttributeOutput, error) {
	req, out := c.ModifyNetworkInterfaceAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyReservedInstances = "ModifyReservedInstances"

// ModifyReservedInstancesRequest generates a "aws/request.Request" representing the
// client's request for the ModifyReservedInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyReservedInstances for more information on using the ModifyReservedInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyReservedInstancesRequest method.
//    req, resp := client.ModifyReservedInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyReservedInstances
func (c *EC2) ModifyReservedInstancesRequest(input *ModifyReservedInstancesInput) (req *request.Request, output *ModifyReservedInstancesOutput) {
	op := &request.Operation{
		Name:       opModifyReservedInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyReservedInstancesInput{}
	}

	output = &ModifyReservedInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyReservedInstances API operation for Amazon Elastic Compute Cloud.
//
// Modifies the Availability Zone, instance count, instance type, or network
// platform (EC2-Classic or EC2-VPC) of your Reserved Instances. The Reserved
// Instances to be modified must be identical, except for Availability Zone,
// network platform, and instance type.
//
// For more information, see Modifying Reserved Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-modifying.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyReservedInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyReservedInstances
func (c *EC2) ModifyReservedInstances(input *ModifyReservedInstancesInput) (*ModifyReservedInstancesOutput, error) {
	req, out := c.ModifyReservedInstancesRequest(input)
	return out, req.Send()
}

// ModifyReservedInstancesWithContext is the same as ModifyReservedInstances with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyReservedInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyReservedInstancesWithContext(ctx aws.Context, input *ModifyReservedInstancesInput, opts ...request.Option) (*ModifyReservedInstancesOutput, error) {
	req, out := c.ModifyReservedInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifySnapshotAttribute = "ModifySnapshotAttribute"

// ModifySnapshotAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifySnapshotAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifySnapshotAttribute for more information on using the ModifySnapshotAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifySnapshotAttributeRequest method.
//    req, resp := client.ModifySnapshotAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifySnapshotAttribute
func (c *EC2) ModifySnapshotAttributeRequest(input *ModifySnapshotAttributeInput) (req *request.Request, output *ModifySnapshotAttributeOutput) {
	op := &request.Operation{
		Name:       opModifySnapshotAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifySnapshotAttributeInput{}
	}

	output = &ModifySnapshotAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifySnapshotAttribute API operation for Amazon Elastic Compute Cloud.
//
// Adds or removes permission settings for the specified snapshot. You may add
// or remove specified AWS account IDs from a snapshot's list of create volume
// permissions, but you cannot do both in a single API call. If you need to
// both add and remove account IDs for a snapshot, you must use multiple API
// calls.
//
// Encrypted snapshots and snapshots with AWS Marketplace product codes cannot
// be made public. Snapshots encrypted with your default CMK cannot be shared
// with other accounts.
//
// For more information about modifying snapshot permissions, see Sharing Snapshots
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-modifying-snapshot-permissions.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifySnapshotAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifySnapshotAttribute
func (c *EC2) ModifySnapshotAttribute(input *ModifySnapshotAttributeInput) (*ModifySnapshotAttributeOutput, error) {
	req, out := c.ModifySnapshotAttributeRequest(input)
	return out, req.Send()
}

// ModifySnapshotAttributeWithContext is the same as ModifySnapshotAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifySnapshotAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifySnapshotAttributeWithContext(ctx aws.Context, input *ModifySnapshotAttributeInput, opts ...request.Option) (*ModifySnapshotAttributeOutput, error) {
	req, out := c.ModifySnapshotAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifySpotFleetRequest = "ModifySpotFleetRequest"

// ModifySpotFleetRequestRequest generates a "aws/request.Request" representing the
// client's request for the ModifySpotFleetRequest operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifySpotFleetRequest for more information on using the ModifySpotFleetRequest
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifySpotFleetRequestRequest method.
//    req, resp := client.ModifySpotFleetRequestRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifySpotFleetRequest
func (c *EC2) ModifySpotFleetRequestRequest(input *ModifySpotFleetRequestInput) (req *request.Request, output *ModifySpotFleetRequestOutput) {
	op := &request.Operation{
		Name:       opModifySpotFleetRequest,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifySpotFleetRequestInput{}
	}

	output = &ModifySpotFleetRequestOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifySpotFleetRequest API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified Spot Fleet request.
//
// While the Spot Fleet request is being modified, it is in the modifying state.
//
// To scale up your Spot Fleet, increase its target capacity. The Spot Fleet
// launches the additional Spot Instances according to the allocation strategy
// for the Spot Fleet request. If the allocation strategy is lowestPrice, the
// Spot Fleet launches instances using the Spot pool with the lowest price.
// If the allocation strategy is diversified, the Spot Fleet distributes the
// instances across the Spot pools.
//
// To scale down your Spot Fleet, decrease its target capacity. First, the Spot
// Fleet cancels any open requests that exceed the new target capacity. You
// can request that the Spot Fleet terminate Spot Instances until the size of
// the fleet no longer exceeds the new target capacity. If the allocation strategy
// is lowestPrice, the Spot Fleet terminates the instances with the highest
// price per unit. If the allocation strategy is diversified, the Spot Fleet
// terminates instances across the Spot pools. Alternatively, you can request
// that the Spot Fleet keep the fleet at its current size, but not replace any
// Spot Instances that are interrupted or that you terminate manually.
//
// If you are finished with your Spot Fleet for now, but will use it again later,
// you can set the target capacity to 0.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifySpotFleetRequest for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifySpotFleetRequest
func (c *EC2) ModifySpotFleetRequest(input *ModifySpotFleetRequestInput) (*ModifySpotFleetRequestOutput, error) {
	req, out := c.ModifySpotFleetRequestRequest(input)
	return out, req.Send()
}

// ModifySpotFleetRequestWithContext is the same as ModifySpotFleetRequest with the addition of
// the ability to pass a context and additional request options.
//
// See ModifySpotFleetRequest for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifySpotFleetRequestWithContext(ctx aws.Context, input *ModifySpotFleetRequestInput, opts ...request.Option) (*ModifySpotFleetRequestOutput, error) {
	req, out := c.ModifySpotFleetRequestRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifySubnetAttribute = "ModifySubnetAttribute"

// ModifySubnetAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifySubnetAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifySubnetAttribute for more information on using the ModifySubnetAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifySubnetAttributeRequest method.
//    req, resp := client.ModifySubnetAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifySubnetAttribute
func (c *EC2) ModifySubnetAttributeRequest(input *ModifySubnetAttributeInput) (req *request.Request, output *ModifySubnetAttributeOutput) {
	op := &request.Operation{
		Name:       opModifySubnetAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifySubnetAttributeInput{}
	}

	output = &ModifySubnetAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifySubnetAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies a subnet attribute. You can only modify one attribute at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifySubnetAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifySubnetAttribute
func (c *EC2) ModifySubnetAttribute(input *ModifySubnetAttributeInput) (*ModifySubnetAttributeOutput, error) {
	req, out := c.ModifySubnetAttributeRequest(input)
	return out, req.Send()
}

// ModifySubnetAttributeWithContext is the same as ModifySubnetAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifySubnetAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifySubnetAttributeWithContext(ctx aws.Context, input *ModifySubnetAttributeInput, opts ...request.Option) (*ModifySubnetAttributeOutput, error) {
	req, out := c.ModifySubnetAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyTransitGatewayVpcAttachment = "ModifyTransitGatewayVpcAttachment"

// ModifyTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the
// client's request for the ModifyTransitGatewayVpcAttachment operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyTransitGatewayVpcAttachment for more information on using the ModifyTransitGatewayVpcAttachment
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyTransitGatewayVpcAttachmentRequest method.
//    req, resp := client.ModifyTransitGatewayVpcAttachmentRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyTransitGatewayVpcAttachment
func (c *EC2) ModifyTransitGatewayVpcAttachmentRequest(input *ModifyTransitGatewayVpcAttachmentInput) (req *request.Request, output *ModifyTransitGatewayVpcAttachmentOutput) {
	op := &request.Operation{
		Name:       opModifyTransitGatewayVpcAttachment,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyTransitGatewayVpcAttachmentInput{}
	}

	output = &ModifyTransitGatewayVpcAttachmentOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyTransitGatewayVpcAttachment API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified VPC attachment.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyTransitGatewayVpcAttachment for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyTransitGatewayVpcAttachment
func (c *EC2) ModifyTransitGatewayVpcAttachment(input *ModifyTransitGatewayVpcAttachmentInput) (*ModifyTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.ModifyTransitGatewayVpcAttachmentRequest(input)
	return out, req.Send()
}

// ModifyTransitGatewayVpcAttachmentWithContext is the same as ModifyTransitGatewayVpcAttachment with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyTransitGatewayVpcAttachment for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyTransitGatewayVpcAttachmentWithContext(ctx aws.Context, input *ModifyTransitGatewayVpcAttachmentInput, opts ...request.Option) (*ModifyTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.ModifyTransitGatewayVpcAttachmentRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVolume = "ModifyVolume"

// ModifyVolumeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVolume operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVolume for more information on using the ModifyVolume
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVolumeRequest method.
//    req, resp := client.ModifyVolumeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVolume
func (c *EC2) ModifyVolumeRequest(input *ModifyVolumeInput) (req *request.Request, output *ModifyVolumeOutput) {
	op := &request.Operation{
		Name:       opModifyVolume,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVolumeInput{}
	}

	output = &ModifyVolumeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVolume API operation for Amazon Elastic Compute Cloud.
//
// You can modify several parameters of an existing EBS volume, including volume
// size, volume type, and IOPS capacity. If your EBS volume is attached to a
// current-generation EC2 instance type, you may be able to apply these changes
// without stopping the instance or detaching the volume from it. For more information
// about modifying an EBS volume running Linux, see Modifying the Size, IOPS,
// or Type of an EBS Volume on Linux (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html).
// For more information about modifying an EBS volume running Windows, see Modifying
// the Size, IOPS, or Type of an EBS Volume on Windows (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ebs-expand-volume.html).
//
// When you complete a resize operation on your volume, you need to extend the
// volume's file-system size to take advantage of the new storage capacity.
// For information about extending a Linux file system, see Extending a Linux
// File System (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html#recognize-expanded-volume-linux).
// For information about extending a Windows file system, see Extending a Windows
// File System (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ebs-expand-volume.html#recognize-expanded-volume-windows).
//
// You can use CloudWatch Events to check the status of a modification to an
// EBS volume. For information about CloudWatch Events, see the Amazon CloudWatch
// Events User Guide (https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/).
// You can also track the status of a modification using the DescribeVolumesModifications
// API. For information about tracking status changes using either method, see
// Monitoring Volume Modifications (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html#monitoring_mods).
//
// With previous-generation instance types, resizing an EBS volume may require
// detaching and reattaching the volume or stopping and restarting the instance.
// For more information, see Modifying the Size, IOPS, or Type of an EBS Volume
// on Linux (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-expand-volume.html)
// and Modifying the Size, IOPS, or Type of an EBS Volume on Windows (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ebs-expand-volume.html).
//
// If you reach the maximum volume modification rate per volume limit, you will
// need to wait at least six hours before applying further modifications to
// the affected EBS volume.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVolume for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVolume
func (c *EC2) ModifyVolume(input *ModifyVolumeInput) (*ModifyVolumeOutput, error) {
	req, out := c.ModifyVolumeRequest(input)
	return out, req.Send()
}

// ModifyVolumeWithContext is the same as ModifyVolume with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVolume for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVolumeWithContext(ctx aws.Context, input *ModifyVolumeInput, opts ...request.Option) (*ModifyVolumeOutput, error) {
	req, out := c.ModifyVolumeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVolumeAttribute = "ModifyVolumeAttribute"

// ModifyVolumeAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVolumeAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVolumeAttribute for more information on using the ModifyVolumeAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVolumeAttributeRequest method.
//    req, resp := client.ModifyVolumeAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVolumeAttribute
func (c *EC2) ModifyVolumeAttributeRequest(input *ModifyVolumeAttributeInput) (req *request.Request, output *ModifyVolumeAttributeOutput) {
	op := &request.Operation{
		Name:       opModifyVolumeAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVolumeAttributeInput{}
	}

	output = &ModifyVolumeAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyVolumeAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies a volume attribute.
//
// By default, all I/O operations for the volume are suspended when the data
// on the volume is determined to be potentially inconsistent, to prevent undetectable,
// latent data corruption. The I/O access to the volume can be resumed by first
// enabling I/O access and then checking the data consistency on your volume.
//
// You can change the default behavior to resume I/O operations. We recommend
// that you change this only for boot volumes or for volumes that are stateless
// or disposable.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVolumeAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVolumeAttribute
func (c *EC2) ModifyVolumeAttribute(input *ModifyVolumeAttributeInput) (*ModifyVolumeAttributeOutput, error) {
	req, out := c.ModifyVolumeAttributeRequest(input)
	return out, req.Send()
}

// ModifyVolumeAttributeWithContext is the same as ModifyVolumeAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVolumeAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVolumeAttributeWithContext(ctx aws.Context, input *ModifyVolumeAttributeInput, opts ...request.Option) (*ModifyVolumeAttributeOutput, error) {
	req, out := c.ModifyVolumeAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcAttribute = "ModifyVpcAttribute"

// ModifyVpcAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcAttribute for more information on using the ModifyVpcAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcAttributeRequest method.
//    req, resp := client.ModifyVpcAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcAttribute
func (c *EC2) ModifyVpcAttributeRequest(input *ModifyVpcAttributeInput) (req *request.Request, output *ModifyVpcAttributeOutput) {
	op := &request.Operation{
		Name:       opModifyVpcAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcAttributeInput{}
	}

	output = &ModifyVpcAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ModifyVpcAttribute API operation for Amazon Elastic Compute Cloud.
//
// Modifies the specified attribute of the specified VPC.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcAttribute
func (c *EC2) ModifyVpcAttribute(input *ModifyVpcAttributeInput) (*ModifyVpcAttributeOutput, error) {
	req, out := c.ModifyVpcAttributeRequest(input)
	return out, req.Send()
}

// ModifyVpcAttributeWithContext is the same as ModifyVpcAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcAttributeWithContext(ctx aws.Context, input *ModifyVpcAttributeInput, opts ...request.Option) (*ModifyVpcAttributeOutput, error) {
	req, out := c.ModifyVpcAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcEndpoint = "ModifyVpcEndpoint"

// ModifyVpcEndpointRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcEndpoint operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcEndpoint for more information on using the ModifyVpcEndpoint
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcEndpointRequest method.
//    req, resp := client.ModifyVpcEndpointRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpoint
func (c *EC2) ModifyVpcEndpointRequest(input *ModifyVpcEndpointInput) (req *request.Request, output *ModifyVpcEndpointOutput) {
	op := &request.Operation{
		Name:       opModifyVpcEndpoint,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcEndpointInput{}
	}

	output = &ModifyVpcEndpointOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVpcEndpoint API operation for Amazon Elastic Compute Cloud.
//
// Modifies attributes of a specified VPC endpoint. The attributes that you
// can modify depend on the type of VPC endpoint (interface or gateway). For
// more information, see VPC Endpoints (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcEndpoint for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpoint
func (c *EC2) ModifyVpcEndpoint(input *ModifyVpcEndpointInput) (*ModifyVpcEndpointOutput, error) {
	req, out := c.ModifyVpcEndpointRequest(input)
	return out, req.Send()
}

// ModifyVpcEndpointWithContext is the same as ModifyVpcEndpoint with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcEndpoint for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcEndpointWithContext(ctx aws.Context, input *ModifyVpcEndpointInput, opts ...request.Option) (*ModifyVpcEndpointOutput, error) {
	req, out := c.ModifyVpcEndpointRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcEndpointConnectionNotification = "ModifyVpcEndpointConnectionNotification"

// ModifyVpcEndpointConnectionNotificationRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcEndpointConnectionNotification operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcEndpointConnectionNotification for more information on using the ModifyVpcEndpointConnectionNotification
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcEndpointConnectionNotificationRequest method.
//    req, resp := client.ModifyVpcEndpointConnectionNotificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpointConnectionNotification
func (c *EC2) ModifyVpcEndpointConnectionNotificationRequest(input *ModifyVpcEndpointConnectionNotificationInput) (req *request.Request, output *ModifyVpcEndpointConnectionNotificationOutput) {
	op := &request.Operation{
		Name:       opModifyVpcEndpointConnectionNotification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcEndpointConnectionNotificationInput{}
	}

	output = &ModifyVpcEndpointConnectionNotificationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVpcEndpointConnectionNotification API operation for Amazon Elastic Compute Cloud.
//
// Modifies a connection notification for VPC endpoint or VPC endpoint service.
// You can change the SNS topic for the notification, or the events for which
// to be notified.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcEndpointConnectionNotification for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpointConnectionNotification
func (c *EC2) ModifyVpcEndpointConnectionNotification(input *ModifyVpcEndpointConnectionNotificationInput) (*ModifyVpcEndpointConnectionNotificationOutput, error) {
	req, out := c.ModifyVpcEndpointConnectionNotificationRequest(input)
	return out, req.Send()
}

// ModifyVpcEndpointConnectionNotificationWithContext is the same as ModifyVpcEndpointConnectionNotification with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcEndpointConnectionNotification for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcEndpointConnectionNotificationWithContext(ctx aws.Context, input *ModifyVpcEndpointConnectionNotificationInput, opts ...request.Option) (*ModifyVpcEndpointConnectionNotificationOutput, error) {
	req, out := c.ModifyVpcEndpointConnectionNotificationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcEndpointServiceConfiguration = "ModifyVpcEndpointServiceConfiguration"

// ModifyVpcEndpointServiceConfigurationRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcEndpointServiceConfiguration operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcEndpointServiceConfiguration for more information on using the ModifyVpcEndpointServiceConfiguration
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcEndpointServiceConfigurationRequest method.
//    req, resp := client.ModifyVpcEndpointServiceConfigurationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpointServiceConfiguration
func (c *EC2) ModifyVpcEndpointServiceConfigurationRequest(input *ModifyVpcEndpointServiceConfigurationInput) (req *request.Request, output *ModifyVpcEndpointServiceConfigurationOutput) {
	op := &request.Operation{
		Name:       opModifyVpcEndpointServiceConfiguration,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcEndpointServiceConfigurationInput{}
	}

	output = &ModifyVpcEndpointServiceConfigurationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVpcEndpointServiceConfiguration API operation for Amazon Elastic Compute Cloud.
//
// Modifies the attributes of your VPC endpoint service configuration. You can
// change the Network Load Balancers for your service, and you can specify whether
// acceptance is required for requests to connect to your endpoint service through
// an interface VPC endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcEndpointServiceConfiguration for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpointServiceConfiguration
func (c *EC2) ModifyVpcEndpointServiceConfiguration(input *ModifyVpcEndpointServiceConfigurationInput) (*ModifyVpcEndpointServiceConfigurationOutput, error) {
	req, out := c.ModifyVpcEndpointServiceConfigurationRequest(input)
	return out, req.Send()
}

// ModifyVpcEndpointServiceConfigurationWithContext is the same as ModifyVpcEndpointServiceConfiguration with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcEndpointServiceConfiguration for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcEndpointServiceConfigurationWithContext(ctx aws.Context, input *ModifyVpcEndpointServiceConfigurationInput, opts ...request.Option) (*ModifyVpcEndpointServiceConfigurationOutput, error) {
	req, out := c.ModifyVpcEndpointServiceConfigurationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcEndpointServicePermissions = "ModifyVpcEndpointServicePermissions"

// ModifyVpcEndpointServicePermissionsRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcEndpointServicePermissions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcEndpointServicePermissions for more information on using the ModifyVpcEndpointServicePermissions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcEndpointServicePermissionsRequest method.
//    req, resp := client.ModifyVpcEndpointServicePermissionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpointServicePermissions
func (c *EC2) ModifyVpcEndpointServicePermissionsRequest(input *ModifyVpcEndpointServicePermissionsInput) (req *request.Request, output *ModifyVpcEndpointServicePermissionsOutput) {
	op := &request.Operation{
		Name:       opModifyVpcEndpointServicePermissions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcEndpointServicePermissionsInput{}
	}

	output = &ModifyVpcEndpointServicePermissionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVpcEndpointServicePermissions API operation for Amazon Elastic Compute Cloud.
//
// Modifies the permissions for your VPC endpoint service (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/endpoint-service.html).
// You can add or remove permissions for service consumers (IAM users, IAM roles,
// and AWS accounts) to connect to your endpoint service.
//
// If you grant permissions to all principals, the service is public. Any users
// who know the name of a public service can send a request to attach an endpoint.
// If the service does not require manual approval, attachments are automatically
// approved.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcEndpointServicePermissions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcEndpointServicePermissions
func (c *EC2) ModifyVpcEndpointServicePermissions(input *ModifyVpcEndpointServicePermissionsInput) (*ModifyVpcEndpointServicePermissionsOutput, error) {
	req, out := c.ModifyVpcEndpointServicePermissionsRequest(input)
	return out, req.Send()
}

// ModifyVpcEndpointServicePermissionsWithContext is the same as ModifyVpcEndpointServicePermissions with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcEndpointServicePermissions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcEndpointServicePermissionsWithContext(ctx aws.Context, input *ModifyVpcEndpointServicePermissionsInput, opts ...request.Option) (*ModifyVpcEndpointServicePermissionsOutput, error) {
	req, out := c.ModifyVpcEndpointServicePermissionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcPeeringConnectionOptions = "ModifyVpcPeeringConnectionOptions"

// ModifyVpcPeeringConnectionOptionsRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcPeeringConnectionOptions operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcPeeringConnectionOptions for more information on using the ModifyVpcPeeringConnectionOptions
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcPeeringConnectionOptionsRequest method.
//    req, resp := client.ModifyVpcPeeringConnectionOptionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcPeeringConnectionOptions
func (c *EC2) ModifyVpcPeeringConnectionOptionsRequest(input *ModifyVpcPeeringConnectionOptionsInput) (req *request.Request, output *ModifyVpcPeeringConnectionOptionsOutput) {
	op := &request.Operation{
		Name:       opModifyVpcPeeringConnectionOptions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcPeeringConnectionOptionsInput{}
	}

	output = &ModifyVpcPeeringConnectionOptionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVpcPeeringConnectionOptions API operation for Amazon Elastic Compute Cloud.
//
// Modifies the VPC peering connection options on one side of a VPC peering
// connection. You can do the following:
//
//    * Enable/disable communication over the peering connection between an
//    EC2-Classic instance that's linked to your VPC (using ClassicLink) and
//    instances in the peer VPC.
//
//    * Enable/disable communication over the peering connection between instances
//    in your VPC and an EC2-Classic instance that's linked to the peer VPC.
//
//    * Enable/disable the ability to resolve public DNS hostnames to private
//    IP addresses when queried from instances in the peer VPC.
//
// If the peered VPCs are in the same AWS account, you can enable DNS resolution
// for queries from the local VPC. This ensures that queries from the local
// VPC resolve to private IP addresses in the peer VPC. This option is not available
// if the peered VPCs are in different AWS accounts or different regions. For
// peered VPCs in different AWS accounts, each AWS account owner must initiate
// a separate request to modify the peering connection options. For inter-region
// peering connections, you must use the region for the requester VPC to modify
// the requester VPC peering options and the region for the accepter VPC to
// modify the accepter VPC peering options. To verify which VPCs are the accepter
// and the requester for a VPC peering connection, use the DescribeVpcPeeringConnections
// command.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcPeeringConnectionOptions for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcPeeringConnectionOptions
func (c *EC2) ModifyVpcPeeringConnectionOptions(input *ModifyVpcPeeringConnectionOptionsInput) (*ModifyVpcPeeringConnectionOptionsOutput, error) {
	req, out := c.ModifyVpcPeeringConnectionOptionsRequest(input)
	return out, req.Send()
}

// ModifyVpcPeeringConnectionOptionsWithContext is the same as ModifyVpcPeeringConnectionOptions with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcPeeringConnectionOptions for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcPeeringConnectionOptionsWithContext(ctx aws.Context, input *ModifyVpcPeeringConnectionOptionsInput, opts ...request.Option) (*ModifyVpcPeeringConnectionOptionsOutput, error) {
	req, out := c.ModifyVpcPeeringConnectionOptionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opModifyVpcTenancy = "ModifyVpcTenancy"

// ModifyVpcTenancyRequest generates a "aws/request.Request" representing the
// client's request for the ModifyVpcTenancy operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ModifyVpcTenancy for more information on using the ModifyVpcTenancy
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ModifyVpcTenancyRequest method.
//    req, resp := client.ModifyVpcTenancyRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcTenancy
func (c *EC2) ModifyVpcTenancyRequest(input *ModifyVpcTenancyInput) (req *request.Request, output *ModifyVpcTenancyOutput) {
	op := &request.Operation{
		Name:       opModifyVpcTenancy,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ModifyVpcTenancyInput{}
	}

	output = &ModifyVpcTenancyOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ModifyVpcTenancy API operation for Amazon Elastic Compute Cloud.
//
// Modifies the instance tenancy attribute of the specified VPC. You can change
// the instance tenancy attribute of a VPC to default only. You cannot change
// the instance tenancy attribute to dedicated.
//
// After you modify the tenancy of the VPC, any new instances that you launch
// into the VPC have a tenancy of default, unless you specify otherwise during
// launch. The tenancy of any existing instances in the VPC is not affected.
//
// For more information, see Dedicated Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ModifyVpcTenancy for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ModifyVpcTenancy
func (c *EC2) ModifyVpcTenancy(input *ModifyVpcTenancyInput) (*ModifyVpcTenancyOutput, error) {
	req, out := c.ModifyVpcTenancyRequest(input)
	return out, req.Send()
}

// ModifyVpcTenancyWithContext is the same as ModifyVpcTenancy with the addition of
// the ability to pass a context and additional request options.
//
// See ModifyVpcTenancy for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ModifyVpcTenancyWithContext(ctx aws.Context, input *ModifyVpcTenancyInput, opts ...request.Option) (*ModifyVpcTenancyOutput, error) {
	req, out := c.ModifyVpcTenancyRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opMonitorInstances = "MonitorInstances"

// MonitorInstancesRequest generates a "aws/request.Request" representing the
// client's request for the MonitorInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See MonitorInstances for more information on using the MonitorInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the MonitorInstancesRequest method.
//    req, resp := client.MonitorInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/MonitorInstances
func (c *EC2) MonitorInstancesRequest(input *MonitorInstancesInput) (req *request.Request, output *MonitorInstancesOutput) {
	op := &request.Operation{
		Name:       opMonitorInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &MonitorInstancesInput{}
	}

	output = &MonitorInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// MonitorInstances API operation for Amazon Elastic Compute Cloud.
//
// Enables detailed monitoring for a running instance. Otherwise, basic monitoring
// is enabled. For more information, see Monitoring Your Instances and Volumes
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// To disable detailed monitoring, see .
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation MonitorInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/MonitorInstances
func (c *EC2) MonitorInstances(input *MonitorInstancesInput) (*MonitorInstancesOutput, error) {
	req, out := c.MonitorInstancesRequest(input)
	return out, req.Send()
}

// MonitorInstancesWithContext is the same as MonitorInstances with the addition of
// the ability to pass a context and additional request options.
//
// See MonitorInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) MonitorInstancesWithContext(ctx aws.Context, input *MonitorInstancesInput, opts ...request.Option) (*MonitorInstancesOutput, error) {
	req, out := c.MonitorInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opMoveAddressToVpc = "MoveAddressToVpc"

// MoveAddressToVpcRequest generates a "aws/request.Request" representing the
// client's request for the MoveAddressToVpc operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See MoveAddressToVpc for more information on using the MoveAddressToVpc
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the MoveAddressToVpcRequest method.
//    req, resp := client.MoveAddressToVpcRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/MoveAddressToVpc
func (c *EC2) MoveAddressToVpcRequest(input *MoveAddressToVpcInput) (req *request.Request, output *MoveAddressToVpcOutput) {
	op := &request.Operation{
		Name:       opMoveAddressToVpc,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &MoveAddressToVpcInput{}
	}

	output = &MoveAddressToVpcOutput{}
	req = c.newRequest(op, input, output)
	return
}

// MoveAddressToVpc API operation for Amazon Elastic Compute Cloud.
//
// Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC
// platform. The Elastic IP address must be allocated to your account for more
// than 24 hours, and it must not be associated with an instance. After the
// Elastic IP address is moved, it is no longer available for use in the EC2-Classic
// platform, unless you move it back using the RestoreAddressToClassic request.
// You cannot move an Elastic IP address that was originally allocated for use
// in the EC2-VPC platform to the EC2-Classic platform.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation MoveAddressToVpc for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/MoveAddressToVpc
func (c *EC2) MoveAddressToVpc(input *MoveAddressToVpcInput) (*MoveAddressToVpcOutput, error) {
	req, out := c.MoveAddressToVpcRequest(input)
	return out, req.Send()
}

// MoveAddressToVpcWithContext is the same as MoveAddressToVpc with the addition of
// the ability to pass a context and additional request options.
//
// See MoveAddressToVpc for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) MoveAddressToVpcWithContext(ctx aws.Context, input *MoveAddressToVpcInput, opts ...request.Option) (*MoveAddressToVpcOutput, error) {
	req, out := c.MoveAddressToVpcRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opProvisionByoipCidr = "ProvisionByoipCidr"

// ProvisionByoipCidrRequest generates a "aws/request.Request" representing the
// client's request for the ProvisionByoipCidr operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ProvisionByoipCidr for more information on using the ProvisionByoipCidr
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ProvisionByoipCidrRequest method.
//    req, resp := client.ProvisionByoipCidrRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ProvisionByoipCidr
func (c *EC2) ProvisionByoipCidrRequest(input *ProvisionByoipCidrInput) (req *request.Request, output *ProvisionByoipCidrOutput) {
	op := &request.Operation{
		Name:       opProvisionByoipCidr,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ProvisionByoipCidrInput{}
	}

	output = &ProvisionByoipCidrOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ProvisionByoipCidr API operation for Amazon Elastic Compute Cloud.
//
// Provisions an address range for use with your AWS resources through bring
// your own IP addresses (BYOIP) and creates a corresponding address pool. After
// the address range is provisioned, it is ready to be advertised using AdvertiseByoipCidr.
//
// AWS verifies that you own the address range and are authorized to advertise
// it. You must ensure that the address range is registered to you and that
// you created an RPKI ROA to authorize Amazon ASNs 16509 and 14618 to advertise
// the address range. For more information, see Bring Your Own IP Addresses
// (BYOIP) (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Provisioning an address range is an asynchronous operation, so the call returns
// immediately, but the address range is not ready to use until its status changes
// from pending-provision to provisioned. To monitor the status of an address
// range, use DescribeByoipCidrs. To allocate an Elastic IP address from your
// address pool, use AllocateAddress with either the specific address from the
// address pool or the ID of the address pool.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ProvisionByoipCidr for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ProvisionByoipCidr
func (c *EC2) ProvisionByoipCidr(input *ProvisionByoipCidrInput) (*ProvisionByoipCidrOutput, error) {
	req, out := c.ProvisionByoipCidrRequest(input)
	return out, req.Send()
}

// ProvisionByoipCidrWithContext is the same as ProvisionByoipCidr with the addition of
// the ability to pass a context and additional request options.
//
// See ProvisionByoipCidr for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ProvisionByoipCidrWithContext(ctx aws.Context, input *ProvisionByoipCidrInput, opts ...request.Option) (*ProvisionByoipCidrOutput, error) {
	req, out := c.ProvisionByoipCidrRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opPurchaseHostReservation = "PurchaseHostReservation"

// PurchaseHostReservationRequest generates a "aws/request.Request" representing the
// client's request for the PurchaseHostReservation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See PurchaseHostReservation for more information on using the PurchaseHostReservation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the PurchaseHostReservationRequest method.
//    req, resp := client.PurchaseHostReservationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/PurchaseHostReservation
func (c *EC2) PurchaseHostReservationRequest(input *PurchaseHostReservationInput) (req *request.Request, output *PurchaseHostReservationOutput) {
	op := &request.Operation{
		Name:       opPurchaseHostReservation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &PurchaseHostReservationInput{}
	}

	output = &PurchaseHostReservationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// PurchaseHostReservation API operation for Amazon Elastic Compute Cloud.
//
// Purchase a reservation with configurations that match those of your Dedicated
// Host. You must have active Dedicated Hosts in your account before you purchase
// a reservation. This action results in the specified reservation being purchased
// and charged to your account.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation PurchaseHostReservation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/PurchaseHostReservation
func (c *EC2) PurchaseHostReservation(input *PurchaseHostReservationInput) (*PurchaseHostReservationOutput, error) {
	req, out := c.PurchaseHostReservationRequest(input)
	return out, req.Send()
}

// PurchaseHostReservationWithContext is the same as PurchaseHostReservation with the addition of
// the ability to pass a context and additional request options.
//
// See PurchaseHostReservation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) PurchaseHostReservationWithContext(ctx aws.Context, input *PurchaseHostReservationInput, opts ...request.Option) (*PurchaseHostReservationOutput, error) {
	req, out := c.PurchaseHostReservationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opPurchaseReservedInstancesOffering = "PurchaseReservedInstancesOffering"

// PurchaseReservedInstancesOfferingRequest generates a "aws/request.Request" representing the
// client's request for the PurchaseReservedInstancesOffering operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See PurchaseReservedInstancesOffering for more information on using the PurchaseReservedInstancesOffering
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the PurchaseReservedInstancesOfferingRequest method.
//    req, resp := client.PurchaseReservedInstancesOfferingRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/PurchaseReservedInstancesOffering
func (c *EC2) PurchaseReservedInstancesOfferingRequest(input *PurchaseReservedInstancesOfferingInput) (req *request.Request, output *PurchaseReservedInstancesOfferingOutput) {
	op := &request.Operation{
		Name:       opPurchaseReservedInstancesOffering,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &PurchaseReservedInstancesOfferingInput{}
	}

	output = &PurchaseReservedInstancesOfferingOutput{}
	req = c.newRequest(op, input, output)
	return
}

// PurchaseReservedInstancesOffering API operation for Amazon Elastic Compute Cloud.
//
// Purchases a Reserved Instance for use with your account. With Reserved Instances,
// you pay a lower hourly rate compared to On-Demand instance pricing.
//
// Use DescribeReservedInstancesOfferings to get a list of Reserved Instance
// offerings that match your specifications. After you've purchased a Reserved
// Instance, you can check for your new Reserved Instance with DescribeReservedInstances.
//
// For more information, see Reserved Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts-on-demand-reserved-instances.html)
// and Reserved Instance Marketplace (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation PurchaseReservedInstancesOffering for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/PurchaseReservedInstancesOffering
func (c *EC2) PurchaseReservedInstancesOffering(input *PurchaseReservedInstancesOfferingInput) (*PurchaseReservedInstancesOfferingOutput, error) {
	req, out := c.PurchaseReservedInstancesOfferingRequest(input)
	return out, req.Send()
}

// PurchaseReservedInstancesOfferingWithContext is the same as PurchaseReservedInstancesOffering with the addition of
// the ability to pass a context and additional request options.
//
// See PurchaseReservedInstancesOffering for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) PurchaseReservedInstancesOfferingWithContext(ctx aws.Context, input *PurchaseReservedInstancesOfferingInput, opts ...request.Option) (*PurchaseReservedInstancesOfferingOutput, error) {
	req, out := c.PurchaseReservedInstancesOfferingRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opPurchaseScheduledInstances = "PurchaseScheduledInstances"

// PurchaseScheduledInstancesRequest generates a "aws/request.Request" representing the
// client's request for the PurchaseScheduledInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See PurchaseScheduledInstances for more information on using the PurchaseScheduledInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the PurchaseScheduledInstancesRequest method.
//    req, resp := client.PurchaseScheduledInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/PurchaseScheduledInstances
func (c *EC2) PurchaseScheduledInstancesRequest(input *PurchaseScheduledInstancesInput) (req *request.Request, output *PurchaseScheduledInstancesOutput) {
	op := &request.Operation{
		Name:       opPurchaseScheduledInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &PurchaseScheduledInstancesInput{}
	}

	output = &PurchaseScheduledInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// PurchaseScheduledInstances API operation for Amazon Elastic Compute Cloud.
//
// Purchases one or more Scheduled Instances with the specified schedule.
//
// Scheduled Instances enable you to purchase Amazon EC2 compute capacity by
// the hour for a one-year term. Before you can purchase a Scheduled Instance,
// you must call DescribeScheduledInstanceAvailability to check for available
// schedules and obtain a purchase token. After you purchase a Scheduled Instance,
// you must call RunScheduledInstances during each scheduled time period.
//
// After you purchase a Scheduled Instance, you can't cancel, modify, or resell
// your purchase.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation PurchaseScheduledInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/PurchaseScheduledInstances
func (c *EC2) PurchaseScheduledInstances(input *PurchaseScheduledInstancesInput) (*PurchaseScheduledInstancesOutput, error) {
	req, out := c.PurchaseScheduledInstancesRequest(input)
	return out, req.Send()
}

// PurchaseScheduledInstancesWithContext is the same as PurchaseScheduledInstances with the addition of
// the ability to pass a context and additional request options.
//
// See PurchaseScheduledInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) PurchaseScheduledInstancesWithContext(ctx aws.Context, input *PurchaseScheduledInstancesInput, opts ...request.Option) (*PurchaseScheduledInstancesOutput, error) {
	req, out := c.PurchaseScheduledInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRebootInstances = "RebootInstances"

// RebootInstancesRequest generates a "aws/request.Request" representing the
// client's request for the RebootInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RebootInstances for more information on using the RebootInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RebootInstancesRequest method.
//    req, resp := client.RebootInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RebootInstances
func (c *EC2) RebootInstancesRequest(input *RebootInstancesInput) (req *request.Request, output *RebootInstancesOutput) {
	op := &request.Operation{
		Name:       opRebootInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RebootInstancesInput{}
	}

	output = &RebootInstancesOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// RebootInstances API operation for Amazon Elastic Compute Cloud.
//
// Requests a reboot of one or more instances. This operation is asynchronous;
// it only queues a request to reboot the specified instances. The operation
// succeeds if the instances are valid and belong to you. Requests to reboot
// terminated instances are ignored.
//
// If an instance does not cleanly shut down within four minutes, Amazon EC2
// performs a hard reboot.
//
// For more information about troubleshooting, see Getting Console Output and
// Rebooting Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-console.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RebootInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RebootInstances
func (c *EC2) RebootInstances(input *RebootInstancesInput) (*RebootInstancesOutput, error) {
	req, out := c.RebootInstancesRequest(input)
	return out, req.Send()
}

// RebootInstancesWithContext is the same as RebootInstances with the addition of
// the ability to pass a context and additional request options.
//
// See RebootInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RebootInstancesWithContext(ctx aws.Context, input *RebootInstancesInput, opts ...request.Option) (*RebootInstancesOutput, error) {
	req, out := c.RebootInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRegisterImage = "RegisterImage"

// RegisterImageRequest generates a "aws/request.Request" representing the
// client's request for the RegisterImage operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RegisterImage for more information on using the RegisterImage
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RegisterImageRequest method.
//    req, resp := client.RegisterImageRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RegisterImage
func (c *EC2) RegisterImageRequest(input *RegisterImageInput) (req *request.Request, output *RegisterImageOutput) {
	op := &request.Operation{
		Name:       opRegisterImage,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RegisterImageInput{}
	}

	output = &RegisterImageOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RegisterImage API operation for Amazon Elastic Compute Cloud.
//
// Registers an AMI. When you're creating an AMI, this is the final step you
// must complete before you can launch an instance from the AMI. For more information
// about creating AMIs, see Creating Your Own AMIs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For Amazon EBS-backed instances, CreateImage creates and registers the AMI
// in a single request, so you don't have to register the AMI yourself.
//
// You can also use RegisterImage to create an Amazon EBS-backed Linux AMI from
// a snapshot of a root device volume. You specify the snapshot using the block
// device mapping. For more information, see Launching a Linux Instance from
// a Backup (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-launch-snapshot.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// You can't register an image where a secondary (non-root) snapshot has AWS
// Marketplace product codes.
//
// Some Linux distributions, such as Red Hat Enterprise Linux (RHEL) and SUSE
// Linux Enterprise Server (SLES), use the EC2 billing product code associated
// with an AMI to verify the subscription status for package updates. Creating
// an AMI from an EBS snapshot does not maintain this billing code, and instances
// launched from such an AMI are not able to connect to package update infrastructure.
// If you purchase a Reserved Instance offering for one of these Linux distributions
// and launch instances using an AMI that does not contain the required billing
// code, your Reserved Instance is not applied to these instances.
//
// To create an AMI for operating systems that require a billing code, see CreateImage.
//
// If needed, you can deregister an AMI at any time. Any modifications you make
// to an AMI backed by an instance store volume invalidates its registration.
// If you make changes to an image, deregister the previous image and register
// the new image.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RegisterImage for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RegisterImage
func (c *EC2) RegisterImage(input *RegisterImageInput) (*RegisterImageOutput, error) {
	req, out := c.RegisterImageRequest(input)
	return out, req.Send()
}

// RegisterImageWithContext is the same as RegisterImage with the addition of
// the ability to pass a context and additional request options.
//
// See RegisterImage for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RegisterImageWithContext(ctx aws.Context, input *RegisterImageInput, opts ...request.Option) (*RegisterImageOutput, error) {
	req, out := c.RegisterImageRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRejectTransitGatewayVpcAttachment = "RejectTransitGatewayVpcAttachment"

// RejectTransitGatewayVpcAttachmentRequest generates a "aws/request.Request" representing the
// client's request for the RejectTransitGatewayVpcAttachment operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RejectTransitGatewayVpcAttachment for more information on using the RejectTransitGatewayVpcAttachment
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RejectTransitGatewayVpcAttachmentRequest method.
//    req, resp := client.RejectTransitGatewayVpcAttachmentRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RejectTransitGatewayVpcAttachment
func (c *EC2) RejectTransitGatewayVpcAttachmentRequest(input *RejectTransitGatewayVpcAttachmentInput) (req *request.Request, output *RejectTransitGatewayVpcAttachmentOutput) {
	op := &request.Operation{
		Name:       opRejectTransitGatewayVpcAttachment,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RejectTransitGatewayVpcAttachmentInput{}
	}

	output = &RejectTransitGatewayVpcAttachmentOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RejectTransitGatewayVpcAttachment API operation for Amazon Elastic Compute Cloud.
//
// Rejects a request to attach a VPC to a transit gateway.
//
// The VPC attachment must be in the pendingAcceptance state. Use DescribeTransitGatewayVpcAttachments
// to view your pending VPC attachment requests. Use AcceptTransitGatewayVpcAttachment
// to accept a VPC attachment request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RejectTransitGatewayVpcAttachment for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RejectTransitGatewayVpcAttachment
func (c *EC2) RejectTransitGatewayVpcAttachment(input *RejectTransitGatewayVpcAttachmentInput) (*RejectTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.RejectTransitGatewayVpcAttachmentRequest(input)
	return out, req.Send()
}

// RejectTransitGatewayVpcAttachmentWithContext is the same as RejectTransitGatewayVpcAttachment with the addition of
// the ability to pass a context and additional request options.
//
// See RejectTransitGatewayVpcAttachment for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RejectTransitGatewayVpcAttachmentWithContext(ctx aws.Context, input *RejectTransitGatewayVpcAttachmentInput, opts ...request.Option) (*RejectTransitGatewayVpcAttachmentOutput, error) {
	req, out := c.RejectTransitGatewayVpcAttachmentRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRejectVpcEndpointConnections = "RejectVpcEndpointConnections"

// RejectVpcEndpointConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the RejectVpcEndpointConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RejectVpcEndpointConnections for more information on using the RejectVpcEndpointConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RejectVpcEndpointConnectionsRequest method.
//    req, resp := client.RejectVpcEndpointConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RejectVpcEndpointConnections
func (c *EC2) RejectVpcEndpointConnectionsRequest(input *RejectVpcEndpointConnectionsInput) (req *request.Request, output *RejectVpcEndpointConnectionsOutput) {
	op := &request.Operation{
		Name:       opRejectVpcEndpointConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RejectVpcEndpointConnectionsInput{}
	}

	output = &RejectVpcEndpointConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RejectVpcEndpointConnections API operation for Amazon Elastic Compute Cloud.
//
// Rejects one or more VPC endpoint connection requests to your VPC endpoint
// service.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RejectVpcEndpointConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RejectVpcEndpointConnections
func (c *EC2) RejectVpcEndpointConnections(input *RejectVpcEndpointConnectionsInput) (*RejectVpcEndpointConnectionsOutput, error) {
	req, out := c.RejectVpcEndpointConnectionsRequest(input)
	return out, req.Send()
}

// RejectVpcEndpointConnectionsWithContext is the same as RejectVpcEndpointConnections with the addition of
// the ability to pass a context and additional request options.
//
// See RejectVpcEndpointConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RejectVpcEndpointConnectionsWithContext(ctx aws.Context, input *RejectVpcEndpointConnectionsInput, opts ...request.Option) (*RejectVpcEndpointConnectionsOutput, error) {
	req, out := c.RejectVpcEndpointConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRejectVpcPeeringConnection = "RejectVpcPeeringConnection"

// RejectVpcPeeringConnectionRequest generates a "aws/request.Request" representing the
// client's request for the RejectVpcPeeringConnection operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RejectVpcPeeringConnection for more information on using the RejectVpcPeeringConnection
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RejectVpcPeeringConnectionRequest method.
//    req, resp := client.RejectVpcPeeringConnectionRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RejectVpcPeeringConnection
func (c *EC2) RejectVpcPeeringConnectionRequest(input *RejectVpcPeeringConnectionInput) (req *request.Request, output *RejectVpcPeeringConnectionOutput) {
	op := &request.Operation{
		Name:       opRejectVpcPeeringConnection,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RejectVpcPeeringConnectionInput{}
	}

	output = &RejectVpcPeeringConnectionOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RejectVpcPeeringConnection API operation for Amazon Elastic Compute Cloud.
//
// Rejects a VPC peering connection request. The VPC peering connection must
// be in the pending-acceptance state. Use the DescribeVpcPeeringConnections
// request to view your outstanding VPC peering connection requests. To delete
// an active VPC peering connection, or to delete a VPC peering connection request
// that you initiated, use DeleteVpcPeeringConnection.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RejectVpcPeeringConnection for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RejectVpcPeeringConnection
func (c *EC2) RejectVpcPeeringConnection(input *RejectVpcPeeringConnectionInput) (*RejectVpcPeeringConnectionOutput, error) {
	req, out := c.RejectVpcPeeringConnectionRequest(input)
	return out, req.Send()
}

// RejectVpcPeeringConnectionWithContext is the same as RejectVpcPeeringConnection with the addition of
// the ability to pass a context and additional request options.
//
// See RejectVpcPeeringConnection for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RejectVpcPeeringConnectionWithContext(ctx aws.Context, input *RejectVpcPeeringConnectionInput, opts ...request.Option) (*RejectVpcPeeringConnectionOutput, error) {
	req, out := c.RejectVpcPeeringConnectionRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReleaseAddress = "ReleaseAddress"

// ReleaseAddressRequest generates a "aws/request.Request" representing the
// client's request for the ReleaseAddress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReleaseAddress for more information on using the ReleaseAddress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReleaseAddressRequest method.
//    req, resp := client.ReleaseAddressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReleaseAddress
func (c *EC2) ReleaseAddressRequest(input *ReleaseAddressInput) (req *request.Request, output *ReleaseAddressOutput) {
	op := &request.Operation{
		Name:       opReleaseAddress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReleaseAddressInput{}
	}

	output = &ReleaseAddressOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ReleaseAddress API operation for Amazon Elastic Compute Cloud.
//
// Releases the specified Elastic IP address.
//
// [EC2-Classic, default VPC] Releasing an Elastic IP address automatically
// disassociates it from any instance that it's associated with. To disassociate
// an Elastic IP address without releasing it, use DisassociateAddress.
//
// [Nondefault VPC] You must use DisassociateAddress to disassociate the Elastic
// IP address before you can release it. Otherwise, Amazon EC2 returns an error
// (InvalidIPAddress.InUse).
//
// After releasing an Elastic IP address, it is released to the IP address pool.
// Be sure to update your DNS records and any servers or devices that communicate
// with the address. If you attempt to release an Elastic IP address that you
// already released, you'll get an AuthFailure error if the address is already
// allocated to another AWS account.
//
// [EC2-VPC] After you release an Elastic IP address for use in a VPC, you might
// be able to recover it. For more information, see AllocateAddress.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReleaseAddress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReleaseAddress
func (c *EC2) ReleaseAddress(input *ReleaseAddressInput) (*ReleaseAddressOutput, error) {
	req, out := c.ReleaseAddressRequest(input)
	return out, req.Send()
}

// ReleaseAddressWithContext is the same as ReleaseAddress with the addition of
// the ability to pass a context and additional request options.
//
// See ReleaseAddress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReleaseAddressWithContext(ctx aws.Context, input *ReleaseAddressInput, opts ...request.Option) (*ReleaseAddressOutput, error) {
	req, out := c.ReleaseAddressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReleaseHosts = "ReleaseHosts"

// ReleaseHostsRequest generates a "aws/request.Request" representing the
// client's request for the ReleaseHosts operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReleaseHosts for more information on using the ReleaseHosts
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReleaseHostsRequest method.
//    req, resp := client.ReleaseHostsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReleaseHosts
func (c *EC2) ReleaseHostsRequest(input *ReleaseHostsInput) (req *request.Request, output *ReleaseHostsOutput) {
	op := &request.Operation{
		Name:       opReleaseHosts,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReleaseHostsInput{}
	}

	output = &ReleaseHostsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ReleaseHosts API operation for Amazon Elastic Compute Cloud.
//
// When you no longer want to use an On-Demand Dedicated Host it can be released.
// On-Demand billing is stopped and the host goes into released state. The host
// ID of Dedicated Hosts that have been released can no longer be specified
// in another request, for example, to modify the host. You must stop or terminate
// all instances on a host before it can be released.
//
// When Dedicated Hosts are released, it may take some time for them to stop
// counting toward your limit and you may receive capacity errors when trying
// to allocate new Dedicated Hosts. Wait a few minutes and then try again.
//
// Released hosts still appear in a DescribeHosts response.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReleaseHosts for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReleaseHosts
func (c *EC2) ReleaseHosts(input *ReleaseHostsInput) (*ReleaseHostsOutput, error) {
	req, out := c.ReleaseHostsRequest(input)
	return out, req.Send()
}

// ReleaseHostsWithContext is the same as ReleaseHosts with the addition of
// the ability to pass a context and additional request options.
//
// See ReleaseHosts for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReleaseHostsWithContext(ctx aws.Context, input *ReleaseHostsInput, opts ...request.Option) (*ReleaseHostsOutput, error) {
	req, out := c.ReleaseHostsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReplaceIamInstanceProfileAssociation = "ReplaceIamInstanceProfileAssociation"

// ReplaceIamInstanceProfileAssociationRequest generates a "aws/request.Request" representing the
// client's request for the ReplaceIamInstanceProfileAssociation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReplaceIamInstanceProfileAssociation for more information on using the ReplaceIamInstanceProfileAssociation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReplaceIamInstanceProfileAssociationRequest method.
//    req, resp := client.ReplaceIamInstanceProfileAssociationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceIamInstanceProfileAssociation
func (c *EC2) ReplaceIamInstanceProfileAssociationRequest(input *ReplaceIamInstanceProfileAssociationInput) (req *request.Request, output *ReplaceIamInstanceProfileAssociationOutput) {
	op := &request.Operation{
		Name:       opReplaceIamInstanceProfileAssociation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReplaceIamInstanceProfileAssociationInput{}
	}

	output = &ReplaceIamInstanceProfileAssociationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ReplaceIamInstanceProfileAssociation API operation for Amazon Elastic Compute Cloud.
//
// Replaces an IAM instance profile for the specified running instance. You
// can use this action to change the IAM instance profile that's associated
// with an instance without having to disassociate the existing IAM instance
// profile first.
//
// Use DescribeIamInstanceProfileAssociations to get the association ID.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReplaceIamInstanceProfileAssociation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceIamInstanceProfileAssociation
func (c *EC2) ReplaceIamInstanceProfileAssociation(input *ReplaceIamInstanceProfileAssociationInput) (*ReplaceIamInstanceProfileAssociationOutput, error) {
	req, out := c.ReplaceIamInstanceProfileAssociationRequest(input)
	return out, req.Send()
}

// ReplaceIamInstanceProfileAssociationWithContext is the same as ReplaceIamInstanceProfileAssociation with the addition of
// the ability to pass a context and additional request options.
//
// See ReplaceIamInstanceProfileAssociation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReplaceIamInstanceProfileAssociationWithContext(ctx aws.Context, input *ReplaceIamInstanceProfileAssociationInput, opts ...request.Option) (*ReplaceIamInstanceProfileAssociationOutput, error) {
	req, out := c.ReplaceIamInstanceProfileAssociationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReplaceNetworkAclAssociation = "ReplaceNetworkAclAssociation"

// ReplaceNetworkAclAssociationRequest generates a "aws/request.Request" representing the
// client's request for the ReplaceNetworkAclAssociation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReplaceNetworkAclAssociation for more information on using the ReplaceNetworkAclAssociation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReplaceNetworkAclAssociationRequest method.
//    req, resp := client.ReplaceNetworkAclAssociationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceNetworkAclAssociation
func (c *EC2) ReplaceNetworkAclAssociationRequest(input *ReplaceNetworkAclAssociationInput) (req *request.Request, output *ReplaceNetworkAclAssociationOutput) {
	op := &request.Operation{
		Name:       opReplaceNetworkAclAssociation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReplaceNetworkAclAssociationInput{}
	}

	output = &ReplaceNetworkAclAssociationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ReplaceNetworkAclAssociation API operation for Amazon Elastic Compute Cloud.
//
// Changes which network ACL a subnet is associated with. By default when you
// create a subnet, it's automatically associated with the default network ACL.
// For more information, see Network ACLs (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// This is an idempotent operation.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReplaceNetworkAclAssociation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceNetworkAclAssociation
func (c *EC2) ReplaceNetworkAclAssociation(input *ReplaceNetworkAclAssociationInput) (*ReplaceNetworkAclAssociationOutput, error) {
	req, out := c.ReplaceNetworkAclAssociationRequest(input)
	return out, req.Send()
}

// ReplaceNetworkAclAssociationWithContext is the same as ReplaceNetworkAclAssociation with the addition of
// the ability to pass a context and additional request options.
//
// See ReplaceNetworkAclAssociation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReplaceNetworkAclAssociationWithContext(ctx aws.Context, input *ReplaceNetworkAclAssociationInput, opts ...request.Option) (*ReplaceNetworkAclAssociationOutput, error) {
	req, out := c.ReplaceNetworkAclAssociationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReplaceNetworkAclEntry = "ReplaceNetworkAclEntry"

// ReplaceNetworkAclEntryRequest generates a "aws/request.Request" representing the
// client's request for the ReplaceNetworkAclEntry operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReplaceNetworkAclEntry for more information on using the ReplaceNetworkAclEntry
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReplaceNetworkAclEntryRequest method.
//    req, resp := client.ReplaceNetworkAclEntryRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceNetworkAclEntry
func (c *EC2) ReplaceNetworkAclEntryRequest(input *ReplaceNetworkAclEntryInput) (req *request.Request, output *ReplaceNetworkAclEntryOutput) {
	op := &request.Operation{
		Name:       opReplaceNetworkAclEntry,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReplaceNetworkAclEntryInput{}
	}

	output = &ReplaceNetworkAclEntryOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ReplaceNetworkAclEntry API operation for Amazon Elastic Compute Cloud.
//
// Replaces an entry (rule) in a network ACL. For more information, see Network
// ACLs (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReplaceNetworkAclEntry for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceNetworkAclEntry
func (c *EC2) ReplaceNetworkAclEntry(input *ReplaceNetworkAclEntryInput) (*ReplaceNetworkAclEntryOutput, error) {
	req, out := c.ReplaceNetworkAclEntryRequest(input)
	return out, req.Send()
}

// ReplaceNetworkAclEntryWithContext is the same as ReplaceNetworkAclEntry with the addition of
// the ability to pass a context and additional request options.
//
// See ReplaceNetworkAclEntry for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReplaceNetworkAclEntryWithContext(ctx aws.Context, input *ReplaceNetworkAclEntryInput, opts ...request.Option) (*ReplaceNetworkAclEntryOutput, error) {
	req, out := c.ReplaceNetworkAclEntryRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReplaceRoute = "ReplaceRoute"

// ReplaceRouteRequest generates a "aws/request.Request" representing the
// client's request for the ReplaceRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReplaceRoute for more information on using the ReplaceRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReplaceRouteRequest method.
//    req, resp := client.ReplaceRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceRoute
func (c *EC2) ReplaceRouteRequest(input *ReplaceRouteInput) (req *request.Request, output *ReplaceRouteOutput) {
	op := &request.Operation{
		Name:       opReplaceRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReplaceRouteInput{}
	}

	output = &ReplaceRouteOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ReplaceRoute API operation for Amazon Elastic Compute Cloud.
//
// Replaces an existing route within a route table in a VPC. You must provide
// only one of the following: internet gateway or virtual private gateway, NAT
// instance, NAT gateway, VPC peering connection, network interface, or egress-only
// internet gateway.
//
// For more information, see Route Tables (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReplaceRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceRoute
func (c *EC2) ReplaceRoute(input *ReplaceRouteInput) (*ReplaceRouteOutput, error) {
	req, out := c.ReplaceRouteRequest(input)
	return out, req.Send()
}

// ReplaceRouteWithContext is the same as ReplaceRoute with the addition of
// the ability to pass a context and additional request options.
//
// See ReplaceRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReplaceRouteWithContext(ctx aws.Context, input *ReplaceRouteInput, opts ...request.Option) (*ReplaceRouteOutput, error) {
	req, out := c.ReplaceRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReplaceRouteTableAssociation = "ReplaceRouteTableAssociation"

// ReplaceRouteTableAssociationRequest generates a "aws/request.Request" representing the
// client's request for the ReplaceRouteTableAssociation operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReplaceRouteTableAssociation for more information on using the ReplaceRouteTableAssociation
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReplaceRouteTableAssociationRequest method.
//    req, resp := client.ReplaceRouteTableAssociationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceRouteTableAssociation
func (c *EC2) ReplaceRouteTableAssociationRequest(input *ReplaceRouteTableAssociationInput) (req *request.Request, output *ReplaceRouteTableAssociationOutput) {
	op := &request.Operation{
		Name:       opReplaceRouteTableAssociation,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReplaceRouteTableAssociationInput{}
	}

	output = &ReplaceRouteTableAssociationOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ReplaceRouteTableAssociation API operation for Amazon Elastic Compute Cloud.
//
// Changes the route table associated with a given subnet in a VPC. After the
// operation completes, the subnet uses the routes in the new route table it's
// associated with. For more information about route tables, see Route Tables
// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// You can also use ReplaceRouteTableAssociation to change which table is the
// main route table in the VPC. You just specify the main route table's association
// ID and the route table to be the new main route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReplaceRouteTableAssociation for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceRouteTableAssociation
func (c *EC2) ReplaceRouteTableAssociation(input *ReplaceRouteTableAssociationInput) (*ReplaceRouteTableAssociationOutput, error) {
	req, out := c.ReplaceRouteTableAssociationRequest(input)
	return out, req.Send()
}

// ReplaceRouteTableAssociationWithContext is the same as ReplaceRouteTableAssociation with the addition of
// the ability to pass a context and additional request options.
//
// See ReplaceRouteTableAssociation for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReplaceRouteTableAssociationWithContext(ctx aws.Context, input *ReplaceRouteTableAssociationInput, opts ...request.Option) (*ReplaceRouteTableAssociationOutput, error) {
	req, out := c.ReplaceRouteTableAssociationRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReplaceTransitGatewayRoute = "ReplaceTransitGatewayRoute"

// ReplaceTransitGatewayRouteRequest generates a "aws/request.Request" representing the
// client's request for the ReplaceTransitGatewayRoute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReplaceTransitGatewayRoute for more information on using the ReplaceTransitGatewayRoute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReplaceTransitGatewayRouteRequest method.
//    req, resp := client.ReplaceTransitGatewayRouteRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceTransitGatewayRoute
func (c *EC2) ReplaceTransitGatewayRouteRequest(input *ReplaceTransitGatewayRouteInput) (req *request.Request, output *ReplaceTransitGatewayRouteOutput) {
	op := &request.Operation{
		Name:       opReplaceTransitGatewayRoute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReplaceTransitGatewayRouteInput{}
	}

	output = &ReplaceTransitGatewayRouteOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ReplaceTransitGatewayRoute API operation for Amazon Elastic Compute Cloud.
//
// Replaces the specified route in the specified transit gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReplaceTransitGatewayRoute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReplaceTransitGatewayRoute
func (c *EC2) ReplaceTransitGatewayRoute(input *ReplaceTransitGatewayRouteInput) (*ReplaceTransitGatewayRouteOutput, error) {
	req, out := c.ReplaceTransitGatewayRouteRequest(input)
	return out, req.Send()
}

// ReplaceTransitGatewayRouteWithContext is the same as ReplaceTransitGatewayRoute with the addition of
// the ability to pass a context and additional request options.
//
// See ReplaceTransitGatewayRoute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReplaceTransitGatewayRouteWithContext(ctx aws.Context, input *ReplaceTransitGatewayRouteInput, opts ...request.Option) (*ReplaceTransitGatewayRouteOutput, error) {
	req, out := c.ReplaceTransitGatewayRouteRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opReportInstanceStatus = "ReportInstanceStatus"

// ReportInstanceStatusRequest generates a "aws/request.Request" representing the
// client's request for the ReportInstanceStatus operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ReportInstanceStatus for more information on using the ReportInstanceStatus
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ReportInstanceStatusRequest method.
//    req, resp := client.ReportInstanceStatusRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReportInstanceStatus
func (c *EC2) ReportInstanceStatusRequest(input *ReportInstanceStatusInput) (req *request.Request, output *ReportInstanceStatusOutput) {
	op := &request.Operation{
		Name:       opReportInstanceStatus,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ReportInstanceStatusInput{}
	}

	output = &ReportInstanceStatusOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ReportInstanceStatus API operation for Amazon Elastic Compute Cloud.
//
// Submits feedback about the status of an instance. The instance must be in
// the running state. If your experience with the instance differs from the
// instance status returned by DescribeInstanceStatus, use ReportInstanceStatus
// to report your experience with the instance. Amazon EC2 collects this information
// to improve the accuracy of status checks.
//
// Use of this action does not change the value returned by DescribeInstanceStatus.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ReportInstanceStatus for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ReportInstanceStatus
func (c *EC2) ReportInstanceStatus(input *ReportInstanceStatusInput) (*ReportInstanceStatusOutput, error) {
	req, out := c.ReportInstanceStatusRequest(input)
	return out, req.Send()
}

// ReportInstanceStatusWithContext is the same as ReportInstanceStatus with the addition of
// the ability to pass a context and additional request options.
//
// See ReportInstanceStatus for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ReportInstanceStatusWithContext(ctx aws.Context, input *ReportInstanceStatusInput, opts ...request.Option) (*ReportInstanceStatusOutput, error) {
	req, out := c.ReportInstanceStatusRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRequestSpotFleet = "RequestSpotFleet"

// RequestSpotFleetRequest generates a "aws/request.Request" representing the
// client's request for the RequestSpotFleet operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RequestSpotFleet for more information on using the RequestSpotFleet
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RequestSpotFleetRequest method.
//    req, resp := client.RequestSpotFleetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RequestSpotFleet
func (c *EC2) RequestSpotFleetRequest(input *RequestSpotFleetInput) (req *request.Request, output *RequestSpotFleetOutput) {
	op := &request.Operation{
		Name:       opRequestSpotFleet,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RequestSpotFleetInput{}
	}

	output = &RequestSpotFleetOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RequestSpotFleet API operation for Amazon Elastic Compute Cloud.
//
// Creates a Spot Fleet request.
//
// The Spot Fleet request specifies the total target capacity and the On-Demand
// target capacity. Amazon EC2 calculates the difference between the total capacity
// and On-Demand capacity, and launches the difference as Spot capacity.
//
// You can submit a single request that includes multiple launch specifications
// that vary by instance type, AMI, Availability Zone, or subnet.
//
// By default, the Spot Fleet requests Spot Instances in the Spot pool where
// the price per unit is the lowest. Each launch specification can include its
// own instance weighting that reflects the value of the instance type to your
// application workload.
//
// Alternatively, you can specify that the Spot Fleet distribute the target
// capacity across the Spot pools included in its launch specifications. By
// ensuring that the Spot Instances in your Spot Fleet are in different Spot
// pools, you can improve the availability of your fleet.
//
// You can specify tags for the Spot Instances. You cannot tag other resource
// types in a Spot Fleet request because only the instance resource type is
// supported.
//
// For more information, see Spot Fleet Requests (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-requests.html)
// in the Amazon EC2 User Guide for Linux Instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RequestSpotFleet for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RequestSpotFleet
func (c *EC2) RequestSpotFleet(input *RequestSpotFleetInput) (*RequestSpotFleetOutput, error) {
	req, out := c.RequestSpotFleetRequest(input)
	return out, req.Send()
}

// RequestSpotFleetWithContext is the same as RequestSpotFleet with the addition of
// the ability to pass a context and additional request options.
//
// See RequestSpotFleet for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RequestSpotFleetWithContext(ctx aws.Context, input *RequestSpotFleetInput, opts ...request.Option) (*RequestSpotFleetOutput, error) {
	req, out := c.RequestSpotFleetRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRequestSpotInstances = "RequestSpotInstances"

// RequestSpotInstancesRequest generates a "aws/request.Request" representing the
// client's request for the RequestSpotInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RequestSpotInstances for more information on using the RequestSpotInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RequestSpotInstancesRequest method.
//    req, resp := client.RequestSpotInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RequestSpotInstances
func (c *EC2) RequestSpotInstancesRequest(input *RequestSpotInstancesInput) (req *request.Request, output *RequestSpotInstancesOutput) {
	op := &request.Operation{
		Name:       opRequestSpotInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RequestSpotInstancesInput{}
	}

	output = &RequestSpotInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RequestSpotInstances API operation for Amazon Elastic Compute Cloud.
//
// Creates a Spot Instance request.
//
// For more information, see Spot Instance Requests (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html)
// in the Amazon EC2 User Guide for Linux Instances.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RequestSpotInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RequestSpotInstances
func (c *EC2) RequestSpotInstances(input *RequestSpotInstancesInput) (*RequestSpotInstancesOutput, error) {
	req, out := c.RequestSpotInstancesRequest(input)
	return out, req.Send()
}

// RequestSpotInstancesWithContext is the same as RequestSpotInstances with the addition of
// the ability to pass a context and additional request options.
//
// See RequestSpotInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RequestSpotInstancesWithContext(ctx aws.Context, input *RequestSpotInstancesInput, opts ...request.Option) (*RequestSpotInstancesOutput, error) {
	req, out := c.RequestSpotInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opResetFpgaImageAttribute = "ResetFpgaImageAttribute"

// ResetFpgaImageAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ResetFpgaImageAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ResetFpgaImageAttribute for more information on using the ResetFpgaImageAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ResetFpgaImageAttributeRequest method.
//    req, resp := client.ResetFpgaImageAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetFpgaImageAttribute
func (c *EC2) ResetFpgaImageAttributeRequest(input *ResetFpgaImageAttributeInput) (req *request.Request, output *ResetFpgaImageAttributeOutput) {
	op := &request.Operation{
		Name:       opResetFpgaImageAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ResetFpgaImageAttributeInput{}
	}

	output = &ResetFpgaImageAttributeOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ResetFpgaImageAttribute API operation for Amazon Elastic Compute Cloud.
//
// Resets the specified attribute of the specified Amazon FPGA Image (AFI) to
// its default value. You can only reset the load permission attribute.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ResetFpgaImageAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetFpgaImageAttribute
func (c *EC2) ResetFpgaImageAttribute(input *ResetFpgaImageAttributeInput) (*ResetFpgaImageAttributeOutput, error) {
	req, out := c.ResetFpgaImageAttributeRequest(input)
	return out, req.Send()
}

// ResetFpgaImageAttributeWithContext is the same as ResetFpgaImageAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ResetFpgaImageAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ResetFpgaImageAttributeWithContext(ctx aws.Context, input *ResetFpgaImageAttributeInput, opts ...request.Option) (*ResetFpgaImageAttributeOutput, error) {
	req, out := c.ResetFpgaImageAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opResetImageAttribute = "ResetImageAttribute"

// ResetImageAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ResetImageAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ResetImageAttribute for more information on using the ResetImageAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ResetImageAttributeRequest method.
//    req, resp := client.ResetImageAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetImageAttribute
func (c *EC2) ResetImageAttributeRequest(input *ResetImageAttributeInput) (req *request.Request, output *ResetImageAttributeOutput) {
	op := &request.Operation{
		Name:       opResetImageAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ResetImageAttributeInput{}
	}

	output = &ResetImageAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ResetImageAttribute API operation for Amazon Elastic Compute Cloud.
//
// Resets an attribute of an AMI to its default value.
//
// The productCodes attribute can't be reset.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ResetImageAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetImageAttribute
func (c *EC2) ResetImageAttribute(input *ResetImageAttributeInput) (*ResetImageAttributeOutput, error) {
	req, out := c.ResetImageAttributeRequest(input)
	return out, req.Send()
}

// ResetImageAttributeWithContext is the same as ResetImageAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ResetImageAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ResetImageAttributeWithContext(ctx aws.Context, input *ResetImageAttributeInput, opts ...request.Option) (*ResetImageAttributeOutput, error) {
	req, out := c.ResetImageAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opResetInstanceAttribute = "ResetInstanceAttribute"

// ResetInstanceAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ResetInstanceAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ResetInstanceAttribute for more information on using the ResetInstanceAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ResetInstanceAttributeRequest method.
//    req, resp := client.ResetInstanceAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetInstanceAttribute
func (c *EC2) ResetInstanceAttributeRequest(input *ResetInstanceAttributeInput) (req *request.Request, output *ResetInstanceAttributeOutput) {
	op := &request.Operation{
		Name:       opResetInstanceAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ResetInstanceAttributeInput{}
	}

	output = &ResetInstanceAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ResetInstanceAttribute API operation for Amazon Elastic Compute Cloud.
//
// Resets an attribute of an instance to its default value. To reset the kernel
// or ramdisk, the instance must be in a stopped state. To reset the sourceDestCheck,
// the instance can be either running or stopped.
//
// The sourceDestCheck attribute controls whether source/destination checking
// is enabled. The default value is true, which means checking is enabled. This
// value must be false for a NAT instance to perform NAT. For more information,
// see NAT Instances (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html)
// in the Amazon Virtual Private Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ResetInstanceAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetInstanceAttribute
func (c *EC2) ResetInstanceAttribute(input *ResetInstanceAttributeInput) (*ResetInstanceAttributeOutput, error) {
	req, out := c.ResetInstanceAttributeRequest(input)
	return out, req.Send()
}

// ResetInstanceAttributeWithContext is the same as ResetInstanceAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ResetInstanceAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ResetInstanceAttributeWithContext(ctx aws.Context, input *ResetInstanceAttributeInput, opts ...request.Option) (*ResetInstanceAttributeOutput, error) {
	req, out := c.ResetInstanceAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opResetNetworkInterfaceAttribute = "ResetNetworkInterfaceAttribute"

// ResetNetworkInterfaceAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ResetNetworkInterfaceAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ResetNetworkInterfaceAttribute for more information on using the ResetNetworkInterfaceAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ResetNetworkInterfaceAttributeRequest method.
//    req, resp := client.ResetNetworkInterfaceAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetNetworkInterfaceAttribute
func (c *EC2) ResetNetworkInterfaceAttributeRequest(input *ResetNetworkInterfaceAttributeInput) (req *request.Request, output *ResetNetworkInterfaceAttributeOutput) {
	op := &request.Operation{
		Name:       opResetNetworkInterfaceAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ResetNetworkInterfaceAttributeInput{}
	}

	output = &ResetNetworkInterfaceAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ResetNetworkInterfaceAttribute API operation for Amazon Elastic Compute Cloud.
//
// Resets a network interface attribute. You can specify only one attribute
// at a time.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ResetNetworkInterfaceAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetNetworkInterfaceAttribute
func (c *EC2) ResetNetworkInterfaceAttribute(input *ResetNetworkInterfaceAttributeInput) (*ResetNetworkInterfaceAttributeOutput, error) {
	req, out := c.ResetNetworkInterfaceAttributeRequest(input)
	return out, req.Send()
}

// ResetNetworkInterfaceAttributeWithContext is the same as ResetNetworkInterfaceAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ResetNetworkInterfaceAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ResetNetworkInterfaceAttributeWithContext(ctx aws.Context, input *ResetNetworkInterfaceAttributeInput, opts ...request.Option) (*ResetNetworkInterfaceAttributeOutput, error) {
	req, out := c.ResetNetworkInterfaceAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opResetSnapshotAttribute = "ResetSnapshotAttribute"

// ResetSnapshotAttributeRequest generates a "aws/request.Request" representing the
// client's request for the ResetSnapshotAttribute operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ResetSnapshotAttribute for more information on using the ResetSnapshotAttribute
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the ResetSnapshotAttributeRequest method.
//    req, resp := client.ResetSnapshotAttributeRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetSnapshotAttribute
func (c *EC2) ResetSnapshotAttributeRequest(input *ResetSnapshotAttributeInput) (req *request.Request, output *ResetSnapshotAttributeOutput) {
	op := &request.Operation{
		Name:       opResetSnapshotAttribute,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &ResetSnapshotAttributeInput{}
	}

	output = &ResetSnapshotAttributeOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// ResetSnapshotAttribute API operation for Amazon Elastic Compute Cloud.
//
// Resets permission settings for the specified snapshot.
//
// For more information about modifying snapshot permissions, see Sharing Snapshots
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-modifying-snapshot-permissions.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation ResetSnapshotAttribute for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/ResetSnapshotAttribute
func (c *EC2) ResetSnapshotAttribute(input *ResetSnapshotAttributeInput) (*ResetSnapshotAttributeOutput, error) {
	req, out := c.ResetSnapshotAttributeRequest(input)
	return out, req.Send()
}

// ResetSnapshotAttributeWithContext is the same as ResetSnapshotAttribute with the addition of
// the ability to pass a context and additional request options.
//
// See ResetSnapshotAttribute for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) ResetSnapshotAttributeWithContext(ctx aws.Context, input *ResetSnapshotAttributeInput, opts ...request.Option) (*ResetSnapshotAttributeOutput, error) {
	req, out := c.ResetSnapshotAttributeRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRestoreAddressToClassic = "RestoreAddressToClassic"

// RestoreAddressToClassicRequest generates a "aws/request.Request" representing the
// client's request for the RestoreAddressToClassic operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RestoreAddressToClassic for more information on using the RestoreAddressToClassic
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RestoreAddressToClassicRequest method.
//    req, resp := client.RestoreAddressToClassicRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RestoreAddressToClassic
func (c *EC2) RestoreAddressToClassicRequest(input *RestoreAddressToClassicInput) (req *request.Request, output *RestoreAddressToClassicOutput) {
	op := &request.Operation{
		Name:       opRestoreAddressToClassic,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RestoreAddressToClassicInput{}
	}

	output = &RestoreAddressToClassicOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RestoreAddressToClassic API operation for Amazon Elastic Compute Cloud.
//
// Restores an Elastic IP address that was previously moved to the EC2-VPC platform
// back to the EC2-Classic platform. You cannot move an Elastic IP address that
// was originally allocated for use in EC2-VPC. The Elastic IP address must
// not be associated with an instance or network interface.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RestoreAddressToClassic for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RestoreAddressToClassic
func (c *EC2) RestoreAddressToClassic(input *RestoreAddressToClassicInput) (*RestoreAddressToClassicOutput, error) {
	req, out := c.RestoreAddressToClassicRequest(input)
	return out, req.Send()
}

// RestoreAddressToClassicWithContext is the same as RestoreAddressToClassic with the addition of
// the ability to pass a context and additional request options.
//
// See RestoreAddressToClassic for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RestoreAddressToClassicWithContext(ctx aws.Context, input *RestoreAddressToClassicInput, opts ...request.Option) (*RestoreAddressToClassicOutput, error) {
	req, out := c.RestoreAddressToClassicRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRevokeClientVpnIngress = "RevokeClientVpnIngress"

// RevokeClientVpnIngressRequest generates a "aws/request.Request" representing the
// client's request for the RevokeClientVpnIngress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RevokeClientVpnIngress for more information on using the RevokeClientVpnIngress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RevokeClientVpnIngressRequest method.
//    req, resp := client.RevokeClientVpnIngressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RevokeClientVpnIngress
func (c *EC2) RevokeClientVpnIngressRequest(input *RevokeClientVpnIngressInput) (req *request.Request, output *RevokeClientVpnIngressOutput) {
	op := &request.Operation{
		Name:       opRevokeClientVpnIngress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RevokeClientVpnIngressInput{}
	}

	output = &RevokeClientVpnIngressOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RevokeClientVpnIngress API operation for Amazon Elastic Compute Cloud.
//
// Removes an ingress authorization rule from a Client VPN endpoint.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RevokeClientVpnIngress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RevokeClientVpnIngress
func (c *EC2) RevokeClientVpnIngress(input *RevokeClientVpnIngressInput) (*RevokeClientVpnIngressOutput, error) {
	req, out := c.RevokeClientVpnIngressRequest(input)
	return out, req.Send()
}

// RevokeClientVpnIngressWithContext is the same as RevokeClientVpnIngress with the addition of
// the ability to pass a context and additional request options.
//
// See RevokeClientVpnIngress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RevokeClientVpnIngressWithContext(ctx aws.Context, input *RevokeClientVpnIngressInput, opts ...request.Option) (*RevokeClientVpnIngressOutput, error) {
	req, out := c.RevokeClientVpnIngressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRevokeSecurityGroupEgress = "RevokeSecurityGroupEgress"

// RevokeSecurityGroupEgressRequest generates a "aws/request.Request" representing the
// client's request for the RevokeSecurityGroupEgress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RevokeSecurityGroupEgress for more information on using the RevokeSecurityGroupEgress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RevokeSecurityGroupEgressRequest method.
//    req, resp := client.RevokeSecurityGroupEgressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RevokeSecurityGroupEgress
func (c *EC2) RevokeSecurityGroupEgressRequest(input *RevokeSecurityGroupEgressInput) (req *request.Request, output *RevokeSecurityGroupEgressOutput) {
	op := &request.Operation{
		Name:       opRevokeSecurityGroupEgress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RevokeSecurityGroupEgressInput{}
	}

	output = &RevokeSecurityGroupEgressOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// RevokeSecurityGroupEgress API operation for Amazon Elastic Compute Cloud.
//
// [EC2-VPC only] Removes one or more egress rules from a security group for
// EC2-VPC. This action doesn't apply to security groups for use in EC2-Classic.
// To remove a rule, the values that you specify (for example, ports) must match
// the existing rule's values exactly.
//
// Each rule consists of the protocol and the IPv4 or IPv6 CIDR range or source
// security group. For the TCP and UDP protocols, you must also specify the
// destination port or range of ports. For the ICMP protocol, you must also
// specify the ICMP type and code. If the security group rule has a description,
// you do not have to specify the description to revoke the rule.
//
// Rule changes are propagated to instances within the security group as quickly
// as possible. However, a small delay might occur.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RevokeSecurityGroupEgress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RevokeSecurityGroupEgress
func (c *EC2) RevokeSecurityGroupEgress(input *RevokeSecurityGroupEgressInput) (*RevokeSecurityGroupEgressOutput, error) {
	req, out := c.RevokeSecurityGroupEgressRequest(input)
	return out, req.Send()
}

// RevokeSecurityGroupEgressWithContext is the same as RevokeSecurityGroupEgress with the addition of
// the ability to pass a context and additional request options.
//
// See RevokeSecurityGroupEgress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RevokeSecurityGroupEgressWithContext(ctx aws.Context, input *RevokeSecurityGroupEgressInput, opts ...request.Option) (*RevokeSecurityGroupEgressOutput, error) {
	req, out := c.RevokeSecurityGroupEgressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRevokeSecurityGroupIngress = "RevokeSecurityGroupIngress"

// RevokeSecurityGroupIngressRequest generates a "aws/request.Request" representing the
// client's request for the RevokeSecurityGroupIngress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RevokeSecurityGroupIngress for more information on using the RevokeSecurityGroupIngress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RevokeSecurityGroupIngressRequest method.
//    req, resp := client.RevokeSecurityGroupIngressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RevokeSecurityGroupIngress
func (c *EC2) RevokeSecurityGroupIngressRequest(input *RevokeSecurityGroupIngressInput) (req *request.Request, output *RevokeSecurityGroupIngressOutput) {
	op := &request.Operation{
		Name:       opRevokeSecurityGroupIngress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RevokeSecurityGroupIngressInput{}
	}

	output = &RevokeSecurityGroupIngressOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// RevokeSecurityGroupIngress API operation for Amazon Elastic Compute Cloud.
//
// Removes one or more ingress rules from a security group. To remove a rule,
// the values that you specify (for example, ports) must match the existing
// rule's values exactly.
//
// [EC2-Classic security groups only] If the values you specify do not match
// the existing rule's values, no error is returned. Use DescribeSecurityGroups
// to verify that the rule has been removed.
//
// Each rule consists of the protocol and the CIDR range or source security
// group. For the TCP and UDP protocols, you must also specify the destination
// port or range of ports. For the ICMP protocol, you must also specify the
// ICMP type and code. If the security group rule has a description, you do
// not have to specify the description to revoke the rule.
//
// Rule changes are propagated to instances within the security group as quickly
// as possible. However, a small delay might occur.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RevokeSecurityGroupIngress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RevokeSecurityGroupIngress
func (c *EC2) RevokeSecurityGroupIngress(input *RevokeSecurityGroupIngressInput) (*RevokeSecurityGroupIngressOutput, error) {
	req, out := c.RevokeSecurityGroupIngressRequest(input)
	return out, req.Send()
}

// RevokeSecurityGroupIngressWithContext is the same as RevokeSecurityGroupIngress with the addition of
// the ability to pass a context and additional request options.
//
// See RevokeSecurityGroupIngress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RevokeSecurityGroupIngressWithContext(ctx aws.Context, input *RevokeSecurityGroupIngressInput, opts ...request.Option) (*RevokeSecurityGroupIngressOutput, error) {
	req, out := c.RevokeSecurityGroupIngressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRunInstances = "RunInstances"

// RunInstancesRequest generates a "aws/request.Request" representing the
// client's request for the RunInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RunInstances for more information on using the RunInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RunInstancesRequest method.
//    req, resp := client.RunInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RunInstances
func (c *EC2) RunInstancesRequest(input *RunInstancesInput) (req *request.Request, output *Reservation) {
	op := &request.Operation{
		Name:       opRunInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RunInstancesInput{}
	}

	output = &Reservation{}
	req = c.newRequest(op, input, output)
	return
}

// RunInstances API operation for Amazon Elastic Compute Cloud.
//
// Launches the specified number of instances using an AMI for which you have
// permissions.
//
// You can specify a number of options, or leave the default options. The following
// rules apply:
//
//    * [EC2-VPC] If you don't specify a subnet ID, we choose a default subnet
//    from your default VPC for you. If you don't have a default VPC, you must
//    specify a subnet ID in the request.
//
//    * [EC2-Classic] If don't specify an Availability Zone, we choose one for
//    you.
//
//    * Some instance types must be launched into a VPC. If you do not have
//    a default VPC, or if you do not specify a subnet ID, the request fails.
//    For more information, see Instance Types Available Only in a VPC (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-vpc.html#vpc-only-instance-types).
//
//    * [EC2-VPC] All instances have a network interface with a primary private
//    IPv4 address. If you don't specify this address, we choose one from the
//    IPv4 range of your subnet.
//
//    * Not all instance types support IPv6 addresses. For more information,
//    see Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html).
//
//    * If you don't specify a security group ID, we use the default security
//    group. For more information, see Security Groups (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html).
//
//    * If any of the AMIs have a product code attached for which the user has
//    not subscribed, the request fails.
//
// You can create a launch template (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html),
// which is a resource that contains the parameters to launch an instance. When
// you launch an instance using RunInstances, you can specify the launch template
// instead of specifying the launch parameters.
//
// To ensure faster instance launches, break up large requests into smaller
// batches. For example, create five separate launch requests for 100 instances
// each instead of one launch request for 500 instances.
//
// An instance is ready for you to use when it's in the running state. You can
// check the state of your instance using DescribeInstances. You can tag instances
// and EBS volumes during launch, after launch, or both. For more information,
// see CreateTags and Tagging Your Amazon EC2 Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html).
//
// Linux instances have access to the public key of the key pair at boot. You
// can use this key to provide secure access to the instance. Amazon EC2 public
// images use this feature to provide secure access without passwords. For more
// information, see Key Pairs (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For troubleshooting, see What To Do If An Instance Immediately Terminates
// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_InstanceStraightToTerminated.html),
// and Troubleshooting Connecting to Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RunInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RunInstances
func (c *EC2) RunInstances(input *RunInstancesInput) (*Reservation, error) {
	req, out := c.RunInstancesRequest(input)
	return out, req.Send()
}

// RunInstancesWithContext is the same as RunInstances with the addition of
// the ability to pass a context and additional request options.
//
// See RunInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RunInstancesWithContext(ctx aws.Context, input *RunInstancesInput, opts ...request.Option) (*Reservation, error) {
	req, out := c.RunInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opRunScheduledInstances = "RunScheduledInstances"

// RunScheduledInstancesRequest generates a "aws/request.Request" representing the
// client's request for the RunScheduledInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See RunScheduledInstances for more information on using the RunScheduledInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the RunScheduledInstancesRequest method.
//    req, resp := client.RunScheduledInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RunScheduledInstances
func (c *EC2) RunScheduledInstancesRequest(input *RunScheduledInstancesInput) (req *request.Request, output *RunScheduledInstancesOutput) {
	op := &request.Operation{
		Name:       opRunScheduledInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &RunScheduledInstancesInput{}
	}

	output = &RunScheduledInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// RunScheduledInstances API operation for Amazon Elastic Compute Cloud.
//
// Launches the specified Scheduled Instances.
//
// Before you can launch a Scheduled Instance, you must purchase it and obtain
// an identifier using PurchaseScheduledInstances.
//
// You must launch a Scheduled Instance during its scheduled time period. You
// can't stop or reboot a Scheduled Instance, but you can terminate it as needed.
// If you terminate a Scheduled Instance before the current scheduled time period
// ends, you can launch it again after a few minutes. For more information,
// see Scheduled Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-scheduled-instances.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation RunScheduledInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/RunScheduledInstances
func (c *EC2) RunScheduledInstances(input *RunScheduledInstancesInput) (*RunScheduledInstancesOutput, error) {
	req, out := c.RunScheduledInstancesRequest(input)
	return out, req.Send()
}

// RunScheduledInstancesWithContext is the same as RunScheduledInstances with the addition of
// the ability to pass a context and additional request options.
//
// See RunScheduledInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) RunScheduledInstancesWithContext(ctx aws.Context, input *RunScheduledInstancesInput, opts ...request.Option) (*RunScheduledInstancesOutput, error) {
	req, out := c.RunScheduledInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opSearchTransitGatewayRoutes = "SearchTransitGatewayRoutes"

// SearchTransitGatewayRoutesRequest generates a "aws/request.Request" representing the
// client's request for the SearchTransitGatewayRoutes operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See SearchTransitGatewayRoutes for more information on using the SearchTransitGatewayRoutes
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the SearchTransitGatewayRoutesRequest method.
//    req, resp := client.SearchTransitGatewayRoutesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/SearchTransitGatewayRoutes
func (c *EC2) SearchTransitGatewayRoutesRequest(input *SearchTransitGatewayRoutesInput) (req *request.Request, output *SearchTransitGatewayRoutesOutput) {
	op := &request.Operation{
		Name:       opSearchTransitGatewayRoutes,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &SearchTransitGatewayRoutesInput{}
	}

	output = &SearchTransitGatewayRoutesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// SearchTransitGatewayRoutes API operation for Amazon Elastic Compute Cloud.
//
// Searches for routes in the specified transit gateway route table.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation SearchTransitGatewayRoutes for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/SearchTransitGatewayRoutes
func (c *EC2) SearchTransitGatewayRoutes(input *SearchTransitGatewayRoutesInput) (*SearchTransitGatewayRoutesOutput, error) {
	req, out := c.SearchTransitGatewayRoutesRequest(input)
	return out, req.Send()
}

// SearchTransitGatewayRoutesWithContext is the same as SearchTransitGatewayRoutes with the addition of
// the ability to pass a context and additional request options.
//
// See SearchTransitGatewayRoutes for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) SearchTransitGatewayRoutesWithContext(ctx aws.Context, input *SearchTransitGatewayRoutesInput, opts ...request.Option) (*SearchTransitGatewayRoutesOutput, error) {
	req, out := c.SearchTransitGatewayRoutesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opStartInstances = "StartInstances"

// StartInstancesRequest generates a "aws/request.Request" representing the
// client's request for the StartInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See StartInstances for more information on using the StartInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the StartInstancesRequest method.
//    req, resp := client.StartInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/StartInstances
func (c *EC2) StartInstancesRequest(input *StartInstancesInput) (req *request.Request, output *StartInstancesOutput) {
	op := &request.Operation{
		Name:       opStartInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &StartInstancesInput{}
	}

	output = &StartInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// StartInstances API operation for Amazon Elastic Compute Cloud.
//
// Starts an Amazon EBS-backed instance that you've previously stopped.
//
// Instances that use Amazon EBS volumes as their root devices can be quickly
// stopped and started. When an instance is stopped, the compute resources are
// released and you are not billed for instance usage. However, your root partition
// Amazon EBS volume remains and continues to persist your data, and you are
// charged for Amazon EBS volume usage. You can restart your instance at any
// time. Every time you start your Windows instance, Amazon EC2 charges you
// for a full instance hour. If you stop and restart your Windows instance,
// a new instance hour begins and Amazon EC2 charges you for another full instance
// hour even if you are still within the same 60-minute period when it was stopped.
// Every time you start your Linux instance, Amazon EC2 charges a one-minute
// minimum for instance usage, and thereafter charges per second for instance
// usage.
//
// Before stopping an instance, make sure it is in a state from which it can
// be restarted. Stopping an instance does not preserve data stored in RAM.
//
// Performing this operation on an instance that uses an instance store as its
// root device returns an error.
//
// For more information, see Stopping Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation StartInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/StartInstances
func (c *EC2) StartInstances(input *StartInstancesInput) (*StartInstancesOutput, error) {
	req, out := c.StartInstancesRequest(input)
	return out, req.Send()
}

// StartInstancesWithContext is the same as StartInstances with the addition of
// the ability to pass a context and additional request options.
//
// See StartInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) StartInstancesWithContext(ctx aws.Context, input *StartInstancesInput, opts ...request.Option) (*StartInstancesOutput, error) {
	req, out := c.StartInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opStopInstances = "StopInstances"

// StopInstancesRequest generates a "aws/request.Request" representing the
// client's request for the StopInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See StopInstances for more information on using the StopInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the StopInstancesRequest method.
//    req, resp := client.StopInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/StopInstances
func (c *EC2) StopInstancesRequest(input *StopInstancesInput) (req *request.Request, output *StopInstancesOutput) {
	op := &request.Operation{
		Name:       opStopInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &StopInstancesInput{}
	}

	output = &StopInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// StopInstances API operation for Amazon Elastic Compute Cloud.
//
// Stops an Amazon EBS-backed instance.
//
// You can use the Stop action to hibernate an instance if the instance is enabled
// for hibernation (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#enabling-hibernation)
// and it meets the hibernation prerequisites (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#hibernating-prerequisites).
// For more information, see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// We don't charge usage for a stopped instance, or data transfer fees; however,
// your root partition Amazon EBS volume remains and continues to persist your
// data, and you are charged for Amazon EBS volume usage. Every time you start
// your Windows instance, Amazon EC2 charges you for a full instance hour. If
// you stop and restart your Windows instance, a new instance hour begins and
// Amazon EC2 charges you for another full instance hour even if you are still
// within the same 60-minute period when it was stopped. Every time you start
// your Linux instance, Amazon EC2 charges a one-minute minimum for instance
// usage, and thereafter charges per second for instance usage.
//
// You can't start, stop, or hibernate Spot Instances, and you can't stop or
// hibernate instance store-backed instances. For information about using hibernation
// for Spot Instances, see Hibernating Interrupted Spot Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html#hibernate-spot-instances)
// in the Amazon Elastic Compute Cloud User Guide.
//
// When you stop or hibernate an instance, we shut it down. You can restart
// your instance at any time. Before stopping or hibernating an instance, make
// sure it is in a state from which it can be restarted. Stopping an instance
// does not preserve data stored in RAM, but hibernating an instance does preserve
// data stored in RAM. If an instance cannot hibernate successfully, a normal
// shutdown occurs.
//
// Stopping and hibernating an instance is different to rebooting or terminating
// it. For example, when you stop or hibernate an instance, the root device
// and any other devices attached to the instance persist. When you terminate
// an instance, the root device and any other devices attached during the instance
// launch are automatically deleted. For more information about the differences
// between rebooting, stopping, hibernating, and terminating instances, see
// Instance Lifecycle (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// When you stop an instance, we attempt to shut it down forcibly after a short
// while. If your instance appears stuck in the stopping state after a period
// of time, there may be an issue with the underlying host computer. For more
// information, see Troubleshooting Stopping Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesStopping.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation StopInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/StopInstances
func (c *EC2) StopInstances(input *StopInstancesInput) (*StopInstancesOutput, error) {
	req, out := c.StopInstancesRequest(input)
	return out, req.Send()
}

// StopInstancesWithContext is the same as StopInstances with the addition of
// the ability to pass a context and additional request options.
//
// See StopInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) StopInstancesWithContext(ctx aws.Context, input *StopInstancesInput, opts ...request.Option) (*StopInstancesOutput, error) {
	req, out := c.StopInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opTerminateClientVpnConnections = "TerminateClientVpnConnections"

// TerminateClientVpnConnectionsRequest generates a "aws/request.Request" representing the
// client's request for the TerminateClientVpnConnections operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See TerminateClientVpnConnections for more information on using the TerminateClientVpnConnections
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the TerminateClientVpnConnectionsRequest method.
//    req, resp := client.TerminateClientVpnConnectionsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/TerminateClientVpnConnections
func (c *EC2) TerminateClientVpnConnectionsRequest(input *TerminateClientVpnConnectionsInput) (req *request.Request, output *TerminateClientVpnConnectionsOutput) {
	op := &request.Operation{
		Name:       opTerminateClientVpnConnections,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &TerminateClientVpnConnectionsInput{}
	}

	output = &TerminateClientVpnConnectionsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// TerminateClientVpnConnections API operation for Amazon Elastic Compute Cloud.
//
// Terminates active Client VPN endpoint connections. This action can be used
// to terminate a specific client connection, or up to five connections established
// by a specific user.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation TerminateClientVpnConnections for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/TerminateClientVpnConnections
func (c *EC2) TerminateClientVpnConnections(input *TerminateClientVpnConnectionsInput) (*TerminateClientVpnConnectionsOutput, error) {
	req, out := c.TerminateClientVpnConnectionsRequest(input)
	return out, req.Send()
}

// TerminateClientVpnConnectionsWithContext is the same as TerminateClientVpnConnections with the addition of
// the ability to pass a context and additional request options.
//
// See TerminateClientVpnConnections for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) TerminateClientVpnConnectionsWithContext(ctx aws.Context, input *TerminateClientVpnConnectionsInput, opts ...request.Option) (*TerminateClientVpnConnectionsOutput, error) {
	req, out := c.TerminateClientVpnConnectionsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opTerminateInstances = "TerminateInstances"

// TerminateInstancesRequest generates a "aws/request.Request" representing the
// client's request for the TerminateInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See TerminateInstances for more information on using the TerminateInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the TerminateInstancesRequest method.
//    req, resp := client.TerminateInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/TerminateInstances
func (c *EC2) TerminateInstancesRequest(input *TerminateInstancesInput) (req *request.Request, output *TerminateInstancesOutput) {
	op := &request.Operation{
		Name:       opTerminateInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &TerminateInstancesInput{}
	}

	output = &TerminateInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// TerminateInstances API operation for Amazon Elastic Compute Cloud.
//
// Shuts down one or more instances. This operation is idempotent; if you terminate
// an instance more than once, each call succeeds.
//
// If you specify multiple instances and the request fails (for example, because
// of a single incorrect instance ID), none of the instances are terminated.
//
// Terminated instances remain visible after termination (for approximately
// one hour).
//
// By default, Amazon EC2 deletes all EBS volumes that were attached when the
// instance launched. Volumes attached after instance launch continue running.
//
// You can stop, start, and terminate EBS-backed instances. You can only terminate
// instance store-backed instances. What happens to an instance differs if you
// stop it or terminate it. For example, when you stop an instance, the root
// device and any other devices attached to the instance persist. When you terminate
// an instance, any attached EBS volumes with the DeleteOnTermination block
// device mapping parameter set to true are automatically deleted. For more
// information about the differences between stopping and terminating instances,
// see Instance Lifecycle (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// For more information about troubleshooting, see Troubleshooting Terminating
// Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesShuttingDown.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation TerminateInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/TerminateInstances
func (c *EC2) TerminateInstances(input *TerminateInstancesInput) (*TerminateInstancesOutput, error) {
	req, out := c.TerminateInstancesRequest(input)
	return out, req.Send()
}

// TerminateInstancesWithContext is the same as TerminateInstances with the addition of
// the ability to pass a context and additional request options.
//
// See TerminateInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) TerminateInstancesWithContext(ctx aws.Context, input *TerminateInstancesInput, opts ...request.Option) (*TerminateInstancesOutput, error) {
	req, out := c.TerminateInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opUnassignIpv6Addresses = "UnassignIpv6Addresses"

// UnassignIpv6AddressesRequest generates a "aws/request.Request" representing the
// client's request for the UnassignIpv6Addresses operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See UnassignIpv6Addresses for more information on using the UnassignIpv6Addresses
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the UnassignIpv6AddressesRequest method.
//    req, resp := client.UnassignIpv6AddressesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UnassignIpv6Addresses
func (c *EC2) UnassignIpv6AddressesRequest(input *UnassignIpv6AddressesInput) (req *request.Request, output *UnassignIpv6AddressesOutput) {
	op := &request.Operation{
		Name:       opUnassignIpv6Addresses,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UnassignIpv6AddressesInput{}
	}

	output = &UnassignIpv6AddressesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// UnassignIpv6Addresses API operation for Amazon Elastic Compute Cloud.
//
// Unassigns one or more IPv6 addresses from a network interface.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation UnassignIpv6Addresses for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UnassignIpv6Addresses
func (c *EC2) UnassignIpv6Addresses(input *UnassignIpv6AddressesInput) (*UnassignIpv6AddressesOutput, error) {
	req, out := c.UnassignIpv6AddressesRequest(input)
	return out, req.Send()
}

// UnassignIpv6AddressesWithContext is the same as UnassignIpv6Addresses with the addition of
// the ability to pass a context and additional request options.
//
// See UnassignIpv6Addresses for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) UnassignIpv6AddressesWithContext(ctx aws.Context, input *UnassignIpv6AddressesInput, opts ...request.Option) (*UnassignIpv6AddressesOutput, error) {
	req, out := c.UnassignIpv6AddressesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opUnassignPrivateIpAddresses = "UnassignPrivateIpAddresses"

// UnassignPrivateIpAddressesRequest generates a "aws/request.Request" representing the
// client's request for the UnassignPrivateIpAddresses operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See UnassignPrivateIpAddresses for more information on using the UnassignPrivateIpAddresses
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the UnassignPrivateIpAddressesRequest method.
//    req, resp := client.UnassignPrivateIpAddressesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UnassignPrivateIpAddresses
func (c *EC2) UnassignPrivateIpAddressesRequest(input *UnassignPrivateIpAddressesInput) (req *request.Request, output *UnassignPrivateIpAddressesOutput) {
	op := &request.Operation{
		Name:       opUnassignPrivateIpAddresses,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UnassignPrivateIpAddressesInput{}
	}

	output = &UnassignPrivateIpAddressesOutput{}
	req = c.newRequest(op, input, output)
	req.Handlers.Unmarshal.Swap(ec2query.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
	return
}

// UnassignPrivateIpAddresses API operation for Amazon Elastic Compute Cloud.
//
// Unassigns one or more secondary private IP addresses from a network interface.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation UnassignPrivateIpAddresses for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UnassignPrivateIpAddresses
func (c *EC2) UnassignPrivateIpAddresses(input *UnassignPrivateIpAddressesInput) (*UnassignPrivateIpAddressesOutput, error) {
	req, out := c.UnassignPrivateIpAddressesRequest(input)
	return out, req.Send()
}

// UnassignPrivateIpAddressesWithContext is the same as UnassignPrivateIpAddresses with the addition of
// the ability to pass a context and additional request options.
//
// See UnassignPrivateIpAddresses for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) UnassignPrivateIpAddressesWithContext(ctx aws.Context, input *UnassignPrivateIpAddressesInput, opts ...request.Option) (*UnassignPrivateIpAddressesOutput, error) {
	req, out := c.UnassignPrivateIpAddressesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opUnmonitorInstances = "UnmonitorInstances"

// UnmonitorInstancesRequest generates a "aws/request.Request" representing the
// client's request for the UnmonitorInstances operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See UnmonitorInstances for more information on using the UnmonitorInstances
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the UnmonitorInstancesRequest method.
//    req, resp := client.UnmonitorInstancesRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UnmonitorInstances
func (c *EC2) UnmonitorInstancesRequest(input *UnmonitorInstancesInput) (req *request.Request, output *UnmonitorInstancesOutput) {
	op := &request.Operation{
		Name:       opUnmonitorInstances,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UnmonitorInstancesInput{}
	}

	output = &UnmonitorInstancesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// UnmonitorInstances API operation for Amazon Elastic Compute Cloud.
//
// Disables detailed monitoring for a running instance. For more information,
// see Monitoring Your Instances and Volumes (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch.html)
// in the Amazon Elastic Compute Cloud User Guide.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation UnmonitorInstances for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UnmonitorInstances
func (c *EC2) UnmonitorInstances(input *UnmonitorInstancesInput) (*UnmonitorInstancesOutput, error) {
	req, out := c.UnmonitorInstancesRequest(input)
	return out, req.Send()
}

// UnmonitorInstancesWithContext is the same as UnmonitorInstances with the addition of
// the ability to pass a context and additional request options.
//
// See UnmonitorInstances for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) UnmonitorInstancesWithContext(ctx aws.Context, input *UnmonitorInstancesInput, opts ...request.Option) (*UnmonitorInstancesOutput, error) {
	req, out := c.UnmonitorInstancesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opUpdateSecurityGroupRuleDescriptionsEgress = "UpdateSecurityGroupRuleDescriptionsEgress"

// UpdateSecurityGroupRuleDescriptionsEgressRequest generates a "aws/request.Request" representing the
// client's request for the UpdateSecurityGroupRuleDescriptionsEgress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See UpdateSecurityGroupRuleDescriptionsEgress for more information on using the UpdateSecurityGroupRuleDescriptionsEgress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the UpdateSecurityGroupRuleDescriptionsEgressRequest method.
//    req, resp := client.UpdateSecurityGroupRuleDescriptionsEgressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UpdateSecurityGroupRuleDescriptionsEgress
func (c *EC2) UpdateSecurityGroupRuleDescriptionsEgressRequest(input *UpdateSecurityGroupRuleDescriptionsEgressInput) (req *request.Request, output *UpdateSecurityGroupRuleDescriptionsEgressOutput) {
	op := &request.Operation{
		Name:       opUpdateSecurityGroupRuleDescriptionsEgress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UpdateSecurityGroupRuleDescriptionsEgressInput{}
	}

	output = &UpdateSecurityGroupRuleDescriptionsEgressOutput{}
	req = c.newRequest(op, input, output)
	return
}

// UpdateSecurityGroupRuleDescriptionsEgress API operation for Amazon Elastic Compute Cloud.
//
// [EC2-VPC only] Updates the description of an egress (outbound) security group
// rule. You can replace an existing description, or add a description to a
// rule that did not have one previously.
//
// You specify the description as part of the IP permissions structure. You
// can remove a description for a security group rule by omitting the description
// parameter in the request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation UpdateSecurityGroupRuleDescriptionsEgress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UpdateSecurityGroupRuleDescriptionsEgress
func (c *EC2) UpdateSecurityGroupRuleDescriptionsEgress(input *UpdateSecurityGroupRuleDescriptionsEgressInput) (*UpdateSecurityGroupRuleDescriptionsEgressOutput, error) {
	req, out := c.UpdateSecurityGroupRuleDescriptionsEgressRequest(input)
	return out, req.Send()
}

// UpdateSecurityGroupRuleDescriptionsEgressWithContext is the same as UpdateSecurityGroupRuleDescriptionsEgress with the addition of
// the ability to pass a context and additional request options.
//
// See UpdateSecurityGroupRuleDescriptionsEgress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) UpdateSecurityGroupRuleDescriptionsEgressWithContext(ctx aws.Context, input *UpdateSecurityGroupRuleDescriptionsEgressInput, opts ...request.Option) (*UpdateSecurityGroupRuleDescriptionsEgressOutput, error) {
	req, out := c.UpdateSecurityGroupRuleDescriptionsEgressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opUpdateSecurityGroupRuleDescriptionsIngress = "UpdateSecurityGroupRuleDescriptionsIngress"

// UpdateSecurityGroupRuleDescriptionsIngressRequest generates a "aws/request.Request" representing the
// client's request for the UpdateSecurityGroupRuleDescriptionsIngress operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See UpdateSecurityGroupRuleDescriptionsIngress for more information on using the UpdateSecurityGroupRuleDescriptionsIngress
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the UpdateSecurityGroupRuleDescriptionsIngressRequest method.
//    req, resp := client.UpdateSecurityGroupRuleDescriptionsIngressRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UpdateSecurityGroupRuleDescriptionsIngress
func (c *EC2) UpdateSecurityGroupRuleDescriptionsIngressRequest(input *UpdateSecurityGroupRuleDescriptionsIngressInput) (req *request.Request, output *UpdateSecurityGroupRuleDescriptionsIngressOutput) {
	op := &request.Operation{
		Name:       opUpdateSecurityGroupRuleDescriptionsIngress,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UpdateSecurityGroupRuleDescriptionsIngressInput{}
	}

	output = &UpdateSecurityGroupRuleDescriptionsIngressOutput{}
	req = c.newRequest(op, input, output)
	return
}

// UpdateSecurityGroupRuleDescriptionsIngress API operation for Amazon Elastic Compute Cloud.
//
// Updates the description of an ingress (inbound) security group rule. You
// can replace an existing description, or add a description to a rule that
// did not have one previously.
//
// You specify the description as part of the IP permissions structure. You
// can remove a description for a security group rule by omitting the description
// parameter in the request.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation UpdateSecurityGroupRuleDescriptionsIngress for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/UpdateSecurityGroupRuleDescriptionsIngress
func (c *EC2) UpdateSecurityGroupRuleDescriptionsIngress(input *UpdateSecurityGroupRuleDescriptionsIngressInput) (*UpdateSecurityGroupRuleDescriptionsIngressOutput, error) {
	req, out := c.UpdateSecurityGroupRuleDescriptionsIngressRequest(input)
	return out, req.Send()
}

// UpdateSecurityGroupRuleDescriptionsIngressWithContext is the same as UpdateSecurityGroupRuleDescriptionsIngress with the addition of
// the ability to pass a context and additional request options.
//
// See UpdateSecurityGroupRuleDescriptionsIngress for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) UpdateSecurityGroupRuleDescriptionsIngressWithContext(ctx aws.Context, input *UpdateSecurityGroupRuleDescriptionsIngressInput, opts ...request.Option) (*UpdateSecurityGroupRuleDescriptionsIngressOutput, error) {
	req, out := c.UpdateSecurityGroupRuleDescriptionsIngressRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opWithdrawByoipCidr = "WithdrawByoipCidr"

// WithdrawByoipCidrRequest generates a "aws/request.Request" representing the
// client's request for the WithdrawByoipCidr operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See WithdrawByoipCidr for more information on using the WithdrawByoipCidr
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//
//    // Example sending a request using the WithdrawByoipCidrRequest method.
//    req, resp := client.WithdrawByoipCidrRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/WithdrawByoipCidr
func (c *EC2) WithdrawByoipCidrRequest(input *WithdrawByoipCidrInput) (req *request.Request, output *WithdrawByoipCidrOutput) {
	op := &request.Operation{
		Name:       opWithdrawByoipCidr,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &WithdrawByoipCidrInput{}
	}

	output = &WithdrawByoipCidrOutput{}
	req = c.newRequest(op, input, output)
	return
}

// WithdrawByoipCidr API operation for Amazon Elastic Compute Cloud.
//
// Stops advertising an IPv4 address range that is provisioned as an address
// pool.
//
// You can perform this operation at most once every 10 seconds, even if you
// specify different address ranges each time.
//
// It can take a few minutes before traffic to the specified addresses stops
// routing to AWS because of BGP propagation delays.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for Amazon Elastic Compute Cloud's
// API operation WithdrawByoipCidr for usage and error information.
// See also, https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/WithdrawByoipCidr
func (c *EC2) WithdrawByoipCidr(input *WithdrawByoipCidrInput) (*WithdrawByoipCidrOutput, error) {
	req, out := c.WithdrawByoipCidrRequest(input)
	return out, req.Send()
}

// WithdrawByoipCidrWithContext is the same as WithdrawByoipCidr with the addition of
// the ability to pass a context and additional request options.
//
// See WithdrawByoipCidr for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *EC2) WithdrawByoipCidrWithContext(ctx aws.Context, input *WithdrawByoipCidrInput, opts ...request.Option) (*WithdrawByoipCidrOutput, error) {
	req, out := c.WithdrawByoipCidrRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// Contains the parameters for accepting the quote.
type AcceptReservedInstancesExchangeQuoteInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The IDs of the Convertible Reserved Instances to exchange for another Convertible
	// Reserved Instance of the same or higher value.
	//
	// ReservedInstanceIds is a required field
	ReservedInstanceIds []*string `locationName:"ReservedInstanceId" locationNameList:"ReservedInstanceId" type:"list" required:"true"`

	// The configuration of the target Convertible Reserved Instance to exchange
	// for your current Convertible Reserved Instances.
	TargetConfigurations []*TargetConfigurationRequest `locationName:"TargetConfiguration" locationNameList:"TargetConfigurationRequest" type:"list"`
}

// String returns the string representation
func (s AcceptReservedInstancesExchangeQuoteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptReservedInstancesExchangeQuoteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AcceptReservedInstancesExchangeQuoteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AcceptReservedInstancesExchangeQuoteInput"}
	if s.ReservedInstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("ReservedInstanceIds"))
	}
	if s.TargetConfigurations != nil {
		for i, v := range s.TargetConfigurations {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "TargetConfigurations", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AcceptReservedInstancesExchangeQuoteInput) SetDryRun(v bool) *AcceptReservedInstancesExchangeQuoteInput {
	s.DryRun = &v
	return s
}

// SetReservedInstanceIds sets the ReservedInstanceIds field's value.
func (s *AcceptReservedInstancesExchangeQuoteInput) SetReservedInstanceIds(v []*string) *AcceptReservedInstancesExchangeQuoteInput {
	s.ReservedInstanceIds = v
	return s
}

// SetTargetConfigurations sets the TargetConfigurations field's value.
func (s *AcceptReservedInstancesExchangeQuoteInput) SetTargetConfigurations(v []*TargetConfigurationRequest) *AcceptReservedInstancesExchangeQuoteInput {
	s.TargetConfigurations = v
	return s
}

// The result of the exchange and whether it was successful.
type AcceptReservedInstancesExchangeQuoteOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the successful exchange.
	ExchangeId *string `locationName:"exchangeId" type:"string"`
}

// String returns the string representation
func (s AcceptReservedInstancesExchangeQuoteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptReservedInstancesExchangeQuoteOutput) GoString() string {
	return s.String()
}

// SetExchangeId sets the ExchangeId field's value.
func (s *AcceptReservedInstancesExchangeQuoteOutput) SetExchangeId(v string) *AcceptReservedInstancesExchangeQuoteOutput {
	s.ExchangeId = &v
	return s
}

type AcceptTransitGatewayVpcAttachmentInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AcceptTransitGatewayVpcAttachmentInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptTransitGatewayVpcAttachmentInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AcceptTransitGatewayVpcAttachmentInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AcceptTransitGatewayVpcAttachmentInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AcceptTransitGatewayVpcAttachmentInput) SetDryRun(v bool) *AcceptTransitGatewayVpcAttachmentInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *AcceptTransitGatewayVpcAttachmentInput) SetTransitGatewayAttachmentId(v string) *AcceptTransitGatewayVpcAttachmentInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

type AcceptTransitGatewayVpcAttachmentOutput struct {
	_ struct{} `type:"structure"`

	// The VPC attachment.
	TransitGatewayVpcAttachment *TransitGatewayVpcAttachment `locationName:"transitGatewayVpcAttachment" type:"structure"`
}

// String returns the string representation
func (s AcceptTransitGatewayVpcAttachmentOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptTransitGatewayVpcAttachmentOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayVpcAttachment sets the TransitGatewayVpcAttachment field's value.
func (s *AcceptTransitGatewayVpcAttachmentOutput) SetTransitGatewayVpcAttachment(v *TransitGatewayVpcAttachment) *AcceptTransitGatewayVpcAttachmentOutput {
	s.TransitGatewayVpcAttachment = v
	return s
}

type AcceptVpcEndpointConnectionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the endpoint service.
	//
	// ServiceId is a required field
	ServiceId *string `type:"string" required:"true"`

	// The IDs of one or more interface VPC endpoints.
	//
	// VpcEndpointIds is a required field
	VpcEndpointIds []*string `locationName:"VpcEndpointId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s AcceptVpcEndpointConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptVpcEndpointConnectionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AcceptVpcEndpointConnectionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AcceptVpcEndpointConnectionsInput"}
	if s.ServiceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceId"))
	}
	if s.VpcEndpointIds == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcEndpointIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AcceptVpcEndpointConnectionsInput) SetDryRun(v bool) *AcceptVpcEndpointConnectionsInput {
	s.DryRun = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *AcceptVpcEndpointConnectionsInput) SetServiceId(v string) *AcceptVpcEndpointConnectionsInput {
	s.ServiceId = &v
	return s
}

// SetVpcEndpointIds sets the VpcEndpointIds field's value.
func (s *AcceptVpcEndpointConnectionsInput) SetVpcEndpointIds(v []*string) *AcceptVpcEndpointConnectionsInput {
	s.VpcEndpointIds = v
	return s
}

type AcceptVpcEndpointConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the interface endpoints that were not accepted, if applicable.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s AcceptVpcEndpointConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptVpcEndpointConnectionsOutput) GoString() string {
	return s.String()
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *AcceptVpcEndpointConnectionsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *AcceptVpcEndpointConnectionsOutput {
	s.Unsuccessful = v
	return s
}

type AcceptVpcPeeringConnectionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC peering connection. You must specify this parameter in
	// the request.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s AcceptVpcPeeringConnectionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptVpcPeeringConnectionInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *AcceptVpcPeeringConnectionInput) SetDryRun(v bool) *AcceptVpcPeeringConnectionInput {
	s.DryRun = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *AcceptVpcPeeringConnectionInput) SetVpcPeeringConnectionId(v string) *AcceptVpcPeeringConnectionInput {
	s.VpcPeeringConnectionId = &v
	return s
}

type AcceptVpcPeeringConnectionOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC peering connection.
	VpcPeeringConnection *VpcPeeringConnection `locationName:"vpcPeeringConnection" type:"structure"`
}

// String returns the string representation
func (s AcceptVpcPeeringConnectionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AcceptVpcPeeringConnectionOutput) GoString() string {
	return s.String()
}

// SetVpcPeeringConnection sets the VpcPeeringConnection field's value.
func (s *AcceptVpcPeeringConnectionOutput) SetVpcPeeringConnection(v *VpcPeeringConnection) *AcceptVpcPeeringConnectionOutput {
	s.VpcPeeringConnection = v
	return s
}

// Describes an account attribute.
type AccountAttribute struct {
	_ struct{} `type:"structure"`

	// The name of the account attribute.
	AttributeName *string `locationName:"attributeName" type:"string"`

	// One or more values for the account attribute.
	AttributeValues []*AccountAttributeValue `locationName:"attributeValueSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s AccountAttribute) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AccountAttribute) GoString() string {
	return s.String()
}

// SetAttributeName sets the AttributeName field's value.
func (s *AccountAttribute) SetAttributeName(v string) *AccountAttribute {
	s.AttributeName = &v
	return s
}

// SetAttributeValues sets the AttributeValues field's value.
func (s *AccountAttribute) SetAttributeValues(v []*AccountAttributeValue) *AccountAttribute {
	s.AttributeValues = v
	return s
}

// Describes a value of an account attribute.
type AccountAttributeValue struct {
	_ struct{} `type:"structure"`

	// The value of the attribute.
	AttributeValue *string `locationName:"attributeValue" type:"string"`
}

// String returns the string representation
func (s AccountAttributeValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AccountAttributeValue) GoString() string {
	return s.String()
}

// SetAttributeValue sets the AttributeValue field's value.
func (s *AccountAttributeValue) SetAttributeValue(v string) *AccountAttributeValue {
	s.AttributeValue = &v
	return s
}

// Describes a running instance in a Spot Fleet.
type ActiveInstance struct {
	_ struct{} `type:"structure"`

	// The health status of the instance. If the status of either the instance status
	// check or the system status check is impaired, the health status of the instance
	// is unhealthy. Otherwise, the health status is healthy.
	InstanceHealth *string `locationName:"instanceHealth" type:"string" enum:"InstanceHealthStatus"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string"`

	// The ID of the Spot Instance request.
	SpotInstanceRequestId *string `locationName:"spotInstanceRequestId" type:"string"`
}

// String returns the string representation
func (s ActiveInstance) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ActiveInstance) GoString() string {
	return s.String()
}

// SetInstanceHealth sets the InstanceHealth field's value.
func (s *ActiveInstance) SetInstanceHealth(v string) *ActiveInstance {
	s.InstanceHealth = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ActiveInstance) SetInstanceId(v string) *ActiveInstance {
	s.InstanceId = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ActiveInstance) SetInstanceType(v string) *ActiveInstance {
	s.InstanceType = &v
	return s
}

// SetSpotInstanceRequestId sets the SpotInstanceRequestId field's value.
func (s *ActiveInstance) SetSpotInstanceRequestId(v string) *ActiveInstance {
	s.SpotInstanceRequestId = &v
	return s
}

// Describes an Elastic IP address.
type Address struct {
	_ struct{} `type:"structure"`

	// The ID representing the allocation of the address for use with EC2-VPC.
	AllocationId *string `locationName:"allocationId" type:"string"`

	// The ID representing the association of the address with an instance in a
	// VPC.
	AssociationId *string `locationName:"associationId" type:"string"`

	// Indicates whether this Elastic IP address is for use with instances in EC2-Classic
	// (standard) or instances in a VPC (vpc).
	Domain *string `locationName:"domain" type:"string" enum:"DomainType"`

	// The ID of the instance that the address is associated with (if any).
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The ID of the AWS account that owns the network interface.
	NetworkInterfaceOwnerId *string `locationName:"networkInterfaceOwnerId" type:"string"`

	// The private IP address associated with the Elastic IP address.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// The Elastic IP address.
	PublicIp *string `locationName:"publicIp" type:"string"`

	// The ID of an address pool.
	PublicIpv4Pool *string `locationName:"publicIpv4Pool" type:"string"`

	// Any tags assigned to the Elastic IP address.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s Address) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Address) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *Address) SetAllocationId(v string) *Address {
	s.AllocationId = &v
	return s
}

// SetAssociationId sets the AssociationId field's value.
func (s *Address) SetAssociationId(v string) *Address {
	s.AssociationId = &v
	return s
}

// SetDomain sets the Domain field's value.
func (s *Address) SetDomain(v string) *Address {
	s.Domain = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *Address) SetInstanceId(v string) *Address {
	s.InstanceId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *Address) SetNetworkInterfaceId(v string) *Address {
	s.NetworkInterfaceId = &v
	return s
}

// SetNetworkInterfaceOwnerId sets the NetworkInterfaceOwnerId field's value.
func (s *Address) SetNetworkInterfaceOwnerId(v string) *Address {
	s.NetworkInterfaceOwnerId = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *Address) SetPrivateIpAddress(v string) *Address {
	s.PrivateIpAddress = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *Address) SetPublicIp(v string) *Address {
	s.PublicIp = &v
	return s
}

// SetPublicIpv4Pool sets the PublicIpv4Pool field's value.
func (s *Address) SetPublicIpv4Pool(v string) *Address {
	s.PublicIpv4Pool = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Address) SetTags(v []*Tag) *Address {
	s.Tags = v
	return s
}

type AdvertiseByoipCidrInput struct {
	_ struct{} `type:"structure"`

	// The IPv4 address range, in CIDR notation. This must be the exact range that
	// you provisioned. You can't advertise only a portion of the provisioned range.
	//
	// Cidr is a required field
	Cidr *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s AdvertiseByoipCidrInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AdvertiseByoipCidrInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AdvertiseByoipCidrInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AdvertiseByoipCidrInput"}
	if s.Cidr == nil {
		invalidParams.Add(request.NewErrParamRequired("Cidr"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidr sets the Cidr field's value.
func (s *AdvertiseByoipCidrInput) SetCidr(v string) *AdvertiseByoipCidrInput {
	s.Cidr = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AdvertiseByoipCidrInput) SetDryRun(v bool) *AdvertiseByoipCidrInput {
	s.DryRun = &v
	return s
}

type AdvertiseByoipCidrOutput struct {
	_ struct{} `type:"structure"`

	// Information about the address range.
	ByoipCidr *ByoipCidr `locationName:"byoipCidr" type:"structure"`
}

// String returns the string representation
func (s AdvertiseByoipCidrOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AdvertiseByoipCidrOutput) GoString() string {
	return s.String()
}

// SetByoipCidr sets the ByoipCidr field's value.
func (s *AdvertiseByoipCidrOutput) SetByoipCidr(v *ByoipCidr) *AdvertiseByoipCidrOutput {
	s.ByoipCidr = v
	return s
}

type AllocateAddressInput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] The Elastic IP address to recover or an IPv4 address from an address
	// pool.
	Address *string `type:"string"`

	// Set to vpc to allocate the address for use with instances in a VPC.
	//
	// Default: The address is for use with instances in EC2-Classic.
	Domain *string `type:"string" enum:"DomainType"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of an address pool that you own. Use this parameter to let Amazon
	// EC2 select an address from the address pool. To specify a specific address
	// from the address pool, use the Address parameter instead.
	PublicIpv4Pool *string `type:"string"`
}

// String returns the string representation
func (s AllocateAddressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AllocateAddressInput) GoString() string {
	return s.String()
}

// SetAddress sets the Address field's value.
func (s *AllocateAddressInput) SetAddress(v string) *AllocateAddressInput {
	s.Address = &v
	return s
}

// SetDomain sets the Domain field's value.
func (s *AllocateAddressInput) SetDomain(v string) *AllocateAddressInput {
	s.Domain = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AllocateAddressInput) SetDryRun(v bool) *AllocateAddressInput {
	s.DryRun = &v
	return s
}

// SetPublicIpv4Pool sets the PublicIpv4Pool field's value.
func (s *AllocateAddressInput) SetPublicIpv4Pool(v string) *AllocateAddressInput {
	s.PublicIpv4Pool = &v
	return s
}

type AllocateAddressOutput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] The ID that AWS assigns to represent the allocation of the Elastic
	// IP address for use with instances in a VPC.
	AllocationId *string `locationName:"allocationId" type:"string"`

	// Indicates whether this Elastic IP address is for use with instances in EC2-Classic
	// (standard) or instances in a VPC (vpc).
	Domain *string `locationName:"domain" type:"string" enum:"DomainType"`

	// The Elastic IP address.
	PublicIp *string `locationName:"publicIp" type:"string"`

	// The ID of an address pool.
	PublicIpv4Pool *string `locationName:"publicIpv4Pool" type:"string"`
}

// String returns the string representation
func (s AllocateAddressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AllocateAddressOutput) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *AllocateAddressOutput) SetAllocationId(v string) *AllocateAddressOutput {
	s.AllocationId = &v
	return s
}

// SetDomain sets the Domain field's value.
func (s *AllocateAddressOutput) SetDomain(v string) *AllocateAddressOutput {
	s.Domain = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *AllocateAddressOutput) SetPublicIp(v string) *AllocateAddressOutput {
	s.PublicIp = &v
	return s
}

// SetPublicIpv4Pool sets the PublicIpv4Pool field's value.
func (s *AllocateAddressOutput) SetPublicIpv4Pool(v string) *AllocateAddressOutput {
	s.PublicIpv4Pool = &v
	return s
}

type AllocateHostsInput struct {
	_ struct{} `type:"structure"`

	// This is enabled by default. This property allows instances to be automatically
	// placed onto available Dedicated Hosts, when you are launching instances without
	// specifying a host ID.
	//
	// Default: Enabled
	AutoPlacement *string `locationName:"autoPlacement" type:"string" enum:"AutoPlacement"`

	// The Availability Zone for the Dedicated Hosts.
	//
	// AvailabilityZone is a required field
	AvailabilityZone *string `locationName:"availabilityZone" type:"string" required:"true"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Specify the instance type for which to configure your Dedicated Hosts. When
	// you specify the instance type, that is the only instance type that you can
	// launch onto that host.
	//
	// InstanceType is a required field
	InstanceType *string `locationName:"instanceType" type:"string" required:"true"`

	// The number of Dedicated Hosts to allocate to your account with these parameters.
	//
	// Quantity is a required field
	Quantity *int64 `locationName:"quantity" type:"integer" required:"true"`

	// The tags to apply to the Dedicated Host during creation.
	TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s AllocateHostsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AllocateHostsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AllocateHostsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AllocateHostsInput"}
	if s.AvailabilityZone == nil {
		invalidParams.Add(request.NewErrParamRequired("AvailabilityZone"))
	}
	if s.InstanceType == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceType"))
	}
	if s.Quantity == nil {
		invalidParams.Add(request.NewErrParamRequired("Quantity"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAutoPlacement sets the AutoPlacement field's value.
func (s *AllocateHostsInput) SetAutoPlacement(v string) *AllocateHostsInput {
	s.AutoPlacement = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *AllocateHostsInput) SetAvailabilityZone(v string) *AllocateHostsInput {
	s.AvailabilityZone = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *AllocateHostsInput) SetClientToken(v string) *AllocateHostsInput {
	s.ClientToken = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *AllocateHostsInput) SetInstanceType(v string) *AllocateHostsInput {
	s.InstanceType = &v
	return s
}

// SetQuantity sets the Quantity field's value.
func (s *AllocateHostsInput) SetQuantity(v int64) *AllocateHostsInput {
	s.Quantity = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *AllocateHostsInput) SetTagSpecifications(v []*TagSpecification) *AllocateHostsInput {
	s.TagSpecifications = v
	return s
}

// Contains the output of AllocateHosts.
type AllocateHostsOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the allocated Dedicated Host. This is used to launch an instance
	// onto a specific host.
	HostIds []*string `locationName:"hostIdSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s AllocateHostsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AllocateHostsOutput) GoString() string {
	return s.String()
}

// SetHostIds sets the HostIds field's value.
func (s *AllocateHostsOutput) SetHostIds(v []*string) *AllocateHostsOutput {
	s.HostIds = v
	return s
}

// Describes a principal.
type AllowedPrincipal struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the principal.
	Principal *string `locationName:"principal" type:"string"`

	// The type of principal.
	PrincipalType *string `locationName:"principalType" type:"string" enum:"PrincipalType"`
}

// String returns the string representation
func (s AllowedPrincipal) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AllowedPrincipal) GoString() string {
	return s.String()
}

// SetPrincipal sets the Principal field's value.
func (s *AllowedPrincipal) SetPrincipal(v string) *AllowedPrincipal {
	s.Principal = &v
	return s
}

// SetPrincipalType sets the PrincipalType field's value.
func (s *AllowedPrincipal) SetPrincipalType(v string) *AllowedPrincipal {
	s.PrincipalType = &v
	return s
}

type ApplySecurityGroupsToClientVpnTargetNetworkInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The IDs of the security groups to apply to the associated target network.
	// Up to 5 security groups can be applied to an associated target network.
	//
	// SecurityGroupIds is a required field
	SecurityGroupIds []*string `locationName:"SecurityGroupId" locationNameList:"item" type:"list" required:"true"`

	// The ID of the VPC in which the associated target network is located.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ApplySecurityGroupsToClientVpnTargetNetworkInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ApplySecurityGroupsToClientVpnTargetNetworkInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ApplySecurityGroupsToClientVpnTargetNetworkInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ApplySecurityGroupsToClientVpnTargetNetworkInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.SecurityGroupIds == nil {
		invalidParams.Add(request.NewErrParamRequired("SecurityGroupIds"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ApplySecurityGroupsToClientVpnTargetNetworkInput) SetClientVpnEndpointId(v string) *ApplySecurityGroupsToClientVpnTargetNetworkInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ApplySecurityGroupsToClientVpnTargetNetworkInput) SetDryRun(v bool) *ApplySecurityGroupsToClientVpnTargetNetworkInput {
	s.DryRun = &v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *ApplySecurityGroupsToClientVpnTargetNetworkInput) SetSecurityGroupIds(v []*string) *ApplySecurityGroupsToClientVpnTargetNetworkInput {
	s.SecurityGroupIds = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *ApplySecurityGroupsToClientVpnTargetNetworkInput) SetVpcId(v string) *ApplySecurityGroupsToClientVpnTargetNetworkInput {
	s.VpcId = &v
	return s
}

type ApplySecurityGroupsToClientVpnTargetNetworkOutput struct {
	_ struct{} `type:"structure"`

	// The IDs of the applied security groups.
	SecurityGroupIds []*string `locationName:"securityGroupIds" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ApplySecurityGroupsToClientVpnTargetNetworkOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ApplySecurityGroupsToClientVpnTargetNetworkOutput) GoString() string {
	return s.String()
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *ApplySecurityGroupsToClientVpnTargetNetworkOutput) SetSecurityGroupIds(v []*string) *ApplySecurityGroupsToClientVpnTargetNetworkOutput {
	s.SecurityGroupIds = v
	return s
}

type AssignIpv6AddressesInput struct {
	_ struct{} `type:"structure"`

	// The number of IPv6 addresses to assign to the network interface. Amazon EC2
	// automatically selects the IPv6 addresses from the subnet range. You can't
	// use this option if specifying specific IPv6 addresses.
	Ipv6AddressCount *int64 `locationName:"ipv6AddressCount" type:"integer"`

	// One or more specific IPv6 addresses to be assigned to the network interface.
	// You can't use this option if you're specifying a number of IPv6 addresses.
	Ipv6Addresses []*string `locationName:"ipv6Addresses" locationNameList:"item" type:"list"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`
}

// String returns the string representation
func (s AssignIpv6AddressesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssignIpv6AddressesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssignIpv6AddressesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssignIpv6AddressesInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *AssignIpv6AddressesInput) SetIpv6AddressCount(v int64) *AssignIpv6AddressesInput {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *AssignIpv6AddressesInput) SetIpv6Addresses(v []*string) *AssignIpv6AddressesInput {
	s.Ipv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *AssignIpv6AddressesInput) SetNetworkInterfaceId(v string) *AssignIpv6AddressesInput {
	s.NetworkInterfaceId = &v
	return s
}

type AssignIpv6AddressesOutput struct {
	_ struct{} `type:"structure"`

	// The IPv6 addresses assigned to the network interface.
	AssignedIpv6Addresses []*string `locationName:"assignedIpv6Addresses" locationNameList:"item" type:"list"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`
}

// String returns the string representation
func (s AssignIpv6AddressesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssignIpv6AddressesOutput) GoString() string {
	return s.String()
}

// SetAssignedIpv6Addresses sets the AssignedIpv6Addresses field's value.
func (s *AssignIpv6AddressesOutput) SetAssignedIpv6Addresses(v []*string) *AssignIpv6AddressesOutput {
	s.AssignedIpv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *AssignIpv6AddressesOutput) SetNetworkInterfaceId(v string) *AssignIpv6AddressesOutput {
	s.NetworkInterfaceId = &v
	return s
}

// Contains the parameters for AssignPrivateIpAddresses.
type AssignPrivateIpAddressesInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether to allow an IP address that is already assigned to another
	// network interface or instance to be reassigned to the specified network interface.
	AllowReassignment *bool `locationName:"allowReassignment" type:"boolean"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`

	// One or more IP addresses to be assigned as a secondary private IP address
	// to the network interface. You can't specify this parameter when also specifying
	// a number of secondary IP addresses.
	//
	// If you don't specify an IP address, Amazon EC2 automatically selects an IP
	// address within the subnet range.
	PrivateIpAddresses []*string `locationName:"privateIpAddress" locationNameList:"PrivateIpAddress" type:"list"`

	// The number of secondary IP addresses to assign to the network interface.
	// You can't specify this parameter when also specifying private IP addresses.
	SecondaryPrivateIpAddressCount *int64 `locationName:"secondaryPrivateIpAddressCount" type:"integer"`
}

// String returns the string representation
func (s AssignPrivateIpAddressesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssignPrivateIpAddressesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssignPrivateIpAddressesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssignPrivateIpAddressesInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAllowReassignment sets the AllowReassignment field's value.
func (s *AssignPrivateIpAddressesInput) SetAllowReassignment(v bool) *AssignPrivateIpAddressesInput {
	s.AllowReassignment = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *AssignPrivateIpAddressesInput) SetNetworkInterfaceId(v string) *AssignPrivateIpAddressesInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *AssignPrivateIpAddressesInput) SetPrivateIpAddresses(v []*string) *AssignPrivateIpAddressesInput {
	s.PrivateIpAddresses = v
	return s
}

// SetSecondaryPrivateIpAddressCount sets the SecondaryPrivateIpAddressCount field's value.
func (s *AssignPrivateIpAddressesInput) SetSecondaryPrivateIpAddressCount(v int64) *AssignPrivateIpAddressesInput {
	s.SecondaryPrivateIpAddressCount = &v
	return s
}

type AssignPrivateIpAddressesOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s AssignPrivateIpAddressesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssignPrivateIpAddressesOutput) GoString() string {
	return s.String()
}

type AssociateAddressInput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] The allocation ID. This is required for EC2-VPC.
	AllocationId *string `type:"string"`

	// [EC2-VPC] For a VPC in an EC2-Classic account, specify true to allow an Elastic
	// IP address that is already associated with an instance or network interface
	// to be reassociated with the specified instance or network interface. Otherwise,
	// the operation fails. In a VPC in an EC2-VPC-only account, reassociation is
	// automatic, therefore you can specify false to ensure the operation fails
	// if the Elastic IP address is already associated with another resource.
	AllowReassociation *bool `locationName:"allowReassociation" type:"boolean"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance. This is required for EC2-Classic. For EC2-VPC, you
	// can specify either the instance ID or the network interface ID, but not both.
	// The operation fails if you specify an instance ID unless exactly one network
	// interface is attached.
	InstanceId *string `type:"string"`

	// [EC2-VPC] The ID of the network interface. If the instance has more than
	// one network interface, you must specify a network interface ID.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// [EC2-VPC] The primary or secondary private IP address to associate with the
	// Elastic IP address. If no private IP address is specified, the Elastic IP
	// address is associated with the primary private IP address.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// The Elastic IP address. This is required for EC2-Classic.
	PublicIp *string `type:"string"`
}

// String returns the string representation
func (s AssociateAddressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateAddressInput) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *AssociateAddressInput) SetAllocationId(v string) *AssociateAddressInput {
	s.AllocationId = &v
	return s
}

// SetAllowReassociation sets the AllowReassociation field's value.
func (s *AssociateAddressInput) SetAllowReassociation(v bool) *AssociateAddressInput {
	s.AllowReassociation = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AssociateAddressInput) SetDryRun(v bool) *AssociateAddressInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *AssociateAddressInput) SetInstanceId(v string) *AssociateAddressInput {
	s.InstanceId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *AssociateAddressInput) SetNetworkInterfaceId(v string) *AssociateAddressInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *AssociateAddressInput) SetPrivateIpAddress(v string) *AssociateAddressInput {
	s.PrivateIpAddress = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *AssociateAddressInput) SetPublicIp(v string) *AssociateAddressInput {
	s.PublicIp = &v
	return s
}

type AssociateAddressOutput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] The ID that represents the association of the Elastic IP address
	// with an instance.
	AssociationId *string `locationName:"associationId" type:"string"`
}

// String returns the string representation
func (s AssociateAddressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateAddressOutput) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *AssociateAddressOutput) SetAssociationId(v string) *AssociateAddressOutput {
	s.AssociationId = &v
	return s
}

type AssociateClientVpnTargetNetworkInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the subnet to associate with the Client VPN endpoint.
	//
	// SubnetId is a required field
	SubnetId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateClientVpnTargetNetworkInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateClientVpnTargetNetworkInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateClientVpnTargetNetworkInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateClientVpnTargetNetworkInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *AssociateClientVpnTargetNetworkInput) SetClientVpnEndpointId(v string) *AssociateClientVpnTargetNetworkInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AssociateClientVpnTargetNetworkInput) SetDryRun(v bool) *AssociateClientVpnTargetNetworkInput {
	s.DryRun = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *AssociateClientVpnTargetNetworkInput) SetSubnetId(v string) *AssociateClientVpnTargetNetworkInput {
	s.SubnetId = &v
	return s
}

type AssociateClientVpnTargetNetworkOutput struct {
	_ struct{} `type:"structure"`

	// The unique ID of the target network association.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The current state of the target network association.
	Status *AssociationStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s AssociateClientVpnTargetNetworkOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateClientVpnTargetNetworkOutput) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *AssociateClientVpnTargetNetworkOutput) SetAssociationId(v string) *AssociateClientVpnTargetNetworkOutput {
	s.AssociationId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *AssociateClientVpnTargetNetworkOutput) SetStatus(v *AssociationStatus) *AssociateClientVpnTargetNetworkOutput {
	s.Status = v
	return s
}

type AssociateDhcpOptionsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the DHCP options set, or default to associate no DHCP options with
	// the VPC.
	//
	// DhcpOptionsId is a required field
	DhcpOptionsId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateDhcpOptionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateDhcpOptionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateDhcpOptionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateDhcpOptionsInput"}
	if s.DhcpOptionsId == nil {
		invalidParams.Add(request.NewErrParamRequired("DhcpOptionsId"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDhcpOptionsId sets the DhcpOptionsId field's value.
func (s *AssociateDhcpOptionsInput) SetDhcpOptionsId(v string) *AssociateDhcpOptionsInput {
	s.DhcpOptionsId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AssociateDhcpOptionsInput) SetDryRun(v bool) *AssociateDhcpOptionsInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *AssociateDhcpOptionsInput) SetVpcId(v string) *AssociateDhcpOptionsInput {
	s.VpcId = &v
	return s
}

type AssociateDhcpOptionsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s AssociateDhcpOptionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateDhcpOptionsOutput) GoString() string {
	return s.String()
}

type AssociateIamInstanceProfileInput struct {
	_ struct{} `type:"structure"`

	// The IAM instance profile.
	//
	// IamInstanceProfile is a required field
	IamInstanceProfile *IamInstanceProfileSpecification `type:"structure" required:"true"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateIamInstanceProfileInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateIamInstanceProfileInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateIamInstanceProfileInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateIamInstanceProfileInput"}
	if s.IamInstanceProfile == nil {
		invalidParams.Add(request.NewErrParamRequired("IamInstanceProfile"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *AssociateIamInstanceProfileInput) SetIamInstanceProfile(v *IamInstanceProfileSpecification) *AssociateIamInstanceProfileInput {
	s.IamInstanceProfile = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *AssociateIamInstanceProfileInput) SetInstanceId(v string) *AssociateIamInstanceProfileInput {
	s.InstanceId = &v
	return s
}

type AssociateIamInstanceProfileOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IAM instance profile association.
	IamInstanceProfileAssociation *IamInstanceProfileAssociation `locationName:"iamInstanceProfileAssociation" type:"structure"`
}

// String returns the string representation
func (s AssociateIamInstanceProfileOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateIamInstanceProfileOutput) GoString() string {
	return s.String()
}

// SetIamInstanceProfileAssociation sets the IamInstanceProfileAssociation field's value.
func (s *AssociateIamInstanceProfileOutput) SetIamInstanceProfileAssociation(v *IamInstanceProfileAssociation) *AssociateIamInstanceProfileOutput {
	s.IamInstanceProfileAssociation = v
	return s
}

type AssociateRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the route table.
	//
	// RouteTableId is a required field
	RouteTableId *string `locationName:"routeTableId" type:"string" required:"true"`

	// The ID of the subnet.
	//
	// SubnetId is a required field
	SubnetId *string `locationName:"subnetId" type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateRouteTableInput"}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AssociateRouteTableInput) SetDryRun(v bool) *AssociateRouteTableInput {
	s.DryRun = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *AssociateRouteTableInput) SetRouteTableId(v string) *AssociateRouteTableInput {
	s.RouteTableId = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *AssociateRouteTableInput) SetSubnetId(v string) *AssociateRouteTableInput {
	s.SubnetId = &v
	return s
}

type AssociateRouteTableOutput struct {
	_ struct{} `type:"structure"`

	// The route table association ID. This ID is required for disassociating the
	// route table.
	AssociationId *string `locationName:"associationId" type:"string"`
}

// String returns the string representation
func (s AssociateRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateRouteTableOutput) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *AssociateRouteTableOutput) SetAssociationId(v string) *AssociateRouteTableOutput {
	s.AssociationId = &v
	return s
}

type AssociateSubnetCidrBlockInput struct {
	_ struct{} `type:"structure"`

	// The IPv6 CIDR block for your subnet. The subnet must have a /64 prefix length.
	//
	// Ipv6CidrBlock is a required field
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string" required:"true"`

	// The ID of your subnet.
	//
	// SubnetId is a required field
	SubnetId *string `locationName:"subnetId" type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateSubnetCidrBlockInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateSubnetCidrBlockInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateSubnetCidrBlockInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateSubnetCidrBlockInput"}
	if s.Ipv6CidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("Ipv6CidrBlock"))
	}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *AssociateSubnetCidrBlockInput) SetIpv6CidrBlock(v string) *AssociateSubnetCidrBlockInput {
	s.Ipv6CidrBlock = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *AssociateSubnetCidrBlockInput) SetSubnetId(v string) *AssociateSubnetCidrBlockInput {
	s.SubnetId = &v
	return s
}

type AssociateSubnetCidrBlockOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IPv6 CIDR block association.
	Ipv6CidrBlockAssociation *SubnetIpv6CidrBlockAssociation `locationName:"ipv6CidrBlockAssociation" type:"structure"`

	// The ID of the subnet.
	SubnetId *string `locationName:"subnetId" type:"string"`
}

// String returns the string representation
func (s AssociateSubnetCidrBlockOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateSubnetCidrBlockOutput) GoString() string {
	return s.String()
}

// SetIpv6CidrBlockAssociation sets the Ipv6CidrBlockAssociation field's value.
func (s *AssociateSubnetCidrBlockOutput) SetIpv6CidrBlockAssociation(v *SubnetIpv6CidrBlockAssociation) *AssociateSubnetCidrBlockOutput {
	s.Ipv6CidrBlockAssociation = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *AssociateSubnetCidrBlockOutput) SetSubnetId(v string) *AssociateSubnetCidrBlockOutput {
	s.SubnetId = &v
	return s
}

type AssociateTransitGatewayRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateTransitGatewayRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateTransitGatewayRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateTransitGatewayRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateTransitGatewayRouteTableInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AssociateTransitGatewayRouteTableInput) SetDryRun(v bool) *AssociateTransitGatewayRouteTableInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *AssociateTransitGatewayRouteTableInput) SetTransitGatewayAttachmentId(v string) *AssociateTransitGatewayRouteTableInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *AssociateTransitGatewayRouteTableInput) SetTransitGatewayRouteTableId(v string) *AssociateTransitGatewayRouteTableInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type AssociateTransitGatewayRouteTableOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the association.
	Association *TransitGatewayAssociation `locationName:"association" type:"structure"`
}

// String returns the string representation
func (s AssociateTransitGatewayRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateTransitGatewayRouteTableOutput) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *AssociateTransitGatewayRouteTableOutput) SetAssociation(v *TransitGatewayAssociation) *AssociateTransitGatewayRouteTableOutput {
	s.Association = v
	return s
}

type AssociateVpcCidrBlockInput struct {
	_ struct{} `type:"structure"`

	// Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for
	// the VPC. You cannot specify the range of IPv6 addresses, or the size of the
	// CIDR block.
	AmazonProvidedIpv6CidrBlock *bool `locationName:"amazonProvidedIpv6CidrBlock" type:"boolean"`

	// An IPv4 CIDR block to associate with the VPC.
	CidrBlock *string `type:"string"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s AssociateVpcCidrBlockInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateVpcCidrBlockInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AssociateVpcCidrBlockInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AssociateVpcCidrBlockInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAmazonProvidedIpv6CidrBlock sets the AmazonProvidedIpv6CidrBlock field's value.
func (s *AssociateVpcCidrBlockInput) SetAmazonProvidedIpv6CidrBlock(v bool) *AssociateVpcCidrBlockInput {
	s.AmazonProvidedIpv6CidrBlock = &v
	return s
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *AssociateVpcCidrBlockInput) SetCidrBlock(v string) *AssociateVpcCidrBlockInput {
	s.CidrBlock = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *AssociateVpcCidrBlockInput) SetVpcId(v string) *AssociateVpcCidrBlockInput {
	s.VpcId = &v
	return s
}

type AssociateVpcCidrBlockOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IPv4 CIDR block association.
	CidrBlockAssociation *VpcCidrBlockAssociation `locationName:"cidrBlockAssociation" type:"structure"`

	// Information about the IPv6 CIDR block association.
	Ipv6CidrBlockAssociation *VpcIpv6CidrBlockAssociation `locationName:"ipv6CidrBlockAssociation" type:"structure"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s AssociateVpcCidrBlockOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociateVpcCidrBlockOutput) GoString() string {
	return s.String()
}

// SetCidrBlockAssociation sets the CidrBlockAssociation field's value.
func (s *AssociateVpcCidrBlockOutput) SetCidrBlockAssociation(v *VpcCidrBlockAssociation) *AssociateVpcCidrBlockOutput {
	s.CidrBlockAssociation = v
	return s
}

// SetIpv6CidrBlockAssociation sets the Ipv6CidrBlockAssociation field's value.
func (s *AssociateVpcCidrBlockOutput) SetIpv6CidrBlockAssociation(v *VpcIpv6CidrBlockAssociation) *AssociateVpcCidrBlockOutput {
	s.Ipv6CidrBlockAssociation = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *AssociateVpcCidrBlockOutput) SetVpcId(v string) *AssociateVpcCidrBlockOutput {
	s.VpcId = &v
	return s
}

// Describes a target network that is associated with a Client VPN endpoint.
// A target network is a subnet in a VPC.
type AssociatedTargetNetwork struct {
	_ struct{} `type:"structure"`

	// The ID of the subnet.
	NetworkId *string `locationName:"networkId" type:"string"`

	// The target network type.
	NetworkType *string `locationName:"networkType" type:"string" enum:"AssociatedNetworkType"`
}

// String returns the string representation
func (s AssociatedTargetNetwork) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociatedTargetNetwork) GoString() string {
	return s.String()
}

// SetNetworkId sets the NetworkId field's value.
func (s *AssociatedTargetNetwork) SetNetworkId(v string) *AssociatedTargetNetwork {
	s.NetworkId = &v
	return s
}

// SetNetworkType sets the NetworkType field's value.
func (s *AssociatedTargetNetwork) SetNetworkType(v string) *AssociatedTargetNetwork {
	s.NetworkType = &v
	return s
}

// Describes the state of a target network association.
type AssociationStatus struct {
	_ struct{} `type:"structure"`

	// The state of the target network association.
	Code *string `locationName:"code" type:"string" enum:"AssociationStatusCode"`

	// A message about the status of the target network association, if applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s AssociationStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AssociationStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *AssociationStatus) SetCode(v string) *AssociationStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *AssociationStatus) SetMessage(v string) *AssociationStatus {
	s.Message = &v
	return s
}

type AttachClassicLinkVpcInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of one or more of the VPC's security groups. You cannot specify security
	// groups from a different VPC.
	//
	// Groups is a required field
	Groups []*string `locationName:"SecurityGroupId" locationNameList:"groupId" type:"list" required:"true"`

	// The ID of an EC2-Classic instance to link to the ClassicLink-enabled VPC.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// The ID of a ClassicLink-enabled VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s AttachClassicLinkVpcInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachClassicLinkVpcInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AttachClassicLinkVpcInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AttachClassicLinkVpcInput"}
	if s.Groups == nil {
		invalidParams.Add(request.NewErrParamRequired("Groups"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AttachClassicLinkVpcInput) SetDryRun(v bool) *AttachClassicLinkVpcInput {
	s.DryRun = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *AttachClassicLinkVpcInput) SetGroups(v []*string) *AttachClassicLinkVpcInput {
	s.Groups = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *AttachClassicLinkVpcInput) SetInstanceId(v string) *AttachClassicLinkVpcInput {
	s.InstanceId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *AttachClassicLinkVpcInput) SetVpcId(v string) *AttachClassicLinkVpcInput {
	s.VpcId = &v
	return s
}

type AttachClassicLinkVpcOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s AttachClassicLinkVpcOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachClassicLinkVpcOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *AttachClassicLinkVpcOutput) SetReturn(v bool) *AttachClassicLinkVpcOutput {
	s.Return = &v
	return s
}

type AttachInternetGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the internet gateway.
	//
	// InternetGatewayId is a required field
	InternetGatewayId *string `locationName:"internetGatewayId" type:"string" required:"true"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s AttachInternetGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachInternetGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AttachInternetGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AttachInternetGatewayInput"}
	if s.InternetGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("InternetGatewayId"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AttachInternetGatewayInput) SetDryRun(v bool) *AttachInternetGatewayInput {
	s.DryRun = &v
	return s
}

// SetInternetGatewayId sets the InternetGatewayId field's value.
func (s *AttachInternetGatewayInput) SetInternetGatewayId(v string) *AttachInternetGatewayInput {
	s.InternetGatewayId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *AttachInternetGatewayInput) SetVpcId(v string) *AttachInternetGatewayInput {
	s.VpcId = &v
	return s
}

type AttachInternetGatewayOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s AttachInternetGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachInternetGatewayOutput) GoString() string {
	return s.String()
}

// Contains the parameters for AttachNetworkInterface.
type AttachNetworkInterfaceInput struct {
	_ struct{} `type:"structure"`

	// The index of the device for the network interface attachment.
	//
	// DeviceIndex is a required field
	DeviceIndex *int64 `locationName:"deviceIndex" type:"integer" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`
}

// String returns the string representation
func (s AttachNetworkInterfaceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachNetworkInterfaceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AttachNetworkInterfaceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AttachNetworkInterfaceInput"}
	if s.DeviceIndex == nil {
		invalidParams.Add(request.NewErrParamRequired("DeviceIndex"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *AttachNetworkInterfaceInput) SetDeviceIndex(v int64) *AttachNetworkInterfaceInput {
	s.DeviceIndex = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AttachNetworkInterfaceInput) SetDryRun(v bool) *AttachNetworkInterfaceInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *AttachNetworkInterfaceInput) SetInstanceId(v string) *AttachNetworkInterfaceInput {
	s.InstanceId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *AttachNetworkInterfaceInput) SetNetworkInterfaceId(v string) *AttachNetworkInterfaceInput {
	s.NetworkInterfaceId = &v
	return s
}

// Contains the output of AttachNetworkInterface.
type AttachNetworkInterfaceOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the network interface attachment.
	AttachmentId *string `locationName:"attachmentId" type:"string"`
}

// String returns the string representation
func (s AttachNetworkInterfaceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachNetworkInterfaceOutput) GoString() string {
	return s.String()
}

// SetAttachmentId sets the AttachmentId field's value.
func (s *AttachNetworkInterfaceOutput) SetAttachmentId(v string) *AttachNetworkInterfaceOutput {
	s.AttachmentId = &v
	return s
}

// Contains the parameters for AttachVolume.
type AttachVolumeInput struct {
	_ struct{} `type:"structure"`

	// The device name (for example, /dev/sdh or xvdh).
	//
	// Device is a required field
	Device *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`

	// The ID of the EBS volume. The volume and instance must be within the same
	// Availability Zone.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AttachVolumeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachVolumeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AttachVolumeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AttachVolumeInput"}
	if s.Device == nil {
		invalidParams.Add(request.NewErrParamRequired("Device"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDevice sets the Device field's value.
func (s *AttachVolumeInput) SetDevice(v string) *AttachVolumeInput {
	s.Device = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AttachVolumeInput) SetDryRun(v bool) *AttachVolumeInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *AttachVolumeInput) SetInstanceId(v string) *AttachVolumeInput {
	s.InstanceId = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *AttachVolumeInput) SetVolumeId(v string) *AttachVolumeInput {
	s.VolumeId = &v
	return s
}

// Contains the parameters for AttachVpnGateway.
type AttachVpnGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`

	// The ID of the virtual private gateway.
	//
	// VpnGatewayId is a required field
	VpnGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AttachVpnGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachVpnGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AttachVpnGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AttachVpnGatewayInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}
	if s.VpnGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpnGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *AttachVpnGatewayInput) SetDryRun(v bool) *AttachVpnGatewayInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *AttachVpnGatewayInput) SetVpcId(v string) *AttachVpnGatewayInput {
	s.VpcId = &v
	return s
}

// SetVpnGatewayId sets the VpnGatewayId field's value.
func (s *AttachVpnGatewayInput) SetVpnGatewayId(v string) *AttachVpnGatewayInput {
	s.VpnGatewayId = &v
	return s
}

// Contains the output of AttachVpnGateway.
type AttachVpnGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Information about the attachment.
	VpcAttachment *VpcAttachment `locationName:"attachment" type:"structure"`
}

// String returns the string representation
func (s AttachVpnGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttachVpnGatewayOutput) GoString() string {
	return s.String()
}

// SetVpcAttachment sets the VpcAttachment field's value.
func (s *AttachVpnGatewayOutput) SetVpcAttachment(v *VpcAttachment) *AttachVpnGatewayOutput {
	s.VpcAttachment = v
	return s
}

// Describes a value for a resource attribute that is a Boolean value.
type AttributeBooleanValue struct {
	_ struct{} `type:"structure"`

	// The attribute value. The valid values are true or false.
	Value *bool `locationName:"value" type:"boolean"`
}

// String returns the string representation
func (s AttributeBooleanValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttributeBooleanValue) GoString() string {
	return s.String()
}

// SetValue sets the Value field's value.
func (s *AttributeBooleanValue) SetValue(v bool) *AttributeBooleanValue {
	s.Value = &v
	return s
}

// Describes a value for a resource attribute that is a String.
type AttributeValue struct {
	_ struct{} `type:"structure"`

	// The attribute value. The value is case-sensitive.
	Value *string `locationName:"value" type:"string"`
}

// String returns the string representation
func (s AttributeValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AttributeValue) GoString() string {
	return s.String()
}

// SetValue sets the Value field's value.
func (s *AttributeValue) SetValue(v string) *AttributeValue {
	s.Value = &v
	return s
}

// Information about an authorization rule.
type AuthorizationRule struct {
	_ struct{} `type:"structure"`

	// Indicates whether the authorization rule grants access to all clients.
	AccessAll *bool `locationName:"accessAll" type:"boolean"`

	// The ID of the Client VPN endpoint with which the authorization rule is associated.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// A brief description of the authorization rule.
	Description *string `locationName:"description" type:"string"`

	// The IPv4 address range, in CIDR notation, of the network to which the authorization
	// rule applies.
	DestinationCidr *string `locationName:"destinationCidr" type:"string"`

	// The ID of the Active Directory group to which the authorization rule grants
	// access.
	GroupId *string `locationName:"groupId" type:"string"`

	// The current state of the authorization rule.
	Status *ClientVpnAuthorizationRuleStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s AuthorizationRule) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizationRule) GoString() string {
	return s.String()
}

// SetAccessAll sets the AccessAll field's value.
func (s *AuthorizationRule) SetAccessAll(v bool) *AuthorizationRule {
	s.AccessAll = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *AuthorizationRule) SetClientVpnEndpointId(v string) *AuthorizationRule {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *AuthorizationRule) SetDescription(v string) *AuthorizationRule {
	s.Description = &v
	return s
}

// SetDestinationCidr sets the DestinationCidr field's value.
func (s *AuthorizationRule) SetDestinationCidr(v string) *AuthorizationRule {
	s.DestinationCidr = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *AuthorizationRule) SetGroupId(v string) *AuthorizationRule {
	s.GroupId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *AuthorizationRule) SetStatus(v *ClientVpnAuthorizationRuleStatus) *AuthorizationRule {
	s.Status = v
	return s
}

type AuthorizeClientVpnIngressInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Active Directory group to grant access.
	AccessGroupId *string `type:"string"`

	// Indicates whether to grant access to all clients. Use true to grant all clients
	// who successfully establish a VPN connection access to the network.
	AuthorizeAllGroups *bool `type:"boolean"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// A brief description of the authorization rule.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The IPv4 address range, in CIDR notation, of the network for which access
	// is being authorized.
	//
	// TargetNetworkCidr is a required field
	TargetNetworkCidr *string `type:"string" required:"true"`
}

// String returns the string representation
func (s AuthorizeClientVpnIngressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizeClientVpnIngressInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AuthorizeClientVpnIngressInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AuthorizeClientVpnIngressInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.TargetNetworkCidr == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetNetworkCidr"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAccessGroupId sets the AccessGroupId field's value.
func (s *AuthorizeClientVpnIngressInput) SetAccessGroupId(v string) *AuthorizeClientVpnIngressInput {
	s.AccessGroupId = &v
	return s
}

// SetAuthorizeAllGroups sets the AuthorizeAllGroups field's value.
func (s *AuthorizeClientVpnIngressInput) SetAuthorizeAllGroups(v bool) *AuthorizeClientVpnIngressInput {
	s.AuthorizeAllGroups = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *AuthorizeClientVpnIngressInput) SetClientVpnEndpointId(v string) *AuthorizeClientVpnIngressInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *AuthorizeClientVpnIngressInput) SetDescription(v string) *AuthorizeClientVpnIngressInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AuthorizeClientVpnIngressInput) SetDryRun(v bool) *AuthorizeClientVpnIngressInput {
	s.DryRun = &v
	return s
}

// SetTargetNetworkCidr sets the TargetNetworkCidr field's value.
func (s *AuthorizeClientVpnIngressInput) SetTargetNetworkCidr(v string) *AuthorizeClientVpnIngressInput {
	s.TargetNetworkCidr = &v
	return s
}

type AuthorizeClientVpnIngressOutput struct {
	_ struct{} `type:"structure"`

	// The current state of the authorization rule.
	Status *ClientVpnAuthorizationRuleStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s AuthorizeClientVpnIngressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizeClientVpnIngressOutput) GoString() string {
	return s.String()
}

// SetStatus sets the Status field's value.
func (s *AuthorizeClientVpnIngressOutput) SetStatus(v *ClientVpnAuthorizationRuleStatus) *AuthorizeClientVpnIngressOutput {
	s.Status = v
	return s
}

type AuthorizeSecurityGroupEgressInput struct {
	_ struct{} `type:"structure"`

	// Not supported. Use a set of IP permissions to specify the CIDR.
	CidrIp *string `locationName:"cidrIp" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Not supported. Use a set of IP permissions to specify the port.
	FromPort *int64 `locationName:"fromPort" type:"integer"`

	// The ID of the security group.
	//
	// GroupId is a required field
	GroupId *string `locationName:"groupId" type:"string" required:"true"`

	// One or more sets of IP permissions. You can't specify a destination security
	// group and a CIDR IP address range in the same set of permissions.
	IpPermissions []*IpPermission `locationName:"ipPermissions" locationNameList:"item" type:"list"`

	// Not supported. Use a set of IP permissions to specify the protocol name or
	// number.
	IpProtocol *string `locationName:"ipProtocol" type:"string"`

	// Not supported. Use a set of IP permissions to specify a destination security
	// group.
	SourceSecurityGroupName *string `locationName:"sourceSecurityGroupName" type:"string"`

	// Not supported. Use a set of IP permissions to specify a destination security
	// group.
	SourceSecurityGroupOwnerId *string `locationName:"sourceSecurityGroupOwnerId" type:"string"`

	// Not supported. Use a set of IP permissions to specify the port.
	ToPort *int64 `locationName:"toPort" type:"integer"`
}

// String returns the string representation
func (s AuthorizeSecurityGroupEgressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizeSecurityGroupEgressInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *AuthorizeSecurityGroupEgressInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "AuthorizeSecurityGroupEgressInput"}
	if s.GroupId == nil {
		invalidParams.Add(request.NewErrParamRequired("GroupId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidrIp sets the CidrIp field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetCidrIp(v string) *AuthorizeSecurityGroupEgressInput {
	s.CidrIp = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetDryRun(v bool) *AuthorizeSecurityGroupEgressInput {
	s.DryRun = &v
	return s
}

// SetFromPort sets the FromPort field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetFromPort(v int64) *AuthorizeSecurityGroupEgressInput {
	s.FromPort = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetGroupId(v string) *AuthorizeSecurityGroupEgressInput {
	s.GroupId = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetIpPermissions(v []*IpPermission) *AuthorizeSecurityGroupEgressInput {
	s.IpPermissions = v
	return s
}

// SetIpProtocol sets the IpProtocol field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetIpProtocol(v string) *AuthorizeSecurityGroupEgressInput {
	s.IpProtocol = &v
	return s
}

// SetSourceSecurityGroupName sets the SourceSecurityGroupName field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetSourceSecurityGroupName(v string) *AuthorizeSecurityGroupEgressInput {
	s.SourceSecurityGroupName = &v
	return s
}

// SetSourceSecurityGroupOwnerId sets the SourceSecurityGroupOwnerId field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetSourceSecurityGroupOwnerId(v string) *AuthorizeSecurityGroupEgressInput {
	s.SourceSecurityGroupOwnerId = &v
	return s
}

// SetToPort sets the ToPort field's value.
func (s *AuthorizeSecurityGroupEgressInput) SetToPort(v int64) *AuthorizeSecurityGroupEgressInput {
	s.ToPort = &v
	return s
}

type AuthorizeSecurityGroupEgressOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s AuthorizeSecurityGroupEgressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizeSecurityGroupEgressOutput) GoString() string {
	return s.String()
}

type AuthorizeSecurityGroupIngressInput struct {
	_ struct{} `type:"structure"`

	// The CIDR IPv4 address range. You can't specify this parameter when specifying
	// a source security group.
	CidrIp *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The start of port range for the TCP and UDP protocols, or an ICMP/ICMPv6
	// type number. For the ICMP/ICMPv6 type number, use -1 to specify all types.
	// If you specify all ICMP/ICMPv6 types, you must specify all codes.
	FromPort *int64 `type:"integer"`

	// The ID of the security group. You must specify either the security group
	// ID or the security group name in the request. For security groups in a nondefault
	// VPC, you must specify the security group ID.
	GroupId *string `type:"string"`

	// [EC2-Classic, default VPC] The name of the security group. You must specify
	// either the security group ID or the security group name in the request.
	GroupName *string `type:"string"`

	// One or more sets of IP permissions. Can be used to specify multiple rules
	// in a single command.
	IpPermissions []*IpPermission `locationNameList:"item" type:"list"`

	// The IP protocol name (tcp, udp, icmp) or number (see Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)).
	// (VPC only) Use -1 to specify all protocols. If you specify -1, or a protocol
	// number other than tcp, udp, icmp, or 58 (ICMPv6), traffic on all ports is
	// allowed, regardless of any ports you specify. For tcp, udp, and icmp, you
	// must specify a port range. For protocol 58 (ICMPv6), you can optionally specify
	// a port range; if you don't, traffic for all types and codes is allowed.
	IpProtocol *string `type:"string"`

	// [EC2-Classic, default VPC] The name of the source security group. You can't
	// specify this parameter in combination with the following parameters: the
	// CIDR IP address range, the start of the port range, the IP protocol, and
	// the end of the port range. Creates rules that grant full ICMP, UDP, and TCP
	// access. To create a rule with a specific IP protocol and port range, use
	// a set of IP permissions instead. For EC2-VPC, the source security group must
	// be in the same VPC.
	SourceSecurityGroupName *string `type:"string"`

	// [nondefault VPC] The AWS account ID for the source security group, if the
	// source security group is in a different account. You can't specify this parameter
	// in combination with the following parameters: the CIDR IP address range,
	// the IP protocol, the start of the port range, and the end of the port range.
	// Creates rules that grant full ICMP, UDP, and TCP access. To create a rule
	// with a specific IP protocol and port range, use a set of IP permissions instead.
	SourceSecurityGroupOwnerId *string `type:"string"`

	// The end of port range for the TCP and UDP protocols, or an ICMP/ICMPv6 code
	// number. For the ICMP/ICMPv6 code number, use -1 to specify all codes. If
	// you specify all ICMP/ICMPv6 types, you must specify all codes.
	ToPort *int64 `type:"integer"`
}

// String returns the string representation
func (s AuthorizeSecurityGroupIngressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizeSecurityGroupIngressInput) GoString() string {
	return s.String()
}

// SetCidrIp sets the CidrIp field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetCidrIp(v string) *AuthorizeSecurityGroupIngressInput {
	s.CidrIp = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetDryRun(v bool) *AuthorizeSecurityGroupIngressInput {
	s.DryRun = &v
	return s
}

// SetFromPort sets the FromPort field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetFromPort(v int64) *AuthorizeSecurityGroupIngressInput {
	s.FromPort = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetGroupId(v string) *AuthorizeSecurityGroupIngressInput {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetGroupName(v string) *AuthorizeSecurityGroupIngressInput {
	s.GroupName = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetIpPermissions(v []*IpPermission) *AuthorizeSecurityGroupIngressInput {
	s.IpPermissions = v
	return s
}

// SetIpProtocol sets the IpProtocol field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetIpProtocol(v string) *AuthorizeSecurityGroupIngressInput {
	s.IpProtocol = &v
	return s
}

// SetSourceSecurityGroupName sets the SourceSecurityGroupName field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetSourceSecurityGroupName(v string) *AuthorizeSecurityGroupIngressInput {
	s.SourceSecurityGroupName = &v
	return s
}

// SetSourceSecurityGroupOwnerId sets the SourceSecurityGroupOwnerId field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetSourceSecurityGroupOwnerId(v string) *AuthorizeSecurityGroupIngressInput {
	s.SourceSecurityGroupOwnerId = &v
	return s
}

// SetToPort sets the ToPort field's value.
func (s *AuthorizeSecurityGroupIngressInput) SetToPort(v int64) *AuthorizeSecurityGroupIngressInput {
	s.ToPort = &v
	return s
}

type AuthorizeSecurityGroupIngressOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s AuthorizeSecurityGroupIngressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AuthorizeSecurityGroupIngressOutput) GoString() string {
	return s.String()
}

// Describes an Availability Zone.
type AvailabilityZone struct {
	_ struct{} `type:"structure"`

	// Any messages about the Availability Zone.
	Messages []*AvailabilityZoneMessage `locationName:"messageSet" locationNameList:"item" type:"list"`

	// The name of the region.
	RegionName *string `locationName:"regionName" type:"string"`

	// The state of the Availability Zone.
	State *string `locationName:"zoneState" type:"string" enum:"AvailabilityZoneState"`

	// The ID of the Availability Zone.
	ZoneId *string `locationName:"zoneId" type:"string"`

	// The name of the Availability Zone.
	ZoneName *string `locationName:"zoneName" type:"string"`
}

// String returns the string representation
func (s AvailabilityZone) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AvailabilityZone) GoString() string {
	return s.String()
}

// SetMessages sets the Messages field's value.
func (s *AvailabilityZone) SetMessages(v []*AvailabilityZoneMessage) *AvailabilityZone {
	s.Messages = v
	return s
}

// SetRegionName sets the RegionName field's value.
func (s *AvailabilityZone) SetRegionName(v string) *AvailabilityZone {
	s.RegionName = &v
	return s
}

// SetState sets the State field's value.
func (s *AvailabilityZone) SetState(v string) *AvailabilityZone {
	s.State = &v
	return s
}

// SetZoneId sets the ZoneId field's value.
func (s *AvailabilityZone) SetZoneId(v string) *AvailabilityZone {
	s.ZoneId = &v
	return s
}

// SetZoneName sets the ZoneName field's value.
func (s *AvailabilityZone) SetZoneName(v string) *AvailabilityZone {
	s.ZoneName = &v
	return s
}

// Describes a message about an Availability Zone.
type AvailabilityZoneMessage struct {
	_ struct{} `type:"structure"`

	// The message about the Availability Zone.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s AvailabilityZoneMessage) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AvailabilityZoneMessage) GoString() string {
	return s.String()
}

// SetMessage sets the Message field's value.
func (s *AvailabilityZoneMessage) SetMessage(v string) *AvailabilityZoneMessage {
	s.Message = &v
	return s
}

// The capacity information for instances launched onto the Dedicated Host.
type AvailableCapacity struct {
	_ struct{} `type:"structure"`

	// The total number of instances supported by the Dedicated Host.
	AvailableInstanceCapacity []*InstanceCapacity `locationName:"availableInstanceCapacity" locationNameList:"item" type:"list"`

	// The number of vCPUs available on the Dedicated Host.
	AvailableVCpus *int64 `locationName:"availableVCpus" type:"integer"`
}

// String returns the string representation
func (s AvailableCapacity) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AvailableCapacity) GoString() string {
	return s.String()
}

// SetAvailableInstanceCapacity sets the AvailableInstanceCapacity field's value.
func (s *AvailableCapacity) SetAvailableInstanceCapacity(v []*InstanceCapacity) *AvailableCapacity {
	s.AvailableInstanceCapacity = v
	return s
}

// SetAvailableVCpus sets the AvailableVCpus field's value.
func (s *AvailableCapacity) SetAvailableVCpus(v int64) *AvailableCapacity {
	s.AvailableVCpus = &v
	return s
}

type BlobAttributeValue struct {
	_ struct{} `type:"structure"`

	// Value is automatically base64 encoded/decoded by the SDK.
	Value []byte `locationName:"value" type:"blob"`
}

// String returns the string representation
func (s BlobAttributeValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s BlobAttributeValue) GoString() string {
	return s.String()
}

// SetValue sets the Value field's value.
func (s *BlobAttributeValue) SetValue(v []byte) *BlobAttributeValue {
	s.Value = v
	return s
}

// Describes a block device mapping.
type BlockDeviceMapping struct {
	_ struct{} `type:"structure"`

	// The device name (for example, /dev/sdh or xvdh).
	DeviceName *string `locationName:"deviceName" type:"string"`

	// Parameters used to automatically set up EBS volumes when the instance is
	// launched.
	Ebs *EbsBlockDevice `locationName:"ebs" type:"structure"`

	// Suppresses the specified device included in the block device mapping of the
	// AMI.
	NoDevice *string `locationName:"noDevice" type:"string"`

	// The virtual device name (ephemeralN). Instance store volumes are numbered
	// starting from 0. An instance type with 2 available instance store volumes
	// can specify mappings for ephemeral0 and ephemeral1. The number of available
	// instance store volumes depends on the instance type. After you connect to
	// the instance, you must mount the volume.
	//
	// NVMe instance store volumes are automatically enumerated and assigned a device
	// name. Including them in your block device mapping has no effect.
	//
	// Constraints: For M3 instances, you must specify instance store volumes in
	// the block device mapping for the instance. When you launch an M3 instance,
	// we ignore any instance store volumes specified in the block device mapping
	// for the AMI.
	VirtualName *string `locationName:"virtualName" type:"string"`
}

// String returns the string representation
func (s BlockDeviceMapping) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s BlockDeviceMapping) GoString() string {
	return s.String()
}

// SetDeviceName sets the DeviceName field's value.
func (s *BlockDeviceMapping) SetDeviceName(v string) *BlockDeviceMapping {
	s.DeviceName = &v
	return s
}

// SetEbs sets the Ebs field's value.
func (s *BlockDeviceMapping) SetEbs(v *EbsBlockDevice) *BlockDeviceMapping {
	s.Ebs = v
	return s
}

// SetNoDevice sets the NoDevice field's value.
func (s *BlockDeviceMapping) SetNoDevice(v string) *BlockDeviceMapping {
	s.NoDevice = &v
	return s
}

// SetVirtualName sets the VirtualName field's value.
func (s *BlockDeviceMapping) SetVirtualName(v string) *BlockDeviceMapping {
	s.VirtualName = &v
	return s
}

// Contains the parameters for BundleInstance.
type BundleInstanceInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance to bundle.
	//
	// Type: String
	//
	// Default: None
	//
	// Required: Yes
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`

	// The bucket in which to store the AMI. You can specify a bucket that you already
	// own or a new bucket that Amazon EC2 creates on your behalf. If you specify
	// a bucket that belongs to someone else, Amazon EC2 returns an error.
	//
	// Storage is a required field
	Storage *Storage `type:"structure" required:"true"`
}

// String returns the string representation
func (s BundleInstanceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s BundleInstanceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *BundleInstanceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "BundleInstanceInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.Storage == nil {
		invalidParams.Add(request.NewErrParamRequired("Storage"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *BundleInstanceInput) SetDryRun(v bool) *BundleInstanceInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *BundleInstanceInput) SetInstanceId(v string) *BundleInstanceInput {
	s.InstanceId = &v
	return s
}

// SetStorage sets the Storage field's value.
func (s *BundleInstanceInput) SetStorage(v *Storage) *BundleInstanceInput {
	s.Storage = v
	return s
}

// Contains the output of BundleInstance.
type BundleInstanceOutput struct {
	_ struct{} `type:"structure"`

	// Information about the bundle task.
	BundleTask *BundleTask `locationName:"bundleInstanceTask" type:"structure"`
}

// String returns the string representation
func (s BundleInstanceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s BundleInstanceOutput) GoString() string {
	return s.String()
}

// SetBundleTask sets the BundleTask field's value.
func (s *BundleInstanceOutput) SetBundleTask(v *BundleTask) *BundleInstanceOutput {
	s.BundleTask = v
	return s
}

// Describes a bundle task.
type BundleTask struct {
	_ struct{} `type:"structure"`

	// The ID of the bundle task.
	BundleId *string `locationName:"bundleId" type:"string"`

	// If the task fails, a description of the error.
	BundleTaskError *BundleTaskError `locationName:"error" type:"structure"`

	// The ID of the instance associated with this bundle task.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The level of task completion, as a percent (for example, 20%).
	Progress *string `locationName:"progress" type:"string"`

	// The time this task started.
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`

	// The state of the task.
	State *string `locationName:"state" type:"string" enum:"BundleTaskState"`

	// The Amazon S3 storage locations.
	Storage *Storage `locationName:"storage" type:"structure"`

	// The time of the most recent update for the task.
	UpdateTime *time.Time `locationName:"updateTime" type:"timestamp"`
}

// String returns the string representation
func (s BundleTask) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s BundleTask) GoString() string {
	return s.String()
}

// SetBundleId sets the BundleId field's value.
func (s *BundleTask) SetBundleId(v string) *BundleTask {
	s.BundleId = &v
	return s
}

// SetBundleTaskError sets the BundleTaskError field's value.
func (s *BundleTask) SetBundleTaskError(v *BundleTaskError) *BundleTask {
	s.BundleTaskError = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *BundleTask) SetInstanceId(v string) *BundleTask {
	s.InstanceId = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *BundleTask) SetProgress(v string) *BundleTask {
	s.Progress = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *BundleTask) SetStartTime(v time.Time) *BundleTask {
	s.StartTime = &v
	return s
}

// SetState sets the State field's value.
func (s *BundleTask) SetState(v string) *BundleTask {
	s.State = &v
	return s
}

// SetStorage sets the Storage field's value.
func (s *BundleTask) SetStorage(v *Storage) *BundleTask {
	s.Storage = v
	return s
}

// SetUpdateTime sets the UpdateTime field's value.
func (s *BundleTask) SetUpdateTime(v time.Time) *BundleTask {
	s.UpdateTime = &v
	return s
}

// Describes an error for BundleInstance.
type BundleTaskError struct {
	_ struct{} `type:"structure"`

	// The error code.
	Code *string `locationName:"code" type:"string"`

	// The error message.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s BundleTaskError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s BundleTaskError) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *BundleTaskError) SetCode(v string) *BundleTaskError {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *BundleTaskError) SetMessage(v string) *BundleTaskError {
	s.Message = &v
	return s
}

// Information about an address range that is provisioned for use with your
// AWS resources through bring your own IP addresses (BYOIP).
type ByoipCidr struct {
	_ struct{} `type:"structure"`

	// The public IPv4 address range, in CIDR notation.
	Cidr *string `locationName:"cidr" type:"string"`

	// The description of the address range.
	Description *string `locationName:"description" type:"string"`

	// The state of the address pool.
	State *string `locationName:"state" type:"string" enum:"ByoipCidrState"`

	// Upon success, contains the ID of the address pool. Otherwise, contains an
	// error message.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s ByoipCidr) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ByoipCidr) GoString() string {
	return s.String()
}

// SetCidr sets the Cidr field's value.
func (s *ByoipCidr) SetCidr(v string) *ByoipCidr {
	s.Cidr = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ByoipCidr) SetDescription(v string) *ByoipCidr {
	s.Description = &v
	return s
}

// SetState sets the State field's value.
func (s *ByoipCidr) SetState(v string) *ByoipCidr {
	s.State = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ByoipCidr) SetStatusMessage(v string) *ByoipCidr {
	s.StatusMessage = &v
	return s
}

// Contains the parameters for CancelBundleTask.
type CancelBundleTaskInput struct {
	_ struct{} `type:"structure"`

	// The ID of the bundle task.
	//
	// BundleId is a required field
	BundleId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s CancelBundleTaskInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelBundleTaskInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelBundleTaskInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelBundleTaskInput"}
	if s.BundleId == nil {
		invalidParams.Add(request.NewErrParamRequired("BundleId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBundleId sets the BundleId field's value.
func (s *CancelBundleTaskInput) SetBundleId(v string) *CancelBundleTaskInput {
	s.BundleId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CancelBundleTaskInput) SetDryRun(v bool) *CancelBundleTaskInput {
	s.DryRun = &v
	return s
}

// Contains the output of CancelBundleTask.
type CancelBundleTaskOutput struct {
	_ struct{} `type:"structure"`

	// Information about the bundle task.
	BundleTask *BundleTask `locationName:"bundleInstanceTask" type:"structure"`
}

// String returns the string representation
func (s CancelBundleTaskOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelBundleTaskOutput) GoString() string {
	return s.String()
}

// SetBundleTask sets the BundleTask field's value.
func (s *CancelBundleTaskOutput) SetBundleTask(v *BundleTask) *CancelBundleTaskOutput {
	s.BundleTask = v
	return s
}

type CancelCapacityReservationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Capacity Reservation to be cancelled.
	//
	// CapacityReservationId is a required field
	CapacityReservationId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s CancelCapacityReservationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelCapacityReservationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelCapacityReservationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelCapacityReservationInput"}
	if s.CapacityReservationId == nil {
		invalidParams.Add(request.NewErrParamRequired("CapacityReservationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCapacityReservationId sets the CapacityReservationId field's value.
func (s *CancelCapacityReservationInput) SetCapacityReservationId(v string) *CancelCapacityReservationInput {
	s.CapacityReservationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CancelCapacityReservationInput) SetDryRun(v bool) *CancelCapacityReservationInput {
	s.DryRun = &v
	return s
}

type CancelCapacityReservationOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s CancelCapacityReservationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelCapacityReservationOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *CancelCapacityReservationOutput) SetReturn(v bool) *CancelCapacityReservationOutput {
	s.Return = &v
	return s
}

// Contains the parameters for CancelConversionTask.
type CancelConversionTaskInput struct {
	_ struct{} `type:"structure"`

	// The ID of the conversion task.
	//
	// ConversionTaskId is a required field
	ConversionTaskId *string `locationName:"conversionTaskId" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The reason for canceling the conversion task.
	ReasonMessage *string `locationName:"reasonMessage" type:"string"`
}

// String returns the string representation
func (s CancelConversionTaskInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelConversionTaskInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelConversionTaskInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelConversionTaskInput"}
	if s.ConversionTaskId == nil {
		invalidParams.Add(request.NewErrParamRequired("ConversionTaskId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetConversionTaskId sets the ConversionTaskId field's value.
func (s *CancelConversionTaskInput) SetConversionTaskId(v string) *CancelConversionTaskInput {
	s.ConversionTaskId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CancelConversionTaskInput) SetDryRun(v bool) *CancelConversionTaskInput {
	s.DryRun = &v
	return s
}

// SetReasonMessage sets the ReasonMessage field's value.
func (s *CancelConversionTaskInput) SetReasonMessage(v string) *CancelConversionTaskInput {
	s.ReasonMessage = &v
	return s
}

type CancelConversionTaskOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CancelConversionTaskOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelConversionTaskOutput) GoString() string {
	return s.String()
}

// Contains the parameters for CancelExportTask.
type CancelExportTaskInput struct {
	_ struct{} `type:"structure"`

	// The ID of the export task. This is the ID returned by CreateInstanceExportTask.
	//
	// ExportTaskId is a required field
	ExportTaskId *string `locationName:"exportTaskId" type:"string" required:"true"`
}

// String returns the string representation
func (s CancelExportTaskInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelExportTaskInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelExportTaskInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelExportTaskInput"}
	if s.ExportTaskId == nil {
		invalidParams.Add(request.NewErrParamRequired("ExportTaskId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetExportTaskId sets the ExportTaskId field's value.
func (s *CancelExportTaskInput) SetExportTaskId(v string) *CancelExportTaskInput {
	s.ExportTaskId = &v
	return s
}

type CancelExportTaskOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CancelExportTaskOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelExportTaskOutput) GoString() string {
	return s.String()
}

// Contains the parameters for CancelImportTask.
type CancelImportTaskInput struct {
	_ struct{} `type:"structure"`

	// The reason for canceling the task.
	CancelReason *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the import image or import snapshot task to be canceled.
	ImportTaskId *string `type:"string"`
}

// String returns the string representation
func (s CancelImportTaskInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelImportTaskInput) GoString() string {
	return s.String()
}

// SetCancelReason sets the CancelReason field's value.
func (s *CancelImportTaskInput) SetCancelReason(v string) *CancelImportTaskInput {
	s.CancelReason = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CancelImportTaskInput) SetDryRun(v bool) *CancelImportTaskInput {
	s.DryRun = &v
	return s
}

// SetImportTaskId sets the ImportTaskId field's value.
func (s *CancelImportTaskInput) SetImportTaskId(v string) *CancelImportTaskInput {
	s.ImportTaskId = &v
	return s
}

// Contains the output for CancelImportTask.
type CancelImportTaskOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the task being canceled.
	ImportTaskId *string `locationName:"importTaskId" type:"string"`

	// The current state of the task being canceled.
	PreviousState *string `locationName:"previousState" type:"string"`

	// The current state of the task being canceled.
	State *string `locationName:"state" type:"string"`
}

// String returns the string representation
func (s CancelImportTaskOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelImportTaskOutput) GoString() string {
	return s.String()
}

// SetImportTaskId sets the ImportTaskId field's value.
func (s *CancelImportTaskOutput) SetImportTaskId(v string) *CancelImportTaskOutput {
	s.ImportTaskId = &v
	return s
}

// SetPreviousState sets the PreviousState field's value.
func (s *CancelImportTaskOutput) SetPreviousState(v string) *CancelImportTaskOutput {
	s.PreviousState = &v
	return s
}

// SetState sets the State field's value.
func (s *CancelImportTaskOutput) SetState(v string) *CancelImportTaskOutput {
	s.State = &v
	return s
}

// Contains the parameters for CancelReservedInstancesListing.
type CancelReservedInstancesListingInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Reserved Instance listing.
	//
	// ReservedInstancesListingId is a required field
	ReservedInstancesListingId *string `locationName:"reservedInstancesListingId" type:"string" required:"true"`
}

// String returns the string representation
func (s CancelReservedInstancesListingInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelReservedInstancesListingInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelReservedInstancesListingInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelReservedInstancesListingInput"}
	if s.ReservedInstancesListingId == nil {
		invalidParams.Add(request.NewErrParamRequired("ReservedInstancesListingId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetReservedInstancesListingId sets the ReservedInstancesListingId field's value.
func (s *CancelReservedInstancesListingInput) SetReservedInstancesListingId(v string) *CancelReservedInstancesListingInput {
	s.ReservedInstancesListingId = &v
	return s
}

// Contains the output of CancelReservedInstancesListing.
type CancelReservedInstancesListingOutput struct {
	_ struct{} `type:"structure"`

	// The Reserved Instance listing.
	ReservedInstancesListings []*ReservedInstancesListing `locationName:"reservedInstancesListingsSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CancelReservedInstancesListingOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelReservedInstancesListingOutput) GoString() string {
	return s.String()
}

// SetReservedInstancesListings sets the ReservedInstancesListings field's value.
func (s *CancelReservedInstancesListingOutput) SetReservedInstancesListings(v []*ReservedInstancesListing) *CancelReservedInstancesListingOutput {
	s.ReservedInstancesListings = v
	return s
}

// Describes a Spot Fleet error.
type CancelSpotFleetRequestsError struct {
	_ struct{} `type:"structure"`

	// The error code.
	Code *string `locationName:"code" type:"string" enum:"CancelBatchErrorCode"`

	// The description for the error code.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s CancelSpotFleetRequestsError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotFleetRequestsError) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *CancelSpotFleetRequestsError) SetCode(v string) *CancelSpotFleetRequestsError {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *CancelSpotFleetRequestsError) SetMessage(v string) *CancelSpotFleetRequestsError {
	s.Message = &v
	return s
}

// Describes a Spot Fleet request that was not successfully canceled.
type CancelSpotFleetRequestsErrorItem struct {
	_ struct{} `type:"structure"`

	// The error.
	Error *CancelSpotFleetRequestsError `locationName:"error" type:"structure"`

	// The ID of the Spot Fleet request.
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string"`
}

// String returns the string representation
func (s CancelSpotFleetRequestsErrorItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotFleetRequestsErrorItem) GoString() string {
	return s.String()
}

// SetError sets the Error field's value.
func (s *CancelSpotFleetRequestsErrorItem) SetError(v *CancelSpotFleetRequestsError) *CancelSpotFleetRequestsErrorItem {
	s.Error = v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *CancelSpotFleetRequestsErrorItem) SetSpotFleetRequestId(v string) *CancelSpotFleetRequestsErrorItem {
	s.SpotFleetRequestId = &v
	return s
}

// Contains the parameters for CancelSpotFleetRequests.
type CancelSpotFleetRequestsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The IDs of the Spot Fleet requests.
	//
	// SpotFleetRequestIds is a required field
	SpotFleetRequestIds []*string `locationName:"spotFleetRequestId" locationNameList:"item" type:"list" required:"true"`

	// Indicates whether to terminate instances for a Spot Fleet request if it is
	// canceled successfully.
	//
	// TerminateInstances is a required field
	TerminateInstances *bool `locationName:"terminateInstances" type:"boolean" required:"true"`
}

// String returns the string representation
func (s CancelSpotFleetRequestsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotFleetRequestsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelSpotFleetRequestsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelSpotFleetRequestsInput"}
	if s.SpotFleetRequestIds == nil {
		invalidParams.Add(request.NewErrParamRequired("SpotFleetRequestIds"))
	}
	if s.TerminateInstances == nil {
		invalidParams.Add(request.NewErrParamRequired("TerminateInstances"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CancelSpotFleetRequestsInput) SetDryRun(v bool) *CancelSpotFleetRequestsInput {
	s.DryRun = &v
	return s
}

// SetSpotFleetRequestIds sets the SpotFleetRequestIds field's value.
func (s *CancelSpotFleetRequestsInput) SetSpotFleetRequestIds(v []*string) *CancelSpotFleetRequestsInput {
	s.SpotFleetRequestIds = v
	return s
}

// SetTerminateInstances sets the TerminateInstances field's value.
func (s *CancelSpotFleetRequestsInput) SetTerminateInstances(v bool) *CancelSpotFleetRequestsInput {
	s.TerminateInstances = &v
	return s
}

// Contains the output of CancelSpotFleetRequests.
type CancelSpotFleetRequestsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Spot Fleet requests that are successfully canceled.
	SuccessfulFleetRequests []*CancelSpotFleetRequestsSuccessItem `locationName:"successfulFleetRequestSet" locationNameList:"item" type:"list"`

	// Information about the Spot Fleet requests that are not successfully canceled.
	UnsuccessfulFleetRequests []*CancelSpotFleetRequestsErrorItem `locationName:"unsuccessfulFleetRequestSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CancelSpotFleetRequestsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotFleetRequestsOutput) GoString() string {
	return s.String()
}

// SetSuccessfulFleetRequests sets the SuccessfulFleetRequests field's value.
func (s *CancelSpotFleetRequestsOutput) SetSuccessfulFleetRequests(v []*CancelSpotFleetRequestsSuccessItem) *CancelSpotFleetRequestsOutput {
	s.SuccessfulFleetRequests = v
	return s
}

// SetUnsuccessfulFleetRequests sets the UnsuccessfulFleetRequests field's value.
func (s *CancelSpotFleetRequestsOutput) SetUnsuccessfulFleetRequests(v []*CancelSpotFleetRequestsErrorItem) *CancelSpotFleetRequestsOutput {
	s.UnsuccessfulFleetRequests = v
	return s
}

// Describes a Spot Fleet request that was successfully canceled.
type CancelSpotFleetRequestsSuccessItem struct {
	_ struct{} `type:"structure"`

	// The current state of the Spot Fleet request.
	CurrentSpotFleetRequestState *string `locationName:"currentSpotFleetRequestState" type:"string" enum:"BatchState"`

	// The previous state of the Spot Fleet request.
	PreviousSpotFleetRequestState *string `locationName:"previousSpotFleetRequestState" type:"string" enum:"BatchState"`

	// The ID of the Spot Fleet request.
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string"`
}

// String returns the string representation
func (s CancelSpotFleetRequestsSuccessItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotFleetRequestsSuccessItem) GoString() string {
	return s.String()
}

// SetCurrentSpotFleetRequestState sets the CurrentSpotFleetRequestState field's value.
func (s *CancelSpotFleetRequestsSuccessItem) SetCurrentSpotFleetRequestState(v string) *CancelSpotFleetRequestsSuccessItem {
	s.CurrentSpotFleetRequestState = &v
	return s
}

// SetPreviousSpotFleetRequestState sets the PreviousSpotFleetRequestState field's value.
func (s *CancelSpotFleetRequestsSuccessItem) SetPreviousSpotFleetRequestState(v string) *CancelSpotFleetRequestsSuccessItem {
	s.PreviousSpotFleetRequestState = &v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *CancelSpotFleetRequestsSuccessItem) SetSpotFleetRequestId(v string) *CancelSpotFleetRequestsSuccessItem {
	s.SpotFleetRequestId = &v
	return s
}

// Contains the parameters for CancelSpotInstanceRequests.
type CancelSpotInstanceRequestsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more Spot Instance request IDs.
	//
	// SpotInstanceRequestIds is a required field
	SpotInstanceRequestIds []*string `locationName:"SpotInstanceRequestId" locationNameList:"SpotInstanceRequestId" type:"list" required:"true"`
}

// String returns the string representation
func (s CancelSpotInstanceRequestsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotInstanceRequestsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CancelSpotInstanceRequestsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CancelSpotInstanceRequestsInput"}
	if s.SpotInstanceRequestIds == nil {
		invalidParams.Add(request.NewErrParamRequired("SpotInstanceRequestIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CancelSpotInstanceRequestsInput) SetDryRun(v bool) *CancelSpotInstanceRequestsInput {
	s.DryRun = &v
	return s
}

// SetSpotInstanceRequestIds sets the SpotInstanceRequestIds field's value.
func (s *CancelSpotInstanceRequestsInput) SetSpotInstanceRequestIds(v []*string) *CancelSpotInstanceRequestsInput {
	s.SpotInstanceRequestIds = v
	return s
}

// Contains the output of CancelSpotInstanceRequests.
type CancelSpotInstanceRequestsOutput struct {
	_ struct{} `type:"structure"`

	// One or more Spot Instance requests.
	CancelledSpotInstanceRequests []*CancelledSpotInstanceRequest `locationName:"spotInstanceRequestSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CancelSpotInstanceRequestsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelSpotInstanceRequestsOutput) GoString() string {
	return s.String()
}

// SetCancelledSpotInstanceRequests sets the CancelledSpotInstanceRequests field's value.
func (s *CancelSpotInstanceRequestsOutput) SetCancelledSpotInstanceRequests(v []*CancelledSpotInstanceRequest) *CancelSpotInstanceRequestsOutput {
	s.CancelledSpotInstanceRequests = v
	return s
}

// Describes a request to cancel a Spot Instance.
type CancelledSpotInstanceRequest struct {
	_ struct{} `type:"structure"`

	// The ID of the Spot Instance request.
	SpotInstanceRequestId *string `locationName:"spotInstanceRequestId" type:"string"`

	// The state of the Spot Instance request.
	State *string `locationName:"state" type:"string" enum:"CancelSpotInstanceRequestState"`
}

// String returns the string representation
func (s CancelledSpotInstanceRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CancelledSpotInstanceRequest) GoString() string {
	return s.String()
}

// SetSpotInstanceRequestId sets the SpotInstanceRequestId field's value.
func (s *CancelledSpotInstanceRequest) SetSpotInstanceRequestId(v string) *CancelledSpotInstanceRequest {
	s.SpotInstanceRequestId = &v
	return s
}

// SetState sets the State field's value.
func (s *CancelledSpotInstanceRequest) SetState(v string) *CancelledSpotInstanceRequest {
	s.State = &v
	return s
}

// Describes a Capacity Reservation.
type CapacityReservation struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which the capacity is reserved.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The remaining capacity. Indicates the number of instances that can be launched
	// in the Capacity Reservation.
	AvailableInstanceCount *int64 `locationName:"availableInstanceCount" type:"integer"`

	// The ID of the Capacity Reservation.
	CapacityReservationId *string `locationName:"capacityReservationId" type:"string"`

	// The date and time at which the Capacity Reservation was created.
	CreateDate *time.Time `locationName:"createDate" type:"timestamp"`

	// Indicates whether the Capacity Reservation supports EBS-optimized instances.
	// This optimization provides dedicated throughput to Amazon EBS and an optimized
	// configuration stack to provide optimal I/O performance. This optimization
	// isn't available with all instance types. Additional usage charges apply when
	// using an EBS- optimized instance.
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// The date and time at which the Capacity Reservation expires. When a Capacity
	// Reservation expires, the reserved capacity is released and you can no longer
	// launch instances into it. The Capacity Reservation's state changes to expired
	// when it reaches its end date and time.
	EndDate *time.Time `locationName:"endDate" type:"timestamp"`

	// Indicates the way in which the Capacity Reservation ends. A Capacity Reservation
	// can have one of the following end types:
	//
	//    * unlimited - The Capacity Reservation remains active until you explicitly
	//    cancel it.
	//
	//    * limited - The Capacity Reservation expires automatically at a specified
	//    date and time.
	EndDateType *string `locationName:"endDateType" type:"string" enum:"EndDateType"`

	// Indicates whether the Capacity Reservation supports instances with temporary,
	// block-level storage.
	EphemeralStorage *bool `locationName:"ephemeralStorage" type:"boolean"`

	// Indicates the type of instance launches that the Capacity Reservation accepts.
	// The options include:
	//
	//    * open - The Capacity Reservation accepts all instances that have matching
	//    attributes (instance type, platform, and Availability Zone). Instances
	//    that have matching attributes launch into the Capacity Reservation automatically
	//    without specifying any additional parameters.
	//
	//    * targeted - The Capacity Reservation only accepts instances that have
	//    matching attributes (instance type, platform, and Availability Zone),
	//    and explicitly target the Capacity Reservation. This ensures that only
	//    permitted instances can use the reserved capacity.
	InstanceMatchCriteria *string `locationName:"instanceMatchCriteria" type:"string" enum:"InstanceMatchCriteria"`

	// The type of operating system for which the Capacity Reservation reserves
	// capacity.
	InstancePlatform *string `locationName:"instancePlatform" type:"string" enum:"CapacityReservationInstancePlatform"`

	// The type of instance for which the Capacity Reservation reserves capacity.
	InstanceType *string `locationName:"instanceType" type:"string"`

	// The current state of the Capacity Reservation. A Capacity Reservation can
	// be in one of the following states:
	//
	//    * active - The Capacity Reservation is active and the capacity is available
	//    for your use.
	//
	//    * cancelled - The Capacity Reservation expired automatically at the date
	//    and time specified in your request. The reserved capacity is no longer
	//    available for your use.
	//
	//    * expired - The Capacity Reservation was manually cancelled. The reserved
	//    capacity is no longer available for your use.
	//
	//    * pending - The Capacity Reservation request was successful but the capacity
	//    provisioning is still pending.
	//
	//    * failed - The Capacity Reservation request has failed. A request might
	//    fail due to invalid request parameters, capacity constraints, or instance
	//    limit constraints. Failed requests are retained for 60 minutes.
	State *string `locationName:"state" type:"string" enum:"CapacityReservationState"`

	// Any tags assigned to the Capacity Reservation.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// Indicates the tenancy of the Capacity Reservation. A Capacity Reservation
	// can have one of the following tenancy settings:
	//
	//    * default - The Capacity Reservation is created on hardware that is shared
	//    with other AWS accounts.
	//
	//    * dedicated - The Capacity Reservation is created on single-tenant hardware
	//    that is dedicated to a single AWS account.
	Tenancy *string `locationName:"tenancy" type:"string" enum:"CapacityReservationTenancy"`

	// The number of instances for which the Capacity Reservation reserves capacity.
	TotalInstanceCount *int64 `locationName:"totalInstanceCount" type:"integer"`
}

// String returns the string representation
func (s CapacityReservation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CapacityReservation) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CapacityReservation) SetAvailabilityZone(v string) *CapacityReservation {
	s.AvailabilityZone = &v
	return s
}

// SetAvailableInstanceCount sets the AvailableInstanceCount field's value.
func (s *CapacityReservation) SetAvailableInstanceCount(v int64) *CapacityReservation {
	s.AvailableInstanceCount = &v
	return s
}

// SetCapacityReservationId sets the CapacityReservationId field's value.
func (s *CapacityReservation) SetCapacityReservationId(v string) *CapacityReservation {
	s.CapacityReservationId = &v
	return s
}

// SetCreateDate sets the CreateDate field's value.
func (s *CapacityReservation) SetCreateDate(v time.Time) *CapacityReservation {
	s.CreateDate = &v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *CapacityReservation) SetEbsOptimized(v bool) *CapacityReservation {
	s.EbsOptimized = &v
	return s
}

// SetEndDate sets the EndDate field's value.
func (s *CapacityReservation) SetEndDate(v time.Time) *CapacityReservation {
	s.EndDate = &v
	return s
}

// SetEndDateType sets the EndDateType field's value.
func (s *CapacityReservation) SetEndDateType(v string) *CapacityReservation {
	s.EndDateType = &v
	return s
}

// SetEphemeralStorage sets the EphemeralStorage field's value.
func (s *CapacityReservation) SetEphemeralStorage(v bool) *CapacityReservation {
	s.EphemeralStorage = &v
	return s
}

// SetInstanceMatchCriteria sets the InstanceMatchCriteria field's value.
func (s *CapacityReservation) SetInstanceMatchCriteria(v string) *CapacityReservation {
	s.InstanceMatchCriteria = &v
	return s
}

// SetInstancePlatform sets the InstancePlatform field's value.
func (s *CapacityReservation) SetInstancePlatform(v string) *CapacityReservation {
	s.InstancePlatform = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *CapacityReservation) SetInstanceType(v string) *CapacityReservation {
	s.InstanceType = &v
	return s
}

// SetState sets the State field's value.
func (s *CapacityReservation) SetState(v string) *CapacityReservation {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *CapacityReservation) SetTags(v []*Tag) *CapacityReservation {
	s.Tags = v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *CapacityReservation) SetTenancy(v string) *CapacityReservation {
	s.Tenancy = &v
	return s
}

// SetTotalInstanceCount sets the TotalInstanceCount field's value.
func (s *CapacityReservation) SetTotalInstanceCount(v int64) *CapacityReservation {
	s.TotalInstanceCount = &v
	return s
}

// Describes an instance's Capacity Reservation targeting option. You can specify
// only one parameter at a time. If you specify CapacityReservationPreference
// and CapacityReservationTarget, the request fails.
//
// Use the CapacityReservationPreference parameter to configure the instance
// to run as an On-Demand Instance or to run in any open Capacity Reservation
// that has matching attributes (instance type, platform, Availability Zone).
// Use the CapacityReservationTarget parameter to explicitly target a specific
// Capacity Reservation.
type CapacityReservationSpecification struct {
	_ struct{} `type:"structure"`

	// Indicates the instance's Capacity Reservation preferences. Possible preferences
	// include:
	//
	//    * open - The instance can run in any open Capacity Reservation that has
	//    matching attributes (instance type, platform, Availability Zone).
	//
	//    * none - The instance avoids running in a Capacity Reservation even if
	//    one is available. The instance runs as an On-Demand Instance.
	CapacityReservationPreference *string `type:"string" enum:"CapacityReservationPreference"`

	// Information about the target Capacity Reservation.
	CapacityReservationTarget *CapacityReservationTarget `type:"structure"`
}

// String returns the string representation
func (s CapacityReservationSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CapacityReservationSpecification) GoString() string {
	return s.String()
}

// SetCapacityReservationPreference sets the CapacityReservationPreference field's value.
func (s *CapacityReservationSpecification) SetCapacityReservationPreference(v string) *CapacityReservationSpecification {
	s.CapacityReservationPreference = &v
	return s
}

// SetCapacityReservationTarget sets the CapacityReservationTarget field's value.
func (s *CapacityReservationSpecification) SetCapacityReservationTarget(v *CapacityReservationTarget) *CapacityReservationSpecification {
	s.CapacityReservationTarget = v
	return s
}

// Describes the instance's Capacity Reservation targeting preferences. The
// action returns the capacityReservationPreference response element if the
// instance is configured to run in On-Demand capacity, or if it is configured
// in run in any open Capacity Reservation that has matching attributes (instance
// type, platform, Availability Zone). The action returns the capacityReservationTarget
// response element if the instance explicily targets a specific Capacity Reservation.
type CapacityReservationSpecificationResponse struct {
	_ struct{} `type:"structure"`

	// Describes the instance's Capacity Reservation preferences. Possible preferences
	// include:
	//
	//    * open - The instance can run in any open Capacity Reservation that has
	//    matching attributes (instance type, platform, Availability Zone).
	//
	//    * none - The instance avoids running in a Capacity Reservation even if
	//    one is available. The instance runs in On-Demand capacity.
	CapacityReservationPreference *string `locationName:"capacityReservationPreference" type:"string" enum:"CapacityReservationPreference"`

	// Information about the targeted Capacity Reservation.
	CapacityReservationTarget *CapacityReservationTargetResponse `locationName:"capacityReservationTarget" type:"structure"`
}

// String returns the string representation
func (s CapacityReservationSpecificationResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CapacityReservationSpecificationResponse) GoString() string {
	return s.String()
}

// SetCapacityReservationPreference sets the CapacityReservationPreference field's value.
func (s *CapacityReservationSpecificationResponse) SetCapacityReservationPreference(v string) *CapacityReservationSpecificationResponse {
	s.CapacityReservationPreference = &v
	return s
}

// SetCapacityReservationTarget sets the CapacityReservationTarget field's value.
func (s *CapacityReservationSpecificationResponse) SetCapacityReservationTarget(v *CapacityReservationTargetResponse) *CapacityReservationSpecificationResponse {
	s.CapacityReservationTarget = v
	return s
}

// Describes a target Capacity Reservation.
type CapacityReservationTarget struct {
	_ struct{} `type:"structure"`

	// The ID of the Capacity Reservation.
	CapacityReservationId *string `type:"string"`
}

// String returns the string representation
func (s CapacityReservationTarget) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CapacityReservationTarget) GoString() string {
	return s.String()
}

// SetCapacityReservationId sets the CapacityReservationId field's value.
func (s *CapacityReservationTarget) SetCapacityReservationId(v string) *CapacityReservationTarget {
	s.CapacityReservationId = &v
	return s
}

// Describes a target Capacity Reservation.
type CapacityReservationTargetResponse struct {
	_ struct{} `type:"structure"`

	// The ID of the Capacity Reservation.
	CapacityReservationId *string `locationName:"capacityReservationId" type:"string"`
}

// String returns the string representation
func (s CapacityReservationTargetResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CapacityReservationTargetResponse) GoString() string {
	return s.String()
}

// SetCapacityReservationId sets the CapacityReservationId field's value.
func (s *CapacityReservationTargetResponse) SetCapacityReservationId(v string) *CapacityReservationTargetResponse {
	s.CapacityReservationId = &v
	return s
}

// Information about the client certificate used for authentication.
type CertificateAuthentication struct {
	_ struct{} `type:"structure"`

	// The ARN of the client certificate.
	ClientRootCertificateChain *string `locationName:"clientRootCertificateChain" type:"string"`
}

// String returns the string representation
func (s CertificateAuthentication) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CertificateAuthentication) GoString() string {
	return s.String()
}

// SetClientRootCertificateChain sets the ClientRootCertificateChain field's value.
func (s *CertificateAuthentication) SetClientRootCertificateChain(v string) *CertificateAuthentication {
	s.ClientRootCertificateChain = &v
	return s
}

// Information about the client certificate to be used for authentication.
type CertificateAuthenticationRequest struct {
	_ struct{} `type:"structure"`

	// The ARN of the client certificate. The certificate must be signed by a certificate
	// authority (CA) and it must be provisioned in AWS Certificate Manager (ACM).
	ClientRootCertificateChainArn *string `type:"string"`
}

// String returns the string representation
func (s CertificateAuthenticationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CertificateAuthenticationRequest) GoString() string {
	return s.String()
}

// SetClientRootCertificateChainArn sets the ClientRootCertificateChainArn field's value.
func (s *CertificateAuthenticationRequest) SetClientRootCertificateChainArn(v string) *CertificateAuthenticationRequest {
	s.ClientRootCertificateChainArn = &v
	return s
}

// Provides authorization for Amazon to bring a specific IP address range to
// a specific AWS account using bring your own IP addresses (BYOIP).
type CidrAuthorizationContext struct {
	_ struct{} `type:"structure"`

	// The plain-text authorization message for the prefix and account.
	//
	// Message is a required field
	Message *string `type:"string" required:"true"`

	// The signed authorization message for the prefix and account.
	//
	// Signature is a required field
	Signature *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CidrAuthorizationContext) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CidrAuthorizationContext) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CidrAuthorizationContext) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CidrAuthorizationContext"}
	if s.Message == nil {
		invalidParams.Add(request.NewErrParamRequired("Message"))
	}
	if s.Signature == nil {
		invalidParams.Add(request.NewErrParamRequired("Signature"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetMessage sets the Message field's value.
func (s *CidrAuthorizationContext) SetMessage(v string) *CidrAuthorizationContext {
	s.Message = &v
	return s
}

// SetSignature sets the Signature field's value.
func (s *CidrAuthorizationContext) SetSignature(v string) *CidrAuthorizationContext {
	s.Signature = &v
	return s
}

// Describes an IPv4 CIDR block.
type CidrBlock struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR block.
	CidrBlock *string `locationName:"cidrBlock" type:"string"`
}

// String returns the string representation
func (s CidrBlock) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CidrBlock) GoString() string {
	return s.String()
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *CidrBlock) SetCidrBlock(v string) *CidrBlock {
	s.CidrBlock = &v
	return s
}

// Describes the ClassicLink DNS support status of a VPC.
type ClassicLinkDnsSupport struct {
	_ struct{} `type:"structure"`

	// Indicates whether ClassicLink DNS support is enabled for the VPC.
	ClassicLinkDnsSupported *bool `locationName:"classicLinkDnsSupported" type:"boolean"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s ClassicLinkDnsSupport) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClassicLinkDnsSupport) GoString() string {
	return s.String()
}

// SetClassicLinkDnsSupported sets the ClassicLinkDnsSupported field's value.
func (s *ClassicLinkDnsSupport) SetClassicLinkDnsSupported(v bool) *ClassicLinkDnsSupport {
	s.ClassicLinkDnsSupported = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *ClassicLinkDnsSupport) SetVpcId(v string) *ClassicLinkDnsSupport {
	s.VpcId = &v
	return s
}

// Describes a linked EC2-Classic instance.
type ClassicLinkInstance struct {
	_ struct{} `type:"structure"`

	// A list of security groups.
	Groups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// Any tags assigned to the instance.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s ClassicLinkInstance) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClassicLinkInstance) GoString() string {
	return s.String()
}

// SetGroups sets the Groups field's value.
func (s *ClassicLinkInstance) SetGroups(v []*GroupIdentifier) *ClassicLinkInstance {
	s.Groups = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ClassicLinkInstance) SetInstanceId(v string) *ClassicLinkInstance {
	s.InstanceId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *ClassicLinkInstance) SetTags(v []*Tag) *ClassicLinkInstance {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *ClassicLinkInstance) SetVpcId(v string) *ClassicLinkInstance {
	s.VpcId = &v
	return s
}

// Describes a Classic Load Balancer.
type ClassicLoadBalancer struct {
	_ struct{} `type:"structure"`

	// The name of the load balancer.
	Name *string `locationName:"name" type:"string"`
}

// String returns the string representation
func (s ClassicLoadBalancer) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClassicLoadBalancer) GoString() string {
	return s.String()
}

// SetName sets the Name field's value.
func (s *ClassicLoadBalancer) SetName(v string) *ClassicLoadBalancer {
	s.Name = &v
	return s
}

// Describes the Classic Load Balancers to attach to a Spot Fleet. Spot Fleet
// registers the running Spot Instances with these Classic Load Balancers.
type ClassicLoadBalancersConfig struct {
	_ struct{} `type:"structure"`

	// One or more Classic Load Balancers.
	ClassicLoadBalancers []*ClassicLoadBalancer `locationName:"classicLoadBalancers" locationNameList:"item" min:"1" type:"list"`
}

// String returns the string representation
func (s ClassicLoadBalancersConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClassicLoadBalancersConfig) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ClassicLoadBalancersConfig) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ClassicLoadBalancersConfig"}
	if s.ClassicLoadBalancers != nil && len(s.ClassicLoadBalancers) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ClassicLoadBalancers", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClassicLoadBalancers sets the ClassicLoadBalancers field's value.
func (s *ClassicLoadBalancersConfig) SetClassicLoadBalancers(v []*ClassicLoadBalancer) *ClassicLoadBalancersConfig {
	s.ClassicLoadBalancers = v
	return s
}

// Describes the state of a client certificate revocation list.
type ClientCertificateRevocationListStatus struct {
	_ struct{} `type:"structure"`

	// The state of the client certificate revocation list.
	Code *string `locationName:"code" type:"string" enum:"ClientCertificateRevocationListStatusCode"`

	// A message about the status of the client certificate revocation list, if
	// applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s ClientCertificateRevocationListStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientCertificateRevocationListStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *ClientCertificateRevocationListStatus) SetCode(v string) *ClientCertificateRevocationListStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *ClientCertificateRevocationListStatus) SetMessage(v string) *ClientCertificateRevocationListStatus {
	s.Message = &v
	return s
}

// Describes the client-specific data.
type ClientData struct {
	_ struct{} `type:"structure"`

	// A user-defined comment about the disk upload.
	Comment *string `type:"string"`

	// The time that the disk upload ends.
	UploadEnd *time.Time `type:"timestamp"`

	// The size of the uploaded disk image, in GiB.
	UploadSize *float64 `type:"double"`

	// The time that the disk upload starts.
	UploadStart *time.Time `type:"timestamp"`
}

// String returns the string representation
func (s ClientData) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientData) GoString() string {
	return s.String()
}

// SetComment sets the Comment field's value.
func (s *ClientData) SetComment(v string) *ClientData {
	s.Comment = &v
	return s
}

// SetUploadEnd sets the UploadEnd field's value.
func (s *ClientData) SetUploadEnd(v time.Time) *ClientData {
	s.UploadEnd = &v
	return s
}

// SetUploadSize sets the UploadSize field's value.
func (s *ClientData) SetUploadSize(v float64) *ClientData {
	s.UploadSize = &v
	return s
}

// SetUploadStart sets the UploadStart field's value.
func (s *ClientData) SetUploadStart(v time.Time) *ClientData {
	s.UploadStart = &v
	return s
}

// Describes the authentication methods used by a Client VPN endpoint. Client
// VPN supports Active Directory and mutual authentication. For more information,
// see Authentication (vpn/latest/clientvpn-admin/authentication-authrization.html#client-authentication)
// in the AWS Client VPN Admin Guide.
type ClientVpnAuthentication struct {
	_ struct{} `type:"structure"`

	// Information about the Active Directory, if applicable.
	ActiveDirectory *DirectoryServiceAuthentication `locationName:"activeDirectory" type:"structure"`

	// Information about the authentication certificates, if applicable.
	MutualAuthentication *CertificateAuthentication `locationName:"mutualAuthentication" type:"structure"`

	// The authentication type used.
	Type *string `locationName:"type" type:"string" enum:"ClientVpnAuthenticationType"`
}

// String returns the string representation
func (s ClientVpnAuthentication) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnAuthentication) GoString() string {
	return s.String()
}

// SetActiveDirectory sets the ActiveDirectory field's value.
func (s *ClientVpnAuthentication) SetActiveDirectory(v *DirectoryServiceAuthentication) *ClientVpnAuthentication {
	s.ActiveDirectory = v
	return s
}

// SetMutualAuthentication sets the MutualAuthentication field's value.
func (s *ClientVpnAuthentication) SetMutualAuthentication(v *CertificateAuthentication) *ClientVpnAuthentication {
	s.MutualAuthentication = v
	return s
}

// SetType sets the Type field's value.
func (s *ClientVpnAuthentication) SetType(v string) *ClientVpnAuthentication {
	s.Type = &v
	return s
}

// Describes the authentication method to be used by a Client VPN endpoint.
// Client VPN supports Active Directory and mutual authentication. For more
// information, see Authentication (vpn/latest/clientvpn-admin/authentication-authrization.html#client-authentication)
// in the AWS Client VPN Admin Guide.
type ClientVpnAuthenticationRequest struct {
	_ struct{} `type:"structure"`

	// Information about the Active Directory to be used, if applicable. You must
	// provide this information if Type is directory-service-authentication.
	ActiveDirectory *DirectoryServiceAuthenticationRequest `type:"structure"`

	// Information about the authentication certificates to be used, if applicable.
	// You must provide this information if Type is certificate-authentication.
	MutualAuthentication *CertificateAuthenticationRequest `type:"structure"`

	// The type of client authentication to be used. Specify certificate-authentication
	// to use certificate-based authentication, or directory-service-authentication
	// to use Active Directory authentication.
	Type *string `type:"string" enum:"ClientVpnAuthenticationType"`
}

// String returns the string representation
func (s ClientVpnAuthenticationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnAuthenticationRequest) GoString() string {
	return s.String()
}

// SetActiveDirectory sets the ActiveDirectory field's value.
func (s *ClientVpnAuthenticationRequest) SetActiveDirectory(v *DirectoryServiceAuthenticationRequest) *ClientVpnAuthenticationRequest {
	s.ActiveDirectory = v
	return s
}

// SetMutualAuthentication sets the MutualAuthentication field's value.
func (s *ClientVpnAuthenticationRequest) SetMutualAuthentication(v *CertificateAuthenticationRequest) *ClientVpnAuthenticationRequest {
	s.MutualAuthentication = v
	return s
}

// SetType sets the Type field's value.
func (s *ClientVpnAuthenticationRequest) SetType(v string) *ClientVpnAuthenticationRequest {
	s.Type = &v
	return s
}

// Describes the state of an authorization rule.
type ClientVpnAuthorizationRuleStatus struct {
	_ struct{} `type:"structure"`

	// The state of the authorization rule.
	Code *string `locationName:"code" type:"string" enum:"ClientVpnAuthorizationRuleStatusCode"`

	// A message about the status of the authorization rule, if applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s ClientVpnAuthorizationRuleStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnAuthorizationRuleStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *ClientVpnAuthorizationRuleStatus) SetCode(v string) *ClientVpnAuthorizationRuleStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *ClientVpnAuthorizationRuleStatus) SetMessage(v string) *ClientVpnAuthorizationRuleStatus {
	s.Message = &v
	return s
}

// Describes a client connection.
type ClientVpnConnection struct {
	_ struct{} `type:"structure"`

	// The IP address of the client.
	ClientIp *string `locationName:"clientIp" type:"string"`

	// The ID of the Client VPN endpoint to which the client is connected.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// The common name associated with the client. This is either the name of the
	// client certificate, or the Active Directory user name.
	CommonName *string `locationName:"commonName" type:"string"`

	// The date and time the client connection was terminated.
	ConnectionEndTime *string `locationName:"connectionEndTime" type:"string"`

	// The date and time the client connection was established.
	ConnectionEstablishedTime *string `locationName:"connectionEstablishedTime" type:"string"`

	// The ID of the client connection.
	ConnectionId *string `locationName:"connectionId" type:"string"`

	// The number of bytes received by the client.
	EgressBytes *string `locationName:"egressBytes" type:"string"`

	// The number of packets received by the client.
	EgressPackets *string `locationName:"egressPackets" type:"string"`

	// The number of bytes sent by the client.
	IngressBytes *string `locationName:"ingressBytes" type:"string"`

	// The number of packets sent by the client.
	IngressPackets *string `locationName:"ingressPackets" type:"string"`

	// The current state of the client connection.
	Status *ClientVpnConnectionStatus `locationName:"status" type:"structure"`

	// The current date and time.
	Timestamp *string `locationName:"timestamp" type:"string"`

	// The username of the client who established the client connection. This information
	// is only provided if Active Directory client authentication is used.
	Username *string `locationName:"username" type:"string"`
}

// String returns the string representation
func (s ClientVpnConnection) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnConnection) GoString() string {
	return s.String()
}

// SetClientIp sets the ClientIp field's value.
func (s *ClientVpnConnection) SetClientIp(v string) *ClientVpnConnection {
	s.ClientIp = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ClientVpnConnection) SetClientVpnEndpointId(v string) *ClientVpnConnection {
	s.ClientVpnEndpointId = &v
	return s
}

// SetCommonName sets the CommonName field's value.
func (s *ClientVpnConnection) SetCommonName(v string) *ClientVpnConnection {
	s.CommonName = &v
	return s
}

// SetConnectionEndTime sets the ConnectionEndTime field's value.
func (s *ClientVpnConnection) SetConnectionEndTime(v string) *ClientVpnConnection {
	s.ConnectionEndTime = &v
	return s
}

// SetConnectionEstablishedTime sets the ConnectionEstablishedTime field's value.
func (s *ClientVpnConnection) SetConnectionEstablishedTime(v string) *ClientVpnConnection {
	s.ConnectionEstablishedTime = &v
	return s
}

// SetConnectionId sets the ConnectionId field's value.
func (s *ClientVpnConnection) SetConnectionId(v string) *ClientVpnConnection {
	s.ConnectionId = &v
	return s
}

// SetEgressBytes sets the EgressBytes field's value.
func (s *ClientVpnConnection) SetEgressBytes(v string) *ClientVpnConnection {
	s.EgressBytes = &v
	return s
}

// SetEgressPackets sets the EgressPackets field's value.
func (s *ClientVpnConnection) SetEgressPackets(v string) *ClientVpnConnection {
	s.EgressPackets = &v
	return s
}

// SetIngressBytes sets the IngressBytes field's value.
func (s *ClientVpnConnection) SetIngressBytes(v string) *ClientVpnConnection {
	s.IngressBytes = &v
	return s
}

// SetIngressPackets sets the IngressPackets field's value.
func (s *ClientVpnConnection) SetIngressPackets(v string) *ClientVpnConnection {
	s.IngressPackets = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ClientVpnConnection) SetStatus(v *ClientVpnConnectionStatus) *ClientVpnConnection {
	s.Status = v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *ClientVpnConnection) SetTimestamp(v string) *ClientVpnConnection {
	s.Timestamp = &v
	return s
}

// SetUsername sets the Username field's value.
func (s *ClientVpnConnection) SetUsername(v string) *ClientVpnConnection {
	s.Username = &v
	return s
}

// Describes the status of a client connection.
type ClientVpnConnectionStatus struct {
	_ struct{} `type:"structure"`

	// The state of the client connection.
	Code *string `locationName:"code" type:"string" enum:"ClientVpnConnectionStatusCode"`

	// A message about the status of the client connection, if applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s ClientVpnConnectionStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnConnectionStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *ClientVpnConnectionStatus) SetCode(v string) *ClientVpnConnectionStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *ClientVpnConnectionStatus) SetMessage(v string) *ClientVpnConnectionStatus {
	s.Message = &v
	return s
}

// Describes a Client VPN endpoint.
type ClientVpnEndpoint struct {
	_ struct{} `type:"structure"`

	// Information about the associated target networks. A target network is a subnet
	// in a VPC.
	AssociatedTargetNetworks []*AssociatedTargetNetwork `locationName:"associatedTargetNetwork" locationNameList:"item" type:"list"`

	// Information about the authentication method used by the Client VPN endpoint.
	AuthenticationOptions []*ClientVpnAuthentication `locationName:"authenticationOptions" locationNameList:"item" type:"list"`

	// The IPv4 address range, in CIDR notation, from which client IP addresses
	// are assigned.
	ClientCidrBlock *string `locationName:"clientCidrBlock" type:"string"`

	// The ID of the Client VPN endpoint.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// Information about the client connection logging options for the Client VPN
	// endpoint.
	ConnectionLogOptions *ConnectionLogResponseOptions `locationName:"connectionLogOptions" type:"structure"`

	// The date and time the Client VPN endpoint was created.
	CreationTime *string `locationName:"creationTime" type:"string"`

	// The date and time the Client VPN endpoint was deleted, if applicable. Information
	// about deleted Client VPN endpoints is retained for 24 hours, unless a new
	// Client VPN is created with the same name.
	DeletionTime *string `locationName:"deletionTime" type:"string"`

	// A brief description of the endpoint.
	Description *string `locationName:"description" type:"string"`

	// The DNS name to be used by clients when establishing a connection.
	DnsName *string `locationName:"dnsName" type:"string"`

	// The ARN of the server certificate.
	ServerCertificateArn *string `locationName:"serverCertificateArn" type:"string"`

	// Indicates whether VPN split tunneling is supported.
	SplitTunnel *bool `locationName:"splitTunnel" type:"boolean"`

	// The current state of the Client VPN endpoint.
	Status *ClientVpnEndpointStatus `locationName:"status" type:"structure"`

	// The transport protocol used by the Client VPN endpoint.
	TransportProtocol *string `locationName:"transportProtocol" type:"string" enum:"TransportProtocol"`

	// The protocol used by the VPN session.
	VpnProtocol *string `locationName:"vpnProtocol" type:"string" enum:"VpnProtocol"`
}

// String returns the string representation
func (s ClientVpnEndpoint) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnEndpoint) GoString() string {
	return s.String()
}

// SetAssociatedTargetNetworks sets the AssociatedTargetNetworks field's value.
func (s *ClientVpnEndpoint) SetAssociatedTargetNetworks(v []*AssociatedTargetNetwork) *ClientVpnEndpoint {
	s.AssociatedTargetNetworks = v
	return s
}

// SetAuthenticationOptions sets the AuthenticationOptions field's value.
func (s *ClientVpnEndpoint) SetAuthenticationOptions(v []*ClientVpnAuthentication) *ClientVpnEndpoint {
	s.AuthenticationOptions = v
	return s
}

// SetClientCidrBlock sets the ClientCidrBlock field's value.
func (s *ClientVpnEndpoint) SetClientCidrBlock(v string) *ClientVpnEndpoint {
	s.ClientCidrBlock = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ClientVpnEndpoint) SetClientVpnEndpointId(v string) *ClientVpnEndpoint {
	s.ClientVpnEndpointId = &v
	return s
}

// SetConnectionLogOptions sets the ConnectionLogOptions field's value.
func (s *ClientVpnEndpoint) SetConnectionLogOptions(v *ConnectionLogResponseOptions) *ClientVpnEndpoint {
	s.ConnectionLogOptions = v
	return s
}

// SetCreationTime sets the CreationTime field's value.
func (s *ClientVpnEndpoint) SetCreationTime(v string) *ClientVpnEndpoint {
	s.CreationTime = &v
	return s
}

// SetDeletionTime sets the DeletionTime field's value.
func (s *ClientVpnEndpoint) SetDeletionTime(v string) *ClientVpnEndpoint {
	s.DeletionTime = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ClientVpnEndpoint) SetDescription(v string) *ClientVpnEndpoint {
	s.Description = &v
	return s
}

// SetDnsName sets the DnsName field's value.
func (s *ClientVpnEndpoint) SetDnsName(v string) *ClientVpnEndpoint {
	s.DnsName = &v
	return s
}

// SetServerCertificateArn sets the ServerCertificateArn field's value.
func (s *ClientVpnEndpoint) SetServerCertificateArn(v string) *ClientVpnEndpoint {
	s.ServerCertificateArn = &v
	return s
}

// SetSplitTunnel sets the SplitTunnel field's value.
func (s *ClientVpnEndpoint) SetSplitTunnel(v bool) *ClientVpnEndpoint {
	s.SplitTunnel = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ClientVpnEndpoint) SetStatus(v *ClientVpnEndpointStatus) *ClientVpnEndpoint {
	s.Status = v
	return s
}

// SetTransportProtocol sets the TransportProtocol field's value.
func (s *ClientVpnEndpoint) SetTransportProtocol(v string) *ClientVpnEndpoint {
	s.TransportProtocol = &v
	return s
}

// SetVpnProtocol sets the VpnProtocol field's value.
func (s *ClientVpnEndpoint) SetVpnProtocol(v string) *ClientVpnEndpoint {
	s.VpnProtocol = &v
	return s
}

// Describes the state of a Client VPN endpoint.
type ClientVpnEndpointStatus struct {
	_ struct{} `type:"structure"`

	// The state of the Client VPN endpoint. Possible states include:
	//
	//    * pending-associate - The Client VPN endpoint has been created but no
	//    target networks have been associated. The Client VPN endpoint cannot accept
	//    connections.
	//
	//    * available - The Client VPN endpoint has been created and a target network
	//    has been associated. The Client VPN endpoint can accept connections.
	//
	//    * deleting - The Client VPN endpoint is being deleted. The Client VPN
	//    endpoint cannot accept connections.
	//
	//    * deleted - The Client VPN endpoint has been deleted. The Client VPN endpoint
	//    cannot accept connections.
	Code *string `locationName:"code" type:"string" enum:"ClientVpnEndpointStatusCode"`

	// A message about the status of the Client VPN endpoint.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s ClientVpnEndpointStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnEndpointStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *ClientVpnEndpointStatus) SetCode(v string) *ClientVpnEndpointStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *ClientVpnEndpointStatus) SetMessage(v string) *ClientVpnEndpointStatus {
	s.Message = &v
	return s
}

// Information about a Client VPN endpoint route.
type ClientVpnRoute struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint with which the route is associated.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// A brief description of the route.
	Description *string `locationName:"description" type:"string"`

	// The IPv4 address range, in CIDR notation, of the route destination.
	DestinationCidr *string `locationName:"destinationCidr" type:"string"`

	// Indicates how the route was associated with the Client VPN endpoint. associate
	// indicates that the route was automatically added when the target network
	// was associated with the Client VPN endpoint. add-route indicates that the
	// route was manually added using the CreateClientVpnRoute action.
	Origin *string `locationName:"origin" type:"string"`

	// The current state of the route.
	Status *ClientVpnRouteStatus `locationName:"status" type:"structure"`

	// The ID of the subnet through which traffic is routed.
	TargetSubnet *string `locationName:"targetSubnet" type:"string"`

	// The route type.
	Type *string `locationName:"type" type:"string"`
}

// String returns the string representation
func (s ClientVpnRoute) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnRoute) GoString() string {
	return s.String()
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ClientVpnRoute) SetClientVpnEndpointId(v string) *ClientVpnRoute {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ClientVpnRoute) SetDescription(v string) *ClientVpnRoute {
	s.Description = &v
	return s
}

// SetDestinationCidr sets the DestinationCidr field's value.
func (s *ClientVpnRoute) SetDestinationCidr(v string) *ClientVpnRoute {
	s.DestinationCidr = &v
	return s
}

// SetOrigin sets the Origin field's value.
func (s *ClientVpnRoute) SetOrigin(v string) *ClientVpnRoute {
	s.Origin = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ClientVpnRoute) SetStatus(v *ClientVpnRouteStatus) *ClientVpnRoute {
	s.Status = v
	return s
}

// SetTargetSubnet sets the TargetSubnet field's value.
func (s *ClientVpnRoute) SetTargetSubnet(v string) *ClientVpnRoute {
	s.TargetSubnet = &v
	return s
}

// SetType sets the Type field's value.
func (s *ClientVpnRoute) SetType(v string) *ClientVpnRoute {
	s.Type = &v
	return s
}

// Describes the state of a Client VPN endpoint route.
type ClientVpnRouteStatus struct {
	_ struct{} `type:"structure"`

	// The state of the Client VPN endpoint route.
	Code *string `locationName:"code" type:"string" enum:"ClientVpnRouteStatusCode"`

	// A message about the status of the Client VPN endpoint route, if applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s ClientVpnRouteStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ClientVpnRouteStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *ClientVpnRouteStatus) SetCode(v string) *ClientVpnRouteStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *ClientVpnRouteStatus) SetMessage(v string) *ClientVpnRouteStatus {
	s.Message = &v
	return s
}

type ConfirmProductInstanceInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`

	// The product code. This must be a product code that you own.
	//
	// ProductCode is a required field
	ProductCode *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ConfirmProductInstanceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ConfirmProductInstanceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ConfirmProductInstanceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ConfirmProductInstanceInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.ProductCode == nil {
		invalidParams.Add(request.NewErrParamRequired("ProductCode"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ConfirmProductInstanceInput) SetDryRun(v bool) *ConfirmProductInstanceInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ConfirmProductInstanceInput) SetInstanceId(v string) *ConfirmProductInstanceInput {
	s.InstanceId = &v
	return s
}

// SetProductCode sets the ProductCode field's value.
func (s *ConfirmProductInstanceInput) SetProductCode(v string) *ConfirmProductInstanceInput {
	s.ProductCode = &v
	return s
}

type ConfirmProductInstanceOutput struct {
	_ struct{} `type:"structure"`

	// The AWS account ID of the instance owner. This is only present if the product
	// code is attached to the instance.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The return value of the request. Returns true if the specified product code
	// is owned by the requester and associated with the specified instance.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ConfirmProductInstanceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ConfirmProductInstanceOutput) GoString() string {
	return s.String()
}

// SetOwnerId sets the OwnerId field's value.
func (s *ConfirmProductInstanceOutput) SetOwnerId(v string) *ConfirmProductInstanceOutput {
	s.OwnerId = &v
	return s
}

// SetReturn sets the Return field's value.
func (s *ConfirmProductInstanceOutput) SetReturn(v bool) *ConfirmProductInstanceOutput {
	s.Return = &v
	return s
}

// Describes the client connection logging options for the Client VPN endpoint.
type ConnectionLogOptions struct {
	_ struct{} `type:"structure"`

	// The name of the CloudWatch Logs log group.
	CloudwatchLogGroup *string `type:"string"`

	// The name of the CloudWatch Logs log stream to which the connection data is
	// published.
	CloudwatchLogStream *string `type:"string"`

	// Indicates whether connection logging is enabled.
	Enabled *bool `type:"boolean"`
}

// String returns the string representation
func (s ConnectionLogOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ConnectionLogOptions) GoString() string {
	return s.String()
}

// SetCloudwatchLogGroup sets the CloudwatchLogGroup field's value.
func (s *ConnectionLogOptions) SetCloudwatchLogGroup(v string) *ConnectionLogOptions {
	s.CloudwatchLogGroup = &v
	return s
}

// SetCloudwatchLogStream sets the CloudwatchLogStream field's value.
func (s *ConnectionLogOptions) SetCloudwatchLogStream(v string) *ConnectionLogOptions {
	s.CloudwatchLogStream = &v
	return s
}

// SetEnabled sets the Enabled field's value.
func (s *ConnectionLogOptions) SetEnabled(v bool) *ConnectionLogOptions {
	s.Enabled = &v
	return s
}

// Information about the client connection logging options for a Client VPN
// endpoint.
type ConnectionLogResponseOptions struct {
	_ struct{} `type:"structure"`

	// The name of the Amazon CloudWatch Logs log group to which connection logging
	// data is published.
	CloudwatchLogGroup *string `type:"string"`

	// The name of the Amazon CloudWatch Logs log stream to which connection logging
	// data is published.
	CloudwatchLogStream *string `type:"string"`

	// Indicates whether client connection logging is enabled for the Client VPN
	// endpoint.
	Enabled *bool `type:"boolean"`
}

// String returns the string representation
func (s ConnectionLogResponseOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ConnectionLogResponseOptions) GoString() string {
	return s.String()
}

// SetCloudwatchLogGroup sets the CloudwatchLogGroup field's value.
func (s *ConnectionLogResponseOptions) SetCloudwatchLogGroup(v string) *ConnectionLogResponseOptions {
	s.CloudwatchLogGroup = &v
	return s
}

// SetCloudwatchLogStream sets the CloudwatchLogStream field's value.
func (s *ConnectionLogResponseOptions) SetCloudwatchLogStream(v string) *ConnectionLogResponseOptions {
	s.CloudwatchLogStream = &v
	return s
}

// SetEnabled sets the Enabled field's value.
func (s *ConnectionLogResponseOptions) SetEnabled(v bool) *ConnectionLogResponseOptions {
	s.Enabled = &v
	return s
}

// Describes a connection notification for a VPC endpoint or VPC endpoint service.
type ConnectionNotification struct {
	_ struct{} `type:"structure"`

	// The events for the notification. Valid values are Accept, Connect, Delete,
	// and Reject.
	ConnectionEvents []*string `locationName:"connectionEvents" locationNameList:"item" type:"list"`

	// The ARN of the SNS topic for the notification.
	ConnectionNotificationArn *string `locationName:"connectionNotificationArn" type:"string"`

	// The ID of the notification.
	ConnectionNotificationId *string `locationName:"connectionNotificationId" type:"string"`

	// The state of the notification.
	ConnectionNotificationState *string `locationName:"connectionNotificationState" type:"string" enum:"ConnectionNotificationState"`

	// The type of notification.
	ConnectionNotificationType *string `locationName:"connectionNotificationType" type:"string" enum:"ConnectionNotificationType"`

	// The ID of the endpoint service.
	ServiceId *string `locationName:"serviceId" type:"string"`

	// The ID of the VPC endpoint.
	VpcEndpointId *string `locationName:"vpcEndpointId" type:"string"`
}

// String returns the string representation
func (s ConnectionNotification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ConnectionNotification) GoString() string {
	return s.String()
}

// SetConnectionEvents sets the ConnectionEvents field's value.
func (s *ConnectionNotification) SetConnectionEvents(v []*string) *ConnectionNotification {
	s.ConnectionEvents = v
	return s
}

// SetConnectionNotificationArn sets the ConnectionNotificationArn field's value.
func (s *ConnectionNotification) SetConnectionNotificationArn(v string) *ConnectionNotification {
	s.ConnectionNotificationArn = &v
	return s
}

// SetConnectionNotificationId sets the ConnectionNotificationId field's value.
func (s *ConnectionNotification) SetConnectionNotificationId(v string) *ConnectionNotification {
	s.ConnectionNotificationId = &v
	return s
}

// SetConnectionNotificationState sets the ConnectionNotificationState field's value.
func (s *ConnectionNotification) SetConnectionNotificationState(v string) *ConnectionNotification {
	s.ConnectionNotificationState = &v
	return s
}

// SetConnectionNotificationType sets the ConnectionNotificationType field's value.
func (s *ConnectionNotification) SetConnectionNotificationType(v string) *ConnectionNotification {
	s.ConnectionNotificationType = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *ConnectionNotification) SetServiceId(v string) *ConnectionNotification {
	s.ServiceId = &v
	return s
}

// SetVpcEndpointId sets the VpcEndpointId field's value.
func (s *ConnectionNotification) SetVpcEndpointId(v string) *ConnectionNotification {
	s.VpcEndpointId = &v
	return s
}

// Describes a conversion task.
type ConversionTask struct {
	_ struct{} `type:"structure"`

	// The ID of the conversion task.
	ConversionTaskId *string `locationName:"conversionTaskId" type:"string"`

	// The time when the task expires. If the upload isn't complete before the expiration
	// time, we automatically cancel the task.
	ExpirationTime *string `locationName:"expirationTime" type:"string"`

	// If the task is for importing an instance, this contains information about
	// the import instance task.
	ImportInstance *ImportInstanceTaskDetails `locationName:"importInstance" type:"structure"`

	// If the task is for importing a volume, this contains information about the
	// import volume task.
	ImportVolume *ImportVolumeTaskDetails `locationName:"importVolume" type:"structure"`

	// The state of the conversion task.
	State *string `locationName:"state" type:"string" enum:"ConversionTaskState"`

	// The status message related to the conversion task.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// Any tags assigned to the task.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ConversionTask) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ConversionTask) GoString() string {
	return s.String()
}

// SetConversionTaskId sets the ConversionTaskId field's value.
func (s *ConversionTask) SetConversionTaskId(v string) *ConversionTask {
	s.ConversionTaskId = &v
	return s
}

// SetExpirationTime sets the ExpirationTime field's value.
func (s *ConversionTask) SetExpirationTime(v string) *ConversionTask {
	s.ExpirationTime = &v
	return s
}

// SetImportInstance sets the ImportInstance field's value.
func (s *ConversionTask) SetImportInstance(v *ImportInstanceTaskDetails) *ConversionTask {
	s.ImportInstance = v
	return s
}

// SetImportVolume sets the ImportVolume field's value.
func (s *ConversionTask) SetImportVolume(v *ImportVolumeTaskDetails) *ConversionTask {
	s.ImportVolume = v
	return s
}

// SetState sets the State field's value.
func (s *ConversionTask) SetState(v string) *ConversionTask {
	s.State = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ConversionTask) SetStatusMessage(v string) *ConversionTask {
	s.StatusMessage = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *ConversionTask) SetTags(v []*Tag) *ConversionTask {
	s.Tags = v
	return s
}

type CopyFpgaImageInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// The description for the new AFI.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The name for the new AFI. The default is the name of the source AFI.
	Name *string `type:"string"`

	// The ID of the source AFI.
	//
	// SourceFpgaImageId is a required field
	SourceFpgaImageId *string `type:"string" required:"true"`

	// The region that contains the source AFI.
	//
	// SourceRegion is a required field
	SourceRegion *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CopyFpgaImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CopyFpgaImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CopyFpgaImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CopyFpgaImageInput"}
	if s.SourceFpgaImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("SourceFpgaImageId"))
	}
	if s.SourceRegion == nil {
		invalidParams.Add(request.NewErrParamRequired("SourceRegion"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CopyFpgaImageInput) SetClientToken(v string) *CopyFpgaImageInput {
	s.ClientToken = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *CopyFpgaImageInput) SetDescription(v string) *CopyFpgaImageInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CopyFpgaImageInput) SetDryRun(v bool) *CopyFpgaImageInput {
	s.DryRun = &v
	return s
}

// SetName sets the Name field's value.
func (s *CopyFpgaImageInput) SetName(v string) *CopyFpgaImageInput {
	s.Name = &v
	return s
}

// SetSourceFpgaImageId sets the SourceFpgaImageId field's value.
func (s *CopyFpgaImageInput) SetSourceFpgaImageId(v string) *CopyFpgaImageInput {
	s.SourceFpgaImageId = &v
	return s
}

// SetSourceRegion sets the SourceRegion field's value.
func (s *CopyFpgaImageInput) SetSourceRegion(v string) *CopyFpgaImageInput {
	s.SourceRegion = &v
	return s
}

type CopyFpgaImageOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the new AFI.
	FpgaImageId *string `locationName:"fpgaImageId" type:"string"`
}

// String returns the string representation
func (s CopyFpgaImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CopyFpgaImageOutput) GoString() string {
	return s.String()
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *CopyFpgaImageOutput) SetFpgaImageId(v string) *CopyFpgaImageOutput {
	s.FpgaImageId = &v
	return s
}

// Contains the parameters for CopyImage.
type CopyImageInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure idempotency of the
	// request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	ClientToken *string `type:"string"`

	// A description for the new AMI in the destination region.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Specifies whether the destination snapshots of the copied image should be
	// encrypted. You can encrypt a copy of an unencrypted snapshot, but you cannot
	// create an unencrypted copy of an encrypted snapshot. The default CMK for
	// EBS is used unless you specify a non-default AWS Key Management Service (AWS
	// KMS) CMK using KmsKeyId. For more information, see Amazon EBS Encryption
	// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// An identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) to use when creating the encrypted volume. This parameter is only
	// required if you want to use a non-default CMK; if this parameter is not specified,
	// the default CMK for EBS is used. If a KmsKeyId is specified, the Encrypted
	// flag must also be set.
	//
	// The CMK identifier may be provided in any of the following formats:
	//
	//    * Key ID
	//
	//    * Key alias, in the form alias/ExampleAlias
	//
	//    * ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed
	//    by the region of the CMK, the AWS account ID of the CMK owner, the key
	//    namespace, and then the CMK ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.
	//
	//
	//    * ARN using key alias. The alias ARN contains the arn:aws:kms namespace,
	//    followed by the region of the CMK, the AWS account ID of the CMK owner,
	//    the alias namespace, and then the CMK alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.
	//
	//
	// AWS parses KmsKeyId asynchronously, meaning that the action you call may
	// appear to complete even though you provided an invalid identifier. This action
	// will eventually report failure.
	//
	// The specified CMK must exist in the region that the snapshot is being copied
	// to.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// The name of the new AMI in the destination region.
	//
	// Name is a required field
	Name *string `type:"string" required:"true"`

	// The ID of the AMI to copy.
	//
	// SourceImageId is a required field
	SourceImageId *string `type:"string" required:"true"`

	// The name of the region that contains the AMI to copy.
	//
	// SourceRegion is a required field
	SourceRegion *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CopyImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CopyImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CopyImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CopyImageInput"}
	if s.Name == nil {
		invalidParams.Add(request.NewErrParamRequired("Name"))
	}
	if s.SourceImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("SourceImageId"))
	}
	if s.SourceRegion == nil {
		invalidParams.Add(request.NewErrParamRequired("SourceRegion"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CopyImageInput) SetClientToken(v string) *CopyImageInput {
	s.ClientToken = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *CopyImageInput) SetDescription(v string) *CopyImageInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CopyImageInput) SetDryRun(v bool) *CopyImageInput {
	s.DryRun = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *CopyImageInput) SetEncrypted(v bool) *CopyImageInput {
	s.Encrypted = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *CopyImageInput) SetKmsKeyId(v string) *CopyImageInput {
	s.KmsKeyId = &v
	return s
}

// SetName sets the Name field's value.
func (s *CopyImageInput) SetName(v string) *CopyImageInput {
	s.Name = &v
	return s
}

// SetSourceImageId sets the SourceImageId field's value.
func (s *CopyImageInput) SetSourceImageId(v string) *CopyImageInput {
	s.SourceImageId = &v
	return s
}

// SetSourceRegion sets the SourceRegion field's value.
func (s *CopyImageInput) SetSourceRegion(v string) *CopyImageInput {
	s.SourceRegion = &v
	return s
}

// Contains the output of CopyImage.
type CopyImageOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the new AMI.
	ImageId *string `locationName:"imageId" type:"string"`
}

// String returns the string representation
func (s CopyImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CopyImageOutput) GoString() string {
	return s.String()
}

// SetImageId sets the ImageId field's value.
func (s *CopyImageOutput) SetImageId(v string) *CopyImageOutput {
	s.ImageId = &v
	return s
}

// Contains the parameters for CopySnapshot.
type CopySnapshotInput struct {
	_ struct{} `type:"structure"`

	// A description for the EBS snapshot.
	Description *string `type:"string"`

	// The destination region to use in the PresignedUrl parameter of a snapshot
	// copy operation. This parameter is only valid for specifying the destination
	// region in a PresignedUrl parameter, where it is required.
	//
	// The snapshot copy is sent to the regional endpoint that you sent the HTTP
	// request to (for example, ec2.us-east-1.amazonaws.com). With the AWS CLI,
	// this is specified using the --region parameter or the default region in your
	// AWS configuration file.
	DestinationRegion *string `locationName:"destinationRegion" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Specifies whether the destination snapshot should be encrypted. You can encrypt
	// a copy of an unencrypted snapshot, but you cannot use it to create an unencrypted
	// copy of an encrypted snapshot. Your default CMK for EBS is used unless you
	// specify a non-default AWS Key Management Service (AWS KMS) CMK using KmsKeyId.
	// For more information, see Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// An identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) to use when creating the encrypted volume. This parameter is only
	// required if you want to use a non-default CMK; if this parameter is not specified,
	// the default CMK for EBS is used. If a KmsKeyId is specified, the Encrypted
	// flag must also be set.
	//
	// The CMK identifier may be provided in any of the following formats:
	//
	//    * Key ID
	//
	//    * Key alias
	//
	//    * ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed
	//    by the region of the CMK, the AWS account ID of the CMK owner, the key
	//    namespace, and then the CMK ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.
	//
	//
	//    * ARN using key alias. The alias ARN contains the arn:aws:kms namespace,
	//    followed by the region of the CMK, the AWS account ID of the CMK owner,
	//    the alias namespace, and then the CMK alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.
	//
	//
	// AWS parses KmsKeyId asynchronously, meaning that the action you call may
	// appear to complete even though you provided an invalid identifier. The action
	// will eventually fail.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// When you copy an encrypted source snapshot using the Amazon EC2 Query API,
	// you must supply a pre-signed URL. This parameter is optional for unencrypted
	// snapshots. For more information, see Query Requests (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html).
	//
	// The PresignedUrl should use the snapshot source endpoint, the CopySnapshot
	// action, and include the SourceRegion, SourceSnapshotId, and DestinationRegion
	// parameters. The PresignedUrl must be signed using AWS Signature Version 4.
	// Because EBS snapshots are stored in Amazon S3, the signing algorithm for
	// this parameter uses the same logic that is described in Authenticating Requests
	// by Using Query Parameters (AWS Signature Version 4) (https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html)
	// in the Amazon Simple Storage Service API Reference. An invalid or improperly
	// signed PresignedUrl will cause the copy operation to fail asynchronously,
	// and the snapshot will move to an error state.
	PresignedUrl *string `locationName:"presignedUrl" type:"string"`

	// The ID of the region that contains the snapshot to be copied.
	//
	// SourceRegion is a required field
	SourceRegion *string `type:"string" required:"true"`

	// The ID of the EBS snapshot to copy.
	//
	// SourceSnapshotId is a required field
	SourceSnapshotId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CopySnapshotInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CopySnapshotInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CopySnapshotInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CopySnapshotInput"}
	if s.SourceRegion == nil {
		invalidParams.Add(request.NewErrParamRequired("SourceRegion"))
	}
	if s.SourceSnapshotId == nil {
		invalidParams.Add(request.NewErrParamRequired("SourceSnapshotId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *CopySnapshotInput) SetDescription(v string) *CopySnapshotInput {
	s.Description = &v
	return s
}

// SetDestinationRegion sets the DestinationRegion field's value.
func (s *CopySnapshotInput) SetDestinationRegion(v string) *CopySnapshotInput {
	s.DestinationRegion = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CopySnapshotInput) SetDryRun(v bool) *CopySnapshotInput {
	s.DryRun = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *CopySnapshotInput) SetEncrypted(v bool) *CopySnapshotInput {
	s.Encrypted = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *CopySnapshotInput) SetKmsKeyId(v string) *CopySnapshotInput {
	s.KmsKeyId = &v
	return s
}

// SetPresignedUrl sets the PresignedUrl field's value.
func (s *CopySnapshotInput) SetPresignedUrl(v string) *CopySnapshotInput {
	s.PresignedUrl = &v
	return s
}

// SetSourceRegion sets the SourceRegion field's value.
func (s *CopySnapshotInput) SetSourceRegion(v string) *CopySnapshotInput {
	s.SourceRegion = &v
	return s
}

// SetSourceSnapshotId sets the SourceSnapshotId field's value.
func (s *CopySnapshotInput) SetSourceSnapshotId(v string) *CopySnapshotInput {
	s.SourceSnapshotId = &v
	return s
}

// Contains the output of CopySnapshot.
type CopySnapshotOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the new snapshot.
	SnapshotId *string `locationName:"snapshotId" type:"string"`
}

// String returns the string representation
func (s CopySnapshotOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CopySnapshotOutput) GoString() string {
	return s.String()
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *CopySnapshotOutput) SetSnapshotId(v string) *CopySnapshotOutput {
	s.SnapshotId = &v
	return s
}

// The CPU options for the instance.
type CpuOptions struct {
	_ struct{} `type:"structure"`

	// The number of CPU cores for the instance.
	CoreCount *int64 `locationName:"coreCount" type:"integer"`

	// The number of threads per CPU core.
	ThreadsPerCore *int64 `locationName:"threadsPerCore" type:"integer"`
}

// String returns the string representation
func (s CpuOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CpuOptions) GoString() string {
	return s.String()
}

// SetCoreCount sets the CoreCount field's value.
func (s *CpuOptions) SetCoreCount(v int64) *CpuOptions {
	s.CoreCount = &v
	return s
}

// SetThreadsPerCore sets the ThreadsPerCore field's value.
func (s *CpuOptions) SetThreadsPerCore(v int64) *CpuOptions {
	s.ThreadsPerCore = &v
	return s
}

// The CPU options for the instance. Both the core count and threads per core
// must be specified in the request.
type CpuOptionsRequest struct {
	_ struct{} `type:"structure"`

	// The number of CPU cores for the instance.
	CoreCount *int64 `type:"integer"`

	// The number of threads per CPU core. To disable Intel Hyper-Threading Technology
	// for the instance, specify a value of 1. Otherwise, specify the default value
	// of 2.
	ThreadsPerCore *int64 `type:"integer"`
}

// String returns the string representation
func (s CpuOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CpuOptionsRequest) GoString() string {
	return s.String()
}

// SetCoreCount sets the CoreCount field's value.
func (s *CpuOptionsRequest) SetCoreCount(v int64) *CpuOptionsRequest {
	s.CoreCount = &v
	return s
}

// SetThreadsPerCore sets the ThreadsPerCore field's value.
func (s *CpuOptionsRequest) SetThreadsPerCore(v int64) *CpuOptionsRequest {
	s.ThreadsPerCore = &v
	return s
}

type CreateCapacityReservationInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which to create the Capacity Reservation.
	//
	// AvailabilityZone is a required field
	AvailabilityZone *string `type:"string" required:"true"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	//
	// Constraint: Maximum 64 ASCII characters.
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Indicates whether the Capacity Reservation supports EBS-optimized instances.
	// This optimization provides dedicated throughput to Amazon EBS and an optimized
	// configuration stack to provide optimal I/O performance. This optimization
	// isn't available with all instance types. Additional usage charges apply when
	// using an EBS- optimized instance.
	EbsOptimized *bool `type:"boolean"`

	// The date and time at which the Capacity Reservation expires. When a Capacity
	// Reservation expires, the reserved capacity is released and you can no longer
	// launch instances into it. The Capacity Reservation's state changes to expired
	// when it reaches its end date and time.
	//
	// You must provide an EndDate value if EndDateType is limited. Omit EndDate
	// if EndDateType is unlimited.
	//
	// If the EndDateType is limited, the Capacity Reservation is cancelled within
	// an hour from the specified time. For example, if you specify 5/31/2019, 13:30:55,
	// the Capacity Reservation is guaranteed to end between 13:30:55 and 14:30:55
	// on 5/31/2019.
	EndDate *time.Time `type:"timestamp"`

	// Indicates the way in which the Capacity Reservation ends. A Capacity Reservation
	// can have one of the following end types:
	//
	//    * unlimited - The Capacity Reservation remains active until you explicitly
	//    cancel it. Do not provide an EndDate if the EndDateType is unlimited.
	//
	//    * limited - The Capacity Reservation expires automatically at a specified
	//    date and time. You must provide an EndDate value if the EndDateType value
	//    is limited.
	EndDateType *string `type:"string" enum:"EndDateType"`

	// Indicates whether the Capacity Reservation supports instances with temporary,
	// block-level storage.
	EphemeralStorage *bool `type:"boolean"`

	// The number of instances for which to reserve capacity.
	//
	// InstanceCount is a required field
	InstanceCount *int64 `type:"integer" required:"true"`

	// Indicates the type of instance launches that the Capacity Reservation accepts.
	// The options include:
	//
	//    * open - The Capacity Reservation automatically matches all instances
	//    that have matching attributes (instance type, platform, and Availability
	//    Zone). Instances that have matching attributes run in the Capacity Reservation
	//    automatically without specifying any additional parameters.
	//
	//    * targeted - The Capacity Reservation only accepts instances that have
	//    matching attributes (instance type, platform, and Availability Zone),
	//    and explicitly target the Capacity Reservation. This ensures that only
	//    permitted instances can use the reserved capacity.
	//
	// Default: open
	InstanceMatchCriteria *string `type:"string" enum:"InstanceMatchCriteria"`

	// The type of operating system for which to reserve capacity.
	//
	// InstancePlatform is a required field
	InstancePlatform *string `type:"string" required:"true" enum:"CapacityReservationInstancePlatform"`

	// The instance type for which to reserve capacity. For more information, see
	// Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// InstanceType is a required field
	InstanceType *string `type:"string" required:"true"`

	// The tags to apply to the Capacity Reservation during launch.
	TagSpecifications []*TagSpecification `locationNameList:"item" type:"list"`

	// Indicates the tenancy of the Capacity Reservation. A Capacity Reservation
	// can have one of the following tenancy settings:
	//
	//    * default - The Capacity Reservation is created on hardware that is shared
	//    with other AWS accounts.
	//
	//    * dedicated - The Capacity Reservation is created on single-tenant hardware
	//    that is dedicated to a single AWS account.
	Tenancy *string `type:"string" enum:"CapacityReservationTenancy"`
}

// String returns the string representation
func (s CreateCapacityReservationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateCapacityReservationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateCapacityReservationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateCapacityReservationInput"}
	if s.AvailabilityZone == nil {
		invalidParams.Add(request.NewErrParamRequired("AvailabilityZone"))
	}
	if s.InstanceCount == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceCount"))
	}
	if s.InstancePlatform == nil {
		invalidParams.Add(request.NewErrParamRequired("InstancePlatform"))
	}
	if s.InstanceType == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceType"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CreateCapacityReservationInput) SetAvailabilityZone(v string) *CreateCapacityReservationInput {
	s.AvailabilityZone = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateCapacityReservationInput) SetClientToken(v string) *CreateCapacityReservationInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateCapacityReservationInput) SetDryRun(v bool) *CreateCapacityReservationInput {
	s.DryRun = &v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *CreateCapacityReservationInput) SetEbsOptimized(v bool) *CreateCapacityReservationInput {
	s.EbsOptimized = &v
	return s
}

// SetEndDate sets the EndDate field's value.
func (s *CreateCapacityReservationInput) SetEndDate(v time.Time) *CreateCapacityReservationInput {
	s.EndDate = &v
	return s
}

// SetEndDateType sets the EndDateType field's value.
func (s *CreateCapacityReservationInput) SetEndDateType(v string) *CreateCapacityReservationInput {
	s.EndDateType = &v
	return s
}

// SetEphemeralStorage sets the EphemeralStorage field's value.
func (s *CreateCapacityReservationInput) SetEphemeralStorage(v bool) *CreateCapacityReservationInput {
	s.EphemeralStorage = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *CreateCapacityReservationInput) SetInstanceCount(v int64) *CreateCapacityReservationInput {
	s.InstanceCount = &v
	return s
}

// SetInstanceMatchCriteria sets the InstanceMatchCriteria field's value.
func (s *CreateCapacityReservationInput) SetInstanceMatchCriteria(v string) *CreateCapacityReservationInput {
	s.InstanceMatchCriteria = &v
	return s
}

// SetInstancePlatform sets the InstancePlatform field's value.
func (s *CreateCapacityReservationInput) SetInstancePlatform(v string) *CreateCapacityReservationInput {
	s.InstancePlatform = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *CreateCapacityReservationInput) SetInstanceType(v string) *CreateCapacityReservationInput {
	s.InstanceType = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateCapacityReservationInput) SetTagSpecifications(v []*TagSpecification) *CreateCapacityReservationInput {
	s.TagSpecifications = v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *CreateCapacityReservationInput) SetTenancy(v string) *CreateCapacityReservationInput {
	s.Tenancy = &v
	return s
}

type CreateCapacityReservationOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Capacity Reservation.
	CapacityReservation *CapacityReservation `locationName:"capacityReservation" type:"structure"`
}

// String returns the string representation
func (s CreateCapacityReservationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateCapacityReservationOutput) GoString() string {
	return s.String()
}

// SetCapacityReservation sets the CapacityReservation field's value.
func (s *CreateCapacityReservationOutput) SetCapacityReservation(v *CapacityReservation) *CreateCapacityReservationOutput {
	s.CapacityReservation = v
	return s
}

type CreateClientVpnEndpointInput struct {
	_ struct{} `type:"structure"`

	// Information about the authentication method to be used to authenticate clients.
	//
	// AuthenticationOptions is a required field
	AuthenticationOptions []*ClientVpnAuthenticationRequest `locationName:"Authentication" type:"list" required:"true"`

	// The IPv4 address range, in CIDR notation, from which to assign client IP
	// addresses. The address range cannot overlap with the local CIDR of the VPC
	// in which the associated subnet is located, or the routes that you add manually.
	// The address range cannot be changed after the Client VPN endpoint has been
	// created. The CIDR block should be /22 or greater.
	//
	// ClientCidrBlock is a required field
	ClientCidrBlock *string `type:"string" required:"true"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see  How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string" idempotencyToken:"true"`

	// Information about the client connection logging options.
	//
	// If you enable client connection logging, data about client connections is
	// sent to a Cloudwatch Logs log stream. The following information is logged:
	//
	//    * Client connection requests
	//
	//    * Client connection results (successful and unsuccessful)
	//
	//    * Reasons for unsuccessful client connection requests
	//
	//    * Client connection termination time
	//
	// ConnectionLogOptions is a required field
	ConnectionLogOptions *ConnectionLogOptions `type:"structure" required:"true"`

	// A brief description of the Client VPN endpoint.
	Description *string `type:"string"`

	// Information about the DNS servers to be used for DNS resolution. A Client
	// VPN endpoint can have up to two DNS servers. If no DNS server is specified,
	// the DNS address of the VPC that is to be associated with Client VPN endpoint
	// is used as the DNS server.
	DnsServers []*string `locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ARN of the server certificate. For more information, see the AWS Certificate
	// Manager User Guide (acm/latest/userguide/acm-overview.html) .
	//
	// ServerCertificateArn is a required field
	ServerCertificateArn *string `type:"string" required:"true"`

	// The transport protocol to be used by the VPN session.
	//
	// Default value: udp
	TransportProtocol *string `type:"string" enum:"TransportProtocol"`
}

// String returns the string representation
func (s CreateClientVpnEndpointInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateClientVpnEndpointInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateClientVpnEndpointInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateClientVpnEndpointInput"}
	if s.AuthenticationOptions == nil {
		invalidParams.Add(request.NewErrParamRequired("AuthenticationOptions"))
	}
	if s.ClientCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientCidrBlock"))
	}
	if s.ConnectionLogOptions == nil {
		invalidParams.Add(request.NewErrParamRequired("ConnectionLogOptions"))
	}
	if s.ServerCertificateArn == nil {
		invalidParams.Add(request.NewErrParamRequired("ServerCertificateArn"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAuthenticationOptions sets the AuthenticationOptions field's value.
func (s *CreateClientVpnEndpointInput) SetAuthenticationOptions(v []*ClientVpnAuthenticationRequest) *CreateClientVpnEndpointInput {
	s.AuthenticationOptions = v
	return s
}

// SetClientCidrBlock sets the ClientCidrBlock field's value.
func (s *CreateClientVpnEndpointInput) SetClientCidrBlock(v string) *CreateClientVpnEndpointInput {
	s.ClientCidrBlock = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateClientVpnEndpointInput) SetClientToken(v string) *CreateClientVpnEndpointInput {
	s.ClientToken = &v
	return s
}

// SetConnectionLogOptions sets the ConnectionLogOptions field's value.
func (s *CreateClientVpnEndpointInput) SetConnectionLogOptions(v *ConnectionLogOptions) *CreateClientVpnEndpointInput {
	s.ConnectionLogOptions = v
	return s
}

// SetDescription sets the Description field's value.
func (s *CreateClientVpnEndpointInput) SetDescription(v string) *CreateClientVpnEndpointInput {
	s.Description = &v
	return s
}

// SetDnsServers sets the DnsServers field's value.
func (s *CreateClientVpnEndpointInput) SetDnsServers(v []*string) *CreateClientVpnEndpointInput {
	s.DnsServers = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateClientVpnEndpointInput) SetDryRun(v bool) *CreateClientVpnEndpointInput {
	s.DryRun = &v
	return s
}

// SetServerCertificateArn sets the ServerCertificateArn field's value.
func (s *CreateClientVpnEndpointInput) SetServerCertificateArn(v string) *CreateClientVpnEndpointInput {
	s.ServerCertificateArn = &v
	return s
}

// SetTransportProtocol sets the TransportProtocol field's value.
func (s *CreateClientVpnEndpointInput) SetTransportProtocol(v string) *CreateClientVpnEndpointInput {
	s.TransportProtocol = &v
	return s
}

type CreateClientVpnEndpointOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// The DNS name to be used by clients when establishing their VPN session.
	DnsName *string `locationName:"dnsName" type:"string"`

	// The current state of the Client VPN endpoint.
	Status *ClientVpnEndpointStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s CreateClientVpnEndpointOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateClientVpnEndpointOutput) GoString() string {
	return s.String()
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *CreateClientVpnEndpointOutput) SetClientVpnEndpointId(v string) *CreateClientVpnEndpointOutput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDnsName sets the DnsName field's value.
func (s *CreateClientVpnEndpointOutput) SetDnsName(v string) *CreateClientVpnEndpointOutput {
	s.DnsName = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *CreateClientVpnEndpointOutput) SetStatus(v *ClientVpnEndpointStatus) *CreateClientVpnEndpointOutput {
	s.Status = v
	return s
}

type CreateClientVpnRouteInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint to which to add the route.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// A brief description of the route.
	Description *string `type:"string"`

	// The IPv4 address range, in CIDR notation, of the route destination. For example:
	//
	//    * To add a route for Internet access, enter 0.0.0.0/0
	//
	//    * To add a route for a peered VPC, enter the peered VPC's IPv4 CIDR range
	//
	//    * To add a route for an on-premises network, enter the AWS Site-to-Site
	//    VPN connection's IPv4 CIDR range
	//
	// Route address ranges cannot overlap with the CIDR range specified for client
	// allocation.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the subnet through which you want to route traffic. The specified
	// subnet must be an existing target network of the Client VPN endpoint.
	//
	// TargetVpcSubnetId is a required field
	TargetVpcSubnetId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateClientVpnRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateClientVpnRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateClientVpnRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateClientVpnRouteInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}
	if s.TargetVpcSubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetVpcSubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *CreateClientVpnRouteInput) SetClientVpnEndpointId(v string) *CreateClientVpnRouteInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *CreateClientVpnRouteInput) SetDescription(v string) *CreateClientVpnRouteInput {
	s.Description = &v
	return s
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *CreateClientVpnRouteInput) SetDestinationCidrBlock(v string) *CreateClientVpnRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateClientVpnRouteInput) SetDryRun(v bool) *CreateClientVpnRouteInput {
	s.DryRun = &v
	return s
}

// SetTargetVpcSubnetId sets the TargetVpcSubnetId field's value.
func (s *CreateClientVpnRouteInput) SetTargetVpcSubnetId(v string) *CreateClientVpnRouteInput {
	s.TargetVpcSubnetId = &v
	return s
}

type CreateClientVpnRouteOutput struct {
	_ struct{} `type:"structure"`

	// The current state of the route.
	Status *ClientVpnRouteStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s CreateClientVpnRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateClientVpnRouteOutput) GoString() string {
	return s.String()
}

// SetStatus sets the Status field's value.
func (s *CreateClientVpnRouteOutput) SetStatus(v *ClientVpnRouteStatus) *CreateClientVpnRouteOutput {
	s.Status = v
	return s
}

// Contains the parameters for CreateCustomerGateway.
type CreateCustomerGatewayInput struct {
	_ struct{} `type:"structure"`

	// For devices that support BGP, the customer gateway's BGP ASN.
	//
	// Default: 65000
	//
	// BgpAsn is a required field
	BgpAsn *int64 `type:"integer" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The Internet-routable IP address for the customer gateway's outside interface.
	// The address must be static.
	//
	// PublicIp is a required field
	PublicIp *string `locationName:"IpAddress" type:"string" required:"true"`

	// The type of VPN connection that this customer gateway supports (ipsec.1).
	//
	// Type is a required field
	Type *string `type:"string" required:"true" enum:"GatewayType"`
}

// String returns the string representation
func (s CreateCustomerGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateCustomerGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateCustomerGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateCustomerGatewayInput"}
	if s.BgpAsn == nil {
		invalidParams.Add(request.NewErrParamRequired("BgpAsn"))
	}
	if s.PublicIp == nil {
		invalidParams.Add(request.NewErrParamRequired("PublicIp"))
	}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBgpAsn sets the BgpAsn field's value.
func (s *CreateCustomerGatewayInput) SetBgpAsn(v int64) *CreateCustomerGatewayInput {
	s.BgpAsn = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateCustomerGatewayInput) SetDryRun(v bool) *CreateCustomerGatewayInput {
	s.DryRun = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *CreateCustomerGatewayInput) SetPublicIp(v string) *CreateCustomerGatewayInput {
	s.PublicIp = &v
	return s
}

// SetType sets the Type field's value.
func (s *CreateCustomerGatewayInput) SetType(v string) *CreateCustomerGatewayInput {
	s.Type = &v
	return s
}

// Contains the output of CreateCustomerGateway.
type CreateCustomerGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Information about the customer gateway.
	CustomerGateway *CustomerGateway `locationName:"customerGateway" type:"structure"`
}

// String returns the string representation
func (s CreateCustomerGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateCustomerGatewayOutput) GoString() string {
	return s.String()
}

// SetCustomerGateway sets the CustomerGateway field's value.
func (s *CreateCustomerGatewayOutput) SetCustomerGateway(v *CustomerGateway) *CreateCustomerGatewayOutput {
	s.CustomerGateway = v
	return s
}

type CreateDefaultSubnetInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which to create the default subnet.
	//
	// AvailabilityZone is a required field
	AvailabilityZone *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s CreateDefaultSubnetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateDefaultSubnetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateDefaultSubnetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateDefaultSubnetInput"}
	if s.AvailabilityZone == nil {
		invalidParams.Add(request.NewErrParamRequired("AvailabilityZone"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CreateDefaultSubnetInput) SetAvailabilityZone(v string) *CreateDefaultSubnetInput {
	s.AvailabilityZone = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateDefaultSubnetInput) SetDryRun(v bool) *CreateDefaultSubnetInput {
	s.DryRun = &v
	return s
}

type CreateDefaultSubnetOutput struct {
	_ struct{} `type:"structure"`

	// Information about the subnet.
	Subnet *Subnet `locationName:"subnet" type:"structure"`
}

// String returns the string representation
func (s CreateDefaultSubnetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateDefaultSubnetOutput) GoString() string {
	return s.String()
}

// SetSubnet sets the Subnet field's value.
func (s *CreateDefaultSubnetOutput) SetSubnet(v *Subnet) *CreateDefaultSubnetOutput {
	s.Subnet = v
	return s
}

type CreateDefaultVpcInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s CreateDefaultVpcInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateDefaultVpcInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *CreateDefaultVpcInput) SetDryRun(v bool) *CreateDefaultVpcInput {
	s.DryRun = &v
	return s
}

type CreateDefaultVpcOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC.
	Vpc *Vpc `locationName:"vpc" type:"structure"`
}

// String returns the string representation
func (s CreateDefaultVpcOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateDefaultVpcOutput) GoString() string {
	return s.String()
}

// SetVpc sets the Vpc field's value.
func (s *CreateDefaultVpcOutput) SetVpc(v *Vpc) *CreateDefaultVpcOutput {
	s.Vpc = v
	return s
}

type CreateDhcpOptionsInput struct {
	_ struct{} `type:"structure"`

	// A DHCP configuration option.
	//
	// DhcpConfigurations is a required field
	DhcpConfigurations []*NewDhcpConfiguration `locationName:"dhcpConfiguration" locationNameList:"item" type:"list" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s CreateDhcpOptionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateDhcpOptionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateDhcpOptionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateDhcpOptionsInput"}
	if s.DhcpConfigurations == nil {
		invalidParams.Add(request.NewErrParamRequired("DhcpConfigurations"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDhcpConfigurations sets the DhcpConfigurations field's value.
func (s *CreateDhcpOptionsInput) SetDhcpConfigurations(v []*NewDhcpConfiguration) *CreateDhcpOptionsInput {
	s.DhcpConfigurations = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateDhcpOptionsInput) SetDryRun(v bool) *CreateDhcpOptionsInput {
	s.DryRun = &v
	return s
}

type CreateDhcpOptionsOutput struct {
	_ struct{} `type:"structure"`

	// A set of DHCP options.
	DhcpOptions *DhcpOptions `locationName:"dhcpOptions" type:"structure"`
}

// String returns the string representation
func (s CreateDhcpOptionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateDhcpOptionsOutput) GoString() string {
	return s.String()
}

// SetDhcpOptions sets the DhcpOptions field's value.
func (s *CreateDhcpOptionsOutput) SetDhcpOptions(v *DhcpOptions) *CreateDhcpOptionsOutput {
	s.DhcpOptions = v
	return s
}

type CreateEgressOnlyInternetGatewayInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the VPC for which to create the egress-only internet gateway.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateEgressOnlyInternetGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateEgressOnlyInternetGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateEgressOnlyInternetGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateEgressOnlyInternetGatewayInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateEgressOnlyInternetGatewayInput) SetClientToken(v string) *CreateEgressOnlyInternetGatewayInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateEgressOnlyInternetGatewayInput) SetDryRun(v bool) *CreateEgressOnlyInternetGatewayInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateEgressOnlyInternetGatewayInput) SetVpcId(v string) *CreateEgressOnlyInternetGatewayInput {
	s.VpcId = &v
	return s
}

type CreateEgressOnlyInternetGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Information about the egress-only internet gateway.
	EgressOnlyInternetGateway *EgressOnlyInternetGateway `locationName:"egressOnlyInternetGateway" type:"structure"`
}

// String returns the string representation
func (s CreateEgressOnlyInternetGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateEgressOnlyInternetGatewayOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateEgressOnlyInternetGatewayOutput) SetClientToken(v string) *CreateEgressOnlyInternetGatewayOutput {
	s.ClientToken = &v
	return s
}

// SetEgressOnlyInternetGateway sets the EgressOnlyInternetGateway field's value.
func (s *CreateEgressOnlyInternetGatewayOutput) SetEgressOnlyInternetGateway(v *EgressOnlyInternetGateway) *CreateEgressOnlyInternetGatewayOutput {
	s.EgressOnlyInternetGateway = v
	return s
}

// Describes the instances that could not be launched by the fleet.
type CreateFleetError struct {
	_ struct{} `type:"structure"`

	// The error code that indicates why the instance could not be launched. For
	// more information about error codes, see Error Codes (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html.html).
	ErrorCode *string `locationName:"errorCode" type:"string"`

	// The error message that describes why the instance could not be launched.
	// For more information about error messages, see ee Error Codes (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html.html).
	ErrorMessage *string `locationName:"errorMessage" type:"string"`

	// The launch templates and overrides that were used for launching the instances.
	// Any parameters that you specify in the Overrides override the same parameters
	// in the launch template.
	LaunchTemplateAndOverrides *LaunchTemplateAndOverridesResponse `locationName:"launchTemplateAndOverrides" type:"structure"`

	// Indicates if the instance that could not be launched was a Spot Instance
	// or On-Demand Instance.
	Lifecycle *string `locationName:"lifecycle" type:"string" enum:"InstanceLifecycle"`
}

// String returns the string representation
func (s CreateFleetError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFleetError) GoString() string {
	return s.String()
}

// SetErrorCode sets the ErrorCode field's value.
func (s *CreateFleetError) SetErrorCode(v string) *CreateFleetError {
	s.ErrorCode = &v
	return s
}

// SetErrorMessage sets the ErrorMessage field's value.
func (s *CreateFleetError) SetErrorMessage(v string) *CreateFleetError {
	s.ErrorMessage = &v
	return s
}

// SetLaunchTemplateAndOverrides sets the LaunchTemplateAndOverrides field's value.
func (s *CreateFleetError) SetLaunchTemplateAndOverrides(v *LaunchTemplateAndOverridesResponse) *CreateFleetError {
	s.LaunchTemplateAndOverrides = v
	return s
}

// SetLifecycle sets the Lifecycle field's value.
func (s *CreateFleetError) SetLifecycle(v string) *CreateFleetError {
	s.Lifecycle = &v
	return s
}

type CreateFleetInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Indicates whether running instances should be terminated if the total target
	// capacity of the EC2 Fleet is decreased below the current size of the EC2
	// Fleet.
	ExcessCapacityTerminationPolicy *string `type:"string" enum:"FleetExcessCapacityTerminationPolicy"`

	// The configuration for the EC2 Fleet.
	//
	// LaunchTemplateConfigs is a required field
	LaunchTemplateConfigs []*FleetLaunchTemplateConfigRequest `locationNameList:"item" type:"list" required:"true"`

	// The allocation strategy of On-Demand Instances in an EC2 Fleet.
	OnDemandOptions *OnDemandOptionsRequest `type:"structure"`

	// Indicates whether EC2 Fleet should replace unhealthy instances.
	ReplaceUnhealthyInstances *bool `type:"boolean"`

	// Describes the configuration of Spot Instances in an EC2 Fleet.
	SpotOptions *SpotOptionsRequest `type:"structure"`

	// The key-value pair for tagging the EC2 Fleet request on creation. The value
	// for ResourceType must be fleet, otherwise the fleet request fails. To tag
	// instances at launch, specify the tags in the launch template (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template).
	// For information about tagging after launch, see Tagging Your Resources (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-resources).
	TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"`

	// The TotalTargetCapacity, OnDemandTargetCapacity, SpotTargetCapacity, and
	// DefaultCapacityType structure.
	//
	// TargetCapacitySpecification is a required field
	TargetCapacitySpecification *TargetCapacitySpecificationRequest `type:"structure" required:"true"`

	// Indicates whether running instances should be terminated when the EC2 Fleet
	// expires.
	TerminateInstancesWithExpiration *bool `type:"boolean"`

	// The type of the request. By default, the EC2 Fleet places an asynchronous
	// request for your desired capacity, and maintains it by replenishing interrupted
	// Spot Instances (maintain). A value of instant places a synchronous one-time
	// request, and returns errors for any instances that could not be launched.
	// A value of request places an asynchronous one-time request without maintaining
	// capacity or submitting requests in alternative capacity pools if capacity
	// is unavailable. For more information, see EC2 Fleet Request Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-configuration-strategies.html#ec2-fleet-request-type)
	// in the Amazon Elastic Compute Cloud User Guide.
	Type *string `type:"string" enum:"FleetType"`

	// The start date and time of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// The default is to start fulfilling the request immediately.
	ValidFrom *time.Time `type:"timestamp"`

	// The end date and time of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// At this point, no new EC2 Fleet requests are placed or able to fulfill the
	// request. The default end date is 7 days from the current date.
	ValidUntil *time.Time `type:"timestamp"`
}

// String returns the string representation
func (s CreateFleetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFleetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateFleetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateFleetInput"}
	if s.LaunchTemplateConfigs == nil {
		invalidParams.Add(request.NewErrParamRequired("LaunchTemplateConfigs"))
	}
	if s.TargetCapacitySpecification == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetCapacitySpecification"))
	}
	if s.LaunchTemplateConfigs != nil {
		for i, v := range s.LaunchTemplateConfigs {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "LaunchTemplateConfigs", i), err.(request.ErrInvalidParams))
			}
		}
	}
	if s.TargetCapacitySpecification != nil {
		if err := s.TargetCapacitySpecification.Validate(); err != nil {
			invalidParams.AddNested("TargetCapacitySpecification", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateFleetInput) SetClientToken(v string) *CreateFleetInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateFleetInput) SetDryRun(v bool) *CreateFleetInput {
	s.DryRun = &v
	return s
}

// SetExcessCapacityTerminationPolicy sets the ExcessCapacityTerminationPolicy field's value.
func (s *CreateFleetInput) SetExcessCapacityTerminationPolicy(v string) *CreateFleetInput {
	s.ExcessCapacityTerminationPolicy = &v
	return s
}

// SetLaunchTemplateConfigs sets the LaunchTemplateConfigs field's value.
func (s *CreateFleetInput) SetLaunchTemplateConfigs(v []*FleetLaunchTemplateConfigRequest) *CreateFleetInput {
	s.LaunchTemplateConfigs = v
	return s
}

// SetOnDemandOptions sets the OnDemandOptions field's value.
func (s *CreateFleetInput) SetOnDemandOptions(v *OnDemandOptionsRequest) *CreateFleetInput {
	s.OnDemandOptions = v
	return s
}

// SetReplaceUnhealthyInstances sets the ReplaceUnhealthyInstances field's value.
func (s *CreateFleetInput) SetReplaceUnhealthyInstances(v bool) *CreateFleetInput {
	s.ReplaceUnhealthyInstances = &v
	return s
}

// SetSpotOptions sets the SpotOptions field's value.
func (s *CreateFleetInput) SetSpotOptions(v *SpotOptionsRequest) *CreateFleetInput {
	s.SpotOptions = v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateFleetInput) SetTagSpecifications(v []*TagSpecification) *CreateFleetInput {
	s.TagSpecifications = v
	return s
}

// SetTargetCapacitySpecification sets the TargetCapacitySpecification field's value.
func (s *CreateFleetInput) SetTargetCapacitySpecification(v *TargetCapacitySpecificationRequest) *CreateFleetInput {
	s.TargetCapacitySpecification = v
	return s
}

// SetTerminateInstancesWithExpiration sets the TerminateInstancesWithExpiration field's value.
func (s *CreateFleetInput) SetTerminateInstancesWithExpiration(v bool) *CreateFleetInput {
	s.TerminateInstancesWithExpiration = &v
	return s
}

// SetType sets the Type field's value.
func (s *CreateFleetInput) SetType(v string) *CreateFleetInput {
	s.Type = &v
	return s
}

// SetValidFrom sets the ValidFrom field's value.
func (s *CreateFleetInput) SetValidFrom(v time.Time) *CreateFleetInput {
	s.ValidFrom = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *CreateFleetInput) SetValidUntil(v time.Time) *CreateFleetInput {
	s.ValidUntil = &v
	return s
}

// Describes the instances that were launched by the fleet.
type CreateFleetInstance struct {
	_ struct{} `type:"structure"`

	// The IDs of the instances.
	InstanceIds []*string `locationName:"instanceIds" locationNameList:"item" type:"list"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The launch templates and overrides that were used for launching the instances.
	// Any parameters that you specify in the Overrides override the same parameters
	// in the launch template.
	LaunchTemplateAndOverrides *LaunchTemplateAndOverridesResponse `locationName:"launchTemplateAndOverrides" type:"structure"`

	// Indicates if the instance that was launched is a Spot Instance or On-Demand
	// Instance.
	Lifecycle *string `locationName:"lifecycle" type:"string" enum:"InstanceLifecycle"`

	// The value is Windows for Windows instances; otherwise blank.
	Platform *string `locationName:"platform" type:"string" enum:"PlatformValues"`
}

// String returns the string representation
func (s CreateFleetInstance) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFleetInstance) GoString() string {
	return s.String()
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *CreateFleetInstance) SetInstanceIds(v []*string) *CreateFleetInstance {
	s.InstanceIds = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *CreateFleetInstance) SetInstanceType(v string) *CreateFleetInstance {
	s.InstanceType = &v
	return s
}

// SetLaunchTemplateAndOverrides sets the LaunchTemplateAndOverrides field's value.
func (s *CreateFleetInstance) SetLaunchTemplateAndOverrides(v *LaunchTemplateAndOverridesResponse) *CreateFleetInstance {
	s.LaunchTemplateAndOverrides = v
	return s
}

// SetLifecycle sets the Lifecycle field's value.
func (s *CreateFleetInstance) SetLifecycle(v string) *CreateFleetInstance {
	s.Lifecycle = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *CreateFleetInstance) SetPlatform(v string) *CreateFleetInstance {
	s.Platform = &v
	return s
}

type CreateFleetOutput struct {
	_ struct{} `type:"structure"`

	// Information about the instances that could not be launched by the fleet.
	// Valid only when Type is set to instant.
	Errors []*CreateFleetError `locationName:"errorSet" locationNameList:"item" type:"list"`

	// The ID of the EC2 Fleet.
	FleetId *string `locationName:"fleetId" type:"string"`

	// Information about the instances that were launched by the fleet. Valid only
	// when Type is set to instant.
	Instances []*CreateFleetInstance `locationName:"fleetInstanceSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CreateFleetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFleetOutput) GoString() string {
	return s.String()
}

// SetErrors sets the Errors field's value.
func (s *CreateFleetOutput) SetErrors(v []*CreateFleetError) *CreateFleetOutput {
	s.Errors = v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *CreateFleetOutput) SetFleetId(v string) *CreateFleetOutput {
	s.FleetId = &v
	return s
}

// SetInstances sets the Instances field's value.
func (s *CreateFleetOutput) SetInstances(v []*CreateFleetInstance) *CreateFleetOutput {
	s.Instances = v
	return s
}

type CreateFlowLogsInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// The ARN for the IAM role that's used to post flow logs to a log group.
	DeliverLogsPermissionArn *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Specifies the destination to which the flow log data is to be published.
	// Flow log data can be published to an CloudWatch Logs log group or an Amazon
	// S3 bucket. The value specified for this parameter depends on the value specified
	// for LogDestinationType.
	//
	// If LogDestinationType is not specified or cloud-watch-logs, specify the Amazon
	// Resource Name (ARN) of the CloudWatch Logs log group.
	//
	// If LogDestinationType is s3, specify the ARN of the Amazon S3 bucket. You
	// can also specify a subfolder in the bucket. To specify a subfolder in the
	// bucket, use the following ARN format: bucket_ARN/subfolder_name/. For example,
	// to specify a subfolder named my-logs in a bucket named my-bucket, use the
	// following ARN: arn:aws:s3:::my-bucket/my-logs/. You cannot use AWSLogs as
	// a subfolder name. This is a reserved term.
	LogDestination *string `type:"string"`

	// Specifies the type of destination to which the flow log data is to be published.
	// Flow log data can be published to CloudWatch Logs or Amazon S3. To publish
	// flow log data to CloudWatch Logs, specify cloud-watch-logs. To publish flow
	// log data to Amazon S3, specify s3.
	//
	// Default: cloud-watch-logs
	LogDestinationType *string `type:"string" enum:"LogDestinationType"`

	// The name of the log group.
	LogGroupName *string `type:"string"`

	// One or more subnet, network interface, or VPC IDs.
	//
	// Constraints: Maximum of 1000 resources
	//
	// ResourceIds is a required field
	ResourceIds []*string `locationName:"ResourceId" locationNameList:"item" type:"list" required:"true"`

	// The type of resource on which to create the flow log.
	//
	// ResourceType is a required field
	ResourceType *string `type:"string" required:"true" enum:"FlowLogsResourceType"`

	// The type of traffic to log.
	//
	// TrafficType is a required field
	TrafficType *string `type:"string" required:"true" enum:"TrafficType"`
}

// String returns the string representation
func (s CreateFlowLogsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFlowLogsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateFlowLogsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateFlowLogsInput"}
	if s.ResourceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceIds"))
	}
	if s.ResourceType == nil {
		invalidParams.Add(request.NewErrParamRequired("ResourceType"))
	}
	if s.TrafficType == nil {
		invalidParams.Add(request.NewErrParamRequired("TrafficType"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateFlowLogsInput) SetClientToken(v string) *CreateFlowLogsInput {
	s.ClientToken = &v
	return s
}

// SetDeliverLogsPermissionArn sets the DeliverLogsPermissionArn field's value.
func (s *CreateFlowLogsInput) SetDeliverLogsPermissionArn(v string) *CreateFlowLogsInput {
	s.DeliverLogsPermissionArn = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateFlowLogsInput) SetDryRun(v bool) *CreateFlowLogsInput {
	s.DryRun = &v
	return s
}

// SetLogDestination sets the LogDestination field's value.
func (s *CreateFlowLogsInput) SetLogDestination(v string) *CreateFlowLogsInput {
	s.LogDestination = &v
	return s
}

// SetLogDestinationType sets the LogDestinationType field's value.
func (s *CreateFlowLogsInput) SetLogDestinationType(v string) *CreateFlowLogsInput {
	s.LogDestinationType = &v
	return s
}

// SetLogGroupName sets the LogGroupName field's value.
func (s *CreateFlowLogsInput) SetLogGroupName(v string) *CreateFlowLogsInput {
	s.LogGroupName = &v
	return s
}

// SetResourceIds sets the ResourceIds field's value.
func (s *CreateFlowLogsInput) SetResourceIds(v []*string) *CreateFlowLogsInput {
	s.ResourceIds = v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *CreateFlowLogsInput) SetResourceType(v string) *CreateFlowLogsInput {
	s.ResourceType = &v
	return s
}

// SetTrafficType sets the TrafficType field's value.
func (s *CreateFlowLogsInput) SetTrafficType(v string) *CreateFlowLogsInput {
	s.TrafficType = &v
	return s
}

type CreateFlowLogsOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The IDs of the flow logs.
	FlowLogIds []*string `locationName:"flowLogIdSet" locationNameList:"item" type:"list"`

	// Information about the flow logs that could not be created successfully.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CreateFlowLogsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFlowLogsOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateFlowLogsOutput) SetClientToken(v string) *CreateFlowLogsOutput {
	s.ClientToken = &v
	return s
}

// SetFlowLogIds sets the FlowLogIds field's value.
func (s *CreateFlowLogsOutput) SetFlowLogIds(v []*string) *CreateFlowLogsOutput {
	s.FlowLogIds = v
	return s
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *CreateFlowLogsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *CreateFlowLogsOutput {
	s.Unsuccessful = v
	return s
}

type CreateFpgaImageInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// A description for the AFI.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The location of the encrypted design checkpoint in Amazon S3. The input must
	// be a tarball.
	//
	// InputStorageLocation is a required field
	InputStorageLocation *StorageLocation `type:"structure" required:"true"`

	// The location in Amazon S3 for the output logs.
	LogsStorageLocation *StorageLocation `type:"structure"`

	// A name for the AFI.
	Name *string `type:"string"`
}

// String returns the string representation
func (s CreateFpgaImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFpgaImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateFpgaImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateFpgaImageInput"}
	if s.InputStorageLocation == nil {
		invalidParams.Add(request.NewErrParamRequired("InputStorageLocation"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateFpgaImageInput) SetClientToken(v string) *CreateFpgaImageInput {
	s.ClientToken = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *CreateFpgaImageInput) SetDescription(v string) *CreateFpgaImageInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateFpgaImageInput) SetDryRun(v bool) *CreateFpgaImageInput {
	s.DryRun = &v
	return s
}

// SetInputStorageLocation sets the InputStorageLocation field's value.
func (s *CreateFpgaImageInput) SetInputStorageLocation(v *StorageLocation) *CreateFpgaImageInput {
	s.InputStorageLocation = v
	return s
}

// SetLogsStorageLocation sets the LogsStorageLocation field's value.
func (s *CreateFpgaImageInput) SetLogsStorageLocation(v *StorageLocation) *CreateFpgaImageInput {
	s.LogsStorageLocation = v
	return s
}

// SetName sets the Name field's value.
func (s *CreateFpgaImageInput) SetName(v string) *CreateFpgaImageInput {
	s.Name = &v
	return s
}

type CreateFpgaImageOutput struct {
	_ struct{} `type:"structure"`

	// The global FPGA image identifier (AGFI ID).
	FpgaImageGlobalId *string `locationName:"fpgaImageGlobalId" type:"string"`

	// The FPGA image identifier (AFI ID).
	FpgaImageId *string `locationName:"fpgaImageId" type:"string"`
}

// String returns the string representation
func (s CreateFpgaImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateFpgaImageOutput) GoString() string {
	return s.String()
}

// SetFpgaImageGlobalId sets the FpgaImageGlobalId field's value.
func (s *CreateFpgaImageOutput) SetFpgaImageGlobalId(v string) *CreateFpgaImageOutput {
	s.FpgaImageGlobalId = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *CreateFpgaImageOutput) SetFpgaImageId(v string) *CreateFpgaImageOutput {
	s.FpgaImageId = &v
	return s
}

// Contains the parameters for CreateImage.
type CreateImageInput struct {
	_ struct{} `type:"structure"`

	// Information about one or more block device mappings. This parameter cannot
	// be used to modify the encryption status of existing volumes or snapshots.
	// To create an AMI with encrypted snapshots, use the CopyImage action.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"BlockDeviceMapping" type:"list"`

	// A description for the new image.
	Description *string `locationName:"description" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// A name for the new image.
	//
	// Constraints: 3-128 alphanumeric characters, parentheses (()), square brackets
	// ([]), spaces ( ), periods (.), slashes (/), dashes (-), single quotes ('),
	// at-signs (@), or underscores(_)
	//
	// Name is a required field
	Name *string `locationName:"name" type:"string" required:"true"`

	// By default, Amazon EC2 attempts to shut down and reboot the instance before
	// creating the image. If the 'No Reboot' option is set, Amazon EC2 doesn't
	// shut down the instance before creating the image. When this option is used,
	// file system integrity on the created image can't be guaranteed.
	NoReboot *bool `locationName:"noReboot" type:"boolean"`
}

// String returns the string representation
func (s CreateImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateImageInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.Name == nil {
		invalidParams.Add(request.NewErrParamRequired("Name"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *CreateImageInput) SetBlockDeviceMappings(v []*BlockDeviceMapping) *CreateImageInput {
	s.BlockDeviceMappings = v
	return s
}

// SetDescription sets the Description field's value.
func (s *CreateImageInput) SetDescription(v string) *CreateImageInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateImageInput) SetDryRun(v bool) *CreateImageInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *CreateImageInput) SetInstanceId(v string) *CreateImageInput {
	s.InstanceId = &v
	return s
}

// SetName sets the Name field's value.
func (s *CreateImageInput) SetName(v string) *CreateImageInput {
	s.Name = &v
	return s
}

// SetNoReboot sets the NoReboot field's value.
func (s *CreateImageInput) SetNoReboot(v bool) *CreateImageInput {
	s.NoReboot = &v
	return s
}

// Contains the output of CreateImage.
type CreateImageOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the new AMI.
	ImageId *string `locationName:"imageId" type:"string"`
}

// String returns the string representation
func (s CreateImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateImageOutput) GoString() string {
	return s.String()
}

// SetImageId sets the ImageId field's value.
func (s *CreateImageOutput) SetImageId(v string) *CreateImageOutput {
	s.ImageId = &v
	return s
}

// Contains the parameters for CreateInstanceExportTask.
type CreateInstanceExportTaskInput struct {
	_ struct{} `type:"structure"`

	// A description for the conversion task or the resource being exported. The
	// maximum length is 255 bytes.
	Description *string `locationName:"description" type:"string"`

	// The format and location for an instance export task.
	ExportToS3Task *ExportToS3TaskSpecification `locationName:"exportToS3" type:"structure"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// The target virtualization environment.
	TargetEnvironment *string `locationName:"targetEnvironment" type:"string" enum:"ExportEnvironment"`
}

// String returns the string representation
func (s CreateInstanceExportTaskInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateInstanceExportTaskInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateInstanceExportTaskInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateInstanceExportTaskInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *CreateInstanceExportTaskInput) SetDescription(v string) *CreateInstanceExportTaskInput {
	s.Description = &v
	return s
}

// SetExportToS3Task sets the ExportToS3Task field's value.
func (s *CreateInstanceExportTaskInput) SetExportToS3Task(v *ExportToS3TaskSpecification) *CreateInstanceExportTaskInput {
	s.ExportToS3Task = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *CreateInstanceExportTaskInput) SetInstanceId(v string) *CreateInstanceExportTaskInput {
	s.InstanceId = &v
	return s
}

// SetTargetEnvironment sets the TargetEnvironment field's value.
func (s *CreateInstanceExportTaskInput) SetTargetEnvironment(v string) *CreateInstanceExportTaskInput {
	s.TargetEnvironment = &v
	return s
}

// Contains the output for CreateInstanceExportTask.
type CreateInstanceExportTaskOutput struct {
	_ struct{} `type:"structure"`

	// Information about the instance export task.
	ExportTask *ExportTask `locationName:"exportTask" type:"structure"`
}

// String returns the string representation
func (s CreateInstanceExportTaskOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateInstanceExportTaskOutput) GoString() string {
	return s.String()
}

// SetExportTask sets the ExportTask field's value.
func (s *CreateInstanceExportTaskOutput) SetExportTask(v *ExportTask) *CreateInstanceExportTaskOutput {
	s.ExportTask = v
	return s
}

type CreateInternetGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s CreateInternetGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateInternetGatewayInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *CreateInternetGatewayInput) SetDryRun(v bool) *CreateInternetGatewayInput {
	s.DryRun = &v
	return s
}

type CreateInternetGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Information about the internet gateway.
	InternetGateway *InternetGateway `locationName:"internetGateway" type:"structure"`
}

// String returns the string representation
func (s CreateInternetGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateInternetGatewayOutput) GoString() string {
	return s.String()
}

// SetInternetGateway sets the InternetGateway field's value.
func (s *CreateInternetGatewayOutput) SetInternetGateway(v *InternetGateway) *CreateInternetGatewayOutput {
	s.InternetGateway = v
	return s
}

type CreateKeyPairInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// A unique name for the key pair.
	//
	// Constraints: Up to 255 ASCII characters
	//
	// KeyName is a required field
	KeyName *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateKeyPairInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateKeyPairInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateKeyPairInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateKeyPairInput"}
	if s.KeyName == nil {
		invalidParams.Add(request.NewErrParamRequired("KeyName"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CreateKeyPairInput) SetDryRun(v bool) *CreateKeyPairInput {
	s.DryRun = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *CreateKeyPairInput) SetKeyName(v string) *CreateKeyPairInput {
	s.KeyName = &v
	return s
}

// Describes a key pair.
type CreateKeyPairOutput struct {
	_ struct{} `type:"structure"`

	// The SHA-1 digest of the DER encoded private key.
	KeyFingerprint *string `locationName:"keyFingerprint" type:"string"`

	// An unencrypted PEM encoded RSA private key.
	KeyMaterial *string `locationName:"keyMaterial" type:"string"`

	// The name of the key pair.
	KeyName *string `locationName:"keyName" type:"string"`
}

// String returns the string representation
func (s CreateKeyPairOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateKeyPairOutput) GoString() string {
	return s.String()
}

// SetKeyFingerprint sets the KeyFingerprint field's value.
func (s *CreateKeyPairOutput) SetKeyFingerprint(v string) *CreateKeyPairOutput {
	s.KeyFingerprint = &v
	return s
}

// SetKeyMaterial sets the KeyMaterial field's value.
func (s *CreateKeyPairOutput) SetKeyMaterial(v string) *CreateKeyPairOutput {
	s.KeyMaterial = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *CreateKeyPairOutput) SetKeyName(v string) *CreateKeyPairOutput {
	s.KeyName = &v
	return s
}

type CreateLaunchTemplateInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The information for the launch template.
	//
	// LaunchTemplateData is a required field
	LaunchTemplateData *RequestLaunchTemplateData `type:"structure" required:"true"`

	// A name for the launch template.
	//
	// LaunchTemplateName is a required field
	LaunchTemplateName *string `min:"3" type:"string" required:"true"`

	// A description for the first version of the launch template.
	VersionDescription *string `type:"string"`
}

// String returns the string representation
func (s CreateLaunchTemplateInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateLaunchTemplateInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateLaunchTemplateInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateLaunchTemplateInput"}
	if s.LaunchTemplateData == nil {
		invalidParams.Add(request.NewErrParamRequired("LaunchTemplateData"))
	}
	if s.LaunchTemplateName == nil {
		invalidParams.Add(request.NewErrParamRequired("LaunchTemplateName"))
	}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}
	if s.LaunchTemplateData != nil {
		if err := s.LaunchTemplateData.Validate(); err != nil {
			invalidParams.AddNested("LaunchTemplateData", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateLaunchTemplateInput) SetClientToken(v string) *CreateLaunchTemplateInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateLaunchTemplateInput) SetDryRun(v bool) *CreateLaunchTemplateInput {
	s.DryRun = &v
	return s
}

// SetLaunchTemplateData sets the LaunchTemplateData field's value.
func (s *CreateLaunchTemplateInput) SetLaunchTemplateData(v *RequestLaunchTemplateData) *CreateLaunchTemplateInput {
	s.LaunchTemplateData = v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *CreateLaunchTemplateInput) SetLaunchTemplateName(v string) *CreateLaunchTemplateInput {
	s.LaunchTemplateName = &v
	return s
}

// SetVersionDescription sets the VersionDescription field's value.
func (s *CreateLaunchTemplateInput) SetVersionDescription(v string) *CreateLaunchTemplateInput {
	s.VersionDescription = &v
	return s
}

type CreateLaunchTemplateOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch template.
	LaunchTemplate *LaunchTemplate `locationName:"launchTemplate" type:"structure"`
}

// String returns the string representation
func (s CreateLaunchTemplateOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateLaunchTemplateOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplate sets the LaunchTemplate field's value.
func (s *CreateLaunchTemplateOutput) SetLaunchTemplate(v *LaunchTemplate) *CreateLaunchTemplateOutput {
	s.LaunchTemplate = v
	return s
}

type CreateLaunchTemplateVersionInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The information for the launch template.
	//
	// LaunchTemplateData is a required field
	LaunchTemplateData *RequestLaunchTemplateData `type:"structure" required:"true"`

	// The ID of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateName *string `min:"3" type:"string"`

	// The version number of the launch template version on which to base the new
	// version. The new version inherits the same launch parameters as the source
	// version, except for parameters that you specify in LaunchTemplateData.
	SourceVersion *string `type:"string"`

	// A description for the version of the launch template.
	VersionDescription *string `type:"string"`
}

// String returns the string representation
func (s CreateLaunchTemplateVersionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateLaunchTemplateVersionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateLaunchTemplateVersionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateLaunchTemplateVersionInput"}
	if s.LaunchTemplateData == nil {
		invalidParams.Add(request.NewErrParamRequired("LaunchTemplateData"))
	}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}
	if s.LaunchTemplateData != nil {
		if err := s.LaunchTemplateData.Validate(); err != nil {
			invalidParams.AddNested("LaunchTemplateData", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateLaunchTemplateVersionInput) SetClientToken(v string) *CreateLaunchTemplateVersionInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateLaunchTemplateVersionInput) SetDryRun(v bool) *CreateLaunchTemplateVersionInput {
	s.DryRun = &v
	return s
}

// SetLaunchTemplateData sets the LaunchTemplateData field's value.
func (s *CreateLaunchTemplateVersionInput) SetLaunchTemplateData(v *RequestLaunchTemplateData) *CreateLaunchTemplateVersionInput {
	s.LaunchTemplateData = v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *CreateLaunchTemplateVersionInput) SetLaunchTemplateId(v string) *CreateLaunchTemplateVersionInput {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *CreateLaunchTemplateVersionInput) SetLaunchTemplateName(v string) *CreateLaunchTemplateVersionInput {
	s.LaunchTemplateName = &v
	return s
}

// SetSourceVersion sets the SourceVersion field's value.
func (s *CreateLaunchTemplateVersionInput) SetSourceVersion(v string) *CreateLaunchTemplateVersionInput {
	s.SourceVersion = &v
	return s
}

// SetVersionDescription sets the VersionDescription field's value.
func (s *CreateLaunchTemplateVersionInput) SetVersionDescription(v string) *CreateLaunchTemplateVersionInput {
	s.VersionDescription = &v
	return s
}

type CreateLaunchTemplateVersionOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch template version.
	LaunchTemplateVersion *LaunchTemplateVersion `locationName:"launchTemplateVersion" type:"structure"`
}

// String returns the string representation
func (s CreateLaunchTemplateVersionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateLaunchTemplateVersionOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplateVersion sets the LaunchTemplateVersion field's value.
func (s *CreateLaunchTemplateVersionOutput) SetLaunchTemplateVersion(v *LaunchTemplateVersion) *CreateLaunchTemplateVersionOutput {
	s.LaunchTemplateVersion = v
	return s
}

type CreateNatGatewayInput struct {
	_ struct{} `type:"structure"`

	// The allocation ID of an Elastic IP address to associate with the NAT gateway.
	// If the Elastic IP address is associated with another resource, you must first
	// disassociate it.
	//
	// AllocationId is a required field
	AllocationId *string `type:"string" required:"true"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	//
	// Constraint: Maximum 64 ASCII characters.
	ClientToken *string `type:"string"`

	// The subnet in which to create the NAT gateway.
	//
	// SubnetId is a required field
	SubnetId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateNatGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNatGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateNatGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateNatGatewayInput"}
	if s.AllocationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AllocationId"))
	}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAllocationId sets the AllocationId field's value.
func (s *CreateNatGatewayInput) SetAllocationId(v string) *CreateNatGatewayInput {
	s.AllocationId = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateNatGatewayInput) SetClientToken(v string) *CreateNatGatewayInput {
	s.ClientToken = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *CreateNatGatewayInput) SetSubnetId(v string) *CreateNatGatewayInput {
	s.SubnetId = &v
	return s
}

type CreateNatGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier to ensure the idempotency of the request.
	// Only returned if a client token was provided in the request.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Information about the NAT gateway.
	NatGateway *NatGateway `locationName:"natGateway" type:"structure"`
}

// String returns the string representation
func (s CreateNatGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNatGatewayOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateNatGatewayOutput) SetClientToken(v string) *CreateNatGatewayOutput {
	s.ClientToken = &v
	return s
}

// SetNatGateway sets the NatGateway field's value.
func (s *CreateNatGatewayOutput) SetNatGateway(v *NatGateway) *CreateNatGatewayOutput {
	s.NatGateway = v
	return s
}

type CreateNetworkAclEntryInput struct {
	_ struct{} `type:"structure"`

	// The IPv4 network range to allow or deny, in CIDR notation (for example 172.16.0.0/24).
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Indicates whether this is an egress rule (rule is applied to traffic leaving
	// the subnet).
	//
	// Egress is a required field
	Egress *bool `locationName:"egress" type:"boolean" required:"true"`

	// ICMP protocol: The ICMP or ICMPv6 type and code. Required if specifying protocol
	// 1 (ICMP) or protocol 58 (ICMPv6) with an IPv6 CIDR block.
	IcmpTypeCode *IcmpTypeCode `locationName:"Icmp" type:"structure"`

	// The IPv6 network range to allow or deny, in CIDR notation (for example 2001:db8:1234:1a00::/64).
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string"`

	// The ID of the network ACL.
	//
	// NetworkAclId is a required field
	NetworkAclId *string `locationName:"networkAclId" type:"string" required:"true"`

	// TCP or UDP protocols: The range of ports the rule applies to. Required if
	// specifying protocol 6 (TCP) or 17 (UDP).
	PortRange *PortRange `locationName:"portRange" type:"structure"`

	// The protocol number. A value of "-1" means all protocols. If you specify
	// "-1" or a protocol number other than "6" (TCP), "17" (UDP), or "1" (ICMP),
	// traffic on all ports is allowed, regardless of any ports or ICMP types or
	// codes that you specify. If you specify protocol "58" (ICMPv6) and specify
	// an IPv4 CIDR block, traffic for all ICMP types and codes allowed, regardless
	// of any that you specify. If you specify protocol "58" (ICMPv6) and specify
	// an IPv6 CIDR block, you must specify an ICMP type and code.
	//
	// Protocol is a required field
	Protocol *string `locationName:"protocol" type:"string" required:"true"`

	// Indicates whether to allow or deny the traffic that matches the rule.
	//
	// RuleAction is a required field
	RuleAction *string `locationName:"ruleAction" type:"string" required:"true" enum:"RuleAction"`

	// The rule number for the entry (for example, 100). ACL entries are processed
	// in ascending order by rule number.
	//
	// Constraints: Positive integer from 1 to 32766. The range 32767 to 65535 is
	// reserved for internal use.
	//
	// RuleNumber is a required field
	RuleNumber *int64 `locationName:"ruleNumber" type:"integer" required:"true"`
}

// String returns the string representation
func (s CreateNetworkAclEntryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkAclEntryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateNetworkAclEntryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateNetworkAclEntryInput"}
	if s.Egress == nil {
		invalidParams.Add(request.NewErrParamRequired("Egress"))
	}
	if s.NetworkAclId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkAclId"))
	}
	if s.Protocol == nil {
		invalidParams.Add(request.NewErrParamRequired("Protocol"))
	}
	if s.RuleAction == nil {
		invalidParams.Add(request.NewErrParamRequired("RuleAction"))
	}
	if s.RuleNumber == nil {
		invalidParams.Add(request.NewErrParamRequired("RuleNumber"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *CreateNetworkAclEntryInput) SetCidrBlock(v string) *CreateNetworkAclEntryInput {
	s.CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateNetworkAclEntryInput) SetDryRun(v bool) *CreateNetworkAclEntryInput {
	s.DryRun = &v
	return s
}

// SetEgress sets the Egress field's value.
func (s *CreateNetworkAclEntryInput) SetEgress(v bool) *CreateNetworkAclEntryInput {
	s.Egress = &v
	return s
}

// SetIcmpTypeCode sets the IcmpTypeCode field's value.
func (s *CreateNetworkAclEntryInput) SetIcmpTypeCode(v *IcmpTypeCode) *CreateNetworkAclEntryInput {
	s.IcmpTypeCode = v
	return s
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *CreateNetworkAclEntryInput) SetIpv6CidrBlock(v string) *CreateNetworkAclEntryInput {
	s.Ipv6CidrBlock = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *CreateNetworkAclEntryInput) SetNetworkAclId(v string) *CreateNetworkAclEntryInput {
	s.NetworkAclId = &v
	return s
}

// SetPortRange sets the PortRange field's value.
func (s *CreateNetworkAclEntryInput) SetPortRange(v *PortRange) *CreateNetworkAclEntryInput {
	s.PortRange = v
	return s
}

// SetProtocol sets the Protocol field's value.
func (s *CreateNetworkAclEntryInput) SetProtocol(v string) *CreateNetworkAclEntryInput {
	s.Protocol = &v
	return s
}

// SetRuleAction sets the RuleAction field's value.
func (s *CreateNetworkAclEntryInput) SetRuleAction(v string) *CreateNetworkAclEntryInput {
	s.RuleAction = &v
	return s
}

// SetRuleNumber sets the RuleNumber field's value.
func (s *CreateNetworkAclEntryInput) SetRuleNumber(v int64) *CreateNetworkAclEntryInput {
	s.RuleNumber = &v
	return s
}

type CreateNetworkAclEntryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreateNetworkAclEntryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkAclEntryOutput) GoString() string {
	return s.String()
}

type CreateNetworkAclInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s CreateNetworkAclInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkAclInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateNetworkAclInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateNetworkAclInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CreateNetworkAclInput) SetDryRun(v bool) *CreateNetworkAclInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateNetworkAclInput) SetVpcId(v string) *CreateNetworkAclInput {
	s.VpcId = &v
	return s
}

type CreateNetworkAclOutput struct {
	_ struct{} `type:"structure"`

	// Information about the network ACL.
	NetworkAcl *NetworkAcl `locationName:"networkAcl" type:"structure"`
}

// String returns the string representation
func (s CreateNetworkAclOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkAclOutput) GoString() string {
	return s.String()
}

// SetNetworkAcl sets the NetworkAcl field's value.
func (s *CreateNetworkAclOutput) SetNetworkAcl(v *NetworkAcl) *CreateNetworkAclOutput {
	s.NetworkAcl = v
	return s
}

// Contains the parameters for CreateNetworkInterface.
type CreateNetworkInterfaceInput struct {
	_ struct{} `type:"structure"`

	// A description for the network interface.
	Description *string `locationName:"description" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The IDs of one or more security groups.
	Groups []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// The number of IPv6 addresses to assign to a network interface. Amazon EC2
	// automatically selects the IPv6 addresses from the subnet range. You can't
	// use this option if specifying specific IPv6 addresses. If your subnet has
	// the AssignIpv6AddressOnCreation attribute set to true, you can specify 0
	// to override this setting.
	Ipv6AddressCount *int64 `locationName:"ipv6AddressCount" type:"integer"`

	// One or more specific IPv6 addresses from the IPv6 CIDR block range of your
	// subnet. You can't use this option if you're specifying a number of IPv6 addresses.
	Ipv6Addresses []*InstanceIpv6Address `locationName:"ipv6Addresses" locationNameList:"item" type:"list"`

	// The primary private IPv4 address of the network interface. If you don't specify
	// an IPv4 address, Amazon EC2 selects one for you from the subnet's IPv4 CIDR
	// range. If you specify an IP address, you cannot indicate any IP addresses
	// specified in privateIpAddresses as primary (only one IP address can be designated
	// as primary).
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// One or more private IPv4 addresses.
	PrivateIpAddresses []*PrivateIpAddressSpecification `locationName:"privateIpAddresses" locationNameList:"item" type:"list"`

	// The number of secondary private IPv4 addresses to assign to a network interface.
	// When you specify a number of secondary IPv4 addresses, Amazon EC2 selects
	// these IP addresses within the subnet's IPv4 CIDR range. You can't specify
	// this option and specify more than one private IP address using privateIpAddresses.
	//
	// The number of IP addresses you can assign to a network interface varies by
	// instance type. For more information, see IP Addresses Per ENI Per Instance
	// Type (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)
	// in the Amazon Virtual Private Cloud User Guide.
	SecondaryPrivateIpAddressCount *int64 `locationName:"secondaryPrivateIpAddressCount" type:"integer"`

	// The ID of the subnet to associate with the network interface.
	//
	// SubnetId is a required field
	SubnetId *string `locationName:"subnetId" type:"string" required:"true"`
}

// String returns the string representation
func (s CreateNetworkInterfaceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkInterfaceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateNetworkInterfaceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateNetworkInterfaceInput"}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *CreateNetworkInterfaceInput) SetDescription(v string) *CreateNetworkInterfaceInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateNetworkInterfaceInput) SetDryRun(v bool) *CreateNetworkInterfaceInput {
	s.DryRun = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *CreateNetworkInterfaceInput) SetGroups(v []*string) *CreateNetworkInterfaceInput {
	s.Groups = v
	return s
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *CreateNetworkInterfaceInput) SetIpv6AddressCount(v int64) *CreateNetworkInterfaceInput {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *CreateNetworkInterfaceInput) SetIpv6Addresses(v []*InstanceIpv6Address) *CreateNetworkInterfaceInput {
	s.Ipv6Addresses = v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *CreateNetworkInterfaceInput) SetPrivateIpAddress(v string) *CreateNetworkInterfaceInput {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *CreateNetworkInterfaceInput) SetPrivateIpAddresses(v []*PrivateIpAddressSpecification) *CreateNetworkInterfaceInput {
	s.PrivateIpAddresses = v
	return s
}

// SetSecondaryPrivateIpAddressCount sets the SecondaryPrivateIpAddressCount field's value.
func (s *CreateNetworkInterfaceInput) SetSecondaryPrivateIpAddressCount(v int64) *CreateNetworkInterfaceInput {
	s.SecondaryPrivateIpAddressCount = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *CreateNetworkInterfaceInput) SetSubnetId(v string) *CreateNetworkInterfaceInput {
	s.SubnetId = &v
	return s
}

// Contains the output of CreateNetworkInterface.
type CreateNetworkInterfaceOutput struct {
	_ struct{} `type:"structure"`

	// Information about the network interface.
	NetworkInterface *NetworkInterface `locationName:"networkInterface" type:"structure"`
}

// String returns the string representation
func (s CreateNetworkInterfaceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkInterfaceOutput) GoString() string {
	return s.String()
}

// SetNetworkInterface sets the NetworkInterface field's value.
func (s *CreateNetworkInterfaceOutput) SetNetworkInterface(v *NetworkInterface) *CreateNetworkInterfaceOutput {
	s.NetworkInterface = v
	return s
}

// Contains the parameters for CreateNetworkInterfacePermission.
type CreateNetworkInterfacePermissionInput struct {
	_ struct{} `type:"structure"`

	// The AWS account ID.
	AwsAccountId *string `type:"string"`

	// The AWS service. Currently not supported.
	AwsService *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `type:"string" required:"true"`

	// The type of permission to grant.
	//
	// Permission is a required field
	Permission *string `type:"string" required:"true" enum:"InterfacePermissionType"`
}

// String returns the string representation
func (s CreateNetworkInterfacePermissionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkInterfacePermissionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateNetworkInterfacePermissionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateNetworkInterfacePermissionInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}
	if s.Permission == nil {
		invalidParams.Add(request.NewErrParamRequired("Permission"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAwsAccountId sets the AwsAccountId field's value.
func (s *CreateNetworkInterfacePermissionInput) SetAwsAccountId(v string) *CreateNetworkInterfacePermissionInput {
	s.AwsAccountId = &v
	return s
}

// SetAwsService sets the AwsService field's value.
func (s *CreateNetworkInterfacePermissionInput) SetAwsService(v string) *CreateNetworkInterfacePermissionInput {
	s.AwsService = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateNetworkInterfacePermissionInput) SetDryRun(v bool) *CreateNetworkInterfacePermissionInput {
	s.DryRun = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *CreateNetworkInterfacePermissionInput) SetNetworkInterfaceId(v string) *CreateNetworkInterfacePermissionInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetPermission sets the Permission field's value.
func (s *CreateNetworkInterfacePermissionInput) SetPermission(v string) *CreateNetworkInterfacePermissionInput {
	s.Permission = &v
	return s
}

// Contains the output of CreateNetworkInterfacePermission.
type CreateNetworkInterfacePermissionOutput struct {
	_ struct{} `type:"structure"`

	// Information about the permission for the network interface.
	InterfacePermission *NetworkInterfacePermission `locationName:"interfacePermission" type:"structure"`
}

// String returns the string representation
func (s CreateNetworkInterfacePermissionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNetworkInterfacePermissionOutput) GoString() string {
	return s.String()
}

// SetInterfacePermission sets the InterfacePermission field's value.
func (s *CreateNetworkInterfacePermissionOutput) SetInterfacePermission(v *NetworkInterfacePermission) *CreateNetworkInterfacePermissionOutput {
	s.InterfacePermission = v
	return s
}

type CreatePlacementGroupInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// A name for the placement group. Must be unique within the scope of your account
	// for the Region.
	//
	// Constraints: Up to 255 ASCII characters
	GroupName *string `locationName:"groupName" type:"string"`

	// The number of partitions. Valid only when Strategy is set to partition.
	PartitionCount *int64 `type:"integer"`

	// The placement strategy.
	Strategy *string `locationName:"strategy" type:"string" enum:"PlacementStrategy"`
}

// String returns the string representation
func (s CreatePlacementGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreatePlacementGroupInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *CreatePlacementGroupInput) SetDryRun(v bool) *CreatePlacementGroupInput {
	s.DryRun = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *CreatePlacementGroupInput) SetGroupName(v string) *CreatePlacementGroupInput {
	s.GroupName = &v
	return s
}

// SetPartitionCount sets the PartitionCount field's value.
func (s *CreatePlacementGroupInput) SetPartitionCount(v int64) *CreatePlacementGroupInput {
	s.PartitionCount = &v
	return s
}

// SetStrategy sets the Strategy field's value.
func (s *CreatePlacementGroupInput) SetStrategy(v string) *CreatePlacementGroupInput {
	s.Strategy = &v
	return s
}

type CreatePlacementGroupOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreatePlacementGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreatePlacementGroupOutput) GoString() string {
	return s.String()
}

// Contains the parameters for CreateReservedInstancesListing.
type CreateReservedInstancesListingInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure idempotency of your
	// listings. This helps avoid duplicate listings. For more information, see
	// Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	//
	// ClientToken is a required field
	ClientToken *string `locationName:"clientToken" type:"string" required:"true"`

	// The number of instances that are a part of a Reserved Instance account to
	// be listed in the Reserved Instance Marketplace. This number should be less
	// than or equal to the instance count associated with the Reserved Instance
	// ID specified in this call.
	//
	// InstanceCount is a required field
	InstanceCount *int64 `locationName:"instanceCount" type:"integer" required:"true"`

	// A list specifying the price of the Standard Reserved Instance for each month
	// remaining in the Reserved Instance term.
	//
	// PriceSchedules is a required field
	PriceSchedules []*PriceScheduleSpecification `locationName:"priceSchedules" locationNameList:"item" type:"list" required:"true"`

	// The ID of the active Standard Reserved Instance.
	//
	// ReservedInstancesId is a required field
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string" required:"true"`
}

// String returns the string representation
func (s CreateReservedInstancesListingInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateReservedInstancesListingInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateReservedInstancesListingInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateReservedInstancesListingInput"}
	if s.ClientToken == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientToken"))
	}
	if s.InstanceCount == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceCount"))
	}
	if s.PriceSchedules == nil {
		invalidParams.Add(request.NewErrParamRequired("PriceSchedules"))
	}
	if s.ReservedInstancesId == nil {
		invalidParams.Add(request.NewErrParamRequired("ReservedInstancesId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateReservedInstancesListingInput) SetClientToken(v string) *CreateReservedInstancesListingInput {
	s.ClientToken = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *CreateReservedInstancesListingInput) SetInstanceCount(v int64) *CreateReservedInstancesListingInput {
	s.InstanceCount = &v
	return s
}

// SetPriceSchedules sets the PriceSchedules field's value.
func (s *CreateReservedInstancesListingInput) SetPriceSchedules(v []*PriceScheduleSpecification) *CreateReservedInstancesListingInput {
	s.PriceSchedules = v
	return s
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *CreateReservedInstancesListingInput) SetReservedInstancesId(v string) *CreateReservedInstancesListingInput {
	s.ReservedInstancesId = &v
	return s
}

// Contains the output of CreateReservedInstancesListing.
type CreateReservedInstancesListingOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Standard Reserved Instance listing.
	ReservedInstancesListings []*ReservedInstancesListing `locationName:"reservedInstancesListingsSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CreateReservedInstancesListingOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateReservedInstancesListingOutput) GoString() string {
	return s.String()
}

// SetReservedInstancesListings sets the ReservedInstancesListings field's value.
func (s *CreateReservedInstancesListingOutput) SetReservedInstancesListings(v []*ReservedInstancesListing) *CreateReservedInstancesListingOutput {
	s.ReservedInstancesListings = v
	return s
}

type CreateRouteInput struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR address block used for the destination match. Routing decisions
	// are based on the most specific match.
	DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"`

	// The IPv6 CIDR block used for the destination match. Routing decisions are
	// based on the most specific match.
	DestinationIpv6CidrBlock *string `locationName:"destinationIpv6CidrBlock" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// [IPv6 traffic only] The ID of an egress-only internet gateway.
	EgressOnlyInternetGatewayId *string `locationName:"egressOnlyInternetGatewayId" type:"string"`

	// The ID of an internet gateway or virtual private gateway attached to your
	// VPC.
	GatewayId *string `locationName:"gatewayId" type:"string"`

	// The ID of a NAT instance in your VPC. The operation fails if you specify
	// an instance ID unless exactly one network interface is attached.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// [IPv4 traffic only] The ID of a NAT gateway.
	NatGatewayId *string `locationName:"natGatewayId" type:"string"`

	// The ID of a network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The ID of the route table for the route.
	//
	// RouteTableId is a required field
	RouteTableId *string `locationName:"routeTableId" type:"string" required:"true"`

	// The ID of a transit gateway.
	TransitGatewayId *string `type:"string"`

	// The ID of a VPC peering connection.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s CreateRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateRouteInput"}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *CreateRouteInput) SetDestinationCidrBlock(v string) *CreateRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDestinationIpv6CidrBlock sets the DestinationIpv6CidrBlock field's value.
func (s *CreateRouteInput) SetDestinationIpv6CidrBlock(v string) *CreateRouteInput {
	s.DestinationIpv6CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateRouteInput) SetDryRun(v bool) *CreateRouteInput {
	s.DryRun = &v
	return s
}

// SetEgressOnlyInternetGatewayId sets the EgressOnlyInternetGatewayId field's value.
func (s *CreateRouteInput) SetEgressOnlyInternetGatewayId(v string) *CreateRouteInput {
	s.EgressOnlyInternetGatewayId = &v
	return s
}

// SetGatewayId sets the GatewayId field's value.
func (s *CreateRouteInput) SetGatewayId(v string) *CreateRouteInput {
	s.GatewayId = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *CreateRouteInput) SetInstanceId(v string) *CreateRouteInput {
	s.InstanceId = &v
	return s
}

// SetNatGatewayId sets the NatGatewayId field's value.
func (s *CreateRouteInput) SetNatGatewayId(v string) *CreateRouteInput {
	s.NatGatewayId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *CreateRouteInput) SetNetworkInterfaceId(v string) *CreateRouteInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *CreateRouteInput) SetRouteTableId(v string) *CreateRouteInput {
	s.RouteTableId = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *CreateRouteInput) SetTransitGatewayId(v string) *CreateRouteInput {
	s.TransitGatewayId = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *CreateRouteInput) SetVpcPeeringConnectionId(v string) *CreateRouteInput {
	s.VpcPeeringConnectionId = &v
	return s
}

type CreateRouteOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s CreateRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateRouteOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *CreateRouteOutput) SetReturn(v bool) *CreateRouteOutput {
	s.Return = &v
	return s
}

type CreateRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s CreateRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateRouteTableInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CreateRouteTableInput) SetDryRun(v bool) *CreateRouteTableInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateRouteTableInput) SetVpcId(v string) *CreateRouteTableInput {
	s.VpcId = &v
	return s
}

type CreateRouteTableOutput struct {
	_ struct{} `type:"structure"`

	// Information about the route table.
	RouteTable *RouteTable `locationName:"routeTable" type:"structure"`
}

// String returns the string representation
func (s CreateRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateRouteTableOutput) GoString() string {
	return s.String()
}

// SetRouteTable sets the RouteTable field's value.
func (s *CreateRouteTableOutput) SetRouteTable(v *RouteTable) *CreateRouteTableOutput {
	s.RouteTable = v
	return s
}

type CreateSecurityGroupInput struct {
	_ struct{} `type:"structure"`

	// A description for the security group. This is informational only.
	//
	// Constraints: Up to 255 characters in length
	//
	// Constraints for EC2-Classic: ASCII characters
	//
	// Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*
	//
	// Description is a required field
	Description *string `locationName:"GroupDescription" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The name of the security group.
	//
	// Constraints: Up to 255 characters in length. Cannot start with sg-.
	//
	// Constraints for EC2-Classic: ASCII characters
	//
	// Constraints for EC2-VPC: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*
	//
	// GroupName is a required field
	GroupName *string `type:"string" required:"true"`

	// [EC2-VPC] The ID of the VPC. Required for EC2-VPC.
	VpcId *string `type:"string"`
}

// String returns the string representation
func (s CreateSecurityGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSecurityGroupInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateSecurityGroupInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateSecurityGroupInput"}
	if s.Description == nil {
		invalidParams.Add(request.NewErrParamRequired("Description"))
	}
	if s.GroupName == nil {
		invalidParams.Add(request.NewErrParamRequired("GroupName"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *CreateSecurityGroupInput) SetDescription(v string) *CreateSecurityGroupInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateSecurityGroupInput) SetDryRun(v bool) *CreateSecurityGroupInput {
	s.DryRun = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *CreateSecurityGroupInput) SetGroupName(v string) *CreateSecurityGroupInput {
	s.GroupName = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateSecurityGroupInput) SetVpcId(v string) *CreateSecurityGroupInput {
	s.VpcId = &v
	return s
}

type CreateSecurityGroupOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the security group.
	GroupId *string `locationName:"groupId" type:"string"`
}

// String returns the string representation
func (s CreateSecurityGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSecurityGroupOutput) GoString() string {
	return s.String()
}

// SetGroupId sets the GroupId field's value.
func (s *CreateSecurityGroupOutput) SetGroupId(v string) *CreateSecurityGroupOutput {
	s.GroupId = &v
	return s
}

// Contains the parameters for CreateSnapshot.
type CreateSnapshotInput struct {
	_ struct{} `type:"structure"`

	// A description for the snapshot.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The tags to apply to the snapshot during creation.
	TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"`

	// The ID of the EBS volume.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateSnapshotInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSnapshotInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateSnapshotInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateSnapshotInput"}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *CreateSnapshotInput) SetDescription(v string) *CreateSnapshotInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateSnapshotInput) SetDryRun(v bool) *CreateSnapshotInput {
	s.DryRun = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateSnapshotInput) SetTagSpecifications(v []*TagSpecification) *CreateSnapshotInput {
	s.TagSpecifications = v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *CreateSnapshotInput) SetVolumeId(v string) *CreateSnapshotInput {
	s.VolumeId = &v
	return s
}

// Contains the parameters for CreateSpotDatafeedSubscription.
type CreateSpotDatafeedSubscriptionInput struct {
	_ struct{} `type:"structure"`

	// The Amazon S3 bucket in which to store the Spot Instance data feed.
	//
	// Bucket is a required field
	Bucket *string `locationName:"bucket" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// A prefix for the data feed file names.
	Prefix *string `locationName:"prefix" type:"string"`
}

// String returns the string representation
func (s CreateSpotDatafeedSubscriptionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSpotDatafeedSubscriptionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateSpotDatafeedSubscriptionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateSpotDatafeedSubscriptionInput"}
	if s.Bucket == nil {
		invalidParams.Add(request.NewErrParamRequired("Bucket"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBucket sets the Bucket field's value.
func (s *CreateSpotDatafeedSubscriptionInput) SetBucket(v string) *CreateSpotDatafeedSubscriptionInput {
	s.Bucket = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateSpotDatafeedSubscriptionInput) SetDryRun(v bool) *CreateSpotDatafeedSubscriptionInput {
	s.DryRun = &v
	return s
}

// SetPrefix sets the Prefix field's value.
func (s *CreateSpotDatafeedSubscriptionInput) SetPrefix(v string) *CreateSpotDatafeedSubscriptionInput {
	s.Prefix = &v
	return s
}

// Contains the output of CreateSpotDatafeedSubscription.
type CreateSpotDatafeedSubscriptionOutput struct {
	_ struct{} `type:"structure"`

	// The Spot Instance data feed subscription.
	SpotDatafeedSubscription *SpotDatafeedSubscription `locationName:"spotDatafeedSubscription" type:"structure"`
}

// String returns the string representation
func (s CreateSpotDatafeedSubscriptionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSpotDatafeedSubscriptionOutput) GoString() string {
	return s.String()
}

// SetSpotDatafeedSubscription sets the SpotDatafeedSubscription field's value.
func (s *CreateSpotDatafeedSubscriptionOutput) SetSpotDatafeedSubscription(v *SpotDatafeedSubscription) *CreateSpotDatafeedSubscriptionOutput {
	s.SpotDatafeedSubscription = v
	return s
}

type CreateSubnetInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone for the subnet.
	//
	// Default: AWS selects one for you. If you create more than one subnet in your
	// VPC, we may not necessarily select a different zone for each subnet.
	AvailabilityZone *string `type:"string"`

	// The AZ ID of the subnet.
	AvailabilityZoneId *string `type:"string"`

	// The IPv4 network range for the subnet, in CIDR notation. For example, 10.0.0.0/24.
	//
	// CidrBlock is a required field
	CidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The IPv6 network range for the subnet, in CIDR notation. The subnet size
	// must use a /64 prefix length.
	Ipv6CidrBlock *string `type:"string"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateSubnetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSubnetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateSubnetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateSubnetInput"}
	if s.CidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("CidrBlock"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CreateSubnetInput) SetAvailabilityZone(v string) *CreateSubnetInput {
	s.AvailabilityZone = &v
	return s
}

// SetAvailabilityZoneId sets the AvailabilityZoneId field's value.
func (s *CreateSubnetInput) SetAvailabilityZoneId(v string) *CreateSubnetInput {
	s.AvailabilityZoneId = &v
	return s
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *CreateSubnetInput) SetCidrBlock(v string) *CreateSubnetInput {
	s.CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateSubnetInput) SetDryRun(v bool) *CreateSubnetInput {
	s.DryRun = &v
	return s
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *CreateSubnetInput) SetIpv6CidrBlock(v string) *CreateSubnetInput {
	s.Ipv6CidrBlock = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateSubnetInput) SetVpcId(v string) *CreateSubnetInput {
	s.VpcId = &v
	return s
}

type CreateSubnetOutput struct {
	_ struct{} `type:"structure"`

	// Information about the subnet.
	Subnet *Subnet `locationName:"subnet" type:"structure"`
}

// String returns the string representation
func (s CreateSubnetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSubnetOutput) GoString() string {
	return s.String()
}

// SetSubnet sets the Subnet field's value.
func (s *CreateSubnetOutput) SetSubnet(v *Subnet) *CreateSubnetOutput {
	s.Subnet = v
	return s
}

type CreateTagsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The IDs of one or more resources, separated by spaces.
	//
	// Constraints: Up to 1000 resource IDs. We recommend breaking up this request
	// into smaller batches.
	//
	// Resources is a required field
	Resources []*string `locationName:"ResourceId" type:"list" required:"true"`

	// One or more tags. The value parameter is required, but if you don't want
	// the tag to have a value, specify the parameter with no value, and we set
	// the value to an empty string.
	//
	// Tags is a required field
	Tags []*Tag `locationName:"Tag" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s CreateTagsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTagsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateTagsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateTagsInput"}
	if s.Resources == nil {
		invalidParams.Add(request.NewErrParamRequired("Resources"))
	}
	if s.Tags == nil {
		invalidParams.Add(request.NewErrParamRequired("Tags"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CreateTagsInput) SetDryRun(v bool) *CreateTagsInput {
	s.DryRun = &v
	return s
}

// SetResources sets the Resources field's value.
func (s *CreateTagsInput) SetResources(v []*string) *CreateTagsInput {
	s.Resources = v
	return s
}

// SetTags sets the Tags field's value.
func (s *CreateTagsInput) SetTags(v []*Tag) *CreateTagsInput {
	s.Tags = v
	return s
}

type CreateTagsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreateTagsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTagsOutput) GoString() string {
	return s.String()
}

type CreateTransitGatewayInput struct {
	_ struct{} `type:"structure"`

	// A description of the transit gateway.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The transit gateway options.
	Options *TransitGatewayRequestOptions `type:"structure"`

	// The tags to apply to the transit gateway.
	TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CreateTransitGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayInput) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *CreateTransitGatewayInput) SetDescription(v string) *CreateTransitGatewayInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateTransitGatewayInput) SetDryRun(v bool) *CreateTransitGatewayInput {
	s.DryRun = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *CreateTransitGatewayInput) SetOptions(v *TransitGatewayRequestOptions) *CreateTransitGatewayInput {
	s.Options = v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateTransitGatewayInput) SetTagSpecifications(v []*TagSpecification) *CreateTransitGatewayInput {
	s.TagSpecifications = v
	return s
}

type CreateTransitGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Information about the transit gateway.
	TransitGateway *TransitGateway `locationName:"transitGateway" type:"structure"`
}

// String returns the string representation
func (s CreateTransitGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayOutput) GoString() string {
	return s.String()
}

// SetTransitGateway sets the TransitGateway field's value.
func (s *CreateTransitGatewayOutput) SetTransitGateway(v *TransitGateway) *CreateTransitGatewayOutput {
	s.TransitGateway = v
	return s
}

type CreateTransitGatewayRouteInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether traffic matching this route is to be dropped.
	Blackhole *bool `type:"boolean"`

	// The CIDR range used for destination matches. Routing decisions are based
	// on the most specific match.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `type:"string"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateTransitGatewayRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateTransitGatewayRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateTransitGatewayRouteInput"}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBlackhole sets the Blackhole field's value.
func (s *CreateTransitGatewayRouteInput) SetBlackhole(v bool) *CreateTransitGatewayRouteInput {
	s.Blackhole = &v
	return s
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *CreateTransitGatewayRouteInput) SetDestinationCidrBlock(v string) *CreateTransitGatewayRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateTransitGatewayRouteInput) SetDryRun(v bool) *CreateTransitGatewayRouteInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *CreateTransitGatewayRouteInput) SetTransitGatewayAttachmentId(v string) *CreateTransitGatewayRouteInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *CreateTransitGatewayRouteInput) SetTransitGatewayRouteTableId(v string) *CreateTransitGatewayRouteInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type CreateTransitGatewayRouteOutput struct {
	_ struct{} `type:"structure"`

	// Information about the route.
	Route *TransitGatewayRoute `locationName:"route" type:"structure"`
}

// String returns the string representation
func (s CreateTransitGatewayRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayRouteOutput) GoString() string {
	return s.String()
}

// SetRoute sets the Route field's value.
func (s *CreateTransitGatewayRouteOutput) SetRoute(v *TransitGatewayRoute) *CreateTransitGatewayRouteOutput {
	s.Route = v
	return s
}

type CreateTransitGatewayRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The tags to apply to the transit gateway route table.
	TagSpecifications []*TagSpecification `locationNameList:"item" type:"list"`

	// The ID of the transit gateway.
	//
	// TransitGatewayId is a required field
	TransitGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateTransitGatewayRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateTransitGatewayRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateTransitGatewayRouteTableInput"}
	if s.TransitGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CreateTransitGatewayRouteTableInput) SetDryRun(v bool) *CreateTransitGatewayRouteTableInput {
	s.DryRun = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateTransitGatewayRouteTableInput) SetTagSpecifications(v []*TagSpecification) *CreateTransitGatewayRouteTableInput {
	s.TagSpecifications = v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *CreateTransitGatewayRouteTableInput) SetTransitGatewayId(v string) *CreateTransitGatewayRouteTableInput {
	s.TransitGatewayId = &v
	return s
}

type CreateTransitGatewayRouteTableOutput struct {
	_ struct{} `type:"structure"`

	// Information about the transit gateway route table.
	TransitGatewayRouteTable *TransitGatewayRouteTable `locationName:"transitGatewayRouteTable" type:"structure"`
}

// String returns the string representation
func (s CreateTransitGatewayRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayRouteTableOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayRouteTable sets the TransitGatewayRouteTable field's value.
func (s *CreateTransitGatewayRouteTableOutput) SetTransitGatewayRouteTable(v *TransitGatewayRouteTable) *CreateTransitGatewayRouteTableOutput {
	s.TransitGatewayRouteTable = v
	return s
}

type CreateTransitGatewayVpcAttachmentInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The VPC attachment options.
	Options *CreateTransitGatewayVpcAttachmentRequestOptions `type:"structure"`

	// The IDs of one or more subnets. You can specify only one subnet per Availability
	// Zone. You must specify at least one subnet, but we recommend that you specify
	// two subnets for better availability. The transit gateway uses one IP address
	// from each specified subnet.
	//
	// SubnetIds is a required field
	SubnetIds []*string `locationNameList:"item" type:"list" required:"true"`

	// The tags to apply to the VPC attachment.
	TagSpecifications []*TagSpecification `locationNameList:"item" type:"list"`

	// The ID of the transit gateway.
	//
	// TransitGatewayId is a required field
	TransitGatewayId *string `type:"string" required:"true"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateTransitGatewayVpcAttachmentInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayVpcAttachmentInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateTransitGatewayVpcAttachmentInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateTransitGatewayVpcAttachmentInput"}
	if s.SubnetIds == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetIds"))
	}
	if s.TransitGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayId"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *CreateTransitGatewayVpcAttachmentInput) SetDryRun(v bool) *CreateTransitGatewayVpcAttachmentInput {
	s.DryRun = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *CreateTransitGatewayVpcAttachmentInput) SetOptions(v *CreateTransitGatewayVpcAttachmentRequestOptions) *CreateTransitGatewayVpcAttachmentInput {
	s.Options = v
	return s
}

// SetSubnetIds sets the SubnetIds field's value.
func (s *CreateTransitGatewayVpcAttachmentInput) SetSubnetIds(v []*string) *CreateTransitGatewayVpcAttachmentInput {
	s.SubnetIds = v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateTransitGatewayVpcAttachmentInput) SetTagSpecifications(v []*TagSpecification) *CreateTransitGatewayVpcAttachmentInput {
	s.TagSpecifications = v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *CreateTransitGatewayVpcAttachmentInput) SetTransitGatewayId(v string) *CreateTransitGatewayVpcAttachmentInput {
	s.TransitGatewayId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateTransitGatewayVpcAttachmentInput) SetVpcId(v string) *CreateTransitGatewayVpcAttachmentInput {
	s.VpcId = &v
	return s
}

type CreateTransitGatewayVpcAttachmentOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC attachment.
	TransitGatewayVpcAttachment *TransitGatewayVpcAttachment `locationName:"transitGatewayVpcAttachment" type:"structure"`
}

// String returns the string representation
func (s CreateTransitGatewayVpcAttachmentOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayVpcAttachmentOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayVpcAttachment sets the TransitGatewayVpcAttachment field's value.
func (s *CreateTransitGatewayVpcAttachmentOutput) SetTransitGatewayVpcAttachment(v *TransitGatewayVpcAttachment) *CreateTransitGatewayVpcAttachmentOutput {
	s.TransitGatewayVpcAttachment = v
	return s
}

// Describes the options for a VPC attachment.
type CreateTransitGatewayVpcAttachmentRequestOptions struct {
	_ struct{} `type:"structure"`

	// Enable or disable DNS support. The default is enable.
	DnsSupport *string `type:"string" enum:"DnsSupportValue"`

	// Enable or disable IPv6 support. The default is enable.
	Ipv6Support *string `type:"string" enum:"Ipv6SupportValue"`
}

// String returns the string representation
func (s CreateTransitGatewayVpcAttachmentRequestOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateTransitGatewayVpcAttachmentRequestOptions) GoString() string {
	return s.String()
}

// SetDnsSupport sets the DnsSupport field's value.
func (s *CreateTransitGatewayVpcAttachmentRequestOptions) SetDnsSupport(v string) *CreateTransitGatewayVpcAttachmentRequestOptions {
	s.DnsSupport = &v
	return s
}

// SetIpv6Support sets the Ipv6Support field's value.
func (s *CreateTransitGatewayVpcAttachmentRequestOptions) SetIpv6Support(v string) *CreateTransitGatewayVpcAttachmentRequestOptions {
	s.Ipv6Support = &v
	return s
}

// Contains the parameters for CreateVolume.
type CreateVolumeInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which to create the volume. Use DescribeAvailabilityZones
	// to list the Availability Zones that are currently available to you.
	//
	// AvailabilityZone is a required field
	AvailabilityZone *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Specifies whether the volume should be encrypted. Encrypted Amazon EBS volumes
	// may only be attached to instances that support Amazon EBS encryption. Volumes
	// that are created from encrypted snapshots are automatically encrypted. There
	// is no way to create an encrypted volume from an unencrypted snapshot or vice
	// versa. If your AMI uses encrypted volumes, you can only launch it on supported
	// instance types. For more information, see Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The number of I/O operations per second (IOPS) to provision for the volume,
	// with a maximum ratio of 50 IOPS/GiB. Range is 100 to 64,000 IOPS for volumes
	// in most regions. Maximum IOPS of 64,000 is guaranteed only on Nitro-based
	// instances (AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances).
	// Other instance families guarantee performance up to 32,000 IOPS. For more
	// information, see Amazon EBS Volume Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// This parameter is valid only for Provisioned IOPS SSD (io1) volumes.
	Iops *int64 `type:"integer"`

	// An identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) to use when creating the encrypted volume. This parameter is only
	// required if you want to use a non-default CMK; if this parameter is not specified,
	// the default CMK for EBS is used. If a KmsKeyId is specified, the Encrypted
	// flag must also be set.
	//
	// The CMK identifier may be provided in any of the following formats:
	//
	//    * Key ID
	//
	//    * Key alias
	//
	//    * ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed
	//    by the region of the CMK, the AWS account ID of the CMK owner, the key
	//    namespace, and then the CMK ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.
	//
	//
	//    * ARN using key alias. The alias ARN contains the arn:aws:kms namespace,
	//    followed by the region of the CMK, the AWS account ID of the CMK owner,
	//    the alias namespace, and then the CMK alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.
	//
	//
	// AWS parses KmsKeyId asynchronously, meaning that the action you call may
	// appear to complete even though you provided an invalid identifier. The action
	// will eventually fail.
	KmsKeyId *string `type:"string"`

	// The size of the volume, in GiBs.
	//
	// Constraints: 1-16,384 for gp2, 4-16,384 for io1, 500-16,384 for st1, 500-16,384
	// for sc1, and 1-1,024 for standard. If you specify a snapshot, the volume
	// size must be equal to or larger than the snapshot size.
	//
	// Default: If you're creating the volume from a snapshot and don't specify
	// a volume size, the default is the snapshot size.
	//
	// At least one of Size or SnapshotId are required.
	Size *int64 `type:"integer"`

	// The snapshot from which to create the volume.
	//
	// At least one of Size or SnapshotId are required.
	SnapshotId *string `type:"string"`

	// The tags to apply to the volume during creation.
	TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"`

	// The volume type. This can be gp2 for General Purpose SSD, io1 for Provisioned
	// IOPS SSD, st1 for Throughput Optimized HDD, sc1 for Cold HDD, or standard
	// for Magnetic volumes.
	//
	// Defaults: If no volume type is specified, the default is standard in us-east-1,
	// eu-west-1, eu-central-1, us-west-2, us-west-1, sa-east-1, ap-northeast-1,
	// ap-northeast-2, ap-southeast-1, ap-southeast-2, ap-south-1, us-gov-west-1,
	// and cn-north-1. In all other regions, EBS defaults to gp2.
	VolumeType *string `type:"string" enum:"VolumeType"`
}

// String returns the string representation
func (s CreateVolumeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVolumeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVolumeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVolumeInput"}
	if s.AvailabilityZone == nil {
		invalidParams.Add(request.NewErrParamRequired("AvailabilityZone"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CreateVolumeInput) SetAvailabilityZone(v string) *CreateVolumeInput {
	s.AvailabilityZone = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVolumeInput) SetDryRun(v bool) *CreateVolumeInput {
	s.DryRun = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *CreateVolumeInput) SetEncrypted(v bool) *CreateVolumeInput {
	s.Encrypted = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *CreateVolumeInput) SetIops(v int64) *CreateVolumeInput {
	s.Iops = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *CreateVolumeInput) SetKmsKeyId(v string) *CreateVolumeInput {
	s.KmsKeyId = &v
	return s
}

// SetSize sets the Size field's value.
func (s *CreateVolumeInput) SetSize(v int64) *CreateVolumeInput {
	s.Size = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *CreateVolumeInput) SetSnapshotId(v string) *CreateVolumeInput {
	s.SnapshotId = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *CreateVolumeInput) SetTagSpecifications(v []*TagSpecification) *CreateVolumeInput {
	s.TagSpecifications = v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *CreateVolumeInput) SetVolumeType(v string) *CreateVolumeInput {
	s.VolumeType = &v
	return s
}

// Describes the user or group to be added or removed from the permissions for
// a volume.
type CreateVolumePermission struct {
	_ struct{} `type:"structure"`

	// The specific group that is to be added or removed from a volume's list of
	// create volume permissions.
	Group *string `locationName:"group" type:"string" enum:"PermissionGroup"`

	// The specific AWS account ID that is to be added or removed from a volume's
	// list of create volume permissions.
	UserId *string `locationName:"userId" type:"string"`
}

// String returns the string representation
func (s CreateVolumePermission) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVolumePermission) GoString() string {
	return s.String()
}

// SetGroup sets the Group field's value.
func (s *CreateVolumePermission) SetGroup(v string) *CreateVolumePermission {
	s.Group = &v
	return s
}

// SetUserId sets the UserId field's value.
func (s *CreateVolumePermission) SetUserId(v string) *CreateVolumePermission {
	s.UserId = &v
	return s
}

// Describes modifications to the permissions for a volume.
type CreateVolumePermissionModifications struct {
	_ struct{} `type:"structure"`

	// Adds a specific AWS account ID or group to a volume's list of create volume
	// permissions.
	Add []*CreateVolumePermission `locationNameList:"item" type:"list"`

	// Removes a specific AWS account ID or group from a volume's list of create
	// volume permissions.
	Remove []*CreateVolumePermission `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s CreateVolumePermissionModifications) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVolumePermissionModifications) GoString() string {
	return s.String()
}

// SetAdd sets the Add field's value.
func (s *CreateVolumePermissionModifications) SetAdd(v []*CreateVolumePermission) *CreateVolumePermissionModifications {
	s.Add = v
	return s
}

// SetRemove sets the Remove field's value.
func (s *CreateVolumePermissionModifications) SetRemove(v []*CreateVolumePermission) *CreateVolumePermissionModifications {
	s.Remove = v
	return s
}

type CreateVpcEndpointConnectionNotificationInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// One or more endpoint events for which to receive notifications. Valid values
	// are Accept, Connect, Delete, and Reject.
	//
	// ConnectionEvents is a required field
	ConnectionEvents []*string `locationNameList:"item" type:"list" required:"true"`

	// The ARN of the SNS topic for the notifications.
	//
	// ConnectionNotificationArn is a required field
	ConnectionNotificationArn *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the endpoint service.
	ServiceId *string `type:"string"`

	// The ID of the endpoint.
	VpcEndpointId *string `type:"string"`
}

// String returns the string representation
func (s CreateVpcEndpointConnectionNotificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcEndpointConnectionNotificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpcEndpointConnectionNotificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpcEndpointConnectionNotificationInput"}
	if s.ConnectionEvents == nil {
		invalidParams.Add(request.NewErrParamRequired("ConnectionEvents"))
	}
	if s.ConnectionNotificationArn == nil {
		invalidParams.Add(request.NewErrParamRequired("ConnectionNotificationArn"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateVpcEndpointConnectionNotificationInput) SetClientToken(v string) *CreateVpcEndpointConnectionNotificationInput {
	s.ClientToken = &v
	return s
}

// SetConnectionEvents sets the ConnectionEvents field's value.
func (s *CreateVpcEndpointConnectionNotificationInput) SetConnectionEvents(v []*string) *CreateVpcEndpointConnectionNotificationInput {
	s.ConnectionEvents = v
	return s
}

// SetConnectionNotificationArn sets the ConnectionNotificationArn field's value.
func (s *CreateVpcEndpointConnectionNotificationInput) SetConnectionNotificationArn(v string) *CreateVpcEndpointConnectionNotificationInput {
	s.ConnectionNotificationArn = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpcEndpointConnectionNotificationInput) SetDryRun(v bool) *CreateVpcEndpointConnectionNotificationInput {
	s.DryRun = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *CreateVpcEndpointConnectionNotificationInput) SetServiceId(v string) *CreateVpcEndpointConnectionNotificationInput {
	s.ServiceId = &v
	return s
}

// SetVpcEndpointId sets the VpcEndpointId field's value.
func (s *CreateVpcEndpointConnectionNotificationInput) SetVpcEndpointId(v string) *CreateVpcEndpointConnectionNotificationInput {
	s.VpcEndpointId = &v
	return s
}

type CreateVpcEndpointConnectionNotificationOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Information about the notification.
	ConnectionNotification *ConnectionNotification `locationName:"connectionNotification" type:"structure"`
}

// String returns the string representation
func (s CreateVpcEndpointConnectionNotificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcEndpointConnectionNotificationOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateVpcEndpointConnectionNotificationOutput) SetClientToken(v string) *CreateVpcEndpointConnectionNotificationOutput {
	s.ClientToken = &v
	return s
}

// SetConnectionNotification sets the ConnectionNotification field's value.
func (s *CreateVpcEndpointConnectionNotificationOutput) SetConnectionNotification(v *ConnectionNotification) *CreateVpcEndpointConnectionNotificationOutput {
	s.ConnectionNotification = v
	return s
}

// Contains the parameters for CreateVpcEndpoint.
type CreateVpcEndpointInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// (Gateway endpoint) A policy to attach to the endpoint that controls access
	// to the service. The policy must be in valid JSON format. If this parameter
	// is not specified, we attach a default policy that allows full access to the
	// service.
	PolicyDocument *string `type:"string"`

	// (Interface endpoint) Indicate whether to associate a private hosted zone
	// with the specified VPC. The private hosted zone contains a record set for
	// the default public DNS name for the service for the region (for example,
	// kinesis.us-east-1.amazonaws.com) which resolves to the private IP addresses
	// of the endpoint network interfaces in the VPC. This enables you to make requests
	// to the default public DNS name for the service instead of the public DNS
	// names that are automatically generated by the VPC endpoint service.
	//
	// To use a private hosted zone, you must set the following VPC attributes to
	// true: enableDnsHostnames and enableDnsSupport. Use ModifyVpcAttribute to
	// set the VPC attributes.
	//
	// Default: false
	PrivateDnsEnabled *bool `type:"boolean"`

	// (Gateway endpoint) One or more route table IDs.
	RouteTableIds []*string `locationName:"RouteTableId" locationNameList:"item" type:"list"`

	// (Interface endpoint) The ID of one or more security groups to associate with
	// the endpoint network interface.
	SecurityGroupIds []*string `locationName:"SecurityGroupId" locationNameList:"item" type:"list"`

	// The service name. To get a list of available services, use the DescribeVpcEndpointServices
	// request, or get the name from the service provider.
	//
	// ServiceName is a required field
	ServiceName *string `type:"string" required:"true"`

	// (Interface endpoint) The ID of one or more subnets in which to create an
	// endpoint network interface.
	SubnetIds []*string `locationName:"SubnetId" locationNameList:"item" type:"list"`

	// The type of endpoint.
	//
	// Default: Gateway
	VpcEndpointType *string `type:"string" enum:"VpcEndpointType"`

	// The ID of the VPC in which the endpoint will be used.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateVpcEndpointInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcEndpointInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpcEndpointInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpcEndpointInput"}
	if s.ServiceName == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceName"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateVpcEndpointInput) SetClientToken(v string) *CreateVpcEndpointInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpcEndpointInput) SetDryRun(v bool) *CreateVpcEndpointInput {
	s.DryRun = &v
	return s
}

// SetPolicyDocument sets the PolicyDocument field's value.
func (s *CreateVpcEndpointInput) SetPolicyDocument(v string) *CreateVpcEndpointInput {
	s.PolicyDocument = &v
	return s
}

// SetPrivateDnsEnabled sets the PrivateDnsEnabled field's value.
func (s *CreateVpcEndpointInput) SetPrivateDnsEnabled(v bool) *CreateVpcEndpointInput {
	s.PrivateDnsEnabled = &v
	return s
}

// SetRouteTableIds sets the RouteTableIds field's value.
func (s *CreateVpcEndpointInput) SetRouteTableIds(v []*string) *CreateVpcEndpointInput {
	s.RouteTableIds = v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *CreateVpcEndpointInput) SetSecurityGroupIds(v []*string) *CreateVpcEndpointInput {
	s.SecurityGroupIds = v
	return s
}

// SetServiceName sets the ServiceName field's value.
func (s *CreateVpcEndpointInput) SetServiceName(v string) *CreateVpcEndpointInput {
	s.ServiceName = &v
	return s
}

// SetSubnetIds sets the SubnetIds field's value.
func (s *CreateVpcEndpointInput) SetSubnetIds(v []*string) *CreateVpcEndpointInput {
	s.SubnetIds = v
	return s
}

// SetVpcEndpointType sets the VpcEndpointType field's value.
func (s *CreateVpcEndpointInput) SetVpcEndpointType(v string) *CreateVpcEndpointInput {
	s.VpcEndpointType = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateVpcEndpointInput) SetVpcId(v string) *CreateVpcEndpointInput {
	s.VpcId = &v
	return s
}

// Contains the output of CreateVpcEndpoint.
type CreateVpcEndpointOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Information about the endpoint.
	VpcEndpoint *VpcEndpoint `locationName:"vpcEndpoint" type:"structure"`
}

// String returns the string representation
func (s CreateVpcEndpointOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcEndpointOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateVpcEndpointOutput) SetClientToken(v string) *CreateVpcEndpointOutput {
	s.ClientToken = &v
	return s
}

// SetVpcEndpoint sets the VpcEndpoint field's value.
func (s *CreateVpcEndpointOutput) SetVpcEndpoint(v *VpcEndpoint) *CreateVpcEndpointOutput {
	s.VpcEndpoint = v
	return s
}

type CreateVpcEndpointServiceConfigurationInput struct {
	_ struct{} `type:"structure"`

	// Indicate whether requests from service consumers to create an endpoint to
	// your service must be accepted. To accept a request, use AcceptVpcEndpointConnections.
	AcceptanceRequired *bool `type:"boolean"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The Amazon Resource Names (ARNs) of one or more Network Load Balancers for
	// your service.
	//
	// NetworkLoadBalancerArns is a required field
	NetworkLoadBalancerArns []*string `locationName:"NetworkLoadBalancerArn" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s CreateVpcEndpointServiceConfigurationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcEndpointServiceConfigurationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpcEndpointServiceConfigurationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpcEndpointServiceConfigurationInput"}
	if s.NetworkLoadBalancerArns == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkLoadBalancerArns"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAcceptanceRequired sets the AcceptanceRequired field's value.
func (s *CreateVpcEndpointServiceConfigurationInput) SetAcceptanceRequired(v bool) *CreateVpcEndpointServiceConfigurationInput {
	s.AcceptanceRequired = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateVpcEndpointServiceConfigurationInput) SetClientToken(v string) *CreateVpcEndpointServiceConfigurationInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpcEndpointServiceConfigurationInput) SetDryRun(v bool) *CreateVpcEndpointServiceConfigurationInput {
	s.DryRun = &v
	return s
}

// SetNetworkLoadBalancerArns sets the NetworkLoadBalancerArns field's value.
func (s *CreateVpcEndpointServiceConfigurationInput) SetNetworkLoadBalancerArns(v []*string) *CreateVpcEndpointServiceConfigurationInput {
	s.NetworkLoadBalancerArns = v
	return s
}

type CreateVpcEndpointServiceConfigurationOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Information about the service configuration.
	ServiceConfiguration *ServiceConfiguration `locationName:"serviceConfiguration" type:"structure"`
}

// String returns the string representation
func (s CreateVpcEndpointServiceConfigurationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcEndpointServiceConfigurationOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *CreateVpcEndpointServiceConfigurationOutput) SetClientToken(v string) *CreateVpcEndpointServiceConfigurationOutput {
	s.ClientToken = &v
	return s
}

// SetServiceConfiguration sets the ServiceConfiguration field's value.
func (s *CreateVpcEndpointServiceConfigurationOutput) SetServiceConfiguration(v *ServiceConfiguration) *CreateVpcEndpointServiceConfigurationOutput {
	s.ServiceConfiguration = v
	return s
}

type CreateVpcInput struct {
	_ struct{} `type:"structure"`

	// Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for
	// the VPC. You cannot specify the range of IP addresses, or the size of the
	// CIDR block.
	AmazonProvidedIpv6CidrBlock *bool `locationName:"amazonProvidedIpv6CidrBlock" type:"boolean"`

	// The IPv4 network range for the VPC, in CIDR notation. For example, 10.0.0.0/16.
	//
	// CidrBlock is a required field
	CidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The tenancy options for instances launched into the VPC. For default, instances
	// are launched with shared tenancy by default. You can launch instances with
	// any tenancy into a shared tenancy VPC. For dedicated, instances are launched
	// as dedicated tenancy instances by default. You can only launch instances
	// with a tenancy of dedicated or host into a dedicated tenancy VPC.
	//
	// Important: The host value cannot be used with this parameter. Use the default
	// or dedicated values only.
	//
	// Default: default
	InstanceTenancy *string `locationName:"instanceTenancy" type:"string" enum:"Tenancy"`
}

// String returns the string representation
func (s CreateVpcInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpcInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpcInput"}
	if s.CidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("CidrBlock"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAmazonProvidedIpv6CidrBlock sets the AmazonProvidedIpv6CidrBlock field's value.
func (s *CreateVpcInput) SetAmazonProvidedIpv6CidrBlock(v bool) *CreateVpcInput {
	s.AmazonProvidedIpv6CidrBlock = &v
	return s
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *CreateVpcInput) SetCidrBlock(v string) *CreateVpcInput {
	s.CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpcInput) SetDryRun(v bool) *CreateVpcInput {
	s.DryRun = &v
	return s
}

// SetInstanceTenancy sets the InstanceTenancy field's value.
func (s *CreateVpcInput) SetInstanceTenancy(v string) *CreateVpcInput {
	s.InstanceTenancy = &v
	return s
}

type CreateVpcOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC.
	Vpc *Vpc `locationName:"vpc" type:"structure"`
}

// String returns the string representation
func (s CreateVpcOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcOutput) GoString() string {
	return s.String()
}

// SetVpc sets the Vpc field's value.
func (s *CreateVpcOutput) SetVpc(v *Vpc) *CreateVpcOutput {
	s.Vpc = v
	return s
}

type CreateVpcPeeringConnectionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The AWS account ID of the owner of the accepter VPC.
	//
	// Default: Your AWS account ID
	PeerOwnerId *string `locationName:"peerOwnerId" type:"string"`

	// The region code for the accepter VPC, if the accepter VPC is located in a
	// region other than the region in which you make the request.
	//
	// Default: The region in which you make the request.
	PeerRegion *string `type:"string"`

	// The ID of the VPC with which you are creating the VPC peering connection.
	// You must specify this parameter in the request.
	PeerVpcId *string `locationName:"peerVpcId" type:"string"`

	// The ID of the requester VPC. You must specify this parameter in the request.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s CreateVpcPeeringConnectionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcPeeringConnectionInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpcPeeringConnectionInput) SetDryRun(v bool) *CreateVpcPeeringConnectionInput {
	s.DryRun = &v
	return s
}

// SetPeerOwnerId sets the PeerOwnerId field's value.
func (s *CreateVpcPeeringConnectionInput) SetPeerOwnerId(v string) *CreateVpcPeeringConnectionInput {
	s.PeerOwnerId = &v
	return s
}

// SetPeerRegion sets the PeerRegion field's value.
func (s *CreateVpcPeeringConnectionInput) SetPeerRegion(v string) *CreateVpcPeeringConnectionInput {
	s.PeerRegion = &v
	return s
}

// SetPeerVpcId sets the PeerVpcId field's value.
func (s *CreateVpcPeeringConnectionInput) SetPeerVpcId(v string) *CreateVpcPeeringConnectionInput {
	s.PeerVpcId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *CreateVpcPeeringConnectionInput) SetVpcId(v string) *CreateVpcPeeringConnectionInput {
	s.VpcId = &v
	return s
}

type CreateVpcPeeringConnectionOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC peering connection.
	VpcPeeringConnection *VpcPeeringConnection `locationName:"vpcPeeringConnection" type:"structure"`
}

// String returns the string representation
func (s CreateVpcPeeringConnectionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpcPeeringConnectionOutput) GoString() string {
	return s.String()
}

// SetVpcPeeringConnection sets the VpcPeeringConnection field's value.
func (s *CreateVpcPeeringConnectionOutput) SetVpcPeeringConnection(v *VpcPeeringConnection) *CreateVpcPeeringConnectionOutput {
	s.VpcPeeringConnection = v
	return s
}

// Contains the parameters for CreateVpnConnection.
type CreateVpnConnectionInput struct {
	_ struct{} `type:"structure"`

	// The ID of the customer gateway.
	//
	// CustomerGatewayId is a required field
	CustomerGatewayId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The options for the VPN connection.
	Options *VpnConnectionOptionsSpecification `locationName:"options" type:"structure"`

	// The ID of the transit gateway. If you specify a transit gateway, you cannot
	// specify a virtual private gateway.
	TransitGatewayId *string `type:"string"`

	// The type of VPN connection (ipsec.1).
	//
	// Type is a required field
	Type *string `type:"string" required:"true"`

	// The ID of the virtual private gateway. If you specify a virtual private gateway,
	// you cannot specify a transit gateway.
	VpnGatewayId *string `type:"string"`
}

// String returns the string representation
func (s CreateVpnConnectionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpnConnectionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpnConnectionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpnConnectionInput"}
	if s.CustomerGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("CustomerGatewayId"))
	}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCustomerGatewayId sets the CustomerGatewayId field's value.
func (s *CreateVpnConnectionInput) SetCustomerGatewayId(v string) *CreateVpnConnectionInput {
	s.CustomerGatewayId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpnConnectionInput) SetDryRun(v bool) *CreateVpnConnectionInput {
	s.DryRun = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *CreateVpnConnectionInput) SetOptions(v *VpnConnectionOptionsSpecification) *CreateVpnConnectionInput {
	s.Options = v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *CreateVpnConnectionInput) SetTransitGatewayId(v string) *CreateVpnConnectionInput {
	s.TransitGatewayId = &v
	return s
}

// SetType sets the Type field's value.
func (s *CreateVpnConnectionInput) SetType(v string) *CreateVpnConnectionInput {
	s.Type = &v
	return s
}

// SetVpnGatewayId sets the VpnGatewayId field's value.
func (s *CreateVpnConnectionInput) SetVpnGatewayId(v string) *CreateVpnConnectionInput {
	s.VpnGatewayId = &v
	return s
}

// Contains the output of CreateVpnConnection.
type CreateVpnConnectionOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPN connection.
	VpnConnection *VpnConnection `locationName:"vpnConnection" type:"structure"`
}

// String returns the string representation
func (s CreateVpnConnectionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpnConnectionOutput) GoString() string {
	return s.String()
}

// SetVpnConnection sets the VpnConnection field's value.
func (s *CreateVpnConnectionOutput) SetVpnConnection(v *VpnConnection) *CreateVpnConnectionOutput {
	s.VpnConnection = v
	return s
}

// Contains the parameters for CreateVpnConnectionRoute.
type CreateVpnConnectionRouteInput struct {
	_ struct{} `type:"structure"`

	// The CIDR block associated with the local subnet of the customer network.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// The ID of the VPN connection.
	//
	// VpnConnectionId is a required field
	VpnConnectionId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreateVpnConnectionRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpnConnectionRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpnConnectionRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpnConnectionRouteInput"}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}
	if s.VpnConnectionId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpnConnectionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *CreateVpnConnectionRouteInput) SetDestinationCidrBlock(v string) *CreateVpnConnectionRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetVpnConnectionId sets the VpnConnectionId field's value.
func (s *CreateVpnConnectionRouteInput) SetVpnConnectionId(v string) *CreateVpnConnectionRouteInput {
	s.VpnConnectionId = &v
	return s
}

type CreateVpnConnectionRouteOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreateVpnConnectionRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpnConnectionRouteOutput) GoString() string {
	return s.String()
}

// Contains the parameters for CreateVpnGateway.
type CreateVpnGatewayInput struct {
	_ struct{} `type:"structure"`

	// A private Autonomous System Number (ASN) for the Amazon side of a BGP session.
	// If you're using a 16-bit ASN, it must be in the 64512 to 65534 range. If
	// you're using a 32-bit ASN, it must be in the 4200000000 to 4294967294 range.
	//
	// Default: 64512
	AmazonSideAsn *int64 `type:"long"`

	// The Availability Zone for the virtual private gateway.
	AvailabilityZone *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The type of VPN connection this virtual private gateway supports.
	//
	// Type is a required field
	Type *string `type:"string" required:"true" enum:"GatewayType"`
}

// String returns the string representation
func (s CreateVpnGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpnGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateVpnGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateVpnGatewayInput"}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAmazonSideAsn sets the AmazonSideAsn field's value.
func (s *CreateVpnGatewayInput) SetAmazonSideAsn(v int64) *CreateVpnGatewayInput {
	s.AmazonSideAsn = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *CreateVpnGatewayInput) SetAvailabilityZone(v string) *CreateVpnGatewayInput {
	s.AvailabilityZone = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *CreateVpnGatewayInput) SetDryRun(v bool) *CreateVpnGatewayInput {
	s.DryRun = &v
	return s
}

// SetType sets the Type field's value.
func (s *CreateVpnGatewayInput) SetType(v string) *CreateVpnGatewayInput {
	s.Type = &v
	return s
}

// Contains the output of CreateVpnGateway.
type CreateVpnGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Information about the virtual private gateway.
	VpnGateway *VpnGateway `locationName:"vpnGateway" type:"structure"`
}

// String returns the string representation
func (s CreateVpnGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateVpnGatewayOutput) GoString() string {
	return s.String()
}

// SetVpnGateway sets the VpnGateway field's value.
func (s *CreateVpnGatewayOutput) SetVpnGateway(v *VpnGateway) *CreateVpnGatewayOutput {
	s.VpnGateway = v
	return s
}

// Describes the credit option for CPU usage of a T2 or T3 instance.
type CreditSpecification struct {
	_ struct{} `type:"structure"`

	// The credit option for CPU usage of a T2 or T3 instance. Valid values are
	// standard and unlimited.
	CpuCredits *string `locationName:"cpuCredits" type:"string"`
}

// String returns the string representation
func (s CreditSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreditSpecification) GoString() string {
	return s.String()
}

// SetCpuCredits sets the CpuCredits field's value.
func (s *CreditSpecification) SetCpuCredits(v string) *CreditSpecification {
	s.CpuCredits = &v
	return s
}

// The credit option for CPU usage of a T2 or T3 instance.
type CreditSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// The credit option for CPU usage of a T2 or T3 instance. Valid values are
	// standard and unlimited.
	//
	// CpuCredits is a required field
	CpuCredits *string `type:"string" required:"true"`
}

// String returns the string representation
func (s CreditSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreditSpecificationRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreditSpecificationRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreditSpecificationRequest"}
	if s.CpuCredits == nil {
		invalidParams.Add(request.NewErrParamRequired("CpuCredits"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCpuCredits sets the CpuCredits field's value.
func (s *CreditSpecificationRequest) SetCpuCredits(v string) *CreditSpecificationRequest {
	s.CpuCredits = &v
	return s
}

// Describes a customer gateway.
type CustomerGateway struct {
	_ struct{} `type:"structure"`

	// The customer gateway's Border Gateway Protocol (BGP) Autonomous System Number
	// (ASN).
	BgpAsn *string `locationName:"bgpAsn" type:"string"`

	// The ID of the customer gateway.
	CustomerGatewayId *string `locationName:"customerGatewayId" type:"string"`

	// The Internet-routable IP address of the customer gateway's outside interface.
	IpAddress *string `locationName:"ipAddress" type:"string"`

	// The current state of the customer gateway (pending | available | deleting
	// | deleted).
	State *string `locationName:"state" type:"string"`

	// Any tags assigned to the customer gateway.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The type of VPN connection the customer gateway supports (ipsec.1).
	Type *string `locationName:"type" type:"string"`
}

// String returns the string representation
func (s CustomerGateway) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CustomerGateway) GoString() string {
	return s.String()
}

// SetBgpAsn sets the BgpAsn field's value.
func (s *CustomerGateway) SetBgpAsn(v string) *CustomerGateway {
	s.BgpAsn = &v
	return s
}

// SetCustomerGatewayId sets the CustomerGatewayId field's value.
func (s *CustomerGateway) SetCustomerGatewayId(v string) *CustomerGateway {
	s.CustomerGatewayId = &v
	return s
}

// SetIpAddress sets the IpAddress field's value.
func (s *CustomerGateway) SetIpAddress(v string) *CustomerGateway {
	s.IpAddress = &v
	return s
}

// SetState sets the State field's value.
func (s *CustomerGateway) SetState(v string) *CustomerGateway {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *CustomerGateway) SetTags(v []*Tag) *CustomerGateway {
	s.Tags = v
	return s
}

// SetType sets the Type field's value.
func (s *CustomerGateway) SetType(v string) *CustomerGateway {
	s.Type = &v
	return s
}

type DeleteClientVpnEndpointInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN to be deleted.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s DeleteClientVpnEndpointInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteClientVpnEndpointInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteClientVpnEndpointInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteClientVpnEndpointInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DeleteClientVpnEndpointInput) SetClientVpnEndpointId(v string) *DeleteClientVpnEndpointInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteClientVpnEndpointInput) SetDryRun(v bool) *DeleteClientVpnEndpointInput {
	s.DryRun = &v
	return s
}

type DeleteClientVpnEndpointOutput struct {
	_ struct{} `type:"structure"`

	// The current state of the Client VPN endpoint.
	Status *ClientVpnEndpointStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s DeleteClientVpnEndpointOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteClientVpnEndpointOutput) GoString() string {
	return s.String()
}

// SetStatus sets the Status field's value.
func (s *DeleteClientVpnEndpointOutput) SetStatus(v *ClientVpnEndpointStatus) *DeleteClientVpnEndpointOutput {
	s.Status = v
	return s
}

type DeleteClientVpnRouteInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint from which the route is to be deleted.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// The IPv4 address range, in CIDR notation, of the route to be deleted.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the target subnet used by the route.
	TargetVpcSubnetId *string `type:"string"`
}

// String returns the string representation
func (s DeleteClientVpnRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteClientVpnRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteClientVpnRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteClientVpnRouteInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DeleteClientVpnRouteInput) SetClientVpnEndpointId(v string) *DeleteClientVpnRouteInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *DeleteClientVpnRouteInput) SetDestinationCidrBlock(v string) *DeleteClientVpnRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteClientVpnRouteInput) SetDryRun(v bool) *DeleteClientVpnRouteInput {
	s.DryRun = &v
	return s
}

// SetTargetVpcSubnetId sets the TargetVpcSubnetId field's value.
func (s *DeleteClientVpnRouteInput) SetTargetVpcSubnetId(v string) *DeleteClientVpnRouteInput {
	s.TargetVpcSubnetId = &v
	return s
}

type DeleteClientVpnRouteOutput struct {
	_ struct{} `type:"structure"`

	// The current state of the route.
	Status *ClientVpnRouteStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s DeleteClientVpnRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteClientVpnRouteOutput) GoString() string {
	return s.String()
}

// SetStatus sets the Status field's value.
func (s *DeleteClientVpnRouteOutput) SetStatus(v *ClientVpnRouteStatus) *DeleteClientVpnRouteOutput {
	s.Status = v
	return s
}

// Contains the parameters for DeleteCustomerGateway.
type DeleteCustomerGatewayInput struct {
	_ struct{} `type:"structure"`

	// The ID of the customer gateway.
	//
	// CustomerGatewayId is a required field
	CustomerGatewayId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DeleteCustomerGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteCustomerGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteCustomerGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteCustomerGatewayInput"}
	if s.CustomerGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("CustomerGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCustomerGatewayId sets the CustomerGatewayId field's value.
func (s *DeleteCustomerGatewayInput) SetCustomerGatewayId(v string) *DeleteCustomerGatewayInput {
	s.CustomerGatewayId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteCustomerGatewayInput) SetDryRun(v bool) *DeleteCustomerGatewayInput {
	s.DryRun = &v
	return s
}

type DeleteCustomerGatewayOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteCustomerGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteCustomerGatewayOutput) GoString() string {
	return s.String()
}

type DeleteDhcpOptionsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the DHCP options set.
	//
	// DhcpOptionsId is a required field
	DhcpOptionsId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DeleteDhcpOptionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteDhcpOptionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteDhcpOptionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteDhcpOptionsInput"}
	if s.DhcpOptionsId == nil {
		invalidParams.Add(request.NewErrParamRequired("DhcpOptionsId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDhcpOptionsId sets the DhcpOptionsId field's value.
func (s *DeleteDhcpOptionsInput) SetDhcpOptionsId(v string) *DeleteDhcpOptionsInput {
	s.DhcpOptionsId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteDhcpOptionsInput) SetDryRun(v bool) *DeleteDhcpOptionsInput {
	s.DryRun = &v
	return s
}

type DeleteDhcpOptionsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteDhcpOptionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteDhcpOptionsOutput) GoString() string {
	return s.String()
}

type DeleteEgressOnlyInternetGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the egress-only internet gateway.
	//
	// EgressOnlyInternetGatewayId is a required field
	EgressOnlyInternetGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteEgressOnlyInternetGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteEgressOnlyInternetGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteEgressOnlyInternetGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteEgressOnlyInternetGatewayInput"}
	if s.EgressOnlyInternetGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("EgressOnlyInternetGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteEgressOnlyInternetGatewayInput) SetDryRun(v bool) *DeleteEgressOnlyInternetGatewayInput {
	s.DryRun = &v
	return s
}

// SetEgressOnlyInternetGatewayId sets the EgressOnlyInternetGatewayId field's value.
func (s *DeleteEgressOnlyInternetGatewayInput) SetEgressOnlyInternetGatewayId(v string) *DeleteEgressOnlyInternetGatewayInput {
	s.EgressOnlyInternetGatewayId = &v
	return s
}

type DeleteEgressOnlyInternetGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	ReturnCode *bool `locationName:"returnCode" type:"boolean"`
}

// String returns the string representation
func (s DeleteEgressOnlyInternetGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteEgressOnlyInternetGatewayOutput) GoString() string {
	return s.String()
}

// SetReturnCode sets the ReturnCode field's value.
func (s *DeleteEgressOnlyInternetGatewayOutput) SetReturnCode(v bool) *DeleteEgressOnlyInternetGatewayOutput {
	s.ReturnCode = &v
	return s
}

// Describes an EC2 Fleet error.
type DeleteFleetError struct {
	_ struct{} `type:"structure"`

	// The error code.
	Code *string `locationName:"code" type:"string" enum:"DeleteFleetErrorCode"`

	// The description for the error code.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s DeleteFleetError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFleetError) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *DeleteFleetError) SetCode(v string) *DeleteFleetError {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *DeleteFleetError) SetMessage(v string) *DeleteFleetError {
	s.Message = &v
	return s
}

// Describes an EC2 Fleet that was not successfully deleted.
type DeleteFleetErrorItem struct {
	_ struct{} `type:"structure"`

	// The error.
	Error *DeleteFleetError `locationName:"error" type:"structure"`

	// The ID of the EC2 Fleet.
	FleetId *string `locationName:"fleetId" type:"string"`
}

// String returns the string representation
func (s DeleteFleetErrorItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFleetErrorItem) GoString() string {
	return s.String()
}

// SetError sets the Error field's value.
func (s *DeleteFleetErrorItem) SetError(v *DeleteFleetError) *DeleteFleetErrorItem {
	s.Error = v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *DeleteFleetErrorItem) SetFleetId(v string) *DeleteFleetErrorItem {
	s.FleetId = &v
	return s
}

// Describes an EC2 Fleet that was successfully deleted.
type DeleteFleetSuccessItem struct {
	_ struct{} `type:"structure"`

	// The current state of the EC2 Fleet.
	CurrentFleetState *string `locationName:"currentFleetState" type:"string" enum:"FleetStateCode"`

	// The ID of the EC2 Fleet.
	FleetId *string `locationName:"fleetId" type:"string"`

	// The previous state of the EC2 Fleet.
	PreviousFleetState *string `locationName:"previousFleetState" type:"string" enum:"FleetStateCode"`
}

// String returns the string representation
func (s DeleteFleetSuccessItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFleetSuccessItem) GoString() string {
	return s.String()
}

// SetCurrentFleetState sets the CurrentFleetState field's value.
func (s *DeleteFleetSuccessItem) SetCurrentFleetState(v string) *DeleteFleetSuccessItem {
	s.CurrentFleetState = &v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *DeleteFleetSuccessItem) SetFleetId(v string) *DeleteFleetSuccessItem {
	s.FleetId = &v
	return s
}

// SetPreviousFleetState sets the PreviousFleetState field's value.
func (s *DeleteFleetSuccessItem) SetPreviousFleetState(v string) *DeleteFleetSuccessItem {
	s.PreviousFleetState = &v
	return s
}

type DeleteFleetsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The IDs of the EC2 Fleets.
	//
	// FleetIds is a required field
	FleetIds []*string `locationName:"FleetId" type:"list" required:"true"`

	// Indicates whether to terminate instances for an EC2 Fleet if it is deleted
	// successfully.
	//
	// TerminateInstances is a required field
	TerminateInstances *bool `type:"boolean" required:"true"`
}

// String returns the string representation
func (s DeleteFleetsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFleetsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteFleetsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteFleetsInput"}
	if s.FleetIds == nil {
		invalidParams.Add(request.NewErrParamRequired("FleetIds"))
	}
	if s.TerminateInstances == nil {
		invalidParams.Add(request.NewErrParamRequired("TerminateInstances"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteFleetsInput) SetDryRun(v bool) *DeleteFleetsInput {
	s.DryRun = &v
	return s
}

// SetFleetIds sets the FleetIds field's value.
func (s *DeleteFleetsInput) SetFleetIds(v []*string) *DeleteFleetsInput {
	s.FleetIds = v
	return s
}

// SetTerminateInstances sets the TerminateInstances field's value.
func (s *DeleteFleetsInput) SetTerminateInstances(v bool) *DeleteFleetsInput {
	s.TerminateInstances = &v
	return s
}

type DeleteFleetsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the EC2 Fleets that are successfully deleted.
	SuccessfulFleetDeletions []*DeleteFleetSuccessItem `locationName:"successfulFleetDeletionSet" locationNameList:"item" type:"list"`

	// Information about the EC2 Fleets that are not successfully deleted.
	UnsuccessfulFleetDeletions []*DeleteFleetErrorItem `locationName:"unsuccessfulFleetDeletionSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteFleetsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFleetsOutput) GoString() string {
	return s.String()
}

// SetSuccessfulFleetDeletions sets the SuccessfulFleetDeletions field's value.
func (s *DeleteFleetsOutput) SetSuccessfulFleetDeletions(v []*DeleteFleetSuccessItem) *DeleteFleetsOutput {
	s.SuccessfulFleetDeletions = v
	return s
}

// SetUnsuccessfulFleetDeletions sets the UnsuccessfulFleetDeletions field's value.
func (s *DeleteFleetsOutput) SetUnsuccessfulFleetDeletions(v []*DeleteFleetErrorItem) *DeleteFleetsOutput {
	s.UnsuccessfulFleetDeletions = v
	return s
}

type DeleteFlowLogsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more flow log IDs.
	//
	// FlowLogIds is a required field
	FlowLogIds []*string `locationName:"FlowLogId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s DeleteFlowLogsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFlowLogsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteFlowLogsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteFlowLogsInput"}
	if s.FlowLogIds == nil {
		invalidParams.Add(request.NewErrParamRequired("FlowLogIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteFlowLogsInput) SetDryRun(v bool) *DeleteFlowLogsInput {
	s.DryRun = &v
	return s
}

// SetFlowLogIds sets the FlowLogIds field's value.
func (s *DeleteFlowLogsInput) SetFlowLogIds(v []*string) *DeleteFlowLogsInput {
	s.FlowLogIds = v
	return s
}

type DeleteFlowLogsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the flow logs that could not be deleted successfully.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteFlowLogsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFlowLogsOutput) GoString() string {
	return s.String()
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *DeleteFlowLogsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *DeleteFlowLogsOutput {
	s.Unsuccessful = v
	return s
}

type DeleteFpgaImageInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the AFI.
	//
	// FpgaImageId is a required field
	FpgaImageId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteFpgaImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFpgaImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteFpgaImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteFpgaImageInput"}
	if s.FpgaImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("FpgaImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteFpgaImageInput) SetDryRun(v bool) *DeleteFpgaImageInput {
	s.DryRun = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *DeleteFpgaImageInput) SetFpgaImageId(v string) *DeleteFpgaImageInput {
	s.FpgaImageId = &v
	return s
}

type DeleteFpgaImageOutput struct {
	_ struct{} `type:"structure"`

	// Is true if the request succeeds, and an error otherwise.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s DeleteFpgaImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteFpgaImageOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *DeleteFpgaImageOutput) SetReturn(v bool) *DeleteFpgaImageOutput {
	s.Return = &v
	return s
}

type DeleteInternetGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the internet gateway.
	//
	// InternetGatewayId is a required field
	InternetGatewayId *string `locationName:"internetGatewayId" type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteInternetGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteInternetGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteInternetGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteInternetGatewayInput"}
	if s.InternetGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("InternetGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteInternetGatewayInput) SetDryRun(v bool) *DeleteInternetGatewayInput {
	s.DryRun = &v
	return s
}

// SetInternetGatewayId sets the InternetGatewayId field's value.
func (s *DeleteInternetGatewayInput) SetInternetGatewayId(v string) *DeleteInternetGatewayInput {
	s.InternetGatewayId = &v
	return s
}

type DeleteInternetGatewayOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteInternetGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteInternetGatewayOutput) GoString() string {
	return s.String()
}

type DeleteKeyPairInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The name of the key pair.
	//
	// KeyName is a required field
	KeyName *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteKeyPairInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteKeyPairInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteKeyPairInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteKeyPairInput"}
	if s.KeyName == nil {
		invalidParams.Add(request.NewErrParamRequired("KeyName"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteKeyPairInput) SetDryRun(v bool) *DeleteKeyPairInput {
	s.DryRun = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *DeleteKeyPairInput) SetKeyName(v string) *DeleteKeyPairInput {
	s.KeyName = &v
	return s
}

type DeleteKeyPairOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteKeyPairOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteKeyPairOutput) GoString() string {
	return s.String()
}

type DeleteLaunchTemplateInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateName *string `min:"3" type:"string"`
}

// String returns the string representation
func (s DeleteLaunchTemplateInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteLaunchTemplateInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteLaunchTemplateInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteLaunchTemplateInput"}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteLaunchTemplateInput) SetDryRun(v bool) *DeleteLaunchTemplateInput {
	s.DryRun = &v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *DeleteLaunchTemplateInput) SetLaunchTemplateId(v string) *DeleteLaunchTemplateInput {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *DeleteLaunchTemplateInput) SetLaunchTemplateName(v string) *DeleteLaunchTemplateInput {
	s.LaunchTemplateName = &v
	return s
}

type DeleteLaunchTemplateOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch template.
	LaunchTemplate *LaunchTemplate `locationName:"launchTemplate" type:"structure"`
}

// String returns the string representation
func (s DeleteLaunchTemplateOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteLaunchTemplateOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplate sets the LaunchTemplate field's value.
func (s *DeleteLaunchTemplateOutput) SetLaunchTemplate(v *LaunchTemplate) *DeleteLaunchTemplateOutput {
	s.LaunchTemplate = v
	return s
}

type DeleteLaunchTemplateVersionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateName *string `min:"3" type:"string"`

	// The version numbers of one or more launch template versions to delete.
	//
	// Versions is a required field
	Versions []*string `locationName:"LaunchTemplateVersion" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s DeleteLaunchTemplateVersionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteLaunchTemplateVersionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteLaunchTemplateVersionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteLaunchTemplateVersionsInput"}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}
	if s.Versions == nil {
		invalidParams.Add(request.NewErrParamRequired("Versions"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteLaunchTemplateVersionsInput) SetDryRun(v bool) *DeleteLaunchTemplateVersionsInput {
	s.DryRun = &v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *DeleteLaunchTemplateVersionsInput) SetLaunchTemplateId(v string) *DeleteLaunchTemplateVersionsInput {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *DeleteLaunchTemplateVersionsInput) SetLaunchTemplateName(v string) *DeleteLaunchTemplateVersionsInput {
	s.LaunchTemplateName = &v
	return s
}

// SetVersions sets the Versions field's value.
func (s *DeleteLaunchTemplateVersionsInput) SetVersions(v []*string) *DeleteLaunchTemplateVersionsInput {
	s.Versions = v
	return s
}

type DeleteLaunchTemplateVersionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch template versions that were successfully deleted.
	SuccessfullyDeletedLaunchTemplateVersions []*DeleteLaunchTemplateVersionsResponseSuccessItem `locationName:"successfullyDeletedLaunchTemplateVersionSet" locationNameList:"item" type:"list"`

	// Information about the launch template versions that could not be deleted.
	UnsuccessfullyDeletedLaunchTemplateVersions []*DeleteLaunchTemplateVersionsResponseErrorItem `locationName:"unsuccessfullyDeletedLaunchTemplateVersionSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteLaunchTemplateVersionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteLaunchTemplateVersionsOutput) GoString() string {
	return s.String()
}

// SetSuccessfullyDeletedLaunchTemplateVersions sets the SuccessfullyDeletedLaunchTemplateVersions field's value.
func (s *DeleteLaunchTemplateVersionsOutput) SetSuccessfullyDeletedLaunchTemplateVersions(v []*DeleteLaunchTemplateVersionsResponseSuccessItem) *DeleteLaunchTemplateVersionsOutput {
	s.SuccessfullyDeletedLaunchTemplateVersions = v
	return s
}

// SetUnsuccessfullyDeletedLaunchTemplateVersions sets the UnsuccessfullyDeletedLaunchTemplateVersions field's value.
func (s *DeleteLaunchTemplateVersionsOutput) SetUnsuccessfullyDeletedLaunchTemplateVersions(v []*DeleteLaunchTemplateVersionsResponseErrorItem) *DeleteLaunchTemplateVersionsOutput {
	s.UnsuccessfullyDeletedLaunchTemplateVersions = v
	return s
}

// Describes a launch template version that could not be deleted.
type DeleteLaunchTemplateVersionsResponseErrorItem struct {
	_ struct{} `type:"structure"`

	// The ID of the launch template.
	LaunchTemplateId *string `locationName:"launchTemplateId" type:"string"`

	// The name of the launch template.
	LaunchTemplateName *string `locationName:"launchTemplateName" type:"string"`

	// Information about the error.
	ResponseError *ResponseError `locationName:"responseError" type:"structure"`

	// The version number of the launch template.
	VersionNumber *int64 `locationName:"versionNumber" type:"long"`
}

// String returns the string representation
func (s DeleteLaunchTemplateVersionsResponseErrorItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteLaunchTemplateVersionsResponseErrorItem) GoString() string {
	return s.String()
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *DeleteLaunchTemplateVersionsResponseErrorItem) SetLaunchTemplateId(v string) *DeleteLaunchTemplateVersionsResponseErrorItem {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *DeleteLaunchTemplateVersionsResponseErrorItem) SetLaunchTemplateName(v string) *DeleteLaunchTemplateVersionsResponseErrorItem {
	s.LaunchTemplateName = &v
	return s
}

// SetResponseError sets the ResponseError field's value.
func (s *DeleteLaunchTemplateVersionsResponseErrorItem) SetResponseError(v *ResponseError) *DeleteLaunchTemplateVersionsResponseErrorItem {
	s.ResponseError = v
	return s
}

// SetVersionNumber sets the VersionNumber field's value.
func (s *DeleteLaunchTemplateVersionsResponseErrorItem) SetVersionNumber(v int64) *DeleteLaunchTemplateVersionsResponseErrorItem {
	s.VersionNumber = &v
	return s
}

// Describes a launch template version that was successfully deleted.
type DeleteLaunchTemplateVersionsResponseSuccessItem struct {
	_ struct{} `type:"structure"`

	// The ID of the launch template.
	LaunchTemplateId *string `locationName:"launchTemplateId" type:"string"`

	// The name of the launch template.
	LaunchTemplateName *string `locationName:"launchTemplateName" type:"string"`

	// The version number of the launch template.
	VersionNumber *int64 `locationName:"versionNumber" type:"long"`
}

// String returns the string representation
func (s DeleteLaunchTemplateVersionsResponseSuccessItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteLaunchTemplateVersionsResponseSuccessItem) GoString() string {
	return s.String()
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *DeleteLaunchTemplateVersionsResponseSuccessItem) SetLaunchTemplateId(v string) *DeleteLaunchTemplateVersionsResponseSuccessItem {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *DeleteLaunchTemplateVersionsResponseSuccessItem) SetLaunchTemplateName(v string) *DeleteLaunchTemplateVersionsResponseSuccessItem {
	s.LaunchTemplateName = &v
	return s
}

// SetVersionNumber sets the VersionNumber field's value.
func (s *DeleteLaunchTemplateVersionsResponseSuccessItem) SetVersionNumber(v int64) *DeleteLaunchTemplateVersionsResponseSuccessItem {
	s.VersionNumber = &v
	return s
}

type DeleteNatGatewayInput struct {
	_ struct{} `type:"structure"`

	// The ID of the NAT gateway.
	//
	// NatGatewayId is a required field
	NatGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteNatGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNatGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteNatGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteNatGatewayInput"}
	if s.NatGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("NatGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetNatGatewayId sets the NatGatewayId field's value.
func (s *DeleteNatGatewayInput) SetNatGatewayId(v string) *DeleteNatGatewayInput {
	s.NatGatewayId = &v
	return s
}

type DeleteNatGatewayOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the NAT gateway.
	NatGatewayId *string `locationName:"natGatewayId" type:"string"`
}

// String returns the string representation
func (s DeleteNatGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNatGatewayOutput) GoString() string {
	return s.String()
}

// SetNatGatewayId sets the NatGatewayId field's value.
func (s *DeleteNatGatewayOutput) SetNatGatewayId(v string) *DeleteNatGatewayOutput {
	s.NatGatewayId = &v
	return s
}

type DeleteNetworkAclEntryInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Indicates whether the rule is an egress rule.
	//
	// Egress is a required field
	Egress *bool `locationName:"egress" type:"boolean" required:"true"`

	// The ID of the network ACL.
	//
	// NetworkAclId is a required field
	NetworkAclId *string `locationName:"networkAclId" type:"string" required:"true"`

	// The rule number of the entry to delete.
	//
	// RuleNumber is a required field
	RuleNumber *int64 `locationName:"ruleNumber" type:"integer" required:"true"`
}

// String returns the string representation
func (s DeleteNetworkAclEntryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkAclEntryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteNetworkAclEntryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteNetworkAclEntryInput"}
	if s.Egress == nil {
		invalidParams.Add(request.NewErrParamRequired("Egress"))
	}
	if s.NetworkAclId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkAclId"))
	}
	if s.RuleNumber == nil {
		invalidParams.Add(request.NewErrParamRequired("RuleNumber"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteNetworkAclEntryInput) SetDryRun(v bool) *DeleteNetworkAclEntryInput {
	s.DryRun = &v
	return s
}

// SetEgress sets the Egress field's value.
func (s *DeleteNetworkAclEntryInput) SetEgress(v bool) *DeleteNetworkAclEntryInput {
	s.Egress = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *DeleteNetworkAclEntryInput) SetNetworkAclId(v string) *DeleteNetworkAclEntryInput {
	s.NetworkAclId = &v
	return s
}

// SetRuleNumber sets the RuleNumber field's value.
func (s *DeleteNetworkAclEntryInput) SetRuleNumber(v int64) *DeleteNetworkAclEntryInput {
	s.RuleNumber = &v
	return s
}

type DeleteNetworkAclEntryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteNetworkAclEntryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkAclEntryOutput) GoString() string {
	return s.String()
}

type DeleteNetworkAclInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the network ACL.
	//
	// NetworkAclId is a required field
	NetworkAclId *string `locationName:"networkAclId" type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteNetworkAclInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkAclInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteNetworkAclInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteNetworkAclInput"}
	if s.NetworkAclId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkAclId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteNetworkAclInput) SetDryRun(v bool) *DeleteNetworkAclInput {
	s.DryRun = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *DeleteNetworkAclInput) SetNetworkAclId(v string) *DeleteNetworkAclInput {
	s.NetworkAclId = &v
	return s
}

type DeleteNetworkAclOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteNetworkAclOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkAclOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DeleteNetworkInterface.
type DeleteNetworkInterfaceInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteNetworkInterfaceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkInterfaceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteNetworkInterfaceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteNetworkInterfaceInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteNetworkInterfaceInput) SetDryRun(v bool) *DeleteNetworkInterfaceInput {
	s.DryRun = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *DeleteNetworkInterfaceInput) SetNetworkInterfaceId(v string) *DeleteNetworkInterfaceInput {
	s.NetworkInterfaceId = &v
	return s
}

type DeleteNetworkInterfaceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteNetworkInterfaceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkInterfaceOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DeleteNetworkInterfacePermission.
type DeleteNetworkInterfacePermissionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Specify true to remove the permission even if the network interface is attached
	// to an instance.
	Force *bool `type:"boolean"`

	// The ID of the network interface permission.
	//
	// NetworkInterfacePermissionId is a required field
	NetworkInterfacePermissionId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteNetworkInterfacePermissionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkInterfacePermissionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteNetworkInterfacePermissionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteNetworkInterfacePermissionInput"}
	if s.NetworkInterfacePermissionId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfacePermissionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteNetworkInterfacePermissionInput) SetDryRun(v bool) *DeleteNetworkInterfacePermissionInput {
	s.DryRun = &v
	return s
}

// SetForce sets the Force field's value.
func (s *DeleteNetworkInterfacePermissionInput) SetForce(v bool) *DeleteNetworkInterfacePermissionInput {
	s.Force = &v
	return s
}

// SetNetworkInterfacePermissionId sets the NetworkInterfacePermissionId field's value.
func (s *DeleteNetworkInterfacePermissionInput) SetNetworkInterfacePermissionId(v string) *DeleteNetworkInterfacePermissionInput {
	s.NetworkInterfacePermissionId = &v
	return s
}

// Contains the output for DeleteNetworkInterfacePermission.
type DeleteNetworkInterfacePermissionOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds, otherwise returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s DeleteNetworkInterfacePermissionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNetworkInterfacePermissionOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *DeleteNetworkInterfacePermissionOutput) SetReturn(v bool) *DeleteNetworkInterfacePermissionOutput {
	s.Return = &v
	return s
}

type DeletePlacementGroupInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The name of the placement group.
	//
	// GroupName is a required field
	GroupName *string `locationName:"groupName" type:"string" required:"true"`
}

// String returns the string representation
func (s DeletePlacementGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeletePlacementGroupInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeletePlacementGroupInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeletePlacementGroupInput"}
	if s.GroupName == nil {
		invalidParams.Add(request.NewErrParamRequired("GroupName"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeletePlacementGroupInput) SetDryRun(v bool) *DeletePlacementGroupInput {
	s.DryRun = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *DeletePlacementGroupInput) SetGroupName(v string) *DeletePlacementGroupInput {
	s.GroupName = &v
	return s
}

type DeletePlacementGroupOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeletePlacementGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeletePlacementGroupOutput) GoString() string {
	return s.String()
}

type DeleteRouteInput struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR range for the route. The value you specify must match the CIDR
	// for the route exactly.
	DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"`

	// The IPv6 CIDR range for the route. The value you specify must match the CIDR
	// for the route exactly.
	DestinationIpv6CidrBlock *string `locationName:"destinationIpv6CidrBlock" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the route table.
	//
	// RouteTableId is a required field
	RouteTableId *string `locationName:"routeTableId" type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteRouteInput"}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *DeleteRouteInput) SetDestinationCidrBlock(v string) *DeleteRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDestinationIpv6CidrBlock sets the DestinationIpv6CidrBlock field's value.
func (s *DeleteRouteInput) SetDestinationIpv6CidrBlock(v string) *DeleteRouteInput {
	s.DestinationIpv6CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteRouteInput) SetDryRun(v bool) *DeleteRouteInput {
	s.DryRun = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *DeleteRouteInput) SetRouteTableId(v string) *DeleteRouteInput {
	s.RouteTableId = &v
	return s
}

type DeleteRouteOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteRouteOutput) GoString() string {
	return s.String()
}

type DeleteRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the route table.
	//
	// RouteTableId is a required field
	RouteTableId *string `locationName:"routeTableId" type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteRouteTableInput"}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteRouteTableInput) SetDryRun(v bool) *DeleteRouteTableInput {
	s.DryRun = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *DeleteRouteTableInput) SetRouteTableId(v string) *DeleteRouteTableInput {
	s.RouteTableId = &v
	return s
}

type DeleteRouteTableOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteRouteTableOutput) GoString() string {
	return s.String()
}

type DeleteSecurityGroupInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the security group. Required for a nondefault VPC.
	GroupId *string `type:"string"`

	// [EC2-Classic, default VPC] The name of the security group. You can specify
	// either the security group name or the security group ID.
	GroupName *string `type:"string"`
}

// String returns the string representation
func (s DeleteSecurityGroupInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSecurityGroupInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteSecurityGroupInput) SetDryRun(v bool) *DeleteSecurityGroupInput {
	s.DryRun = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *DeleteSecurityGroupInput) SetGroupId(v string) *DeleteSecurityGroupInput {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *DeleteSecurityGroupInput) SetGroupName(v string) *DeleteSecurityGroupInput {
	s.GroupName = &v
	return s
}

type DeleteSecurityGroupOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteSecurityGroupOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSecurityGroupOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DeleteSnapshot.
type DeleteSnapshotInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the EBS snapshot.
	//
	// SnapshotId is a required field
	SnapshotId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteSnapshotInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSnapshotInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteSnapshotInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteSnapshotInput"}
	if s.SnapshotId == nil {
		invalidParams.Add(request.NewErrParamRequired("SnapshotId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteSnapshotInput) SetDryRun(v bool) *DeleteSnapshotInput {
	s.DryRun = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *DeleteSnapshotInput) SetSnapshotId(v string) *DeleteSnapshotInput {
	s.SnapshotId = &v
	return s
}

type DeleteSnapshotOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteSnapshotOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSnapshotOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DeleteSpotDatafeedSubscription.
type DeleteSpotDatafeedSubscriptionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DeleteSpotDatafeedSubscriptionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSpotDatafeedSubscriptionInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteSpotDatafeedSubscriptionInput) SetDryRun(v bool) *DeleteSpotDatafeedSubscriptionInput {
	s.DryRun = &v
	return s
}

type DeleteSpotDatafeedSubscriptionOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteSpotDatafeedSubscriptionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSpotDatafeedSubscriptionOutput) GoString() string {
	return s.String()
}

type DeleteSubnetInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the subnet.
	//
	// SubnetId is a required field
	SubnetId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteSubnetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSubnetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteSubnetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteSubnetInput"}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteSubnetInput) SetDryRun(v bool) *DeleteSubnetInput {
	s.DryRun = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *DeleteSubnetInput) SetSubnetId(v string) *DeleteSubnetInput {
	s.SubnetId = &v
	return s
}

type DeleteSubnetOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteSubnetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSubnetOutput) GoString() string {
	return s.String()
}

type DeleteTagsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The IDs of one or more resources, separated by spaces.
	//
	// Constraints: Up to 1000 resource IDs. We recommend breaking up this request
	// into smaller batches.
	//
	// Resources is a required field
	Resources []*string `locationName:"resourceId" type:"list" required:"true"`

	// One or more tags to delete. Specify a tag key and an optional tag value to
	// delete specific tags. If you specify a tag key without a tag value, we delete
	// any tag with this key regardless of its value. If you specify a tag key with
	// an empty string as the tag value, we delete the tag only if its value is
	// an empty string.
	//
	// If you omit this parameter, we delete all user-defined tags for the specified
	// resources. We do not delete AWS-generated tags (tags that have the aws: prefix).
	Tags []*Tag `locationName:"tag" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteTagsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTagsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteTagsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteTagsInput"}
	if s.Resources == nil {
		invalidParams.Add(request.NewErrParamRequired("Resources"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteTagsInput) SetDryRun(v bool) *DeleteTagsInput {
	s.DryRun = &v
	return s
}

// SetResources sets the Resources field's value.
func (s *DeleteTagsInput) SetResources(v []*string) *DeleteTagsInput {
	s.Resources = v
	return s
}

// SetTags sets the Tags field's value.
func (s *DeleteTagsInput) SetTags(v []*Tag) *DeleteTagsInput {
	s.Tags = v
	return s
}

type DeleteTagsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteTagsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTagsOutput) GoString() string {
	return s.String()
}

type DeleteTransitGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the transit gateway.
	//
	// TransitGatewayId is a required field
	TransitGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteTransitGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteTransitGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteTransitGatewayInput"}
	if s.TransitGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteTransitGatewayInput) SetDryRun(v bool) *DeleteTransitGatewayInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *DeleteTransitGatewayInput) SetTransitGatewayId(v string) *DeleteTransitGatewayInput {
	s.TransitGatewayId = &v
	return s
}

type DeleteTransitGatewayOutput struct {
	_ struct{} `type:"structure"`

	// Information about the deleted transit gateway.
	TransitGateway *TransitGateway `locationName:"transitGateway" type:"structure"`
}

// String returns the string representation
func (s DeleteTransitGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayOutput) GoString() string {
	return s.String()
}

// SetTransitGateway sets the TransitGateway field's value.
func (s *DeleteTransitGatewayOutput) SetTransitGateway(v *TransitGateway) *DeleteTransitGatewayOutput {
	s.TransitGateway = v
	return s
}

type DeleteTransitGatewayRouteInput struct {
	_ struct{} `type:"structure"`

	// The CIDR range for the route. This must match the CIDR for the route exactly.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteTransitGatewayRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteTransitGatewayRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteTransitGatewayRouteInput"}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *DeleteTransitGatewayRouteInput) SetDestinationCidrBlock(v string) *DeleteTransitGatewayRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteTransitGatewayRouteInput) SetDryRun(v bool) *DeleteTransitGatewayRouteInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *DeleteTransitGatewayRouteInput) SetTransitGatewayRouteTableId(v string) *DeleteTransitGatewayRouteInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type DeleteTransitGatewayRouteOutput struct {
	_ struct{} `type:"structure"`

	// Information about the route.
	Route *TransitGatewayRoute `locationName:"route" type:"structure"`
}

// String returns the string representation
func (s DeleteTransitGatewayRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayRouteOutput) GoString() string {
	return s.String()
}

// SetRoute sets the Route field's value.
func (s *DeleteTransitGatewayRouteOutput) SetRoute(v *TransitGatewayRoute) *DeleteTransitGatewayRouteOutput {
	s.Route = v
	return s
}

type DeleteTransitGatewayRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteTransitGatewayRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteTransitGatewayRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteTransitGatewayRouteTableInput"}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteTransitGatewayRouteTableInput) SetDryRun(v bool) *DeleteTransitGatewayRouteTableInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *DeleteTransitGatewayRouteTableInput) SetTransitGatewayRouteTableId(v string) *DeleteTransitGatewayRouteTableInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type DeleteTransitGatewayRouteTableOutput struct {
	_ struct{} `type:"structure"`

	// Information about the deleted transit gateway route table.
	TransitGatewayRouteTable *TransitGatewayRouteTable `locationName:"transitGatewayRouteTable" type:"structure"`
}

// String returns the string representation
func (s DeleteTransitGatewayRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayRouteTableOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayRouteTable sets the TransitGatewayRouteTable field's value.
func (s *DeleteTransitGatewayRouteTableOutput) SetTransitGatewayRouteTable(v *TransitGatewayRouteTable) *DeleteTransitGatewayRouteTableOutput {
	s.TransitGatewayRouteTable = v
	return s
}

type DeleteTransitGatewayVpcAttachmentInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteTransitGatewayVpcAttachmentInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayVpcAttachmentInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteTransitGatewayVpcAttachmentInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteTransitGatewayVpcAttachmentInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteTransitGatewayVpcAttachmentInput) SetDryRun(v bool) *DeleteTransitGatewayVpcAttachmentInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *DeleteTransitGatewayVpcAttachmentInput) SetTransitGatewayAttachmentId(v string) *DeleteTransitGatewayVpcAttachmentInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

type DeleteTransitGatewayVpcAttachmentOutput struct {
	_ struct{} `type:"structure"`

	// Information about the deleted VPC attachment.
	TransitGatewayVpcAttachment *TransitGatewayVpcAttachment `locationName:"transitGatewayVpcAttachment" type:"structure"`
}

// String returns the string representation
func (s DeleteTransitGatewayVpcAttachmentOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteTransitGatewayVpcAttachmentOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayVpcAttachment sets the TransitGatewayVpcAttachment field's value.
func (s *DeleteTransitGatewayVpcAttachmentOutput) SetTransitGatewayVpcAttachment(v *TransitGatewayVpcAttachment) *DeleteTransitGatewayVpcAttachmentOutput {
	s.TransitGatewayVpcAttachment = v
	return s
}

// Contains the parameters for DeleteVolume.
type DeleteVolumeInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the volume.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteVolumeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVolumeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVolumeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVolumeInput"}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVolumeInput) SetDryRun(v bool) *DeleteVolumeInput {
	s.DryRun = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *DeleteVolumeInput) SetVolumeId(v string) *DeleteVolumeInput {
	s.VolumeId = &v
	return s
}

type DeleteVolumeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteVolumeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVolumeOutput) GoString() string {
	return s.String()
}

type DeleteVpcEndpointConnectionNotificationsInput struct {
	_ struct{} `type:"structure"`

	// One or more notification IDs.
	//
	// ConnectionNotificationIds is a required field
	ConnectionNotificationIds []*string `locationName:"ConnectionNotificationId" locationNameList:"item" type:"list" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s DeleteVpcEndpointConnectionNotificationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcEndpointConnectionNotificationsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpcEndpointConnectionNotificationsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpcEndpointConnectionNotificationsInput"}
	if s.ConnectionNotificationIds == nil {
		invalidParams.Add(request.NewErrParamRequired("ConnectionNotificationIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetConnectionNotificationIds sets the ConnectionNotificationIds field's value.
func (s *DeleteVpcEndpointConnectionNotificationsInput) SetConnectionNotificationIds(v []*string) *DeleteVpcEndpointConnectionNotificationsInput {
	s.ConnectionNotificationIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpcEndpointConnectionNotificationsInput) SetDryRun(v bool) *DeleteVpcEndpointConnectionNotificationsInput {
	s.DryRun = &v
	return s
}

type DeleteVpcEndpointConnectionNotificationsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the notifications that could not be deleted successfully.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteVpcEndpointConnectionNotificationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcEndpointConnectionNotificationsOutput) GoString() string {
	return s.String()
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *DeleteVpcEndpointConnectionNotificationsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *DeleteVpcEndpointConnectionNotificationsOutput {
	s.Unsuccessful = v
	return s
}

type DeleteVpcEndpointServiceConfigurationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The IDs of one or more services.
	//
	// ServiceIds is a required field
	ServiceIds []*string `locationName:"ServiceId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s DeleteVpcEndpointServiceConfigurationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcEndpointServiceConfigurationsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpcEndpointServiceConfigurationsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpcEndpointServiceConfigurationsInput"}
	if s.ServiceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpcEndpointServiceConfigurationsInput) SetDryRun(v bool) *DeleteVpcEndpointServiceConfigurationsInput {
	s.DryRun = &v
	return s
}

// SetServiceIds sets the ServiceIds field's value.
func (s *DeleteVpcEndpointServiceConfigurationsInput) SetServiceIds(v []*string) *DeleteVpcEndpointServiceConfigurationsInput {
	s.ServiceIds = v
	return s
}

type DeleteVpcEndpointServiceConfigurationsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the service configurations that were not deleted, if applicable.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteVpcEndpointServiceConfigurationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcEndpointServiceConfigurationsOutput) GoString() string {
	return s.String()
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *DeleteVpcEndpointServiceConfigurationsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *DeleteVpcEndpointServiceConfigurationsOutput {
	s.Unsuccessful = v
	return s
}

// Contains the parameters for DeleteVpcEndpoints.
type DeleteVpcEndpointsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more VPC endpoint IDs.
	//
	// VpcEndpointIds is a required field
	VpcEndpointIds []*string `locationName:"VpcEndpointId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s DeleteVpcEndpointsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcEndpointsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpcEndpointsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpcEndpointsInput"}
	if s.VpcEndpointIds == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcEndpointIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpcEndpointsInput) SetDryRun(v bool) *DeleteVpcEndpointsInput {
	s.DryRun = &v
	return s
}

// SetVpcEndpointIds sets the VpcEndpointIds field's value.
func (s *DeleteVpcEndpointsInput) SetVpcEndpointIds(v []*string) *DeleteVpcEndpointsInput {
	s.VpcEndpointIds = v
	return s
}

// Contains the output of DeleteVpcEndpoints.
type DeleteVpcEndpointsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC endpoints that were not successfully deleted.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DeleteVpcEndpointsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcEndpointsOutput) GoString() string {
	return s.String()
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *DeleteVpcEndpointsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *DeleteVpcEndpointsOutput {
	s.Unsuccessful = v
	return s
}

type DeleteVpcInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteVpcInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpcInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpcInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpcInput) SetDryRun(v bool) *DeleteVpcInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DeleteVpcInput) SetVpcId(v string) *DeleteVpcInput {
	s.VpcId = &v
	return s
}

type DeleteVpcOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteVpcOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcOutput) GoString() string {
	return s.String()
}

type DeleteVpcPeeringConnectionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC peering connection.
	//
	// VpcPeeringConnectionId is a required field
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteVpcPeeringConnectionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcPeeringConnectionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpcPeeringConnectionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpcPeeringConnectionInput"}
	if s.VpcPeeringConnectionId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcPeeringConnectionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpcPeeringConnectionInput) SetDryRun(v bool) *DeleteVpcPeeringConnectionInput {
	s.DryRun = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *DeleteVpcPeeringConnectionInput) SetVpcPeeringConnectionId(v string) *DeleteVpcPeeringConnectionInput {
	s.VpcPeeringConnectionId = &v
	return s
}

type DeleteVpcPeeringConnectionOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s DeleteVpcPeeringConnectionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpcPeeringConnectionOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *DeleteVpcPeeringConnectionOutput) SetReturn(v bool) *DeleteVpcPeeringConnectionOutput {
	s.Return = &v
	return s
}

// Contains the parameters for DeleteVpnConnection.
type DeleteVpnConnectionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPN connection.
	//
	// VpnConnectionId is a required field
	VpnConnectionId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteVpnConnectionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpnConnectionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpnConnectionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpnConnectionInput"}
	if s.VpnConnectionId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpnConnectionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpnConnectionInput) SetDryRun(v bool) *DeleteVpnConnectionInput {
	s.DryRun = &v
	return s
}

// SetVpnConnectionId sets the VpnConnectionId field's value.
func (s *DeleteVpnConnectionInput) SetVpnConnectionId(v string) *DeleteVpnConnectionInput {
	s.VpnConnectionId = &v
	return s
}

type DeleteVpnConnectionOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteVpnConnectionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpnConnectionOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DeleteVpnConnectionRoute.
type DeleteVpnConnectionRouteInput struct {
	_ struct{} `type:"structure"`

	// The CIDR block associated with the local subnet of the customer network.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// The ID of the VPN connection.
	//
	// VpnConnectionId is a required field
	VpnConnectionId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteVpnConnectionRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpnConnectionRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpnConnectionRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpnConnectionRouteInput"}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}
	if s.VpnConnectionId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpnConnectionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *DeleteVpnConnectionRouteInput) SetDestinationCidrBlock(v string) *DeleteVpnConnectionRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetVpnConnectionId sets the VpnConnectionId field's value.
func (s *DeleteVpnConnectionRouteInput) SetVpnConnectionId(v string) *DeleteVpnConnectionRouteInput {
	s.VpnConnectionId = &v
	return s
}

type DeleteVpnConnectionRouteOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteVpnConnectionRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpnConnectionRouteOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DeleteVpnGateway.
type DeleteVpnGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the virtual private gateway.
	//
	// VpnGatewayId is a required field
	VpnGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteVpnGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpnGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteVpnGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteVpnGatewayInput"}
	if s.VpnGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpnGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeleteVpnGatewayInput) SetDryRun(v bool) *DeleteVpnGatewayInput {
	s.DryRun = &v
	return s
}

// SetVpnGatewayId sets the VpnGatewayId field's value.
func (s *DeleteVpnGatewayInput) SetVpnGatewayId(v string) *DeleteVpnGatewayInput {
	s.VpnGatewayId = &v
	return s
}

type DeleteVpnGatewayOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteVpnGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteVpnGatewayOutput) GoString() string {
	return s.String()
}

type DeprovisionByoipCidrInput struct {
	_ struct{} `type:"structure"`

	// The public IPv4 address range, in CIDR notation. The prefix must be the same
	// prefix that you specified when you provisioned the address range.
	//
	// Cidr is a required field
	Cidr *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s DeprovisionByoipCidrInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeprovisionByoipCidrInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeprovisionByoipCidrInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeprovisionByoipCidrInput"}
	if s.Cidr == nil {
		invalidParams.Add(request.NewErrParamRequired("Cidr"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidr sets the Cidr field's value.
func (s *DeprovisionByoipCidrInput) SetCidr(v string) *DeprovisionByoipCidrInput {
	s.Cidr = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DeprovisionByoipCidrInput) SetDryRun(v bool) *DeprovisionByoipCidrInput {
	s.DryRun = &v
	return s
}

type DeprovisionByoipCidrOutput struct {
	_ struct{} `type:"structure"`

	// Information about the address range.
	ByoipCidr *ByoipCidr `locationName:"byoipCidr" type:"structure"`
}

// String returns the string representation
func (s DeprovisionByoipCidrOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeprovisionByoipCidrOutput) GoString() string {
	return s.String()
}

// SetByoipCidr sets the ByoipCidr field's value.
func (s *DeprovisionByoipCidrOutput) SetByoipCidr(v *ByoipCidr) *DeprovisionByoipCidrOutput {
	s.ByoipCidr = v
	return s
}

// Contains the parameters for DeregisterImage.
type DeregisterImageInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the AMI.
	//
	// ImageId is a required field
	ImageId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeregisterImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeregisterImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeregisterImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeregisterImageInput"}
	if s.ImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("ImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DeregisterImageInput) SetDryRun(v bool) *DeregisterImageInput {
	s.DryRun = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *DeregisterImageInput) SetImageId(v string) *DeregisterImageInput {
	s.ImageId = &v
	return s
}

type DeregisterImageOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeregisterImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeregisterImageOutput) GoString() string {
	return s.String()
}

type DescribeAccountAttributesInput struct {
	_ struct{} `type:"structure"`

	// One or more account attribute names.
	AttributeNames []*string `locationName:"attributeName" locationNameList:"attributeName" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DescribeAccountAttributesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAccountAttributesInput) GoString() string {
	return s.String()
}

// SetAttributeNames sets the AttributeNames field's value.
func (s *DescribeAccountAttributesInput) SetAttributeNames(v []*string) *DescribeAccountAttributesInput {
	s.AttributeNames = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeAccountAttributesInput) SetDryRun(v bool) *DescribeAccountAttributesInput {
	s.DryRun = &v
	return s
}

type DescribeAccountAttributesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more account attributes.
	AccountAttributes []*AccountAttribute `locationName:"accountAttributeSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeAccountAttributesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAccountAttributesOutput) GoString() string {
	return s.String()
}

// SetAccountAttributes sets the AccountAttributes field's value.
func (s *DescribeAccountAttributesOutput) SetAccountAttributes(v []*AccountAttribute) *DescribeAccountAttributesOutput {
	s.AccountAttributes = v
	return s
}

type DescribeAddressesInput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] One or more allocation IDs.
	//
	// Default: Describes all your Elastic IP addresses.
	AllocationIds []*string `locationName:"AllocationId" locationNameList:"AllocationId" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters. Filter names and values are case-sensitive.
	//
	//    * allocation-id - [EC2-VPC] The allocation ID for the address.
	//
	//    * association-id - [EC2-VPC] The association ID for the address.
	//
	//    * domain - Indicates whether the address is for use in EC2-Classic (standard)
	//    or in a VPC (vpc).
	//
	//    * instance-id - The ID of the instance the address is associated with,
	//    if any.
	//
	//    * network-interface-id - [EC2-VPC] The ID of the network interface that
	//    the address is associated with, if any.
	//
	//    * network-interface-owner-id - The AWS account ID of the owner.
	//
	//    * private-ip-address - [EC2-VPC] The private IP address associated with
	//    the Elastic IP address.
	//
	//    * public-ip - The Elastic IP address.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more Elastic IP addresses.
	//
	// Default: Describes all your Elastic IP addresses.
	PublicIps []*string `locationName:"PublicIp" locationNameList:"PublicIp" type:"list"`
}

// String returns the string representation
func (s DescribeAddressesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAddressesInput) GoString() string {
	return s.String()
}

// SetAllocationIds sets the AllocationIds field's value.
func (s *DescribeAddressesInput) SetAllocationIds(v []*string) *DescribeAddressesInput {
	s.AllocationIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeAddressesInput) SetDryRun(v bool) *DescribeAddressesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeAddressesInput) SetFilters(v []*Filter) *DescribeAddressesInput {
	s.Filters = v
	return s
}

// SetPublicIps sets the PublicIps field's value.
func (s *DescribeAddressesInput) SetPublicIps(v []*string) *DescribeAddressesInput {
	s.PublicIps = v
	return s
}

type DescribeAddressesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more Elastic IP addresses.
	Addresses []*Address `locationName:"addressesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeAddressesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAddressesOutput) GoString() string {
	return s.String()
}

// SetAddresses sets the Addresses field's value.
func (s *DescribeAddressesOutput) SetAddresses(v []*Address) *DescribeAddressesOutput {
	s.Addresses = v
	return s
}

type DescribeAggregateIdFormatInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s DescribeAggregateIdFormatInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAggregateIdFormatInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeAggregateIdFormatInput) SetDryRun(v bool) *DescribeAggregateIdFormatInput {
	s.DryRun = &v
	return s
}

type DescribeAggregateIdFormatOutput struct {
	_ struct{} `type:"structure"`

	// Information about each resource's ID format.
	Statuses []*IdFormat `locationName:"statusSet" locationNameList:"item" type:"list"`

	// Indicates whether all resource types in the region are configured to use
	// longer IDs. This value is only true if all users are configured to use longer
	// IDs for all resources types in the region.
	UseLongIdsAggregated *bool `locationName:"useLongIdsAggregated" type:"boolean"`
}

// String returns the string representation
func (s DescribeAggregateIdFormatOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAggregateIdFormatOutput) GoString() string {
	return s.String()
}

// SetStatuses sets the Statuses field's value.
func (s *DescribeAggregateIdFormatOutput) SetStatuses(v []*IdFormat) *DescribeAggregateIdFormatOutput {
	s.Statuses = v
	return s
}

// SetUseLongIdsAggregated sets the UseLongIdsAggregated field's value.
func (s *DescribeAggregateIdFormatOutput) SetUseLongIdsAggregated(v bool) *DescribeAggregateIdFormatOutput {
	s.UseLongIdsAggregated = &v
	return s
}

type DescribeAvailabilityZonesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * message - Information about the Availability Zone.
	//
	//    * region-name - The name of the region for the Availability Zone (for
	//    example, us-east-1).
	//
	//    * state - The state of the Availability Zone (available | information
	//    | impaired | unavailable).
	//
	//    * zone-id - The ID of the Availability Zone (for example, use1-az1).
	//
	//    * zone-name - The name of the Availability Zone (for example, us-east-1a).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The IDs of one or more Availability Zones.
	ZoneIds []*string `locationName:"ZoneId" locationNameList:"ZoneId" type:"list"`

	// The names of one or more Availability Zones.
	ZoneNames []*string `locationName:"ZoneName" locationNameList:"ZoneName" type:"list"`
}

// String returns the string representation
func (s DescribeAvailabilityZonesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAvailabilityZonesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeAvailabilityZonesInput) SetDryRun(v bool) *DescribeAvailabilityZonesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeAvailabilityZonesInput) SetFilters(v []*Filter) *DescribeAvailabilityZonesInput {
	s.Filters = v
	return s
}

// SetZoneIds sets the ZoneIds field's value.
func (s *DescribeAvailabilityZonesInput) SetZoneIds(v []*string) *DescribeAvailabilityZonesInput {
	s.ZoneIds = v
	return s
}

// SetZoneNames sets the ZoneNames field's value.
func (s *DescribeAvailabilityZonesInput) SetZoneNames(v []*string) *DescribeAvailabilityZonesInput {
	s.ZoneNames = v
	return s
}

type DescribeAvailabilityZonesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more Availability Zones.
	AvailabilityZones []*AvailabilityZone `locationName:"availabilityZoneInfo" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeAvailabilityZonesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAvailabilityZonesOutput) GoString() string {
	return s.String()
}

// SetAvailabilityZones sets the AvailabilityZones field's value.
func (s *DescribeAvailabilityZonesOutput) SetAvailabilityZones(v []*AvailabilityZone) *DescribeAvailabilityZonesOutput {
	s.AvailabilityZones = v
	return s
}

// Contains the parameters for DescribeBundleTasks.
type DescribeBundleTasksInput struct {
	_ struct{} `type:"structure"`

	// One or more bundle task IDs.
	//
	// Default: Describes all your bundle tasks.
	BundleIds []*string `locationName:"BundleId" locationNameList:"BundleId" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * bundle-id - The ID of the bundle task.
	//
	//    * error-code - If the task failed, the error code returned.
	//
	//    * error-message - If the task failed, the error message returned.
	//
	//    * instance-id - The ID of the instance.
	//
	//    * progress - The level of task completion, as a percentage (for example,
	//    20%).
	//
	//    * s3-bucket - The Amazon S3 bucket to store the AMI.
	//
	//    * s3-prefix - The beginning of the AMI name.
	//
	//    * start-time - The time the task started (for example, 2013-09-15T17:15:20.000Z).
	//
	//    * state - The state of the task (pending | waiting-for-shutdown | bundling
	//    | storing | cancelling | complete | failed).
	//
	//    * update-time - The time of the most recent update for the task.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`
}

// String returns the string representation
func (s DescribeBundleTasksInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBundleTasksInput) GoString() string {
	return s.String()
}

// SetBundleIds sets the BundleIds field's value.
func (s *DescribeBundleTasksInput) SetBundleIds(v []*string) *DescribeBundleTasksInput {
	s.BundleIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeBundleTasksInput) SetDryRun(v bool) *DescribeBundleTasksInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeBundleTasksInput) SetFilters(v []*Filter) *DescribeBundleTasksInput {
	s.Filters = v
	return s
}

// Contains the output of DescribeBundleTasks.
type DescribeBundleTasksOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more bundle tasks.
	BundleTasks []*BundleTask `locationName:"bundleInstanceTasksSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeBundleTasksOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBundleTasksOutput) GoString() string {
	return s.String()
}

// SetBundleTasks sets the BundleTasks field's value.
func (s *DescribeBundleTasksOutput) SetBundleTasks(v []*BundleTask) *DescribeBundleTasksOutput {
	s.BundleTasks = v
	return s
}

type DescribeByoipCidrsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	//
	// MaxResults is a required field
	MaxResults *int64 `min:"5" type:"integer" required:"true"`

	// The token for the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeByoipCidrsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeByoipCidrsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeByoipCidrsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeByoipCidrsInput"}
	if s.MaxResults == nil {
		invalidParams.Add(request.NewErrParamRequired("MaxResults"))
	}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeByoipCidrsInput) SetDryRun(v bool) *DescribeByoipCidrsInput {
	s.DryRun = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeByoipCidrsInput) SetMaxResults(v int64) *DescribeByoipCidrsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeByoipCidrsInput) SetNextToken(v string) *DescribeByoipCidrsInput {
	s.NextToken = &v
	return s
}

type DescribeByoipCidrsOutput struct {
	_ struct{} `type:"structure"`

	// Information about your address ranges.
	ByoipCidrs []*ByoipCidr `locationName:"byoipCidrSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeByoipCidrsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeByoipCidrsOutput) GoString() string {
	return s.String()
}

// SetByoipCidrs sets the ByoipCidrs field's value.
func (s *DescribeByoipCidrsOutput) SetByoipCidrs(v []*ByoipCidr) *DescribeByoipCidrsOutput {
	s.ByoipCidrs = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeByoipCidrsOutput) SetNextToken(v string) *DescribeByoipCidrsOutput {
	s.NextToken = &v
	return s
}

type DescribeCapacityReservationsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Capacity Reservation.
	CapacityReservationIds []*string `locationName:"CapacityReservationId" locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the returned
	// nextToken value.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeCapacityReservationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeCapacityReservationsInput) GoString() string {
	return s.String()
}

// SetCapacityReservationIds sets the CapacityReservationIds field's value.
func (s *DescribeCapacityReservationsInput) SetCapacityReservationIds(v []*string) *DescribeCapacityReservationsInput {
	s.CapacityReservationIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeCapacityReservationsInput) SetDryRun(v bool) *DescribeCapacityReservationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeCapacityReservationsInput) SetFilters(v []*Filter) *DescribeCapacityReservationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeCapacityReservationsInput) SetMaxResults(v int64) *DescribeCapacityReservationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeCapacityReservationsInput) SetNextToken(v string) *DescribeCapacityReservationsInput {
	s.NextToken = &v
	return s
}

type DescribeCapacityReservationsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Capacity Reservations.
	CapacityReservations []*CapacityReservation `locationName:"capacityReservationSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeCapacityReservationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeCapacityReservationsOutput) GoString() string {
	return s.String()
}

// SetCapacityReservations sets the CapacityReservations field's value.
func (s *DescribeCapacityReservationsOutput) SetCapacityReservations(v []*CapacityReservation) *DescribeCapacityReservationsOutput {
	s.CapacityReservations = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeCapacityReservationsOutput) SetNextToken(v string) *DescribeCapacityReservationsOutput {
	s.NextToken = &v
	return s
}

type DescribeClassicLinkInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * group-id - The ID of a VPC security group that's associated with the
	//    instance.
	//
	//    * instance-id - The ID of the instance.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC to which the instance is linked.
	//
	// vpc-id - The ID of the VPC that the instance is linked to.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more instance IDs. Must be instances linked to a VPC through ClassicLink.
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results of the initial request can be seen by sending another
	// request with the returned NextToken value. This value can be between 5 and
	// 1000. If MaxResults is given a value larger than 1000, only 1000 results
	// are returned. You cannot specify this parameter and the instance IDs parameter
	// in the same request.
	//
	// Constraint: If the value is greater than 1000, we return only 1000 items.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeClassicLinkInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClassicLinkInstancesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeClassicLinkInstancesInput) SetDryRun(v bool) *DescribeClassicLinkInstancesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeClassicLinkInstancesInput) SetFilters(v []*Filter) *DescribeClassicLinkInstancesInput {
	s.Filters = v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *DescribeClassicLinkInstancesInput) SetInstanceIds(v []*string) *DescribeClassicLinkInstancesInput {
	s.InstanceIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClassicLinkInstancesInput) SetMaxResults(v int64) *DescribeClassicLinkInstancesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClassicLinkInstancesInput) SetNextToken(v string) *DescribeClassicLinkInstancesInput {
	s.NextToken = &v
	return s
}

type DescribeClassicLinkInstancesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more linked EC2-Classic instances.
	Instances []*ClassicLinkInstance `locationName:"instancesSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeClassicLinkInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClassicLinkInstancesOutput) GoString() string {
	return s.String()
}

// SetInstances sets the Instances field's value.
func (s *DescribeClassicLinkInstancesOutput) SetInstances(v []*ClassicLinkInstance) *DescribeClassicLinkInstancesOutput {
	s.Instances = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClassicLinkInstancesOutput) SetNextToken(v string) *DescribeClassicLinkInstancesOutput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnAuthorizationRulesInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. Filter names and values are case-sensitive.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the nextToken
	// value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnAuthorizationRulesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnAuthorizationRulesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeClientVpnAuthorizationRulesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeClientVpnAuthorizationRulesInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DescribeClientVpnAuthorizationRulesInput) SetClientVpnEndpointId(v string) *DescribeClientVpnAuthorizationRulesInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeClientVpnAuthorizationRulesInput) SetDryRun(v bool) *DescribeClientVpnAuthorizationRulesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeClientVpnAuthorizationRulesInput) SetFilters(v []*Filter) *DescribeClientVpnAuthorizationRulesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClientVpnAuthorizationRulesInput) SetMaxResults(v int64) *DescribeClientVpnAuthorizationRulesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnAuthorizationRulesInput) SetNextToken(v string) *DescribeClientVpnAuthorizationRulesInput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnAuthorizationRulesOutput struct {
	_ struct{} `type:"structure"`

	// Information about the authorization rules.
	AuthorizationRules []*AuthorizationRule `locationName:"authorizationRule" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnAuthorizationRulesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnAuthorizationRulesOutput) GoString() string {
	return s.String()
}

// SetAuthorizationRules sets the AuthorizationRules field's value.
func (s *DescribeClientVpnAuthorizationRulesOutput) SetAuthorizationRules(v []*AuthorizationRule) *DescribeClientVpnAuthorizationRulesOutput {
	s.AuthorizationRules = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnAuthorizationRulesOutput) SetNextToken(v string) *DescribeClientVpnAuthorizationRulesOutput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnConnectionsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. Filter names and values are case-sensitive.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the nextToken
	// value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnConnectionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeClientVpnConnectionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeClientVpnConnectionsInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DescribeClientVpnConnectionsInput) SetClientVpnEndpointId(v string) *DescribeClientVpnConnectionsInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeClientVpnConnectionsInput) SetDryRun(v bool) *DescribeClientVpnConnectionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeClientVpnConnectionsInput) SetFilters(v []*Filter) *DescribeClientVpnConnectionsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClientVpnConnectionsInput) SetMaxResults(v int64) *DescribeClientVpnConnectionsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnConnectionsInput) SetNextToken(v string) *DescribeClientVpnConnectionsInput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the active and terminated client connections.
	Connections []*ClientVpnConnection `locationName:"connections" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnConnectionsOutput) GoString() string {
	return s.String()
}

// SetConnections sets the Connections field's value.
func (s *DescribeClientVpnConnectionsOutput) SetConnections(v []*ClientVpnConnection) *DescribeClientVpnConnectionsOutput {
	s.Connections = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnConnectionsOutput) SetNextToken(v string) *DescribeClientVpnConnectionsOutput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnEndpointsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	ClientVpnEndpointIds []*string `locationName:"ClientVpnEndpointId" locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. Filter names and values are case-sensitive.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the nextToken
	// value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnEndpointsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnEndpointsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeClientVpnEndpointsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeClientVpnEndpointsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointIds sets the ClientVpnEndpointIds field's value.
func (s *DescribeClientVpnEndpointsInput) SetClientVpnEndpointIds(v []*string) *DescribeClientVpnEndpointsInput {
	s.ClientVpnEndpointIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeClientVpnEndpointsInput) SetDryRun(v bool) *DescribeClientVpnEndpointsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeClientVpnEndpointsInput) SetFilters(v []*Filter) *DescribeClientVpnEndpointsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClientVpnEndpointsInput) SetMaxResults(v int64) *DescribeClientVpnEndpointsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnEndpointsInput) SetNextToken(v string) *DescribeClientVpnEndpointsInput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnEndpointsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Client VPN endpoints.
	ClientVpnEndpoints []*ClientVpnEndpoint `locationName:"clientVpnEndpoint" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnEndpointsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnEndpointsOutput) GoString() string {
	return s.String()
}

// SetClientVpnEndpoints sets the ClientVpnEndpoints field's value.
func (s *DescribeClientVpnEndpointsOutput) SetClientVpnEndpoints(v []*ClientVpnEndpoint) *DescribeClientVpnEndpointsOutput {
	s.ClientVpnEndpoints = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnEndpointsOutput) SetNextToken(v string) *DescribeClientVpnEndpointsOutput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnRoutesInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. Filter names and values are case-sensitive.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the nextToken
	// value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnRoutesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnRoutesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeClientVpnRoutesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeClientVpnRoutesInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DescribeClientVpnRoutesInput) SetClientVpnEndpointId(v string) *DescribeClientVpnRoutesInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeClientVpnRoutesInput) SetDryRun(v bool) *DescribeClientVpnRoutesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeClientVpnRoutesInput) SetFilters(v []*Filter) *DescribeClientVpnRoutesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClientVpnRoutesInput) SetMaxResults(v int64) *DescribeClientVpnRoutesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnRoutesInput) SetNextToken(v string) *DescribeClientVpnRoutesInput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnRoutesOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`

	// Information about the Client VPN endpoint routes.
	Routes []*ClientVpnRoute `locationName:"routes" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeClientVpnRoutesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnRoutesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnRoutesOutput) SetNextToken(v string) *DescribeClientVpnRoutesOutput {
	s.NextToken = &v
	return s
}

// SetRoutes sets the Routes field's value.
func (s *DescribeClientVpnRoutesOutput) SetRoutes(v []*ClientVpnRoute) *DescribeClientVpnRoutesOutput {
	s.Routes = v
	return s
}

type DescribeClientVpnTargetNetworksInput struct {
	_ struct{} `type:"structure"`

	// The IDs of the target network associations.
	AssociationIds []*string `locationNameList:"item" type:"list"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. Filter names and values are case-sensitive.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the nextToken
	// value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnTargetNetworksInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnTargetNetworksInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeClientVpnTargetNetworksInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeClientVpnTargetNetworksInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationIds sets the AssociationIds field's value.
func (s *DescribeClientVpnTargetNetworksInput) SetAssociationIds(v []*string) *DescribeClientVpnTargetNetworksInput {
	s.AssociationIds = v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DescribeClientVpnTargetNetworksInput) SetClientVpnEndpointId(v string) *DescribeClientVpnTargetNetworksInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeClientVpnTargetNetworksInput) SetDryRun(v bool) *DescribeClientVpnTargetNetworksInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeClientVpnTargetNetworksInput) SetFilters(v []*Filter) *DescribeClientVpnTargetNetworksInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeClientVpnTargetNetworksInput) SetMaxResults(v int64) *DescribeClientVpnTargetNetworksInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnTargetNetworksInput) SetNextToken(v string) *DescribeClientVpnTargetNetworksInput {
	s.NextToken = &v
	return s
}

type DescribeClientVpnTargetNetworksOutput struct {
	_ struct{} `type:"structure"`

	// Information about the associated target networks.
	ClientVpnTargetNetworks []*TargetNetwork `locationName:"clientVpnTargetNetworks" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeClientVpnTargetNetworksOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeClientVpnTargetNetworksOutput) GoString() string {
	return s.String()
}

// SetClientVpnTargetNetworks sets the ClientVpnTargetNetworks field's value.
func (s *DescribeClientVpnTargetNetworksOutput) SetClientVpnTargetNetworks(v []*TargetNetwork) *DescribeClientVpnTargetNetworksOutput {
	s.ClientVpnTargetNetworks = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeClientVpnTargetNetworksOutput) SetNextToken(v string) *DescribeClientVpnTargetNetworksOutput {
	s.NextToken = &v
	return s
}

// Contains the parameters for DescribeConversionTasks.
type DescribeConversionTasksInput struct {
	_ struct{} `type:"structure"`

	// One or more conversion task IDs.
	ConversionTaskIds []*string `locationName:"conversionTaskId" locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DescribeConversionTasksInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeConversionTasksInput) GoString() string {
	return s.String()
}

// SetConversionTaskIds sets the ConversionTaskIds field's value.
func (s *DescribeConversionTasksInput) SetConversionTaskIds(v []*string) *DescribeConversionTasksInput {
	s.ConversionTaskIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeConversionTasksInput) SetDryRun(v bool) *DescribeConversionTasksInput {
	s.DryRun = &v
	return s
}

// Contains the output for DescribeConversionTasks.
type DescribeConversionTasksOutput struct {
	_ struct{} `type:"structure"`

	// Information about the conversion tasks.
	ConversionTasks []*ConversionTask `locationName:"conversionTasks" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeConversionTasksOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeConversionTasksOutput) GoString() string {
	return s.String()
}

// SetConversionTasks sets the ConversionTasks field's value.
func (s *DescribeConversionTasksOutput) SetConversionTasks(v []*ConversionTask) *DescribeConversionTasksOutput {
	s.ConversionTasks = v
	return s
}

// Contains the parameters for DescribeCustomerGateways.
type DescribeCustomerGatewaysInput struct {
	_ struct{} `type:"structure"`

	// One or more customer gateway IDs.
	//
	// Default: Describes all your customer gateways.
	CustomerGatewayIds []*string `locationName:"CustomerGatewayId" locationNameList:"CustomerGatewayId" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * bgp-asn - The customer gateway's Border Gateway Protocol (BGP) Autonomous
	//    System Number (ASN).
	//
	//    * customer-gateway-id - The ID of the customer gateway.
	//
	//    * ip-address - The IP address of the customer gateway's Internet-routable
	//    external interface.
	//
	//    * state - The state of the customer gateway (pending | available | deleting
	//    | deleted).
	//
	//    * type - The type of customer gateway. Currently, the only supported type
	//    is ipsec.1.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`
}

// String returns the string representation
func (s DescribeCustomerGatewaysInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeCustomerGatewaysInput) GoString() string {
	return s.String()
}

// SetCustomerGatewayIds sets the CustomerGatewayIds field's value.
func (s *DescribeCustomerGatewaysInput) SetCustomerGatewayIds(v []*string) *DescribeCustomerGatewaysInput {
	s.CustomerGatewayIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeCustomerGatewaysInput) SetDryRun(v bool) *DescribeCustomerGatewaysInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeCustomerGatewaysInput) SetFilters(v []*Filter) *DescribeCustomerGatewaysInput {
	s.Filters = v
	return s
}

// Contains the output of DescribeCustomerGateways.
type DescribeCustomerGatewaysOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more customer gateways.
	CustomerGateways []*CustomerGateway `locationName:"customerGatewaySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeCustomerGatewaysOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeCustomerGatewaysOutput) GoString() string {
	return s.String()
}

// SetCustomerGateways sets the CustomerGateways field's value.
func (s *DescribeCustomerGatewaysOutput) SetCustomerGateways(v []*CustomerGateway) *DescribeCustomerGatewaysOutput {
	s.CustomerGateways = v
	return s
}

type DescribeDhcpOptionsInput struct {
	_ struct{} `type:"structure"`

	// The IDs of one or more DHCP options sets.
	//
	// Default: Describes all your DHCP options sets.
	DhcpOptionsIds []*string `locationName:"DhcpOptionsId" locationNameList:"DhcpOptionsId" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * dhcp-options-id - The ID of a DHCP options set.
	//
	//    * key - The key for one of the options (for example, domain-name).
	//
	//    * value - The value for one of the options.
	//
	//    * owner-id - The ID of the AWS account that owns the DHCP options set.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`
}

// String returns the string representation
func (s DescribeDhcpOptionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeDhcpOptionsInput) GoString() string {
	return s.String()
}

// SetDhcpOptionsIds sets the DhcpOptionsIds field's value.
func (s *DescribeDhcpOptionsInput) SetDhcpOptionsIds(v []*string) *DescribeDhcpOptionsInput {
	s.DhcpOptionsIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeDhcpOptionsInput) SetDryRun(v bool) *DescribeDhcpOptionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeDhcpOptionsInput) SetFilters(v []*Filter) *DescribeDhcpOptionsInput {
	s.Filters = v
	return s
}

type DescribeDhcpOptionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more DHCP options sets.
	DhcpOptions []*DhcpOptions `locationName:"dhcpOptionsSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeDhcpOptionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeDhcpOptionsOutput) GoString() string {
	return s.String()
}

// SetDhcpOptions sets the DhcpOptions field's value.
func (s *DescribeDhcpOptionsOutput) SetDhcpOptions(v []*DhcpOptions) *DescribeDhcpOptionsOutput {
	s.DhcpOptions = v
	return s
}

type DescribeEgressOnlyInternetGatewaysInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more egress-only internet gateway IDs.
	EgressOnlyInternetGatewayIds []*string `locationName:"EgressOnlyInternetGatewayId" locationNameList:"item" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the returned
	// NextToken value. This value can be between 5 and 1000. If MaxResults is given
	// a value larger than 1000, only 1000 results are returned.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeEgressOnlyInternetGatewaysInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeEgressOnlyInternetGatewaysInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeEgressOnlyInternetGatewaysInput) SetDryRun(v bool) *DescribeEgressOnlyInternetGatewaysInput {
	s.DryRun = &v
	return s
}

// SetEgressOnlyInternetGatewayIds sets the EgressOnlyInternetGatewayIds field's value.
func (s *DescribeEgressOnlyInternetGatewaysInput) SetEgressOnlyInternetGatewayIds(v []*string) *DescribeEgressOnlyInternetGatewaysInput {
	s.EgressOnlyInternetGatewayIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeEgressOnlyInternetGatewaysInput) SetMaxResults(v int64) *DescribeEgressOnlyInternetGatewaysInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeEgressOnlyInternetGatewaysInput) SetNextToken(v string) *DescribeEgressOnlyInternetGatewaysInput {
	s.NextToken = &v
	return s
}

type DescribeEgressOnlyInternetGatewaysOutput struct {
	_ struct{} `type:"structure"`

	// Information about the egress-only internet gateways.
	EgressOnlyInternetGateways []*EgressOnlyInternetGateway `locationName:"egressOnlyInternetGatewaySet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeEgressOnlyInternetGatewaysOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeEgressOnlyInternetGatewaysOutput) GoString() string {
	return s.String()
}

// SetEgressOnlyInternetGateways sets the EgressOnlyInternetGateways field's value.
func (s *DescribeEgressOnlyInternetGatewaysOutput) SetEgressOnlyInternetGateways(v []*EgressOnlyInternetGateway) *DescribeEgressOnlyInternetGatewaysOutput {
	s.EgressOnlyInternetGateways = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeEgressOnlyInternetGatewaysOutput) SetNextToken(v string) *DescribeEgressOnlyInternetGatewaysOutput {
	s.NextToken = &v
	return s
}

type DescribeElasticGpusInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more Elastic Graphics accelerator IDs.
	ElasticGpuIds []*string `locationName:"ElasticGpuId" locationNameList:"item" type:"list"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone in which the Elastic Graphics
	//    accelerator resides.
	//
	//    * elastic-gpu-health - The status of the Elastic Graphics accelerator
	//    (OK | IMPAIRED).
	//
	//    * elastic-gpu-state - The state of the Elastic Graphics accelerator (ATTACHED).
	//
	//    * elastic-gpu-type - The type of Elastic Graphics accelerator; for example,
	//    eg1.medium.
	//
	//    * instance-id - The ID of the instance to which the Elastic Graphics accelerator
	//    is associated.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 5 and 1000.
	MaxResults *int64 `type:"integer"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeElasticGpusInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeElasticGpusInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeElasticGpusInput) SetDryRun(v bool) *DescribeElasticGpusInput {
	s.DryRun = &v
	return s
}

// SetElasticGpuIds sets the ElasticGpuIds field's value.
func (s *DescribeElasticGpusInput) SetElasticGpuIds(v []*string) *DescribeElasticGpusInput {
	s.ElasticGpuIds = v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeElasticGpusInput) SetFilters(v []*Filter) *DescribeElasticGpusInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeElasticGpusInput) SetMaxResults(v int64) *DescribeElasticGpusInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeElasticGpusInput) SetNextToken(v string) *DescribeElasticGpusInput {
	s.NextToken = &v
	return s
}

type DescribeElasticGpusOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Elastic Graphics accelerators.
	ElasticGpuSet []*ElasticGpus `locationName:"elasticGpuSet" locationNameList:"item" type:"list"`

	// The total number of items to return. If the total number of items available
	// is more than the value specified in max-items then a Next-Token will be provided
	// in the output that you can use to resume pagination.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeElasticGpusOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeElasticGpusOutput) GoString() string {
	return s.String()
}

// SetElasticGpuSet sets the ElasticGpuSet field's value.
func (s *DescribeElasticGpusOutput) SetElasticGpuSet(v []*ElasticGpus) *DescribeElasticGpusOutput {
	s.ElasticGpuSet = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeElasticGpusOutput) SetMaxResults(v int64) *DescribeElasticGpusOutput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeElasticGpusOutput) SetNextToken(v string) *DescribeElasticGpusOutput {
	s.NextToken = &v
	return s
}

// Contains the parameters for DescribeExportTasks.
type DescribeExportTasksInput struct {
	_ struct{} `type:"structure"`

	// One or more export task IDs.
	ExportTaskIds []*string `locationName:"exportTaskId" locationNameList:"ExportTaskId" type:"list"`
}

// String returns the string representation
func (s DescribeExportTasksInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeExportTasksInput) GoString() string {
	return s.String()
}

// SetExportTaskIds sets the ExportTaskIds field's value.
func (s *DescribeExportTasksInput) SetExportTaskIds(v []*string) *DescribeExportTasksInput {
	s.ExportTaskIds = v
	return s
}

// Contains the output for DescribeExportTasks.
type DescribeExportTasksOutput struct {
	_ struct{} `type:"structure"`

	// Information about the export tasks.
	ExportTasks []*ExportTask `locationName:"exportTaskSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeExportTasksOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeExportTasksOutput) GoString() string {
	return s.String()
}

// SetExportTasks sets the ExportTasks field's value.
func (s *DescribeExportTasksOutput) SetExportTasks(v []*ExportTask) *DescribeExportTasksOutput {
	s.ExportTasks = v
	return s
}

// Describes the instances that could not be launched by the fleet.
type DescribeFleetError struct {
	_ struct{} `type:"structure"`

	// The error code that indicates why the instance could not be launched. For
	// more information about error codes, see Error Codes (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html.html).
	ErrorCode *string `locationName:"errorCode" type:"string"`

	// The error message that describes why the instance could not be launched.
	// For more information about error messages, see ee Error Codes (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html.html).
	ErrorMessage *string `locationName:"errorMessage" type:"string"`

	// The launch templates and overrides that were used for launching the instances.
	// Any parameters that you specify in the Overrides override the same parameters
	// in the launch template.
	LaunchTemplateAndOverrides *LaunchTemplateAndOverridesResponse `locationName:"launchTemplateAndOverrides" type:"structure"`

	// Indicates if the instance that could not be launched was a Spot Instance
	// or On-Demand Instance.
	Lifecycle *string `locationName:"lifecycle" type:"string" enum:"InstanceLifecycle"`
}

// String returns the string representation
func (s DescribeFleetError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetError) GoString() string {
	return s.String()
}

// SetErrorCode sets the ErrorCode field's value.
func (s *DescribeFleetError) SetErrorCode(v string) *DescribeFleetError {
	s.ErrorCode = &v
	return s
}

// SetErrorMessage sets the ErrorMessage field's value.
func (s *DescribeFleetError) SetErrorMessage(v string) *DescribeFleetError {
	s.ErrorMessage = &v
	return s
}

// SetLaunchTemplateAndOverrides sets the LaunchTemplateAndOverrides field's value.
func (s *DescribeFleetError) SetLaunchTemplateAndOverrides(v *LaunchTemplateAndOverridesResponse) *DescribeFleetError {
	s.LaunchTemplateAndOverrides = v
	return s
}

// SetLifecycle sets the Lifecycle field's value.
func (s *DescribeFleetError) SetLifecycle(v string) *DescribeFleetError {
	s.Lifecycle = &v
	return s
}

type DescribeFleetHistoryInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The type of events to describe. By default, all events are described.
	EventType *string `type:"string" enum:"FleetEventType"`

	// The ID of the EC2 Fleet.
	//
	// FleetId is a required field
	FleetId *string `type:"string" required:"true"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of results.
	NextToken *string `type:"string"`

	// The start date and time for the events, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	//
	// StartTime is a required field
	StartTime *time.Time `type:"timestamp" required:"true"`
}

// String returns the string representation
func (s DescribeFleetHistoryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetHistoryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeFleetHistoryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeFleetHistoryInput"}
	if s.FleetId == nil {
		invalidParams.Add(request.NewErrParamRequired("FleetId"))
	}
	if s.StartTime == nil {
		invalidParams.Add(request.NewErrParamRequired("StartTime"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeFleetHistoryInput) SetDryRun(v bool) *DescribeFleetHistoryInput {
	s.DryRun = &v
	return s
}

// SetEventType sets the EventType field's value.
func (s *DescribeFleetHistoryInput) SetEventType(v string) *DescribeFleetHistoryInput {
	s.EventType = &v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *DescribeFleetHistoryInput) SetFleetId(v string) *DescribeFleetHistoryInput {
	s.FleetId = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeFleetHistoryInput) SetMaxResults(v int64) *DescribeFleetHistoryInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFleetHistoryInput) SetNextToken(v string) *DescribeFleetHistoryInput {
	s.NextToken = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *DescribeFleetHistoryInput) SetStartTime(v time.Time) *DescribeFleetHistoryInput {
	s.StartTime = &v
	return s
}

type DescribeFleetHistoryOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the EC Fleet.
	FleetId *string `locationName:"fleetId" type:"string"`

	// Information about the events in the history of the EC2 Fleet.
	HistoryRecords []*HistoryRecordEntry `locationName:"historyRecordSet" locationNameList:"item" type:"list"`

	// The last date and time for the events, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// All records up to this time were retrieved.
	//
	// If nextToken indicates that there are more results, this value is not present.
	LastEvaluatedTime *time.Time `locationName:"lastEvaluatedTime" type:"timestamp"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The start date and time for the events, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`
}

// String returns the string representation
func (s DescribeFleetHistoryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetHistoryOutput) GoString() string {
	return s.String()
}

// SetFleetId sets the FleetId field's value.
func (s *DescribeFleetHistoryOutput) SetFleetId(v string) *DescribeFleetHistoryOutput {
	s.FleetId = &v
	return s
}

// SetHistoryRecords sets the HistoryRecords field's value.
func (s *DescribeFleetHistoryOutput) SetHistoryRecords(v []*HistoryRecordEntry) *DescribeFleetHistoryOutput {
	s.HistoryRecords = v
	return s
}

// SetLastEvaluatedTime sets the LastEvaluatedTime field's value.
func (s *DescribeFleetHistoryOutput) SetLastEvaluatedTime(v time.Time) *DescribeFleetHistoryOutput {
	s.LastEvaluatedTime = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFleetHistoryOutput) SetNextToken(v string) *DescribeFleetHistoryOutput {
	s.NextToken = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *DescribeFleetHistoryOutput) SetStartTime(v time.Time) *DescribeFleetHistoryOutput {
	s.StartTime = &v
	return s
}

type DescribeFleetInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * instance-type - The instance type.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The ID of the EC2 Fleet.
	//
	// FleetId is a required field
	FleetId *string `type:"string" required:"true"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeFleetInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeFleetInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeFleetInstancesInput"}
	if s.FleetId == nil {
		invalidParams.Add(request.NewErrParamRequired("FleetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeFleetInstancesInput) SetDryRun(v bool) *DescribeFleetInstancesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeFleetInstancesInput) SetFilters(v []*Filter) *DescribeFleetInstancesInput {
	s.Filters = v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *DescribeFleetInstancesInput) SetFleetId(v string) *DescribeFleetInstancesInput {
	s.FleetId = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeFleetInstancesInput) SetMaxResults(v int64) *DescribeFleetInstancesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFleetInstancesInput) SetNextToken(v string) *DescribeFleetInstancesInput {
	s.NextToken = &v
	return s
}

type DescribeFleetInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The running instances. This list is refreshed periodically and might be out
	// of date.
	ActiveInstances []*ActiveInstance `locationName:"activeInstanceSet" locationNameList:"item" type:"list"`

	// The ID of the EC2 Fleet.
	FleetId *string `locationName:"fleetId" type:"string"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeFleetInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetInstancesOutput) GoString() string {
	return s.String()
}

// SetActiveInstances sets the ActiveInstances field's value.
func (s *DescribeFleetInstancesOutput) SetActiveInstances(v []*ActiveInstance) *DescribeFleetInstancesOutput {
	s.ActiveInstances = v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *DescribeFleetInstancesOutput) SetFleetId(v string) *DescribeFleetInstancesOutput {
	s.FleetId = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFleetInstancesOutput) SetNextToken(v string) *DescribeFleetInstancesOutput {
	s.NextToken = &v
	return s
}

type DescribeFleetsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * activity-status - The progress of the EC2 Fleet ( error | pending-fulfillment
	//    | pending-termination | fulfilled).
	//
	//    * excess-capacity-termination-policy - Indicates whether to terminate
	//    running instances if the target capacity is decreased below the current
	//    EC2 Fleet size (true | false).
	//
	//    * fleet-state - The state of the EC2 Fleet (submitted | active | deleted
	//    | failed | deleted-running | deleted-terminating | modifying).
	//
	//    * replace-unhealthy-instances - Indicates whether EC2 Fleet should replace
	//    unhealthy instances (true | false).
	//
	//    * type - The type of request (instant | request | maintain).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The ID of the EC2 Fleets.
	FleetIds []*string `locationName:"FleetId" type:"list"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeFleetsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeFleetsInput) SetDryRun(v bool) *DescribeFleetsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeFleetsInput) SetFilters(v []*Filter) *DescribeFleetsInput {
	s.Filters = v
	return s
}

// SetFleetIds sets the FleetIds field's value.
func (s *DescribeFleetsInput) SetFleetIds(v []*string) *DescribeFleetsInput {
	s.FleetIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeFleetsInput) SetMaxResults(v int64) *DescribeFleetsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFleetsInput) SetNextToken(v string) *DescribeFleetsInput {
	s.NextToken = &v
	return s
}

// Describes the instances that were launched by the fleet.
type DescribeFleetsInstances struct {
	_ struct{} `type:"structure"`

	// The IDs of the instances.
	InstanceIds []*string `locationName:"instanceIds" locationNameList:"item" type:"list"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The launch templates and overrides that were used for launching the instances.
	// Any parameters that you specify in the Overrides override the same parameters
	// in the launch template.
	LaunchTemplateAndOverrides *LaunchTemplateAndOverridesResponse `locationName:"launchTemplateAndOverrides" type:"structure"`

	// Indicates if the instance that was launched is a Spot Instance or On-Demand
	// Instance.
	Lifecycle *string `locationName:"lifecycle" type:"string" enum:"InstanceLifecycle"`

	// The value is Windows for Windows instances; otherwise blank.
	Platform *string `locationName:"platform" type:"string" enum:"PlatformValues"`
}

// String returns the string representation
func (s DescribeFleetsInstances) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetsInstances) GoString() string {
	return s.String()
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *DescribeFleetsInstances) SetInstanceIds(v []*string) *DescribeFleetsInstances {
	s.InstanceIds = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *DescribeFleetsInstances) SetInstanceType(v string) *DescribeFleetsInstances {
	s.InstanceType = &v
	return s
}

// SetLaunchTemplateAndOverrides sets the LaunchTemplateAndOverrides field's value.
func (s *DescribeFleetsInstances) SetLaunchTemplateAndOverrides(v *LaunchTemplateAndOverridesResponse) *DescribeFleetsInstances {
	s.LaunchTemplateAndOverrides = v
	return s
}

// SetLifecycle sets the Lifecycle field's value.
func (s *DescribeFleetsInstances) SetLifecycle(v string) *DescribeFleetsInstances {
	s.Lifecycle = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *DescribeFleetsInstances) SetPlatform(v string) *DescribeFleetsInstances {
	s.Platform = &v
	return s
}

type DescribeFleetsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the EC2 Fleets.
	Fleets []*FleetData `locationName:"fleetSet" locationNameList:"item" type:"list"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeFleetsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFleetsOutput) GoString() string {
	return s.String()
}

// SetFleets sets the Fleets field's value.
func (s *DescribeFleetsOutput) SetFleets(v []*FleetData) *DescribeFleetsOutput {
	s.Fleets = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFleetsOutput) SetNextToken(v string) *DescribeFleetsOutput {
	s.NextToken = &v
	return s
}

type DescribeFlowLogsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * deliver-log-status - The status of the logs delivery (SUCCESS | FAILED).
	//
	//    * log-destination-type - The type of destination to which the flow log
	//    publishes data. Possible destination types include cloud-watch-logs and
	//    S3.
	//
	//    * flow-log-id - The ID of the flow log.
	//
	//    * log-group-name - The name of the log group.
	//
	//    * resource-id - The ID of the VPC, subnet, or network interface.
	//
	//    * traffic-type - The type of traffic (ACCEPT | REJECT | ALL).
	Filter []*Filter `locationNameList:"Filter" type:"list"`

	// One or more flow log IDs.
	FlowLogIds []*string `locationName:"FlowLogId" locationNameList:"item" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the returned
	// NextToken value. This value can be between 5 and 1000. If MaxResults is given
	// a value larger than 1000, only 1000 results are returned. You cannot specify
	// this parameter and the flow log IDs parameter in the same request.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeFlowLogsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFlowLogsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeFlowLogsInput) SetDryRun(v bool) *DescribeFlowLogsInput {
	s.DryRun = &v
	return s
}

// SetFilter sets the Filter field's value.
func (s *DescribeFlowLogsInput) SetFilter(v []*Filter) *DescribeFlowLogsInput {
	s.Filter = v
	return s
}

// SetFlowLogIds sets the FlowLogIds field's value.
func (s *DescribeFlowLogsInput) SetFlowLogIds(v []*string) *DescribeFlowLogsInput {
	s.FlowLogIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeFlowLogsInput) SetMaxResults(v int64) *DescribeFlowLogsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFlowLogsInput) SetNextToken(v string) *DescribeFlowLogsInput {
	s.NextToken = &v
	return s
}

type DescribeFlowLogsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the flow logs.
	FlowLogs []*FlowLog `locationName:"flowLogSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeFlowLogsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFlowLogsOutput) GoString() string {
	return s.String()
}

// SetFlowLogs sets the FlowLogs field's value.
func (s *DescribeFlowLogsOutput) SetFlowLogs(v []*FlowLog) *DescribeFlowLogsOutput {
	s.FlowLogs = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFlowLogsOutput) SetNextToken(v string) *DescribeFlowLogsOutput {
	s.NextToken = &v
	return s
}

type DescribeFpgaImageAttributeInput struct {
	_ struct{} `type:"structure"`

	// The AFI attribute.
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"FpgaImageAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the AFI.
	//
	// FpgaImageId is a required field
	FpgaImageId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeFpgaImageAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFpgaImageAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeFpgaImageAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeFpgaImageAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.FpgaImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("FpgaImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeFpgaImageAttributeInput) SetAttribute(v string) *DescribeFpgaImageAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeFpgaImageAttributeInput) SetDryRun(v bool) *DescribeFpgaImageAttributeInput {
	s.DryRun = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *DescribeFpgaImageAttributeInput) SetFpgaImageId(v string) *DescribeFpgaImageAttributeInput {
	s.FpgaImageId = &v
	return s
}

type DescribeFpgaImageAttributeOutput struct {
	_ struct{} `type:"structure"`

	// Information about the attribute.
	FpgaImageAttribute *FpgaImageAttribute `locationName:"fpgaImageAttribute" type:"structure"`
}

// String returns the string representation
func (s DescribeFpgaImageAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFpgaImageAttributeOutput) GoString() string {
	return s.String()
}

// SetFpgaImageAttribute sets the FpgaImageAttribute field's value.
func (s *DescribeFpgaImageAttributeOutput) SetFpgaImageAttribute(v *FpgaImageAttribute) *DescribeFpgaImageAttributeOutput {
	s.FpgaImageAttribute = v
	return s
}

type DescribeFpgaImagesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * create-time - The creation time of the AFI.
	//
	//    * fpga-image-id - The FPGA image identifier (AFI ID).
	//
	//    * fpga-image-global-id - The global FPGA image identifier (AGFI ID).
	//
	//    * name - The name of the AFI.
	//
	//    * owner-id - The AWS account ID of the AFI owner.
	//
	//    * product-code - The product code.
	//
	//    * shell-version - The version of the AWS Shell that was used to create
	//    the bitstream.
	//
	//    * state - The state of the AFI (pending | failed | available | unavailable).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * update-time - The time of the most recent update.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more AFI IDs.
	FpgaImageIds []*string `locationName:"FpgaImageId" locationNameList:"item" type:"list"`

	// The maximum number of results to return in a single call.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `min:"1" type:"string"`

	// Filters the AFI by owner. Specify an AWS account ID, self (owner is the sender
	// of the request), or an AWS owner alias (valid values are amazon | aws-marketplace).
	Owners []*string `locationName:"Owner" locationNameList:"Owner" type:"list"`
}

// String returns the string representation
func (s DescribeFpgaImagesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFpgaImagesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeFpgaImagesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeFpgaImagesInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeFpgaImagesInput) SetDryRun(v bool) *DescribeFpgaImagesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeFpgaImagesInput) SetFilters(v []*Filter) *DescribeFpgaImagesInput {
	s.Filters = v
	return s
}

// SetFpgaImageIds sets the FpgaImageIds field's value.
func (s *DescribeFpgaImagesInput) SetFpgaImageIds(v []*string) *DescribeFpgaImagesInput {
	s.FpgaImageIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeFpgaImagesInput) SetMaxResults(v int64) *DescribeFpgaImagesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFpgaImagesInput) SetNextToken(v string) *DescribeFpgaImagesInput {
	s.NextToken = &v
	return s
}

// SetOwners sets the Owners field's value.
func (s *DescribeFpgaImagesInput) SetOwners(v []*string) *DescribeFpgaImagesInput {
	s.Owners = v
	return s
}

type DescribeFpgaImagesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more FPGA images.
	FpgaImages []*FpgaImage `locationName:"fpgaImageSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeFpgaImagesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeFpgaImagesOutput) GoString() string {
	return s.String()
}

// SetFpgaImages sets the FpgaImages field's value.
func (s *DescribeFpgaImagesOutput) SetFpgaImages(v []*FpgaImage) *DescribeFpgaImagesOutput {
	s.FpgaImages = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeFpgaImagesOutput) SetNextToken(v string) *DescribeFpgaImagesOutput {
	s.NextToken = &v
	return s
}

type DescribeHostReservationOfferingsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * instance-family - The instance family of the offering (for example,
	//    m4).
	//
	//    * payment-option - The payment option (NoUpfront | PartialUpfront | AllUpfront).
	Filter []*Filter `locationNameList:"Filter" type:"list"`

	// This is the maximum duration of the reservation to purchase, specified in
	// seconds. Reservations are available in one-year and three-year terms. The
	// number of seconds specified must be the number of seconds in a year (365x24x60x60)
	// times one of the supported durations (1 or 3). For example, specify 94608000
	// for three years.
	MaxDuration *int64 `type:"integer"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the returned
	// nextToken value. This value can be between 5 and 500. If maxResults is given
	// a larger value than 500, you receive an error.
	MaxResults *int64 `type:"integer"`

	// This is the minimum duration of the reservation you'd like to purchase, specified
	// in seconds. Reservations are available in one-year and three-year terms.
	// The number of seconds specified must be the number of seconds in a year (365x24x60x60)
	// times one of the supported durations (1 or 3). For example, specify 31536000
	// for one year.
	MinDuration *int64 `type:"integer"`

	// The token to use to retrieve the next page of results.
	NextToken *string `type:"string"`

	// The ID of the reservation offering.
	OfferingId *string `type:"string"`
}

// String returns the string representation
func (s DescribeHostReservationOfferingsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeHostReservationOfferingsInput) GoString() string {
	return s.String()
}

// SetFilter sets the Filter field's value.
func (s *DescribeHostReservationOfferingsInput) SetFilter(v []*Filter) *DescribeHostReservationOfferingsInput {
	s.Filter = v
	return s
}

// SetMaxDuration sets the MaxDuration field's value.
func (s *DescribeHostReservationOfferingsInput) SetMaxDuration(v int64) *DescribeHostReservationOfferingsInput {
	s.MaxDuration = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeHostReservationOfferingsInput) SetMaxResults(v int64) *DescribeHostReservationOfferingsInput {
	s.MaxResults = &v
	return s
}

// SetMinDuration sets the MinDuration field's value.
func (s *DescribeHostReservationOfferingsInput) SetMinDuration(v int64) *DescribeHostReservationOfferingsInput {
	s.MinDuration = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeHostReservationOfferingsInput) SetNextToken(v string) *DescribeHostReservationOfferingsInput {
	s.NextToken = &v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *DescribeHostReservationOfferingsInput) SetOfferingId(v string) *DescribeHostReservationOfferingsInput {
	s.OfferingId = &v
	return s
}

type DescribeHostReservationOfferingsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the offerings.
	OfferingSet []*HostOffering `locationName:"offeringSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeHostReservationOfferingsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeHostReservationOfferingsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeHostReservationOfferingsOutput) SetNextToken(v string) *DescribeHostReservationOfferingsOutput {
	s.NextToken = &v
	return s
}

// SetOfferingSet sets the OfferingSet field's value.
func (s *DescribeHostReservationOfferingsOutput) SetOfferingSet(v []*HostOffering) *DescribeHostReservationOfferingsOutput {
	s.OfferingSet = v
	return s
}

type DescribeHostReservationsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * instance-family - The instance family (for example, m4).
	//
	//    * payment-option - The payment option (NoUpfront | PartialUpfront | AllUpfront).
	//
	//    * state - The state of the reservation (payment-pending | payment-failed
	//    | active | retired).
	Filter []*Filter `locationNameList:"Filter" type:"list"`

	// One or more host reservation IDs.
	HostReservationIdSet []*string `locationNameList:"item" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the returned
	// nextToken value. This value can be between 5 and 500. If maxResults is given
	// a larger value than 500, you receive an error.
	MaxResults *int64 `type:"integer"`

	// The token to use to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeHostReservationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeHostReservationsInput) GoString() string {
	return s.String()
}

// SetFilter sets the Filter field's value.
func (s *DescribeHostReservationsInput) SetFilter(v []*Filter) *DescribeHostReservationsInput {
	s.Filter = v
	return s
}

// SetHostReservationIdSet sets the HostReservationIdSet field's value.
func (s *DescribeHostReservationsInput) SetHostReservationIdSet(v []*string) *DescribeHostReservationsInput {
	s.HostReservationIdSet = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeHostReservationsInput) SetMaxResults(v int64) *DescribeHostReservationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeHostReservationsInput) SetNextToken(v string) *DescribeHostReservationsInput {
	s.NextToken = &v
	return s
}

type DescribeHostReservationsOutput struct {
	_ struct{} `type:"structure"`

	// Details about the reservation's configuration.
	HostReservationSet []*HostReservation `locationName:"hostReservationSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeHostReservationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeHostReservationsOutput) GoString() string {
	return s.String()
}

// SetHostReservationSet sets the HostReservationSet field's value.
func (s *DescribeHostReservationsOutput) SetHostReservationSet(v []*HostReservation) *DescribeHostReservationsOutput {
	s.HostReservationSet = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeHostReservationsOutput) SetNextToken(v string) *DescribeHostReservationsOutput {
	s.NextToken = &v
	return s
}

type DescribeHostsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * auto-placement - Whether auto-placement is enabled or disabled (on |
	//    off).
	//
	//    * availability-zone - The Availability Zone of the host.
	//
	//    * client-token - The idempotency token that you provided when you allocated
	//    the host.
	//
	//    * host-reservation-id - The ID of the reservation assigned to this host.
	//
	//    * instance-type - The instance type size that the Dedicated Host is configured
	//    to support.
	//
	//    * state - The allocation state of the Dedicated Host (available | under-assessment
	//    | permanent-failure | released | released-permanent-failure).
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filter []*Filter `locationName:"filter" locationNameList:"Filter" type:"list"`

	// The IDs of the Dedicated Hosts. The IDs are used for targeted instance launches.
	HostIds []*string `locationName:"hostId" locationNameList:"item" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results can be seen by sending another request with the returned
	// nextToken value. This value can be between 5 and 500. If maxResults is given
	// a larger value than 500, you receive an error. You cannot specify this parameter
	// and the host IDs parameter in the same request.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeHostsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeHostsInput) GoString() string {
	return s.String()
}

// SetFilter sets the Filter field's value.
func (s *DescribeHostsInput) SetFilter(v []*Filter) *DescribeHostsInput {
	s.Filter = v
	return s
}

// SetHostIds sets the HostIds field's value.
func (s *DescribeHostsInput) SetHostIds(v []*string) *DescribeHostsInput {
	s.HostIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeHostsInput) SetMaxResults(v int64) *DescribeHostsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeHostsInput) SetNextToken(v string) *DescribeHostsInput {
	s.NextToken = &v
	return s
}

type DescribeHostsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Dedicated Hosts.
	Hosts []*Host `locationName:"hostSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeHostsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeHostsOutput) GoString() string {
	return s.String()
}

// SetHosts sets the Hosts field's value.
func (s *DescribeHostsOutput) SetHosts(v []*Host) *DescribeHostsOutput {
	s.Hosts = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeHostsOutput) SetNextToken(v string) *DescribeHostsOutput {
	s.NextToken = &v
	return s
}

type DescribeIamInstanceProfileAssociationsInput struct {
	_ struct{} `type:"structure"`

	// One or more IAM instance profile associations.
	AssociationIds []*string `locationName:"AssociationId" locationNameList:"AssociationId" type:"list"`

	// One or more filters.
	//
	//    * instance-id - The ID of the instance.
	//
	//    * state - The state of the association (associating | associated | disassociating
	//    | disassociated).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to request the next page of results.
	NextToken *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeIamInstanceProfileAssociationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeIamInstanceProfileAssociationsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeIamInstanceProfileAssociationsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeIamInstanceProfileAssociationsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationIds sets the AssociationIds field's value.
func (s *DescribeIamInstanceProfileAssociationsInput) SetAssociationIds(v []*string) *DescribeIamInstanceProfileAssociationsInput {
	s.AssociationIds = v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeIamInstanceProfileAssociationsInput) SetFilters(v []*Filter) *DescribeIamInstanceProfileAssociationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeIamInstanceProfileAssociationsInput) SetMaxResults(v int64) *DescribeIamInstanceProfileAssociationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeIamInstanceProfileAssociationsInput) SetNextToken(v string) *DescribeIamInstanceProfileAssociationsInput {
	s.NextToken = &v
	return s
}

type DescribeIamInstanceProfileAssociationsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more IAM instance profile associations.
	IamInstanceProfileAssociations []*IamInstanceProfileAssociation `locationName:"iamInstanceProfileAssociationSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`
}

// String returns the string representation
func (s DescribeIamInstanceProfileAssociationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeIamInstanceProfileAssociationsOutput) GoString() string {
	return s.String()
}

// SetIamInstanceProfileAssociations sets the IamInstanceProfileAssociations field's value.
func (s *DescribeIamInstanceProfileAssociationsOutput) SetIamInstanceProfileAssociations(v []*IamInstanceProfileAssociation) *DescribeIamInstanceProfileAssociationsOutput {
	s.IamInstanceProfileAssociations = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeIamInstanceProfileAssociationsOutput) SetNextToken(v string) *DescribeIamInstanceProfileAssociationsOutput {
	s.NextToken = &v
	return s
}

type DescribeIdFormatInput struct {
	_ struct{} `type:"structure"`

	// The type of resource: bundle | conversion-task | customer-gateway | dhcp-options
	// | elastic-ip-allocation | elastic-ip-association | export-task | flow-log
	// | image | import-task | instance | internet-gateway | network-acl | network-acl-association
	// | network-interface | network-interface-attachment | prefix-list | reservation
	// | route-table | route-table-association | security-group | snapshot | subnet
	// | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
	// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway
	Resource *string `type:"string"`
}

// String returns the string representation
func (s DescribeIdFormatInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeIdFormatInput) GoString() string {
	return s.String()
}

// SetResource sets the Resource field's value.
func (s *DescribeIdFormatInput) SetResource(v string) *DescribeIdFormatInput {
	s.Resource = &v
	return s
}

type DescribeIdFormatOutput struct {
	_ struct{} `type:"structure"`

	// Information about the ID format for the resource.
	Statuses []*IdFormat `locationName:"statusSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeIdFormatOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeIdFormatOutput) GoString() string {
	return s.String()
}

// SetStatuses sets the Statuses field's value.
func (s *DescribeIdFormatOutput) SetStatuses(v []*IdFormat) *DescribeIdFormatOutput {
	s.Statuses = v
	return s
}

type DescribeIdentityIdFormatInput struct {
	_ struct{} `type:"structure"`

	// The ARN of the principal, which can be an IAM role, IAM user, or the root
	// user.
	//
	// PrincipalArn is a required field
	PrincipalArn *string `locationName:"principalArn" type:"string" required:"true"`

	// The type of resource: bundle | conversion-task | customer-gateway | dhcp-options
	// | elastic-ip-allocation | elastic-ip-association | export-task | flow-log
	// | image | import-task | instance | internet-gateway | network-acl | network-acl-association
	// | network-interface | network-interface-attachment | prefix-list | reservation
	// | route-table | route-table-association | security-group | snapshot | subnet
	// | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
	// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway
	Resource *string `locationName:"resource" type:"string"`
}

// String returns the string representation
func (s DescribeIdentityIdFormatInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeIdentityIdFormatInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeIdentityIdFormatInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeIdentityIdFormatInput"}
	if s.PrincipalArn == nil {
		invalidParams.Add(request.NewErrParamRequired("PrincipalArn"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetPrincipalArn sets the PrincipalArn field's value.
func (s *DescribeIdentityIdFormatInput) SetPrincipalArn(v string) *DescribeIdentityIdFormatInput {
	s.PrincipalArn = &v
	return s
}

// SetResource sets the Resource field's value.
func (s *DescribeIdentityIdFormatInput) SetResource(v string) *DescribeIdentityIdFormatInput {
	s.Resource = &v
	return s
}

type DescribeIdentityIdFormatOutput struct {
	_ struct{} `type:"structure"`

	// Information about the ID format for the resources.
	Statuses []*IdFormat `locationName:"statusSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeIdentityIdFormatOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeIdentityIdFormatOutput) GoString() string {
	return s.String()
}

// SetStatuses sets the Statuses field's value.
func (s *DescribeIdentityIdFormatOutput) SetStatuses(v []*IdFormat) *DescribeIdentityIdFormatOutput {
	s.Statuses = v
	return s
}

// Contains the parameters for DescribeImageAttribute.
type DescribeImageAttributeInput struct {
	_ struct{} `type:"structure"`

	// The AMI attribute.
	//
	// Note: Depending on your account privileges, the blockDeviceMapping attribute
	// may return a Client.AuthFailure error. If this happens, use DescribeImages
	// to get information about the block device mapping for the AMI.
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"ImageAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the AMI.
	//
	// ImageId is a required field
	ImageId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeImageAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImageAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeImageAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeImageAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.ImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("ImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeImageAttributeInput) SetAttribute(v string) *DescribeImageAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeImageAttributeInput) SetDryRun(v bool) *DescribeImageAttributeInput {
	s.DryRun = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *DescribeImageAttributeInput) SetImageId(v string) *DescribeImageAttributeInput {
	s.ImageId = &v
	return s
}

// Describes an image attribute.
type DescribeImageAttributeOutput struct {
	_ struct{} `type:"structure"`

	// One or more block device mapping entries.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// A description for the AMI.
	Description *AttributeValue `locationName:"description" type:"structure"`

	// The ID of the AMI.
	ImageId *string `locationName:"imageId" type:"string"`

	// The kernel ID.
	KernelId *AttributeValue `locationName:"kernel" type:"structure"`

	// One or more launch permissions.
	LaunchPermissions []*LaunchPermission `locationName:"launchPermission" locationNameList:"item" type:"list"`

	// One or more product codes.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// The RAM disk ID.
	RamdiskId *AttributeValue `locationName:"ramdisk" type:"structure"`

	// Indicates whether enhanced networking with the Intel 82599 Virtual Function
	// interface is enabled.
	SriovNetSupport *AttributeValue `locationName:"sriovNetSupport" type:"structure"`
}

// String returns the string representation
func (s DescribeImageAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImageAttributeOutput) GoString() string {
	return s.String()
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *DescribeImageAttributeOutput) SetBlockDeviceMappings(v []*BlockDeviceMapping) *DescribeImageAttributeOutput {
	s.BlockDeviceMappings = v
	return s
}

// SetDescription sets the Description field's value.
func (s *DescribeImageAttributeOutput) SetDescription(v *AttributeValue) *DescribeImageAttributeOutput {
	s.Description = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *DescribeImageAttributeOutput) SetImageId(v string) *DescribeImageAttributeOutput {
	s.ImageId = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *DescribeImageAttributeOutput) SetKernelId(v *AttributeValue) *DescribeImageAttributeOutput {
	s.KernelId = v
	return s
}

// SetLaunchPermissions sets the LaunchPermissions field's value.
func (s *DescribeImageAttributeOutput) SetLaunchPermissions(v []*LaunchPermission) *DescribeImageAttributeOutput {
	s.LaunchPermissions = v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *DescribeImageAttributeOutput) SetProductCodes(v []*ProductCode) *DescribeImageAttributeOutput {
	s.ProductCodes = v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *DescribeImageAttributeOutput) SetRamdiskId(v *AttributeValue) *DescribeImageAttributeOutput {
	s.RamdiskId = v
	return s
}

// SetSriovNetSupport sets the SriovNetSupport field's value.
func (s *DescribeImageAttributeOutput) SetSriovNetSupport(v *AttributeValue) *DescribeImageAttributeOutput {
	s.SriovNetSupport = v
	return s
}

// Contains the parameters for DescribeImages.
type DescribeImagesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Scopes the images by users with explicit launch permissions. Specify an AWS
	// account ID, self (the sender of the request), or all (public AMIs).
	ExecutableUsers []*string `locationName:"ExecutableBy" locationNameList:"ExecutableBy" type:"list"`

	// One or more filters.
	//
	//    * architecture - The image architecture (i386 | x86_64).
	//
	//    * block-device-mapping.delete-on-termination - A Boolean value that indicates
	//    whether the Amazon EBS volume is deleted on instance termination.
	//
	//    * block-device-mapping.device-name - The device name specified in the
	//    block device mapping (for example, /dev/sdh or xvdh).
	//
	//    * block-device-mapping.snapshot-id - The ID of the snapshot used for the
	//    EBS volume.
	//
	//    * block-device-mapping.volume-size - The volume size of the EBS volume,
	//    in GiB.
	//
	//    * block-device-mapping.volume-type - The volume type of the EBS volume
	//    (gp2 | io1 | st1 | sc1 | standard).
	//
	//    * description - The description of the image (provided during image creation).
	//
	//    * ena-support - A Boolean that indicates whether enhanced networking with
	//    ENA is enabled.
	//
	//    * hypervisor - The hypervisor type (ovm | xen).
	//
	//    * image-id - The ID of the image.
	//
	//    * image-type - The image type (machine | kernel | ramdisk).
	//
	//    * is-public - A Boolean that indicates whether the image is public.
	//
	//    * kernel-id - The kernel ID.
	//
	//    * manifest-location - The location of the image manifest.
	//
	//    * name - The name of the AMI (provided during image creation).
	//
	//    * owner-alias - String value from an Amazon-maintained list (amazon |
	//    aws-marketplace | microsoft) of snapshot owners. Not to be confused with
	//    the user-configured AWS account alias, which is set from the IAM console.
	//
	//    * owner-id - The AWS account ID of the image owner.
	//
	//    * platform - The platform. To only list Windows-based AMIs, use windows.
	//
	//    * product-code - The product code.
	//
	//    * product-code.type - The type of the product code (devpay | marketplace).
	//
	//    * ramdisk-id - The RAM disk ID.
	//
	//    * root-device-name - The device name of the root device volume (for example,
	//    /dev/sda1).
	//
	//    * root-device-type - The type of the root device volume (ebs | instance-store).
	//
	//    * state - The state of the image (available | pending | failed).
	//
	//    * state-reason-code - The reason code for the state change.
	//
	//    * state-reason-message - The message for the state change.
	//
	//    * sriov-net-support - A value of simple indicates that enhanced networking
	//    with the Intel 82599 VF interface is enabled.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * virtualization-type - The virtualization type (paravirtual | hvm).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more image IDs.
	//
	// Default: Describes all images available to you.
	ImageIds []*string `locationName:"ImageId" locationNameList:"ImageId" type:"list"`

	// Filters the images by the owner. Specify an AWS account ID, self (owner is
	// the sender of the request), or an AWS owner alias (valid values are amazon
	// | aws-marketplace | microsoft). Omitting this option returns all images for
	// which you have launch permissions, regardless of ownership.
	Owners []*string `locationName:"Owner" locationNameList:"Owner" type:"list"`
}

// String returns the string representation
func (s DescribeImagesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImagesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeImagesInput) SetDryRun(v bool) *DescribeImagesInput {
	s.DryRun = &v
	return s
}

// SetExecutableUsers sets the ExecutableUsers field's value.
func (s *DescribeImagesInput) SetExecutableUsers(v []*string) *DescribeImagesInput {
	s.ExecutableUsers = v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeImagesInput) SetFilters(v []*Filter) *DescribeImagesInput {
	s.Filters = v
	return s
}

// SetImageIds sets the ImageIds field's value.
func (s *DescribeImagesInput) SetImageIds(v []*string) *DescribeImagesInput {
	s.ImageIds = v
	return s
}

// SetOwners sets the Owners field's value.
func (s *DescribeImagesInput) SetOwners(v []*string) *DescribeImagesInput {
	s.Owners = v
	return s
}

// Contains the output of DescribeImages.
type DescribeImagesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more images.
	Images []*Image `locationName:"imagesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeImagesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImagesOutput) GoString() string {
	return s.String()
}

// SetImages sets the Images field's value.
func (s *DescribeImagesOutput) SetImages(v []*Image) *DescribeImagesOutput {
	s.Images = v
	return s
}

// Contains the parameters for DescribeImportImageTasks.
type DescribeImportImageTasksInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Filter tasks using the task-state filter and one of the following values:
	// active, completed, deleting, deleted.
	Filters []*Filter `locationNameList:"Filter" type:"list"`

	// A list of import image task IDs.
	ImportTaskIds []*string `locationName:"ImportTaskId" locationNameList:"ImportTaskId" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// A token that indicates the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeImportImageTasksInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImportImageTasksInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeImportImageTasksInput) SetDryRun(v bool) *DescribeImportImageTasksInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeImportImageTasksInput) SetFilters(v []*Filter) *DescribeImportImageTasksInput {
	s.Filters = v
	return s
}

// SetImportTaskIds sets the ImportTaskIds field's value.
func (s *DescribeImportImageTasksInput) SetImportTaskIds(v []*string) *DescribeImportImageTasksInput {
	s.ImportTaskIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeImportImageTasksInput) SetMaxResults(v int64) *DescribeImportImageTasksInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeImportImageTasksInput) SetNextToken(v string) *DescribeImportImageTasksInput {
	s.NextToken = &v
	return s
}

// Contains the output for DescribeImportImageTasks.
type DescribeImportImageTasksOutput struct {
	_ struct{} `type:"structure"`

	// A list of zero or more import image tasks that are currently active or were
	// completed or canceled in the previous 7 days.
	ImportImageTasks []*ImportImageTask `locationName:"importImageTaskSet" locationNameList:"item" type:"list"`

	// The token to use to get the next page of results. This value is null when
	// there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeImportImageTasksOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImportImageTasksOutput) GoString() string {
	return s.String()
}

// SetImportImageTasks sets the ImportImageTasks field's value.
func (s *DescribeImportImageTasksOutput) SetImportImageTasks(v []*ImportImageTask) *DescribeImportImageTasksOutput {
	s.ImportImageTasks = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeImportImageTasksOutput) SetNextToken(v string) *DescribeImportImageTasksOutput {
	s.NextToken = &v
	return s
}

// Contains the parameters for DescribeImportSnapshotTasks.
type DescribeImportSnapshotTasksInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	Filters []*Filter `locationNameList:"Filter" type:"list"`

	// A list of import snapshot task IDs.
	ImportTaskIds []*string `locationName:"ImportTaskId" locationNameList:"ImportTaskId" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// A token that indicates the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeImportSnapshotTasksInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImportSnapshotTasksInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeImportSnapshotTasksInput) SetDryRun(v bool) *DescribeImportSnapshotTasksInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeImportSnapshotTasksInput) SetFilters(v []*Filter) *DescribeImportSnapshotTasksInput {
	s.Filters = v
	return s
}

// SetImportTaskIds sets the ImportTaskIds field's value.
func (s *DescribeImportSnapshotTasksInput) SetImportTaskIds(v []*string) *DescribeImportSnapshotTasksInput {
	s.ImportTaskIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeImportSnapshotTasksInput) SetMaxResults(v int64) *DescribeImportSnapshotTasksInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeImportSnapshotTasksInput) SetNextToken(v string) *DescribeImportSnapshotTasksInput {
	s.NextToken = &v
	return s
}

// Contains the output for DescribeImportSnapshotTasks.
type DescribeImportSnapshotTasksOutput struct {
	_ struct{} `type:"structure"`

	// A list of zero or more import snapshot tasks that are currently active or
	// were completed or canceled in the previous 7 days.
	ImportSnapshotTasks []*ImportSnapshotTask `locationName:"importSnapshotTaskSet" locationNameList:"item" type:"list"`

	// The token to use to get the next page of results. This value is null when
	// there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeImportSnapshotTasksOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeImportSnapshotTasksOutput) GoString() string {
	return s.String()
}

// SetImportSnapshotTasks sets the ImportSnapshotTasks field's value.
func (s *DescribeImportSnapshotTasksOutput) SetImportSnapshotTasks(v []*ImportSnapshotTask) *DescribeImportSnapshotTasksOutput {
	s.ImportSnapshotTasks = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeImportSnapshotTasksOutput) SetNextToken(v string) *DescribeImportSnapshotTasksOutput {
	s.NextToken = &v
	return s
}

type DescribeInstanceAttributeInput struct {
	_ struct{} `type:"structure"`

	// The instance attribute.
	//
	// Note: The enaSupport attribute is not supported at this time.
	//
	// Attribute is a required field
	Attribute *string `locationName:"attribute" type:"string" required:"true" enum:"InstanceAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeInstanceAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstanceAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeInstanceAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeInstanceAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeInstanceAttributeInput) SetAttribute(v string) *DescribeInstanceAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeInstanceAttributeInput) SetDryRun(v bool) *DescribeInstanceAttributeInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *DescribeInstanceAttributeInput) SetInstanceId(v string) *DescribeInstanceAttributeInput {
	s.InstanceId = &v
	return s
}

// Describes an instance attribute.
type DescribeInstanceAttributeOutput struct {
	_ struct{} `type:"structure"`

	// The block device mapping of the instance.
	BlockDeviceMappings []*InstanceBlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// If the value is true, you can't terminate the instance through the Amazon
	// EC2 console, CLI, or API; otherwise, you can.
	DisableApiTermination *AttributeBooleanValue `locationName:"disableApiTermination" type:"structure"`

	// Indicates whether the instance is optimized for Amazon EBS I/O.
	EbsOptimized *AttributeBooleanValue `locationName:"ebsOptimized" type:"structure"`

	// Indicates whether enhanced networking with ENA is enabled.
	EnaSupport *AttributeBooleanValue `locationName:"enaSupport" type:"structure"`

	// The security groups associated with the instance.
	Groups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// Indicates whether an instance stops or terminates when you initiate shutdown
	// from the instance (using the operating system command for system shutdown).
	InstanceInitiatedShutdownBehavior *AttributeValue `locationName:"instanceInitiatedShutdownBehavior" type:"structure"`

	// The instance type.
	InstanceType *AttributeValue `locationName:"instanceType" type:"structure"`

	// The kernel ID.
	KernelId *AttributeValue `locationName:"kernel" type:"structure"`

	// A list of product codes.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// The RAM disk ID.
	RamdiskId *AttributeValue `locationName:"ramdisk" type:"structure"`

	// The device name of the root device volume (for example, /dev/sda1).
	RootDeviceName *AttributeValue `locationName:"rootDeviceName" type:"structure"`

	// Indicates whether source/destination checking is enabled. A value of true
	// means that checking is enabled, and false means that checking is disabled.
	// This value must be false for a NAT instance to perform NAT.
	SourceDestCheck *AttributeBooleanValue `locationName:"sourceDestCheck" type:"structure"`

	// Indicates whether enhanced networking with the Intel 82599 Virtual Function
	// interface is enabled.
	SriovNetSupport *AttributeValue `locationName:"sriovNetSupport" type:"structure"`

	// The user data.
	UserData *AttributeValue `locationName:"userData" type:"structure"`
}

// String returns the string representation
func (s DescribeInstanceAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstanceAttributeOutput) GoString() string {
	return s.String()
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *DescribeInstanceAttributeOutput) SetBlockDeviceMappings(v []*InstanceBlockDeviceMapping) *DescribeInstanceAttributeOutput {
	s.BlockDeviceMappings = v
	return s
}

// SetDisableApiTermination sets the DisableApiTermination field's value.
func (s *DescribeInstanceAttributeOutput) SetDisableApiTermination(v *AttributeBooleanValue) *DescribeInstanceAttributeOutput {
	s.DisableApiTermination = v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *DescribeInstanceAttributeOutput) SetEbsOptimized(v *AttributeBooleanValue) *DescribeInstanceAttributeOutput {
	s.EbsOptimized = v
	return s
}

// SetEnaSupport sets the EnaSupport field's value.
func (s *DescribeInstanceAttributeOutput) SetEnaSupport(v *AttributeBooleanValue) *DescribeInstanceAttributeOutput {
	s.EnaSupport = v
	return s
}

// SetGroups sets the Groups field's value.
func (s *DescribeInstanceAttributeOutput) SetGroups(v []*GroupIdentifier) *DescribeInstanceAttributeOutput {
	s.Groups = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *DescribeInstanceAttributeOutput) SetInstanceId(v string) *DescribeInstanceAttributeOutput {
	s.InstanceId = &v
	return s
}

// SetInstanceInitiatedShutdownBehavior sets the InstanceInitiatedShutdownBehavior field's value.
func (s *DescribeInstanceAttributeOutput) SetInstanceInitiatedShutdownBehavior(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.InstanceInitiatedShutdownBehavior = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *DescribeInstanceAttributeOutput) SetInstanceType(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.InstanceType = v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *DescribeInstanceAttributeOutput) SetKernelId(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.KernelId = v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *DescribeInstanceAttributeOutput) SetProductCodes(v []*ProductCode) *DescribeInstanceAttributeOutput {
	s.ProductCodes = v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *DescribeInstanceAttributeOutput) SetRamdiskId(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.RamdiskId = v
	return s
}

// SetRootDeviceName sets the RootDeviceName field's value.
func (s *DescribeInstanceAttributeOutput) SetRootDeviceName(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.RootDeviceName = v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *DescribeInstanceAttributeOutput) SetSourceDestCheck(v *AttributeBooleanValue) *DescribeInstanceAttributeOutput {
	s.SourceDestCheck = v
	return s
}

// SetSriovNetSupport sets the SriovNetSupport field's value.
func (s *DescribeInstanceAttributeOutput) SetSriovNetSupport(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.SriovNetSupport = v
	return s
}

// SetUserData sets the UserData field's value.
func (s *DescribeInstanceAttributeOutput) SetUserData(v *AttributeValue) *DescribeInstanceAttributeOutput {
	s.UserData = v
	return s
}

type DescribeInstanceCreditSpecificationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * instance-id - The ID of the instance.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more instance IDs.
	//
	// Default: Describes all your instances.
	//
	// Constraints: Maximum 1000 explicitly specified instance IDs.
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 5 and 1000. You cannot specify this parameter and the
	// instance IDs parameter in the same call.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeInstanceCreditSpecificationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstanceCreditSpecificationsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeInstanceCreditSpecificationsInput) SetDryRun(v bool) *DescribeInstanceCreditSpecificationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeInstanceCreditSpecificationsInput) SetFilters(v []*Filter) *DescribeInstanceCreditSpecificationsInput {
	s.Filters = v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *DescribeInstanceCreditSpecificationsInput) SetInstanceIds(v []*string) *DescribeInstanceCreditSpecificationsInput {
	s.InstanceIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeInstanceCreditSpecificationsInput) SetMaxResults(v int64) *DescribeInstanceCreditSpecificationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeInstanceCreditSpecificationsInput) SetNextToken(v string) *DescribeInstanceCreditSpecificationsInput {
	s.NextToken = &v
	return s
}

type DescribeInstanceCreditSpecificationsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the credit option for CPU usage of an instance.
	InstanceCreditSpecifications []*InstanceCreditSpecification `locationName:"instanceCreditSpecificationSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeInstanceCreditSpecificationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstanceCreditSpecificationsOutput) GoString() string {
	return s.String()
}

// SetInstanceCreditSpecifications sets the InstanceCreditSpecifications field's value.
func (s *DescribeInstanceCreditSpecificationsOutput) SetInstanceCreditSpecifications(v []*InstanceCreditSpecification) *DescribeInstanceCreditSpecificationsOutput {
	s.InstanceCreditSpecifications = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeInstanceCreditSpecificationsOutput) SetNextToken(v string) *DescribeInstanceCreditSpecificationsOutput {
	s.NextToken = &v
	return s
}

type DescribeInstanceStatusInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone of the instance.
	//
	//    * event.code - The code for the scheduled event (instance-reboot | system-reboot
	//    | system-maintenance | instance-retirement | instance-stop).
	//
	//    * event.description - A description of the event.
	//
	//    * event.not-after - The latest end time for the scheduled event (for example,
	//    2014-09-15T17:15:20.000Z).
	//
	//    * event.not-before - The earliest start time for the scheduled event (for
	//    example, 2014-09-15T17:15:20.000Z).
	//
	//    * instance-state-code - The code for the instance state, as a 16-bit unsigned
	//    integer. The high byte is used for internal purposes and should be ignored.
	//    The low byte is set based on the state represented. The valid values are
	//    0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64 (stopping),
	//    and 80 (stopped).
	//
	//    * instance-state-name - The state of the instance (pending | running |
	//    shutting-down | terminated | stopping | stopped).
	//
	//    * instance-status.reachability - Filters on instance status where the
	//    name is reachability (passed | failed | initializing | insufficient-data).
	//
	//    * instance-status.status - The status of the instance (ok | impaired |
	//    initializing | insufficient-data | not-applicable).
	//
	//    * system-status.reachability - Filters on system status where the name
	//    is reachability (passed | failed | initializing | insufficient-data).
	//
	//    * system-status.status - The system status of the instance (ok | impaired
	//    | initializing | insufficient-data | not-applicable).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// When true, includes the health status for all instances. When false, includes
	// the health status for running instances only.
	//
	// Default: false
	IncludeAllInstances *bool `locationName:"includeAllInstances" type:"boolean"`

	// One or more instance IDs.
	//
	// Default: Describes all your instances.
	//
	// Constraints: Maximum 100 explicitly specified instance IDs.
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 5 and 1000. You cannot specify this parameter and the
	// instance IDs parameter in the same call.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeInstanceStatusInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstanceStatusInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeInstanceStatusInput) SetDryRun(v bool) *DescribeInstanceStatusInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeInstanceStatusInput) SetFilters(v []*Filter) *DescribeInstanceStatusInput {
	s.Filters = v
	return s
}

// SetIncludeAllInstances sets the IncludeAllInstances field's value.
func (s *DescribeInstanceStatusInput) SetIncludeAllInstances(v bool) *DescribeInstanceStatusInput {
	s.IncludeAllInstances = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *DescribeInstanceStatusInput) SetInstanceIds(v []*string) *DescribeInstanceStatusInput {
	s.InstanceIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeInstanceStatusInput) SetMaxResults(v int64) *DescribeInstanceStatusInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeInstanceStatusInput) SetNextToken(v string) *DescribeInstanceStatusInput {
	s.NextToken = &v
	return s
}

type DescribeInstanceStatusOutput struct {
	_ struct{} `type:"structure"`

	// One or more instance status descriptions.
	InstanceStatuses []*InstanceStatus `locationName:"instanceStatusSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeInstanceStatusOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstanceStatusOutput) GoString() string {
	return s.String()
}

// SetInstanceStatuses sets the InstanceStatuses field's value.
func (s *DescribeInstanceStatusOutput) SetInstanceStatuses(v []*InstanceStatus) *DescribeInstanceStatusOutput {
	s.InstanceStatuses = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeInstanceStatusOutput) SetNextToken(v string) *DescribeInstanceStatusOutput {
	s.NextToken = &v
	return s
}

type DescribeInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * affinity - The affinity setting for an instance running on a Dedicated
	//    Host (default | host).
	//
	//    * architecture - The instance architecture (i386 | x86_64).
	//
	//    * availability-zone - The Availability Zone of the instance.
	//
	//    * block-device-mapping.attach-time - The attach time for an EBS volume
	//    mapped to the instance, for example, 2010-09-15T17:15:20.000Z.
	//
	//    * block-device-mapping.delete-on-termination - A Boolean that indicates
	//    whether the EBS volume is deleted on instance termination.
	//
	//    * block-device-mapping.device-name - The device name specified in the
	//    block device mapping (for example, /dev/sdh or xvdh).
	//
	//    * block-device-mapping.status - The status for the EBS volume (attaching
	//    | attached | detaching | detached).
	//
	//    * block-device-mapping.volume-id - The volume ID of the EBS volume.
	//
	//    * client-token - The idempotency token you provided when you launched
	//    the instance.
	//
	//    * dns-name - The public DNS name of the instance.
	//
	//    * group-id - The ID of the security group for the instance. EC2-Classic
	//    only.
	//
	//    * group-name - The name of the security group for the instance. EC2-Classic
	//    only.
	//
	//    * hibernation-options.configured - A Boolean that indicates whether the
	//    instance is enabled for hibernation. A value of true means that the instance
	//    is enabled for hibernation.
	//
	//    * host-id - The ID of the Dedicated Host on which the instance is running,
	//    if applicable.
	//
	//    * hypervisor - The hypervisor type of the instance (ovm | xen).
	//
	//    * iam-instance-profile.arn - The instance profile associated with the
	//    instance. Specified as an ARN.
	//
	//    * image-id - The ID of the image used to launch the instance.
	//
	//    * instance-id - The ID of the instance.
	//
	//    * instance-lifecycle - Indicates whether this is a Spot Instance or a
	//    Scheduled Instance (spot | scheduled).
	//
	//    * instance-state-code - The state of the instance, as a 16-bit unsigned
	//    integer. The high byte is used for internal purposes and should be ignored.
	//    The low byte is set based on the state represented. The valid values are:
	//    0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64 (stopping),
	//    and 80 (stopped).
	//
	//    * instance-state-name - The state of the instance (pending | running |
	//    shutting-down | terminated | stopping | stopped).
	//
	//    * instance-type - The type of instance (for example, t2.micro).
	//
	//    * instance.group-id - The ID of the security group for the instance.
	//
	//    * instance.group-name - The name of the security group for the instance.
	//
	//
	//    * ip-address - The public IPv4 address of the instance.
	//
	//    * kernel-id - The kernel ID.
	//
	//    * key-name - The name of the key pair used when the instance was launched.
	//
	//    * launch-index - When launching multiple instances, this is the index
	//    for the instance in the launch group (for example, 0, 1, 2, and so on).
	//
	//
	//    * launch-time - The time when the instance was launched.
	//
	//    * monitoring-state - Indicates whether detailed monitoring is enabled
	//    (disabled | enabled).
	//
	//    * network-interface.addresses.private-ip-address - The private IPv4 address
	//    associated with the network interface.
	//
	//    * network-interface.addresses.primary - Specifies whether the IPv4 address
	//    of the network interface is the primary private IPv4 address.
	//
	//    * network-interface.addresses.association.public-ip - The ID of the association
	//    of an Elastic IP address (IPv4) with a network interface.
	//
	//    * network-interface.addresses.association.ip-owner-id - The owner ID of
	//    the private IPv4 address associated with the network interface.
	//
	//    * network-interface.association.public-ip - The address of the Elastic
	//    IP address (IPv4) bound to the network interface.
	//
	//    * network-interface.association.ip-owner-id - The owner of the Elastic
	//    IP address (IPv4) associated with the network interface.
	//
	//    * network-interface.association.allocation-id - The allocation ID returned
	//    when you allocated the Elastic IP address (IPv4) for your network interface.
	//
	//    * network-interface.association.association-id - The association ID returned
	//    when the network interface was associated with an IPv4 address.
	//
	//    * network-interface.attachment.attachment-id - The ID of the interface
	//    attachment.
	//
	//    * network-interface.attachment.instance-id - The ID of the instance to
	//    which the network interface is attached.
	//
	//    * network-interface.attachment.instance-owner-id - The owner ID of the
	//    instance to which the network interface is attached.
	//
	//    * network-interface.attachment.device-index - The device index to which
	//    the network interface is attached.
	//
	//    * network-interface.attachment.status - The status of the attachment (attaching
	//    | attached | detaching | detached).
	//
	//    * network-interface.attachment.attach-time - The time that the network
	//    interface was attached to an instance.
	//
	//    * network-interface.attachment.delete-on-termination - Specifies whether
	//    the attachment is deleted when an instance is terminated.
	//
	//    * network-interface.availability-zone - The Availability Zone for the
	//    network interface.
	//
	//    * network-interface.description - The description of the network interface.
	//
	//    * network-interface.group-id - The ID of a security group associated with
	//    the network interface.
	//
	//    * network-interface.group-name - The name of a security group associated
	//    with the network interface.
	//
	//    * network-interface.ipv6-addresses.ipv6-address - The IPv6 address associated
	//    with the network interface.
	//
	//    * network-interface.mac-address - The MAC address of the network interface.
	//
	//    * network-interface.network-interface-id - The ID of the network interface.
	//
	//    * network-interface.owner-id - The ID of the owner of the network interface.
	//
	//    * network-interface.private-dns-name - The private DNS name of the network
	//    interface.
	//
	//    * network-interface.requester-id - The requester ID for the network interface.
	//
	//    * network-interface.requester-managed - Indicates whether the network
	//    interface is being managed by AWS.
	//
	//    * network-interface.status - The status of the network interface (available)
	//    | in-use).
	//
	//    * network-interface.source-dest-check - Whether the network interface
	//    performs source/destination checking. A value of true means that checking
	//    is enabled, and false means that checking is disabled. The value must
	//    be false for the network interface to perform network address translation
	//    (NAT) in your VPC.
	//
	//    * network-interface.subnet-id - The ID of the subnet for the network interface.
	//
	//    * network-interface.vpc-id - The ID of the VPC for the network interface.
	//
	//    * owner-id - The AWS account ID of the instance owner.
	//
	//    * placement-group-name - The name of the placement group for the instance.
	//
	//    * placement-partition-number - The partition in which the instance is
	//    located.
	//
	//    * platform - The platform. Use windows if you have Windows instances;
	//    otherwise, leave blank.
	//
	//    * private-dns-name - The private IPv4 DNS name of the instance.
	//
	//    * private-ip-address - The private IPv4 address of the instance.
	//
	//    * product-code - The product code associated with the AMI used to launch
	//    the instance.
	//
	//    * product-code.type - The type of product code (devpay | marketplace).
	//
	//    * ramdisk-id - The RAM disk ID.
	//
	//    * reason - The reason for the current state of the instance (for example,
	//    shows "User Initiated [date]" when you stop or terminate the instance).
	//    Similar to the state-reason-code filter.
	//
	//    * requester-id - The ID of the entity that launched the instance on your
	//    behalf (for example, AWS Management Console, Auto Scaling, and so on).
	//
	//    * reservation-id - The ID of the instance's reservation. A reservation
	//    ID is created any time you launch an instance. A reservation ID has a
	//    one-to-one relationship with an instance launch request, but can be associated
	//    with more than one instance if you launch multiple instances using the
	//    same launch request. For example, if you launch one instance, you get
	//    one reservation ID. If you launch ten instances using the same launch
	//    request, you also get one reservation ID.
	//
	//    * root-device-name - The device name of the root device volume (for example,
	//    /dev/sda1).
	//
	//    * root-device-type - The type of the root device volume (ebs | instance-store).
	//
	//    * source-dest-check - Indicates whether the instance performs source/destination
	//    checking. A value of true means that checking is enabled, and false means
	//    that checking is disabled. The value must be false for the instance to
	//    perform network address translation (NAT) in your VPC.
	//
	//    * spot-instance-request-id - The ID of the Spot Instance request.
	//
	//    * state-reason-code - The reason code for the state change.
	//
	//    * state-reason-message - A message that describes the state change.
	//
	//    * subnet-id - The ID of the subnet for the instance.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources that have a tag with a specific key, regardless
	//    of the tag value.
	//
	//    * tenancy - The tenancy of an instance (dedicated | default | host).
	//
	//    * virtualization-type - The virtualization type of the instance (paravirtual
	//    | hvm).
	//
	//    * vpc-id - The ID of the VPC that the instance is running in.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more instance IDs.
	//
	// Default: Describes all your instances.
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 5 and 1000. You cannot specify this parameter and the
	// instance IDs parameter in the same call.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token to request the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstancesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeInstancesInput) SetDryRun(v bool) *DescribeInstancesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeInstancesInput) SetFilters(v []*Filter) *DescribeInstancesInput {
	s.Filters = v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *DescribeInstancesInput) SetInstanceIds(v []*string) *DescribeInstancesInput {
	s.InstanceIds = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeInstancesInput) SetMaxResults(v int64) *DescribeInstancesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeInstancesInput) SetNextToken(v string) *DescribeInstancesInput {
	s.NextToken = &v
	return s
}

type DescribeInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Zero or more reservations.
	Reservations []*Reservation `locationName:"reservationSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInstancesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeInstancesOutput) SetNextToken(v string) *DescribeInstancesOutput {
	s.NextToken = &v
	return s
}

// SetReservations sets the Reservations field's value.
func (s *DescribeInstancesOutput) SetReservations(v []*Reservation) *DescribeInstancesOutput {
	s.Reservations = v
	return s
}

type DescribeInternetGatewaysInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * attachment.state - The current state of the attachment between the gateway
	//    and the VPC (available). Present only if a VPC is attached.
	//
	//    * attachment.vpc-id - The ID of an attached VPC.
	//
	//    * internet-gateway-id - The ID of the Internet gateway.
	//
	//    * owner-id - The ID of the AWS account that owns the internet gateway.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more internet gateway IDs.
	//
	// Default: Describes all your internet gateways.
	InternetGatewayIds []*string `locationName:"internetGatewayId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeInternetGatewaysInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInternetGatewaysInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeInternetGatewaysInput) SetDryRun(v bool) *DescribeInternetGatewaysInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeInternetGatewaysInput) SetFilters(v []*Filter) *DescribeInternetGatewaysInput {
	s.Filters = v
	return s
}

// SetInternetGatewayIds sets the InternetGatewayIds field's value.
func (s *DescribeInternetGatewaysInput) SetInternetGatewayIds(v []*string) *DescribeInternetGatewaysInput {
	s.InternetGatewayIds = v
	return s
}

type DescribeInternetGatewaysOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more internet gateways.
	InternetGateways []*InternetGateway `locationName:"internetGatewaySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeInternetGatewaysOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeInternetGatewaysOutput) GoString() string {
	return s.String()
}

// SetInternetGateways sets the InternetGateways field's value.
func (s *DescribeInternetGatewaysOutput) SetInternetGateways(v []*InternetGateway) *DescribeInternetGatewaysOutput {
	s.InternetGateways = v
	return s
}

type DescribeKeyPairsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * fingerprint - The fingerprint of the key pair.
	//
	//    * key-name - The name of the key pair.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more key pair names.
	//
	// Default: Describes all your key pairs.
	KeyNames []*string `locationName:"KeyName" locationNameList:"KeyName" type:"list"`
}

// String returns the string representation
func (s DescribeKeyPairsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeKeyPairsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeKeyPairsInput) SetDryRun(v bool) *DescribeKeyPairsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeKeyPairsInput) SetFilters(v []*Filter) *DescribeKeyPairsInput {
	s.Filters = v
	return s
}

// SetKeyNames sets the KeyNames field's value.
func (s *DescribeKeyPairsInput) SetKeyNames(v []*string) *DescribeKeyPairsInput {
	s.KeyNames = v
	return s
}

type DescribeKeyPairsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more key pairs.
	KeyPairs []*KeyPairInfo `locationName:"keySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeKeyPairsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeKeyPairsOutput) GoString() string {
	return s.String()
}

// SetKeyPairs sets the KeyPairs field's value.
func (s *DescribeKeyPairsOutput) SetKeyPairs(v []*KeyPairInfo) *DescribeKeyPairsOutput {
	s.KeyPairs = v
	return s
}

type DescribeLaunchTemplateVersionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * create-time - The time the launch template version was created.
	//
	//    * ebs-optimized - A boolean that indicates whether the instance is optimized
	//    for Amazon EBS I/O.
	//
	//    * iam-instance-profile - The ARN of the IAM instance profile.
	//
	//    * image-id - The ID of the AMI.
	//
	//    * instance-type - The instance type.
	//
	//    * is-default-version - A boolean that indicates whether the launch template
	//    version is the default version.
	//
	//    * kernel-id - The kernel ID.
	//
	//    * ram-disk-id - The RAM disk ID.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The ID of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateName *string `min:"3" type:"string"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 1 and 200.
	MaxResults *int64 `type:"integer"`

	// The version number up to which to describe launch template versions.
	MaxVersion *string `type:"string"`

	// The version number after which to describe launch template versions.
	MinVersion *string `type:"string"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`

	// One or more versions of the launch template.
	Versions []*string `locationName:"LaunchTemplateVersion" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeLaunchTemplateVersionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeLaunchTemplateVersionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeLaunchTemplateVersionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeLaunchTemplateVersionsInput"}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetDryRun(v bool) *DescribeLaunchTemplateVersionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetFilters(v []*Filter) *DescribeLaunchTemplateVersionsInput {
	s.Filters = v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetLaunchTemplateId(v string) *DescribeLaunchTemplateVersionsInput {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetLaunchTemplateName(v string) *DescribeLaunchTemplateVersionsInput {
	s.LaunchTemplateName = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetMaxResults(v int64) *DescribeLaunchTemplateVersionsInput {
	s.MaxResults = &v
	return s
}

// SetMaxVersion sets the MaxVersion field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetMaxVersion(v string) *DescribeLaunchTemplateVersionsInput {
	s.MaxVersion = &v
	return s
}

// SetMinVersion sets the MinVersion field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetMinVersion(v string) *DescribeLaunchTemplateVersionsInput {
	s.MinVersion = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetNextToken(v string) *DescribeLaunchTemplateVersionsInput {
	s.NextToken = &v
	return s
}

// SetVersions sets the Versions field's value.
func (s *DescribeLaunchTemplateVersionsInput) SetVersions(v []*string) *DescribeLaunchTemplateVersionsInput {
	s.Versions = v
	return s
}

type DescribeLaunchTemplateVersionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch template versions.
	LaunchTemplateVersions []*LaunchTemplateVersion `locationName:"launchTemplateVersionSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeLaunchTemplateVersionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeLaunchTemplateVersionsOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplateVersions sets the LaunchTemplateVersions field's value.
func (s *DescribeLaunchTemplateVersionsOutput) SetLaunchTemplateVersions(v []*LaunchTemplateVersion) *DescribeLaunchTemplateVersionsOutput {
	s.LaunchTemplateVersions = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeLaunchTemplateVersionsOutput) SetNextToken(v string) *DescribeLaunchTemplateVersionsOutput {
	s.NextToken = &v
	return s
}

type DescribeLaunchTemplatesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * create-time - The time the launch template was created.
	//
	//    * launch-template-name - The name of the launch template.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more launch template IDs.
	LaunchTemplateIds []*string `locationName:"LaunchTemplateId" locationNameList:"item" type:"list"`

	// One or more launch template names.
	LaunchTemplateNames []*string `locationName:"LaunchTemplateName" locationNameList:"item" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 1 and 200.
	MaxResults *int64 `type:"integer"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeLaunchTemplatesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeLaunchTemplatesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeLaunchTemplatesInput) SetDryRun(v bool) *DescribeLaunchTemplatesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeLaunchTemplatesInput) SetFilters(v []*Filter) *DescribeLaunchTemplatesInput {
	s.Filters = v
	return s
}

// SetLaunchTemplateIds sets the LaunchTemplateIds field's value.
func (s *DescribeLaunchTemplatesInput) SetLaunchTemplateIds(v []*string) *DescribeLaunchTemplatesInput {
	s.LaunchTemplateIds = v
	return s
}

// SetLaunchTemplateNames sets the LaunchTemplateNames field's value.
func (s *DescribeLaunchTemplatesInput) SetLaunchTemplateNames(v []*string) *DescribeLaunchTemplatesInput {
	s.LaunchTemplateNames = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeLaunchTemplatesInput) SetMaxResults(v int64) *DescribeLaunchTemplatesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeLaunchTemplatesInput) SetNextToken(v string) *DescribeLaunchTemplatesInput {
	s.NextToken = &v
	return s
}

type DescribeLaunchTemplatesOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch templates.
	LaunchTemplates []*LaunchTemplate `locationName:"launchTemplates" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeLaunchTemplatesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeLaunchTemplatesOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplates sets the LaunchTemplates field's value.
func (s *DescribeLaunchTemplatesOutput) SetLaunchTemplates(v []*LaunchTemplate) *DescribeLaunchTemplatesOutput {
	s.LaunchTemplates = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeLaunchTemplatesOutput) SetNextToken(v string) *DescribeLaunchTemplatesOutput {
	s.NextToken = &v
	return s
}

type DescribeMovingAddressesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * moving-status - The status of the Elastic IP address (MovingToVpc |
	//    RestoringToClassic).
	Filters []*Filter `locationName:"filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results of the initial request can be seen by sending another
	// request with the returned NextToken value. This value can be between 5 and
	// 1000; if MaxResults is given a value outside of this range, an error is returned.
	//
	// Default: If no value is provided, the default is 1000.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token for the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// One or more Elastic IP addresses.
	PublicIps []*string `locationName:"publicIp" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeMovingAddressesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeMovingAddressesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeMovingAddressesInput) SetDryRun(v bool) *DescribeMovingAddressesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeMovingAddressesInput) SetFilters(v []*Filter) *DescribeMovingAddressesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeMovingAddressesInput) SetMaxResults(v int64) *DescribeMovingAddressesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeMovingAddressesInput) SetNextToken(v string) *DescribeMovingAddressesInput {
	s.NextToken = &v
	return s
}

// SetPublicIps sets the PublicIps field's value.
func (s *DescribeMovingAddressesInput) SetPublicIps(v []*string) *DescribeMovingAddressesInput {
	s.PublicIps = v
	return s
}

type DescribeMovingAddressesOutput struct {
	_ struct{} `type:"structure"`

	// The status for each Elastic IP address.
	MovingAddressStatuses []*MovingAddressStatus `locationName:"movingAddressStatusSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeMovingAddressesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeMovingAddressesOutput) GoString() string {
	return s.String()
}

// SetMovingAddressStatuses sets the MovingAddressStatuses field's value.
func (s *DescribeMovingAddressesOutput) SetMovingAddressStatuses(v []*MovingAddressStatus) *DescribeMovingAddressesOutput {
	s.MovingAddressStatuses = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeMovingAddressesOutput) SetNextToken(v string) *DescribeMovingAddressesOutput {
	s.NextToken = &v
	return s
}

type DescribeNatGatewaysInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * nat-gateway-id - The ID of the NAT gateway.
	//
	//    * state - The state of the NAT gateway (pending | failed | available |
	//    deleting | deleted).
	//
	//    * subnet-id - The ID of the subnet in which the NAT gateway resides.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC in which the NAT gateway resides.
	Filter []*Filter `locationNameList:"Filter" type:"list"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	//
	// Constraint: If the value specified is greater than 1000, we return only 1000
	// items.
	MaxResults *int64 `type:"integer"`

	// One or more NAT gateway IDs.
	NatGatewayIds []*string `locationName:"NatGatewayId" locationNameList:"item" type:"list"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeNatGatewaysInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNatGatewaysInput) GoString() string {
	return s.String()
}

// SetFilter sets the Filter field's value.
func (s *DescribeNatGatewaysInput) SetFilter(v []*Filter) *DescribeNatGatewaysInput {
	s.Filter = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeNatGatewaysInput) SetMaxResults(v int64) *DescribeNatGatewaysInput {
	s.MaxResults = &v
	return s
}

// SetNatGatewayIds sets the NatGatewayIds field's value.
func (s *DescribeNatGatewaysInput) SetNatGatewayIds(v []*string) *DescribeNatGatewaysInput {
	s.NatGatewayIds = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeNatGatewaysInput) SetNextToken(v string) *DescribeNatGatewaysInput {
	s.NextToken = &v
	return s
}

type DescribeNatGatewaysOutput struct {
	_ struct{} `type:"structure"`

	// Information about the NAT gateways.
	NatGateways []*NatGateway `locationName:"natGatewaySet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeNatGatewaysOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNatGatewaysOutput) GoString() string {
	return s.String()
}

// SetNatGateways sets the NatGateways field's value.
func (s *DescribeNatGatewaysOutput) SetNatGateways(v []*NatGateway) *DescribeNatGatewaysOutput {
	s.NatGateways = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeNatGatewaysOutput) SetNextToken(v string) *DescribeNatGatewaysOutput {
	s.NextToken = &v
	return s
}

type DescribeNetworkAclsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * association.association-id - The ID of an association ID for the ACL.
	//
	//    * association.network-acl-id - The ID of the network ACL involved in the
	//    association.
	//
	//    * association.subnet-id - The ID of the subnet involved in the association.
	//
	//    * default - Indicates whether the ACL is the default network ACL for the
	//    VPC.
	//
	//    * entry.cidr - The IPv4 CIDR range specified in the entry.
	//
	//    * entry.icmp.code - The ICMP code specified in the entry, if any.
	//
	//    * entry.icmp.type - The ICMP type specified in the entry, if any.
	//
	//    * entry.ipv6-cidr - The IPv6 CIDR range specified in the entry.
	//
	//    * entry.port-range.from - The start of the port range specified in the
	//    entry.
	//
	//    * entry.port-range.to - The end of the port range specified in the entry.
	//
	//
	//    * entry.protocol - The protocol specified in the entry (tcp | udp | icmp
	//    or a protocol number).
	//
	//    * entry.rule-action - Allows or denies the matching traffic (allow | deny).
	//
	//    * entry.rule-number - The number of an entry (in other words, rule) in
	//    the set of ACL entries.
	//
	//    * network-acl-id - The ID of the network ACL.
	//
	//    * owner-id - The ID of the AWS account that owns the network ACL.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC for the network ACL.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more network ACL IDs.
	//
	// Default: Describes all your network ACLs.
	NetworkAclIds []*string `locationName:"NetworkAclId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeNetworkAclsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkAclsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeNetworkAclsInput) SetDryRun(v bool) *DescribeNetworkAclsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeNetworkAclsInput) SetFilters(v []*Filter) *DescribeNetworkAclsInput {
	s.Filters = v
	return s
}

// SetNetworkAclIds sets the NetworkAclIds field's value.
func (s *DescribeNetworkAclsInput) SetNetworkAclIds(v []*string) *DescribeNetworkAclsInput {
	s.NetworkAclIds = v
	return s
}

type DescribeNetworkAclsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more network ACLs.
	NetworkAcls []*NetworkAcl `locationName:"networkAclSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeNetworkAclsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkAclsOutput) GoString() string {
	return s.String()
}

// SetNetworkAcls sets the NetworkAcls field's value.
func (s *DescribeNetworkAclsOutput) SetNetworkAcls(v []*NetworkAcl) *DescribeNetworkAclsOutput {
	s.NetworkAcls = v
	return s
}

// Contains the parameters for DescribeNetworkInterfaceAttribute.
type DescribeNetworkInterfaceAttributeInput struct {
	_ struct{} `type:"structure"`

	// The attribute of the network interface. This parameter is required.
	Attribute *string `locationName:"attribute" type:"string" enum:"NetworkInterfaceAttribute"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeNetworkInterfaceAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkInterfaceAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeNetworkInterfaceAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeNetworkInterfaceAttributeInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeNetworkInterfaceAttributeInput) SetAttribute(v string) *DescribeNetworkInterfaceAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeNetworkInterfaceAttributeInput) SetDryRun(v bool) *DescribeNetworkInterfaceAttributeInput {
	s.DryRun = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *DescribeNetworkInterfaceAttributeInput) SetNetworkInterfaceId(v string) *DescribeNetworkInterfaceAttributeInput {
	s.NetworkInterfaceId = &v
	return s
}

// Contains the output of DescribeNetworkInterfaceAttribute.
type DescribeNetworkInterfaceAttributeOutput struct {
	_ struct{} `type:"structure"`

	// The attachment (if any) of the network interface.
	Attachment *NetworkInterfaceAttachment `locationName:"attachment" type:"structure"`

	// The description of the network interface.
	Description *AttributeValue `locationName:"description" type:"structure"`

	// The security groups associated with the network interface.
	Groups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// Indicates whether source/destination checking is enabled.
	SourceDestCheck *AttributeBooleanValue `locationName:"sourceDestCheck" type:"structure"`
}

// String returns the string representation
func (s DescribeNetworkInterfaceAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkInterfaceAttributeOutput) GoString() string {
	return s.String()
}

// SetAttachment sets the Attachment field's value.
func (s *DescribeNetworkInterfaceAttributeOutput) SetAttachment(v *NetworkInterfaceAttachment) *DescribeNetworkInterfaceAttributeOutput {
	s.Attachment = v
	return s
}

// SetDescription sets the Description field's value.
func (s *DescribeNetworkInterfaceAttributeOutput) SetDescription(v *AttributeValue) *DescribeNetworkInterfaceAttributeOutput {
	s.Description = v
	return s
}

// SetGroups sets the Groups field's value.
func (s *DescribeNetworkInterfaceAttributeOutput) SetGroups(v []*GroupIdentifier) *DescribeNetworkInterfaceAttributeOutput {
	s.Groups = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *DescribeNetworkInterfaceAttributeOutput) SetNetworkInterfaceId(v string) *DescribeNetworkInterfaceAttributeOutput {
	s.NetworkInterfaceId = &v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *DescribeNetworkInterfaceAttributeOutput) SetSourceDestCheck(v *AttributeBooleanValue) *DescribeNetworkInterfaceAttributeOutput {
	s.SourceDestCheck = v
	return s
}

// Contains the parameters for DescribeNetworkInterfacePermissions.
type DescribeNetworkInterfacePermissionsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * network-interface-permission.network-interface-permission-id - The ID
	//    of the permission.
	//
	//    * network-interface-permission.network-interface-id - The ID of the network
	//    interface.
	//
	//    * network-interface-permission.aws-account-id - The AWS account ID.
	//
	//    * network-interface-permission.aws-service - The AWS service.
	//
	//    * network-interface-permission.permission - The type of permission (INSTANCE-ATTACH
	//    | EIP-ASSOCIATE).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. If
	// this parameter is not specified, up to 50 results are returned by default.
	MaxResults *int64 `type:"integer"`

	// One or more network interface permission IDs.
	NetworkInterfacePermissionIds []*string `locationName:"NetworkInterfacePermissionId" type:"list"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeNetworkInterfacePermissionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkInterfacePermissionsInput) GoString() string {
	return s.String()
}

// SetFilters sets the Filters field's value.
func (s *DescribeNetworkInterfacePermissionsInput) SetFilters(v []*Filter) *DescribeNetworkInterfacePermissionsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeNetworkInterfacePermissionsInput) SetMaxResults(v int64) *DescribeNetworkInterfacePermissionsInput {
	s.MaxResults = &v
	return s
}

// SetNetworkInterfacePermissionIds sets the NetworkInterfacePermissionIds field's value.
func (s *DescribeNetworkInterfacePermissionsInput) SetNetworkInterfacePermissionIds(v []*string) *DescribeNetworkInterfacePermissionsInput {
	s.NetworkInterfacePermissionIds = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeNetworkInterfacePermissionsInput) SetNextToken(v string) *DescribeNetworkInterfacePermissionsInput {
	s.NextToken = &v
	return s
}

// Contains the output for DescribeNetworkInterfacePermissions.
type DescribeNetworkInterfacePermissionsOutput struct {
	_ struct{} `type:"structure"`

	// The network interface permissions.
	NetworkInterfacePermissions []*NetworkInterfacePermission `locationName:"networkInterfacePermissions" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeNetworkInterfacePermissionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkInterfacePermissionsOutput) GoString() string {
	return s.String()
}

// SetNetworkInterfacePermissions sets the NetworkInterfacePermissions field's value.
func (s *DescribeNetworkInterfacePermissionsOutput) SetNetworkInterfacePermissions(v []*NetworkInterfacePermission) *DescribeNetworkInterfacePermissionsOutput {
	s.NetworkInterfacePermissions = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeNetworkInterfacePermissionsOutput) SetNextToken(v string) *DescribeNetworkInterfacePermissionsOutput {
	s.NextToken = &v
	return s
}

// Contains the parameters for DescribeNetworkInterfaces.
type DescribeNetworkInterfacesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * addresses.private-ip-address - The private IPv4 addresses associated
	//    with the network interface.
	//
	//    * addresses.primary - Whether the private IPv4 address is the primary
	//    IP address associated with the network interface.
	//
	//    * addresses.association.public-ip - The association ID returned when the
	//    network interface was associated with the Elastic IP address (IPv4).
	//
	//    * addresses.association.owner-id - The owner ID of the addresses associated
	//    with the network interface.
	//
	//    * association.association-id - The association ID returned when the network
	//    interface was associated with an IPv4 address.
	//
	//    * association.allocation-id - The allocation ID returned when you allocated
	//    the Elastic IP address (IPv4) for your network interface.
	//
	//    * association.ip-owner-id - The owner of the Elastic IP address (IPv4)
	//    associated with the network interface.
	//
	//    * association.public-ip - The address of the Elastic IP address (IPv4)
	//    bound to the network interface.
	//
	//    * association.public-dns-name - The public DNS name for the network interface
	//    (IPv4).
	//
	//    * attachment.attachment-id - The ID of the interface attachment.
	//
	//    * attachment.attach.time - The time that the network interface was attached
	//    to an instance.
	//
	//    * attachment.delete-on-termination - Indicates whether the attachment
	//    is deleted when an instance is terminated.
	//
	//    * attachment.device-index - The device index to which the network interface
	//    is attached.
	//
	//    * attachment.instance-id - The ID of the instance to which the network
	//    interface is attached.
	//
	//    * attachment.instance-owner-id - The owner ID of the instance to which
	//    the network interface is attached.
	//
	//    * attachment.nat-gateway-id - The ID of the NAT gateway to which the network
	//    interface is attached.
	//
	//    * attachment.status - The status of the attachment (attaching | attached
	//    | detaching | detached).
	//
	//    * availability-zone - The Availability Zone of the network interface.
	//
	//    * description - The description of the network interface.
	//
	//    * group-id - The ID of a security group associated with the network interface.
	//
	//    * group-name - The name of a security group associated with the network
	//    interface.
	//
	//    * ipv6-addresses.ipv6-address - An IPv6 address associated with the network
	//    interface.
	//
	//    * mac-address - The MAC address of the network interface.
	//
	//    * network-interface-id - The ID of the network interface.
	//
	//    * owner-id - The AWS account ID of the network interface owner.
	//
	//    * private-ip-address - The private IPv4 address or addresses of the network
	//    interface.
	//
	//    * private-dns-name - The private DNS name of the network interface (IPv4).
	//
	//    * requester-id - The ID of the entity that launched the instance on your
	//    behalf (for example, AWS Management Console, Auto Scaling, and so on).
	//
	//    * requester-managed - Indicates whether the network interface is being
	//    managed by an AWS service (for example, AWS Management Console, Auto Scaling,
	//    and so on).
	//
	//    * source-desk-check - Indicates whether the network interface performs
	//    source/destination checking. A value of true means checking is enabled,
	//    and false means checking is disabled. The value must be false for the
	//    network interface to perform network address translation (NAT) in your
	//    VPC.
	//
	//    * status - The status of the network interface. If the network interface
	//    is not attached to an instance, the status is available; if a network
	//    interface is attached to an instance the status is in-use.
	//
	//    * subnet-id - The ID of the subnet for the network interface.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC for the network interface.
	Filters []*Filter `locationName:"filter" locationNameList:"Filter" type:"list"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	MaxResults *int64 `type:"integer"`

	// One or more network interface IDs.
	//
	// Default: Describes all your network interfaces.
	NetworkInterfaceIds []*string `locationName:"NetworkInterfaceId" locationNameList:"item" type:"list"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeNetworkInterfacesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkInterfacesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeNetworkInterfacesInput) SetDryRun(v bool) *DescribeNetworkInterfacesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeNetworkInterfacesInput) SetFilters(v []*Filter) *DescribeNetworkInterfacesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeNetworkInterfacesInput) SetMaxResults(v int64) *DescribeNetworkInterfacesInput {
	s.MaxResults = &v
	return s
}

// SetNetworkInterfaceIds sets the NetworkInterfaceIds field's value.
func (s *DescribeNetworkInterfacesInput) SetNetworkInterfaceIds(v []*string) *DescribeNetworkInterfacesInput {
	s.NetworkInterfaceIds = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeNetworkInterfacesInput) SetNextToken(v string) *DescribeNetworkInterfacesInput {
	s.NextToken = &v
	return s
}

// Contains the output of DescribeNetworkInterfaces.
type DescribeNetworkInterfacesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more network interfaces.
	NetworkInterfaces []*NetworkInterface `locationName:"networkInterfaceSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeNetworkInterfacesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNetworkInterfacesOutput) GoString() string {
	return s.String()
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *DescribeNetworkInterfacesOutput) SetNetworkInterfaces(v []*NetworkInterface) *DescribeNetworkInterfacesOutput {
	s.NetworkInterfaces = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeNetworkInterfacesOutput) SetNextToken(v string) *DescribeNetworkInterfacesOutput {
	s.NextToken = &v
	return s
}

type DescribePlacementGroupsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * group-name - The name of the placement group.
	//
	//    * state - The state of the placement group (pending | available | deleting
	//    | deleted).
	//
	//    * strategy - The strategy of the placement group (cluster | spread | partition).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more placement group names.
	//
	// Default: Describes all your placement groups, or only those otherwise specified.
	GroupNames []*string `locationName:"groupName" type:"list"`
}

// String returns the string representation
func (s DescribePlacementGroupsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePlacementGroupsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribePlacementGroupsInput) SetDryRun(v bool) *DescribePlacementGroupsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribePlacementGroupsInput) SetFilters(v []*Filter) *DescribePlacementGroupsInput {
	s.Filters = v
	return s
}

// SetGroupNames sets the GroupNames field's value.
func (s *DescribePlacementGroupsInput) SetGroupNames(v []*string) *DescribePlacementGroupsInput {
	s.GroupNames = v
	return s
}

type DescribePlacementGroupsOutput struct {
	_ struct{} `type:"structure"`

	// One or more placement groups.
	PlacementGroups []*PlacementGroup `locationName:"placementGroupSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePlacementGroupsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePlacementGroupsOutput) GoString() string {
	return s.String()
}

// SetPlacementGroups sets the PlacementGroups field's value.
func (s *DescribePlacementGroupsOutput) SetPlacementGroups(v []*PlacementGroup) *DescribePlacementGroupsOutput {
	s.PlacementGroups = v
	return s
}

type DescribePrefixListsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * prefix-list-id: The ID of a prefix list.
	//
	//    * prefix-list-name: The name of a prefix list.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	//
	// Constraint: If the value specified is greater than 1000, we return only 1000
	// items.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of items to return. (You received this token from
	// a prior call.)
	NextToken *string `type:"string"`

	// One or more prefix list IDs.
	PrefixListIds []*string `locationName:"PrefixListId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePrefixListsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePrefixListsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribePrefixListsInput) SetDryRun(v bool) *DescribePrefixListsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribePrefixListsInput) SetFilters(v []*Filter) *DescribePrefixListsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribePrefixListsInput) SetMaxResults(v int64) *DescribePrefixListsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribePrefixListsInput) SetNextToken(v string) *DescribePrefixListsInput {
	s.NextToken = &v
	return s
}

// SetPrefixListIds sets the PrefixListIds field's value.
func (s *DescribePrefixListsInput) SetPrefixListIds(v []*string) *DescribePrefixListsInput {
	s.PrefixListIds = v
	return s
}

type DescribePrefixListsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use when requesting the next set of items. If there are no additional
	// items to return, the string is empty.
	NextToken *string `locationName:"nextToken" type:"string"`

	// All available prefix lists.
	PrefixLists []*PrefixList `locationName:"prefixListSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePrefixListsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePrefixListsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribePrefixListsOutput) SetNextToken(v string) *DescribePrefixListsOutput {
	s.NextToken = &v
	return s
}

// SetPrefixLists sets the PrefixLists field's value.
func (s *DescribePrefixListsOutput) SetPrefixLists(v []*PrefixList) *DescribePrefixListsOutput {
	s.PrefixLists = v
	return s
}

type DescribePrincipalIdFormatInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`

	// The type of resource: bundle | conversion-task | customer-gateway | dhcp-options
	// | elastic-ip-allocation | elastic-ip-association | export-task | flow-log
	// | image | import-task | instance | internet-gateway | network-acl | network-acl-association
	// | network-interface | network-interface-attachment | prefix-list | reservation
	// | route-table | route-table-association | security-group | snapshot | subnet
	// | subnet-cidr-block-association | volume | vpc | vpc-cidr-block-association
	// | vpc-endpoint | vpc-peering-connection | vpn-connection | vpn-gateway
	Resources []*string `locationName:"Resource" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePrincipalIdFormatInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePrincipalIdFormatInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribePrincipalIdFormatInput) SetDryRun(v bool) *DescribePrincipalIdFormatInput {
	s.DryRun = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribePrincipalIdFormatInput) SetMaxResults(v int64) *DescribePrincipalIdFormatInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribePrincipalIdFormatInput) SetNextToken(v string) *DescribePrincipalIdFormatInput {
	s.NextToken = &v
	return s
}

// SetResources sets the Resources field's value.
func (s *DescribePrincipalIdFormatInput) SetResources(v []*string) *DescribePrincipalIdFormatInput {
	s.Resources = v
	return s
}

type DescribePrincipalIdFormatOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the ID format settings for the ARN.
	Principals []*PrincipalIdFormat `locationName:"principalSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePrincipalIdFormatOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePrincipalIdFormatOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribePrincipalIdFormatOutput) SetNextToken(v string) *DescribePrincipalIdFormatOutput {
	s.NextToken = &v
	return s
}

// SetPrincipals sets the Principals field's value.
func (s *DescribePrincipalIdFormatOutput) SetPrincipals(v []*PrincipalIdFormat) *DescribePrincipalIdFormatOutput {
	s.Principals = v
	return s
}

type DescribePublicIpv4PoolsInput struct {
	_ struct{} `type:"structure"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"1" type:"integer"`

	// The token for the next page of results.
	NextToken *string `min:"1" type:"string"`

	// The IDs of the address pools.
	PoolIds []*string `locationName:"PoolId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePublicIpv4PoolsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePublicIpv4PoolsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribePublicIpv4PoolsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribePublicIpv4PoolsInput"}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribePublicIpv4PoolsInput) SetMaxResults(v int64) *DescribePublicIpv4PoolsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribePublicIpv4PoolsInput) SetNextToken(v string) *DescribePublicIpv4PoolsInput {
	s.NextToken = &v
	return s
}

// SetPoolIds sets the PoolIds field's value.
func (s *DescribePublicIpv4PoolsInput) SetPoolIds(v []*string) *DescribePublicIpv4PoolsInput {
	s.PoolIds = v
	return s
}

type DescribePublicIpv4PoolsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the address pools.
	PublicIpv4Pools []*PublicIpv4Pool `locationName:"publicIpv4PoolSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribePublicIpv4PoolsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribePublicIpv4PoolsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribePublicIpv4PoolsOutput) SetNextToken(v string) *DescribePublicIpv4PoolsOutput {
	s.NextToken = &v
	return s
}

// SetPublicIpv4Pools sets the PublicIpv4Pools field's value.
func (s *DescribePublicIpv4PoolsOutput) SetPublicIpv4Pools(v []*PublicIpv4Pool) *DescribePublicIpv4PoolsOutput {
	s.PublicIpv4Pools = v
	return s
}

type DescribeRegionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * endpoint - The endpoint of the region (for example, ec2.us-east-1.amazonaws.com).
	//
	//    * region-name - The name of the region (for example, us-east-1).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The names of one or more regions.
	RegionNames []*string `locationName:"RegionName" locationNameList:"RegionName" type:"list"`
}

// String returns the string representation
func (s DescribeRegionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeRegionsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeRegionsInput) SetDryRun(v bool) *DescribeRegionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeRegionsInput) SetFilters(v []*Filter) *DescribeRegionsInput {
	s.Filters = v
	return s
}

// SetRegionNames sets the RegionNames field's value.
func (s *DescribeRegionsInput) SetRegionNames(v []*string) *DescribeRegionsInput {
	s.RegionNames = v
	return s
}

type DescribeRegionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more regions.
	Regions []*Region `locationName:"regionInfo" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeRegionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeRegionsOutput) GoString() string {
	return s.String()
}

// SetRegions sets the Regions field's value.
func (s *DescribeRegionsOutput) SetRegions(v []*Region) *DescribeRegionsOutput {
	s.Regions = v
	return s
}

// Contains the parameters for DescribeReservedInstances.
type DescribeReservedInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone where the Reserved Instance
	//    can be used.
	//
	//    * duration - The duration of the Reserved Instance (one year or three
	//    years), in seconds (31536000 | 94608000).
	//
	//    * end - The time when the Reserved Instance expires (for example, 2015-08-07T11:54:42.000Z).
	//
	//    * fixed-price - The purchase price of the Reserved Instance (for example,
	//    9800.0).
	//
	//    * instance-type - The instance type that is covered by the reservation.
	//
	//    * scope - The scope of the Reserved Instance (Region or Availability Zone).
	//
	//    * product-description - The Reserved Instance product platform description.
	//    Instances that include (Amazon VPC) in the product platform description
	//    will only be displayed to EC2-Classic account holders and are for use
	//    with Amazon VPC (Linux/UNIX | Linux/UNIX (Amazon VPC) | SUSE Linux | SUSE
	//    Linux (Amazon VPC) | Red Hat Enterprise Linux | Red Hat Enterprise Linux
	//    (Amazon VPC) | Windows | Windows (Amazon VPC) | Windows with SQL Server
	//    Standard | Windows with SQL Server Standard (Amazon VPC) | Windows with
	//    SQL Server Web | Windows with SQL Server Web (Amazon VPC) | Windows with
	//    SQL Server Enterprise | Windows with SQL Server Enterprise (Amazon VPC)).
	//
	//    * reserved-instances-id - The ID of the Reserved Instance.
	//
	//    * start - The time at which the Reserved Instance purchase request was
	//    placed (for example, 2014-08-07T11:54:42.000Z).
	//
	//    * state - The state of the Reserved Instance (payment-pending | active
	//    | payment-failed | retired).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * usage-price - The usage price of the Reserved Instance, per hour (for
	//    example, 0.84).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// Describes whether the Reserved Instance is Standard or Convertible.
	OfferingClass *string `type:"string" enum:"OfferingClassType"`

	// The Reserved Instance offering type. If you are using tools that predate
	// the 2011-11-01 API version, you only have access to the Medium Utilization
	// Reserved Instance offering type.
	OfferingType *string `locationName:"offeringType" type:"string" enum:"OfferingTypeValues"`

	// One or more Reserved Instance IDs.
	//
	// Default: Describes all your Reserved Instances, or only those otherwise specified.
	ReservedInstancesIds []*string `locationName:"ReservedInstancesId" locationNameList:"ReservedInstancesId" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeReservedInstancesInput) SetDryRun(v bool) *DescribeReservedInstancesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeReservedInstancesInput) SetFilters(v []*Filter) *DescribeReservedInstancesInput {
	s.Filters = v
	return s
}

// SetOfferingClass sets the OfferingClass field's value.
func (s *DescribeReservedInstancesInput) SetOfferingClass(v string) *DescribeReservedInstancesInput {
	s.OfferingClass = &v
	return s
}

// SetOfferingType sets the OfferingType field's value.
func (s *DescribeReservedInstancesInput) SetOfferingType(v string) *DescribeReservedInstancesInput {
	s.OfferingType = &v
	return s
}

// SetReservedInstancesIds sets the ReservedInstancesIds field's value.
func (s *DescribeReservedInstancesInput) SetReservedInstancesIds(v []*string) *DescribeReservedInstancesInput {
	s.ReservedInstancesIds = v
	return s
}

// Contains the parameters for DescribeReservedInstancesListings.
type DescribeReservedInstancesListingsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * reserved-instances-id - The ID of the Reserved Instances.
	//
	//    * reserved-instances-listing-id - The ID of the Reserved Instances listing.
	//
	//    * status - The status of the Reserved Instance listing (pending | active
	//    | cancelled | closed).
	//
	//    * status-message - The reason for the status.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more Reserved Instance IDs.
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string"`

	// One or more Reserved Instance listing IDs.
	ReservedInstancesListingId *string `locationName:"reservedInstancesListingId" type:"string"`
}

// String returns the string representation
func (s DescribeReservedInstancesListingsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesListingsInput) GoString() string {
	return s.String()
}

// SetFilters sets the Filters field's value.
func (s *DescribeReservedInstancesListingsInput) SetFilters(v []*Filter) *DescribeReservedInstancesListingsInput {
	s.Filters = v
	return s
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *DescribeReservedInstancesListingsInput) SetReservedInstancesId(v string) *DescribeReservedInstancesListingsInput {
	s.ReservedInstancesId = &v
	return s
}

// SetReservedInstancesListingId sets the ReservedInstancesListingId field's value.
func (s *DescribeReservedInstancesListingsInput) SetReservedInstancesListingId(v string) *DescribeReservedInstancesListingsInput {
	s.ReservedInstancesListingId = &v
	return s
}

// Contains the output of DescribeReservedInstancesListings.
type DescribeReservedInstancesListingsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Reserved Instance listing.
	ReservedInstancesListings []*ReservedInstancesListing `locationName:"reservedInstancesListingsSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesListingsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesListingsOutput) GoString() string {
	return s.String()
}

// SetReservedInstancesListings sets the ReservedInstancesListings field's value.
func (s *DescribeReservedInstancesListingsOutput) SetReservedInstancesListings(v []*ReservedInstancesListing) *DescribeReservedInstancesListingsOutput {
	s.ReservedInstancesListings = v
	return s
}

// Contains the parameters for DescribeReservedInstancesModifications.
type DescribeReservedInstancesModificationsInput struct {
	_ struct{} `type:"structure"`

	// One or more filters.
	//
	//    * client-token - The idempotency token for the modification request.
	//
	//    * create-date - The time when the modification request was created.
	//
	//    * effective-date - The time when the modification becomes effective.
	//
	//    * modification-result.reserved-instances-id - The ID for the Reserved
	//    Instances created as part of the modification request. This ID is only
	//    available when the status of the modification is fulfilled.
	//
	//    * modification-result.target-configuration.availability-zone - The Availability
	//    Zone for the new Reserved Instances.
	//
	//    * modification-result.target-configuration.instance-count  - The number
	//    of new Reserved Instances.
	//
	//    * modification-result.target-configuration.instance-type - The instance
	//    type of the new Reserved Instances.
	//
	//    * modification-result.target-configuration.platform - The network platform
	//    of the new Reserved Instances (EC2-Classic | EC2-VPC).
	//
	//    * reserved-instances-id - The ID of the Reserved Instances modified.
	//
	//    * reserved-instances-modification-id - The ID of the modification request.
	//
	//    * status - The status of the Reserved Instances modification request (processing
	//    | fulfilled | failed).
	//
	//    * status-message - The reason for the status.
	//
	//    * update-date - The time when the modification request was last updated.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The token to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// IDs for the submitted modification request.
	ReservedInstancesModificationIds []*string `locationName:"ReservedInstancesModificationId" locationNameList:"ReservedInstancesModificationId" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesModificationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesModificationsInput) GoString() string {
	return s.String()
}

// SetFilters sets the Filters field's value.
func (s *DescribeReservedInstancesModificationsInput) SetFilters(v []*Filter) *DescribeReservedInstancesModificationsInput {
	s.Filters = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeReservedInstancesModificationsInput) SetNextToken(v string) *DescribeReservedInstancesModificationsInput {
	s.NextToken = &v
	return s
}

// SetReservedInstancesModificationIds sets the ReservedInstancesModificationIds field's value.
func (s *DescribeReservedInstancesModificationsInput) SetReservedInstancesModificationIds(v []*string) *DescribeReservedInstancesModificationsInput {
	s.ReservedInstancesModificationIds = v
	return s
}

// Contains the output of DescribeReservedInstancesModifications.
type DescribeReservedInstancesModificationsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The Reserved Instance modification information.
	ReservedInstancesModifications []*ReservedInstancesModification `locationName:"reservedInstancesModificationsSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesModificationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesModificationsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeReservedInstancesModificationsOutput) SetNextToken(v string) *DescribeReservedInstancesModificationsOutput {
	s.NextToken = &v
	return s
}

// SetReservedInstancesModifications sets the ReservedInstancesModifications field's value.
func (s *DescribeReservedInstancesModificationsOutput) SetReservedInstancesModifications(v []*ReservedInstancesModification) *DescribeReservedInstancesModificationsOutput {
	s.ReservedInstancesModifications = v
	return s
}

// Contains the parameters for DescribeReservedInstancesOfferings.
type DescribeReservedInstancesOfferingsInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which the Reserved Instance can be used.
	AvailabilityZone *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone where the Reserved Instance
	//    can be used.
	//
	//    * duration - The duration of the Reserved Instance (for example, one year
	//    or three years), in seconds (31536000 | 94608000).
	//
	//    * fixed-price - The purchase price of the Reserved Instance (for example,
	//    9800.0).
	//
	//    * instance-type - The instance type that is covered by the reservation.
	//
	//    * marketplace - Set to true to show only Reserved Instance Marketplace
	//    offerings. When this filter is not used, which is the default behavior,
	//    all offerings from both AWS and the Reserved Instance Marketplace are
	//    listed.
	//
	//    * product-description - The Reserved Instance product platform description.
	//    Instances that include (Amazon VPC) in the product platform description
	//    will only be displayed to EC2-Classic account holders and are for use
	//    with Amazon VPC. (Linux/UNIX | Linux/UNIX (Amazon VPC) | SUSE Linux |
	//    SUSE Linux (Amazon VPC) | Red Hat Enterprise Linux | Red Hat Enterprise
	//    Linux (Amazon VPC) | Windows | Windows (Amazon VPC) | Windows with SQL
	//    Server Standard | Windows with SQL Server Standard (Amazon VPC) | Windows
	//    with SQL Server Web |  Windows with SQL Server Web (Amazon VPC) | Windows
	//    with SQL Server Enterprise | Windows with SQL Server Enterprise (Amazon
	//    VPC))
	//
	//    * reserved-instances-offering-id - The Reserved Instances offering ID.
	//
	//    * scope - The scope of the Reserved Instance (Availability Zone or Region).
	//
	//    * usage-price - The usage price of the Reserved Instance, per hour (for
	//    example, 0.84).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// Include Reserved Instance Marketplace offerings in the response.
	IncludeMarketplace *bool `type:"boolean"`

	// The tenancy of the instances covered by the reservation. A Reserved Instance
	// with a tenancy of dedicated is applied to instances that run in a VPC on
	// single-tenant hardware (i.e., Dedicated Instances).
	//
	// Important: The host value cannot be used with this parameter. Use the default
	// or dedicated values only.
	//
	// Default: default
	InstanceTenancy *string `locationName:"instanceTenancy" type:"string" enum:"Tenancy"`

	// The instance type that the reservation will cover (for example, m1.small).
	// For more information, see Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	InstanceType *string `type:"string" enum:"InstanceType"`

	// The maximum duration (in seconds) to filter when searching for offerings.
	//
	// Default: 94608000 (3 years)
	MaxDuration *int64 `type:"long"`

	// The maximum number of instances to filter when searching for offerings.
	//
	// Default: 20
	MaxInstanceCount *int64 `type:"integer"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results of the initial request can be seen by sending another
	// request with the returned NextToken value. The maximum is 100.
	//
	// Default: 100
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The minimum duration (in seconds) to filter when searching for offerings.
	//
	// Default: 2592000 (1 month)
	MinDuration *int64 `type:"long"`

	// The token to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The offering class of the Reserved Instance. Can be standard or convertible.
	OfferingClass *string `type:"string" enum:"OfferingClassType"`

	// The Reserved Instance offering type. If you are using tools that predate
	// the 2011-11-01 API version, you only have access to the Medium Utilization
	// Reserved Instance offering type.
	OfferingType *string `locationName:"offeringType" type:"string" enum:"OfferingTypeValues"`

	// The Reserved Instance product platform description. Instances that include
	// (Amazon VPC) in the description are for use with Amazon VPC.
	ProductDescription *string `type:"string" enum:"RIProductDescription"`

	// One or more Reserved Instances offering IDs.
	ReservedInstancesOfferingIds []*string `locationName:"ReservedInstancesOfferingId" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesOfferingsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesOfferingsInput) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetAvailabilityZone(v string) *DescribeReservedInstancesOfferingsInput {
	s.AvailabilityZone = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetDryRun(v bool) *DescribeReservedInstancesOfferingsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetFilters(v []*Filter) *DescribeReservedInstancesOfferingsInput {
	s.Filters = v
	return s
}

// SetIncludeMarketplace sets the IncludeMarketplace field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetIncludeMarketplace(v bool) *DescribeReservedInstancesOfferingsInput {
	s.IncludeMarketplace = &v
	return s
}

// SetInstanceTenancy sets the InstanceTenancy field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetInstanceTenancy(v string) *DescribeReservedInstancesOfferingsInput {
	s.InstanceTenancy = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetInstanceType(v string) *DescribeReservedInstancesOfferingsInput {
	s.InstanceType = &v
	return s
}

// SetMaxDuration sets the MaxDuration field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetMaxDuration(v int64) *DescribeReservedInstancesOfferingsInput {
	s.MaxDuration = &v
	return s
}

// SetMaxInstanceCount sets the MaxInstanceCount field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetMaxInstanceCount(v int64) *DescribeReservedInstancesOfferingsInput {
	s.MaxInstanceCount = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetMaxResults(v int64) *DescribeReservedInstancesOfferingsInput {
	s.MaxResults = &v
	return s
}

// SetMinDuration sets the MinDuration field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetMinDuration(v int64) *DescribeReservedInstancesOfferingsInput {
	s.MinDuration = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetNextToken(v string) *DescribeReservedInstancesOfferingsInput {
	s.NextToken = &v
	return s
}

// SetOfferingClass sets the OfferingClass field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetOfferingClass(v string) *DescribeReservedInstancesOfferingsInput {
	s.OfferingClass = &v
	return s
}

// SetOfferingType sets the OfferingType field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetOfferingType(v string) *DescribeReservedInstancesOfferingsInput {
	s.OfferingType = &v
	return s
}

// SetProductDescription sets the ProductDescription field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetProductDescription(v string) *DescribeReservedInstancesOfferingsInput {
	s.ProductDescription = &v
	return s
}

// SetReservedInstancesOfferingIds sets the ReservedInstancesOfferingIds field's value.
func (s *DescribeReservedInstancesOfferingsInput) SetReservedInstancesOfferingIds(v []*string) *DescribeReservedInstancesOfferingsInput {
	s.ReservedInstancesOfferingIds = v
	return s
}

// Contains the output of DescribeReservedInstancesOfferings.
type DescribeReservedInstancesOfferingsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// A list of Reserved Instances offerings.
	ReservedInstancesOfferings []*ReservedInstancesOffering `locationName:"reservedInstancesOfferingsSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesOfferingsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesOfferingsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeReservedInstancesOfferingsOutput) SetNextToken(v string) *DescribeReservedInstancesOfferingsOutput {
	s.NextToken = &v
	return s
}

// SetReservedInstancesOfferings sets the ReservedInstancesOfferings field's value.
func (s *DescribeReservedInstancesOfferingsOutput) SetReservedInstancesOfferings(v []*ReservedInstancesOffering) *DescribeReservedInstancesOfferingsOutput {
	s.ReservedInstancesOfferings = v
	return s
}

// Contains the output for DescribeReservedInstances.
type DescribeReservedInstancesOutput struct {
	_ struct{} `type:"structure"`

	// A list of Reserved Instances.
	ReservedInstances []*ReservedInstances `locationName:"reservedInstancesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeReservedInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeReservedInstancesOutput) GoString() string {
	return s.String()
}

// SetReservedInstances sets the ReservedInstances field's value.
func (s *DescribeReservedInstancesOutput) SetReservedInstances(v []*ReservedInstances) *DescribeReservedInstancesOutput {
	s.ReservedInstances = v
	return s
}

type DescribeRouteTablesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * association.route-table-association-id - The ID of an association ID
	//    for the route table.
	//
	//    * association.route-table-id - The ID of the route table involved in the
	//    association.
	//
	//    * association.subnet-id - The ID of the subnet involved in the association.
	//
	//    * association.main - Indicates whether the route table is the main route
	//    table for the VPC (true | false). Route tables that do not have an association
	//    ID are not returned in the response.
	//
	//    * owner-id - The ID of the AWS account that owns the route table.
	//
	//    * route-table-id - The ID of the route table.
	//
	//    * route.destination-cidr-block - The IPv4 CIDR range specified in a route
	//    in the table.
	//
	//    * route.destination-ipv6-cidr-block - The IPv6 CIDR range specified in
	//    a route in the route table.
	//
	//    * route.destination-prefix-list-id - The ID (prefix) of the AWS service
	//    specified in a route in the table.
	//
	//    * route.egress-only-internet-gateway-id - The ID of an egress-only Internet
	//    gateway specified in a route in the route table.
	//
	//    * route.gateway-id - The ID of a gateway specified in a route in the table.
	//
	//    * route.instance-id - The ID of an instance specified in a route in the
	//    table.
	//
	//    * route.nat-gateway-id - The ID of a NAT gateway.
	//
	//    * route.transit-gateway-id - The ID of a transit gateway.
	//
	//    * route.origin - Describes how the route was created. CreateRouteTable
	//    indicates that the route was automatically created when the route table
	//    was created; CreateRoute indicates that the route was manually added to
	//    the route table; EnableVgwRoutePropagation indicates that the route was
	//    propagated by route propagation.
	//
	//    * route.state - The state of a route in the route table (active | blackhole).
	//    The blackhole state indicates that the route's target isn't available
	//    (for example, the specified gateway isn't attached to the VPC, the specified
	//    NAT instance has been terminated, and so on).
	//
	//    * route.vpc-peering-connection-id - The ID of a VPC peering connection
	//    specified in a route in the table.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * transit-gateway-id - The ID of a transit gateway.
	//
	//    * vpc-id - The ID of the VPC for the route table.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another call with the returned NextToken value. This
	// value can be between 5 and 100.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`

	// One or more route table IDs.
	//
	// Default: Describes all your route tables.
	RouteTableIds []*string `locationName:"RouteTableId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeRouteTablesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeRouteTablesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeRouteTablesInput) SetDryRun(v bool) *DescribeRouteTablesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeRouteTablesInput) SetFilters(v []*Filter) *DescribeRouteTablesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeRouteTablesInput) SetMaxResults(v int64) *DescribeRouteTablesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeRouteTablesInput) SetNextToken(v string) *DescribeRouteTablesInput {
	s.NextToken = &v
	return s
}

// SetRouteTableIds sets the RouteTableIds field's value.
func (s *DescribeRouteTablesInput) SetRouteTableIds(v []*string) *DescribeRouteTablesInput {
	s.RouteTableIds = v
	return s
}

// Contains the output of DescribeRouteTables.
type DescribeRouteTablesOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about one or more route tables.
	RouteTables []*RouteTable `locationName:"routeTableSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeRouteTablesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeRouteTablesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeRouteTablesOutput) SetNextToken(v string) *DescribeRouteTablesOutput {
	s.NextToken = &v
	return s
}

// SetRouteTables sets the RouteTables field's value.
func (s *DescribeRouteTablesOutput) SetRouteTables(v []*RouteTable) *DescribeRouteTablesOutput {
	s.RouteTables = v
	return s
}

// Contains the parameters for DescribeScheduledInstanceAvailability.
type DescribeScheduledInstanceAvailabilityInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone (for example, us-west-2a).
	//
	//    * instance-type - The instance type (for example, c4.large).
	//
	//    * network-platform - The network platform (EC2-Classic or EC2-VPC).
	//
	//    * platform - The platform (Linux/UNIX or Windows).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The time period for the first schedule to start.
	//
	// FirstSlotStartTimeRange is a required field
	FirstSlotStartTimeRange *SlotDateTimeRangeRequest `type:"structure" required:"true"`

	// The maximum number of results to return in a single call. This value can
	// be between 5 and 300. The default value is 300. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The maximum available duration, in hours. This value must be greater than
	// MinSlotDurationInHours and less than 1,720.
	MaxSlotDurationInHours *int64 `type:"integer"`

	// The minimum available duration, in hours. The minimum required duration is
	// 1,200 hours per year. For example, the minimum daily schedule is 4 hours,
	// the minimum weekly schedule is 24 hours, and the minimum monthly schedule
	// is 100 hours.
	MinSlotDurationInHours *int64 `type:"integer"`

	// The token for the next set of results.
	NextToken *string `type:"string"`

	// The schedule recurrence.
	//
	// Recurrence is a required field
	Recurrence *ScheduledInstanceRecurrenceRequest `type:"structure" required:"true"`
}

// String returns the string representation
func (s DescribeScheduledInstanceAvailabilityInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeScheduledInstanceAvailabilityInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeScheduledInstanceAvailabilityInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeScheduledInstanceAvailabilityInput"}
	if s.FirstSlotStartTimeRange == nil {
		invalidParams.Add(request.NewErrParamRequired("FirstSlotStartTimeRange"))
	}
	if s.Recurrence == nil {
		invalidParams.Add(request.NewErrParamRequired("Recurrence"))
	}
	if s.FirstSlotStartTimeRange != nil {
		if err := s.FirstSlotStartTimeRange.Validate(); err != nil {
			invalidParams.AddNested("FirstSlotStartTimeRange", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetDryRun(v bool) *DescribeScheduledInstanceAvailabilityInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetFilters(v []*Filter) *DescribeScheduledInstanceAvailabilityInput {
	s.Filters = v
	return s
}

// SetFirstSlotStartTimeRange sets the FirstSlotStartTimeRange field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetFirstSlotStartTimeRange(v *SlotDateTimeRangeRequest) *DescribeScheduledInstanceAvailabilityInput {
	s.FirstSlotStartTimeRange = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetMaxResults(v int64) *DescribeScheduledInstanceAvailabilityInput {
	s.MaxResults = &v
	return s
}

// SetMaxSlotDurationInHours sets the MaxSlotDurationInHours field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetMaxSlotDurationInHours(v int64) *DescribeScheduledInstanceAvailabilityInput {
	s.MaxSlotDurationInHours = &v
	return s
}

// SetMinSlotDurationInHours sets the MinSlotDurationInHours field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetMinSlotDurationInHours(v int64) *DescribeScheduledInstanceAvailabilityInput {
	s.MinSlotDurationInHours = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetNextToken(v string) *DescribeScheduledInstanceAvailabilityInput {
	s.NextToken = &v
	return s
}

// SetRecurrence sets the Recurrence field's value.
func (s *DescribeScheduledInstanceAvailabilityInput) SetRecurrence(v *ScheduledInstanceRecurrenceRequest) *DescribeScheduledInstanceAvailabilityInput {
	s.Recurrence = v
	return s
}

// Contains the output of DescribeScheduledInstanceAvailability.
type DescribeScheduledInstanceAvailabilityOutput struct {
	_ struct{} `type:"structure"`

	// The token required to retrieve the next set of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the available Scheduled Instances.
	ScheduledInstanceAvailabilitySet []*ScheduledInstanceAvailability `locationName:"scheduledInstanceAvailabilitySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeScheduledInstanceAvailabilityOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeScheduledInstanceAvailabilityOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeScheduledInstanceAvailabilityOutput) SetNextToken(v string) *DescribeScheduledInstanceAvailabilityOutput {
	s.NextToken = &v
	return s
}

// SetScheduledInstanceAvailabilitySet sets the ScheduledInstanceAvailabilitySet field's value.
func (s *DescribeScheduledInstanceAvailabilityOutput) SetScheduledInstanceAvailabilitySet(v []*ScheduledInstanceAvailability) *DescribeScheduledInstanceAvailabilityOutput {
	s.ScheduledInstanceAvailabilitySet = v
	return s
}

// Contains the parameters for DescribeScheduledInstances.
type DescribeScheduledInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone (for example, us-west-2a).
	//
	//    * instance-type - The instance type (for example, c4.large).
	//
	//    * network-platform - The network platform (EC2-Classic or EC2-VPC).
	//
	//    * platform - The platform (Linux/UNIX or Windows).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. This value can
	// be between 5 and 300. The default value is 100. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of results.
	NextToken *string `type:"string"`

	// One or more Scheduled Instance IDs.
	ScheduledInstanceIds []*string `locationName:"ScheduledInstanceId" locationNameList:"ScheduledInstanceId" type:"list"`

	// The time period for the first schedule to start.
	SlotStartTimeRange *SlotStartTimeRangeRequest `type:"structure"`
}

// String returns the string representation
func (s DescribeScheduledInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeScheduledInstancesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeScheduledInstancesInput) SetDryRun(v bool) *DescribeScheduledInstancesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeScheduledInstancesInput) SetFilters(v []*Filter) *DescribeScheduledInstancesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeScheduledInstancesInput) SetMaxResults(v int64) *DescribeScheduledInstancesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeScheduledInstancesInput) SetNextToken(v string) *DescribeScheduledInstancesInput {
	s.NextToken = &v
	return s
}

// SetScheduledInstanceIds sets the ScheduledInstanceIds field's value.
func (s *DescribeScheduledInstancesInput) SetScheduledInstanceIds(v []*string) *DescribeScheduledInstancesInput {
	s.ScheduledInstanceIds = v
	return s
}

// SetSlotStartTimeRange sets the SlotStartTimeRange field's value.
func (s *DescribeScheduledInstancesInput) SetSlotStartTimeRange(v *SlotStartTimeRangeRequest) *DescribeScheduledInstancesInput {
	s.SlotStartTimeRange = v
	return s
}

// Contains the output of DescribeScheduledInstances.
type DescribeScheduledInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The token required to retrieve the next set of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the Scheduled Instances.
	ScheduledInstanceSet []*ScheduledInstance `locationName:"scheduledInstanceSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeScheduledInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeScheduledInstancesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeScheduledInstancesOutput) SetNextToken(v string) *DescribeScheduledInstancesOutput {
	s.NextToken = &v
	return s
}

// SetScheduledInstanceSet sets the ScheduledInstanceSet field's value.
func (s *DescribeScheduledInstancesOutput) SetScheduledInstanceSet(v []*ScheduledInstance) *DescribeScheduledInstancesOutput {
	s.ScheduledInstanceSet = v
	return s
}

type DescribeSecurityGroupReferencesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more security group IDs in your account.
	//
	// GroupId is a required field
	GroupId []*string `locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s DescribeSecurityGroupReferencesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSecurityGroupReferencesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeSecurityGroupReferencesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeSecurityGroupReferencesInput"}
	if s.GroupId == nil {
		invalidParams.Add(request.NewErrParamRequired("GroupId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSecurityGroupReferencesInput) SetDryRun(v bool) *DescribeSecurityGroupReferencesInput {
	s.DryRun = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *DescribeSecurityGroupReferencesInput) SetGroupId(v []*string) *DescribeSecurityGroupReferencesInput {
	s.GroupId = v
	return s
}

type DescribeSecurityGroupReferencesOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPCs with the referencing security groups.
	SecurityGroupReferenceSet []*SecurityGroupReference `locationName:"securityGroupReferenceSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSecurityGroupReferencesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSecurityGroupReferencesOutput) GoString() string {
	return s.String()
}

// SetSecurityGroupReferenceSet sets the SecurityGroupReferenceSet field's value.
func (s *DescribeSecurityGroupReferencesOutput) SetSecurityGroupReferenceSet(v []*SecurityGroupReference) *DescribeSecurityGroupReferencesOutput {
	s.SecurityGroupReferenceSet = v
	return s
}

type DescribeSecurityGroupsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters. If using multiple filters for rules, the results include
	// security groups for which any combination of rules - not necessarily a single
	// rule - match all filters.
	//
	//    * description - The description of the security group.
	//
	//    * egress.ip-permission.cidr - An IPv4 CIDR block for an outbound security
	//    group rule.
	//
	//    * egress.ip-permission.from-port - For an outbound rule, the start of
	//    port range for the TCP and UDP protocols, or an ICMP type number.
	//
	//    * egress.ip-permission.group-id - The ID of a security group that has
	//    been referenced in an outbound security group rule.
	//
	//    * egress.ip-permission.group-name - The name of a security group that
	//    has been referenced in an outbound security group rule.
	//
	//    * egress.ip-permission.ipv6-cidr - An IPv6 CIDR block for an outbound
	//    security group rule.
	//
	//    * egress.ip-permission.prefix-list-id - The ID (prefix) of the AWS service
	//    to which a security group rule allows outbound access.
	//
	//    * egress.ip-permission.protocol - The IP protocol for an outbound security
	//    group rule (tcp | udp | icmp or a protocol number).
	//
	//    * egress.ip-permission.to-port - For an outbound rule, the end of port
	//    range for the TCP and UDP protocols, or an ICMP code.
	//
	//    * egress.ip-permission.user-id - The ID of an AWS account that has been
	//    referenced in an outbound security group rule.
	//
	//    * group-id - The ID of the security group.
	//
	//    * group-name - The name of the security group.
	//
	//    * ip-permission.cidr - An IPv4 CIDR block for an inbound security group
	//    rule.
	//
	//    * ip-permission.from-port - For an inbound rule, the start of port range
	//    for the TCP and UDP protocols, or an ICMP type number.
	//
	//    * ip-permission.group-id - The ID of a security group that has been referenced
	//    in an inbound security group rule.
	//
	//    * ip-permission.group-name - The name of a security group that has been
	//    referenced in an inbound security group rule.
	//
	//    * ip-permission.ipv6-cidr - An IPv6 CIDR block for an inbound security
	//    group rule.
	//
	//    * ip-permission.prefix-list-id - The ID (prefix) of the AWS service from
	//    which a security group rule allows inbound access.
	//
	//    * ip-permission.protocol - The IP protocol for an inbound security group
	//    rule (tcp | udp | icmp or a protocol number).
	//
	//    * ip-permission.to-port - For an inbound rule, the end of port range for
	//    the TCP and UDP protocols, or an ICMP code.
	//
	//    * ip-permission.user-id - The ID of an AWS account that has been referenced
	//    in an inbound security group rule.
	//
	//    * owner-id - The AWS account ID of the owner of the security group.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC specified when the security group was created.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more security group IDs. Required for security groups in a nondefault
	// VPC.
	//
	// Default: Describes all your security groups.
	GroupIds []*string `locationName:"GroupId" locationNameList:"groupId" type:"list"`

	// [EC2-Classic and default VPC only] One or more security group names. You
	// can specify either the security group name or the security group ID. For
	// security groups in a nondefault VPC, use the group-name filter to describe
	// security groups by name.
	//
	// Default: Describes all your security groups.
	GroupNames []*string `locationName:"GroupName" locationNameList:"GroupName" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another request with the returned NextToken value.
	// This value can be between 5 and 1000. If this parameter is not specified,
	// then all results are returned.
	MaxResults *int64 `type:"integer"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeSecurityGroupsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSecurityGroupsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSecurityGroupsInput) SetDryRun(v bool) *DescribeSecurityGroupsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeSecurityGroupsInput) SetFilters(v []*Filter) *DescribeSecurityGroupsInput {
	s.Filters = v
	return s
}

// SetGroupIds sets the GroupIds field's value.
func (s *DescribeSecurityGroupsInput) SetGroupIds(v []*string) *DescribeSecurityGroupsInput {
	s.GroupIds = v
	return s
}

// SetGroupNames sets the GroupNames field's value.
func (s *DescribeSecurityGroupsInput) SetGroupNames(v []*string) *DescribeSecurityGroupsInput {
	s.GroupNames = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSecurityGroupsInput) SetMaxResults(v int64) *DescribeSecurityGroupsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSecurityGroupsInput) SetNextToken(v string) *DescribeSecurityGroupsInput {
	s.NextToken = &v
	return s
}

type DescribeSecurityGroupsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about one or more security groups.
	SecurityGroups []*SecurityGroup `locationName:"securityGroupInfo" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSecurityGroupsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSecurityGroupsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSecurityGroupsOutput) SetNextToken(v string) *DescribeSecurityGroupsOutput {
	s.NextToken = &v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *DescribeSecurityGroupsOutput) SetSecurityGroups(v []*SecurityGroup) *DescribeSecurityGroupsOutput {
	s.SecurityGroups = v
	return s
}

// Contains the parameters for DescribeSnapshotAttribute.
type DescribeSnapshotAttributeInput struct {
	_ struct{} `type:"structure"`

	// The snapshot attribute you would like to view.
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"SnapshotAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the EBS snapshot.
	//
	// SnapshotId is a required field
	SnapshotId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeSnapshotAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSnapshotAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeSnapshotAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeSnapshotAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.SnapshotId == nil {
		invalidParams.Add(request.NewErrParamRequired("SnapshotId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeSnapshotAttributeInput) SetAttribute(v string) *DescribeSnapshotAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSnapshotAttributeInput) SetDryRun(v bool) *DescribeSnapshotAttributeInput {
	s.DryRun = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *DescribeSnapshotAttributeInput) SetSnapshotId(v string) *DescribeSnapshotAttributeInput {
	s.SnapshotId = &v
	return s
}

// Contains the output of DescribeSnapshotAttribute.
type DescribeSnapshotAttributeOutput struct {
	_ struct{} `type:"structure"`

	// A list of permissions for creating volumes from the snapshot.
	CreateVolumePermissions []*CreateVolumePermission `locationName:"createVolumePermission" locationNameList:"item" type:"list"`

	// A list of product codes.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// The ID of the EBS snapshot.
	SnapshotId *string `locationName:"snapshotId" type:"string"`
}

// String returns the string representation
func (s DescribeSnapshotAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSnapshotAttributeOutput) GoString() string {
	return s.String()
}

// SetCreateVolumePermissions sets the CreateVolumePermissions field's value.
func (s *DescribeSnapshotAttributeOutput) SetCreateVolumePermissions(v []*CreateVolumePermission) *DescribeSnapshotAttributeOutput {
	s.CreateVolumePermissions = v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *DescribeSnapshotAttributeOutput) SetProductCodes(v []*ProductCode) *DescribeSnapshotAttributeOutput {
	s.ProductCodes = v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *DescribeSnapshotAttributeOutput) SetSnapshotId(v string) *DescribeSnapshotAttributeOutput {
	s.SnapshotId = &v
	return s
}

// Contains the parameters for DescribeSnapshots.
type DescribeSnapshotsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * description - A description of the snapshot.
	//
	//    * owner-alias - Value from an Amazon-maintained list (amazon | aws-marketplace
	//    | microsoft) of snapshot owners. Not to be confused with the user-configured
	//    AWS account alias, which is set from the IAM console.
	//
	//    * owner-id - The ID of the AWS account that owns the snapshot.
	//
	//    * progress - The progress of the snapshot, as a percentage (for example,
	//    80%).
	//
	//    * snapshot-id - The snapshot ID.
	//
	//    * start-time - The time stamp when the snapshot was initiated.
	//
	//    * status - The status of the snapshot (pending | completed | error).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * volume-id - The ID of the volume the snapshot is for.
	//
	//    * volume-size - The size of the volume, in GiB.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of snapshot results returned by DescribeSnapshots in paginated
	// output. When this parameter is used, DescribeSnapshots only returns MaxResults
	// results in a single page along with a NextToken response element. The remaining
	// results of the initial request can be seen by sending another DescribeSnapshots
	// request with the returned NextToken value. This value can be between 5 and
	// 1000; if MaxResults is given a value larger than 1000, only 1000 results
	// are returned. If this parameter is not used, then DescribeSnapshots returns
	// all results. You cannot specify this parameter and the snapshot IDs parameter
	// in the same request.
	MaxResults *int64 `type:"integer"`

	// The NextToken value returned from a previous paginated DescribeSnapshots
	// request where MaxResults was used and the results exceeded the value of that
	// parameter. Pagination continues from the end of the previous results that
	// returned the NextToken value. This value is null when there are no more results
	// to return.
	NextToken *string `type:"string"`

	// Returns the snapshots owned by the specified owner. Multiple owners can be
	// specified.
	OwnerIds []*string `locationName:"Owner" locationNameList:"Owner" type:"list"`

	// One or more AWS accounts IDs that can create volumes from the snapshot.
	RestorableByUserIds []*string `locationName:"RestorableBy" type:"list"`

	// One or more snapshot IDs.
	//
	// Default: Describes snapshots for which you have launch permissions.
	SnapshotIds []*string `locationName:"SnapshotId" locationNameList:"SnapshotId" type:"list"`
}

// String returns the string representation
func (s DescribeSnapshotsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSnapshotsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSnapshotsInput) SetDryRun(v bool) *DescribeSnapshotsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeSnapshotsInput) SetFilters(v []*Filter) *DescribeSnapshotsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSnapshotsInput) SetMaxResults(v int64) *DescribeSnapshotsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSnapshotsInput) SetNextToken(v string) *DescribeSnapshotsInput {
	s.NextToken = &v
	return s
}

// SetOwnerIds sets the OwnerIds field's value.
func (s *DescribeSnapshotsInput) SetOwnerIds(v []*string) *DescribeSnapshotsInput {
	s.OwnerIds = v
	return s
}

// SetRestorableByUserIds sets the RestorableByUserIds field's value.
func (s *DescribeSnapshotsInput) SetRestorableByUserIds(v []*string) *DescribeSnapshotsInput {
	s.RestorableByUserIds = v
	return s
}

// SetSnapshotIds sets the SnapshotIds field's value.
func (s *DescribeSnapshotsInput) SetSnapshotIds(v []*string) *DescribeSnapshotsInput {
	s.SnapshotIds = v
	return s
}

// Contains the output of DescribeSnapshots.
type DescribeSnapshotsOutput struct {
	_ struct{} `type:"structure"`

	// The NextToken value to include in a future DescribeSnapshots request. When
	// the results of a DescribeSnapshots request exceed MaxResults, this value
	// can be used to retrieve the next page of results. This value is null when
	// there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the snapshots.
	Snapshots []*Snapshot `locationName:"snapshotSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSnapshotsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSnapshotsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSnapshotsOutput) SetNextToken(v string) *DescribeSnapshotsOutput {
	s.NextToken = &v
	return s
}

// SetSnapshots sets the Snapshots field's value.
func (s *DescribeSnapshotsOutput) SetSnapshots(v []*Snapshot) *DescribeSnapshotsOutput {
	s.Snapshots = v
	return s
}

// Contains the parameters for DescribeSpotDatafeedSubscription.
type DescribeSpotDatafeedSubscriptionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DescribeSpotDatafeedSubscriptionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotDatafeedSubscriptionInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSpotDatafeedSubscriptionInput) SetDryRun(v bool) *DescribeSpotDatafeedSubscriptionInput {
	s.DryRun = &v
	return s
}

// Contains the output of DescribeSpotDatafeedSubscription.
type DescribeSpotDatafeedSubscriptionOutput struct {
	_ struct{} `type:"structure"`

	// The Spot Instance data feed subscription.
	SpotDatafeedSubscription *SpotDatafeedSubscription `locationName:"spotDatafeedSubscription" type:"structure"`
}

// String returns the string representation
func (s DescribeSpotDatafeedSubscriptionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotDatafeedSubscriptionOutput) GoString() string {
	return s.String()
}

// SetSpotDatafeedSubscription sets the SpotDatafeedSubscription field's value.
func (s *DescribeSpotDatafeedSubscriptionOutput) SetSpotDatafeedSubscription(v *SpotDatafeedSubscription) *DescribeSpotDatafeedSubscriptionOutput {
	s.SpotDatafeedSubscription = v
	return s
}

// Contains the parameters for DescribeSpotFleetInstances.
type DescribeSpotFleetInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The ID of the Spot Fleet request.
	//
	// SpotFleetRequestId is a required field
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeSpotFleetInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotFleetInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeSpotFleetInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeSpotFleetInstancesInput"}
	if s.SpotFleetRequestId == nil {
		invalidParams.Add(request.NewErrParamRequired("SpotFleetRequestId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSpotFleetInstancesInput) SetDryRun(v bool) *DescribeSpotFleetInstancesInput {
	s.DryRun = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSpotFleetInstancesInput) SetMaxResults(v int64) *DescribeSpotFleetInstancesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotFleetInstancesInput) SetNextToken(v string) *DescribeSpotFleetInstancesInput {
	s.NextToken = &v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *DescribeSpotFleetInstancesInput) SetSpotFleetRequestId(v string) *DescribeSpotFleetInstancesInput {
	s.SpotFleetRequestId = &v
	return s
}

// Contains the output of DescribeSpotFleetInstances.
type DescribeSpotFleetInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The running instances. This list is refreshed periodically and might be out
	// of date.
	ActiveInstances []*ActiveInstance `locationName:"activeInstanceSet" locationNameList:"item" type:"list"`

	// The token required to retrieve the next set of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The ID of the Spot Fleet request.
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string"`
}

// String returns the string representation
func (s DescribeSpotFleetInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotFleetInstancesOutput) GoString() string {
	return s.String()
}

// SetActiveInstances sets the ActiveInstances field's value.
func (s *DescribeSpotFleetInstancesOutput) SetActiveInstances(v []*ActiveInstance) *DescribeSpotFleetInstancesOutput {
	s.ActiveInstances = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotFleetInstancesOutput) SetNextToken(v string) *DescribeSpotFleetInstancesOutput {
	s.NextToken = &v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *DescribeSpotFleetInstancesOutput) SetSpotFleetRequestId(v string) *DescribeSpotFleetInstancesOutput {
	s.SpotFleetRequestId = &v
	return s
}

// Contains the parameters for DescribeSpotFleetRequestHistory.
type DescribeSpotFleetRequestHistoryInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The type of events to describe. By default, all events are described.
	EventType *string `locationName:"eventType" type:"string" enum:"EventType"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The ID of the Spot Fleet request.
	//
	// SpotFleetRequestId is a required field
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string" required:"true"`

	// The starting date and time for the events, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	//
	// StartTime is a required field
	StartTime *time.Time `locationName:"startTime" type:"timestamp" required:"true"`
}

// String returns the string representation
func (s DescribeSpotFleetRequestHistoryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotFleetRequestHistoryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeSpotFleetRequestHistoryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeSpotFleetRequestHistoryInput"}
	if s.SpotFleetRequestId == nil {
		invalidParams.Add(request.NewErrParamRequired("SpotFleetRequestId"))
	}
	if s.StartTime == nil {
		invalidParams.Add(request.NewErrParamRequired("StartTime"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSpotFleetRequestHistoryInput) SetDryRun(v bool) *DescribeSpotFleetRequestHistoryInput {
	s.DryRun = &v
	return s
}

// SetEventType sets the EventType field's value.
func (s *DescribeSpotFleetRequestHistoryInput) SetEventType(v string) *DescribeSpotFleetRequestHistoryInput {
	s.EventType = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSpotFleetRequestHistoryInput) SetMaxResults(v int64) *DescribeSpotFleetRequestHistoryInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotFleetRequestHistoryInput) SetNextToken(v string) *DescribeSpotFleetRequestHistoryInput {
	s.NextToken = &v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *DescribeSpotFleetRequestHistoryInput) SetSpotFleetRequestId(v string) *DescribeSpotFleetRequestHistoryInput {
	s.SpotFleetRequestId = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *DescribeSpotFleetRequestHistoryInput) SetStartTime(v time.Time) *DescribeSpotFleetRequestHistoryInput {
	s.StartTime = &v
	return s
}

// Contains the output of DescribeSpotFleetRequestHistory.
type DescribeSpotFleetRequestHistoryOutput struct {
	_ struct{} `type:"structure"`

	// Information about the events in the history of the Spot Fleet request.
	HistoryRecords []*HistoryRecord `locationName:"historyRecordSet" locationNameList:"item" type:"list"`

	// The last date and time for the events, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// All records up to this time were retrieved.
	//
	// If nextToken indicates that there are more results, this value is not present.
	LastEvaluatedTime *time.Time `locationName:"lastEvaluatedTime" type:"timestamp"`

	// The token required to retrieve the next set of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The ID of the Spot Fleet request.
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string"`

	// The starting date and time for the events, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`
}

// String returns the string representation
func (s DescribeSpotFleetRequestHistoryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotFleetRequestHistoryOutput) GoString() string {
	return s.String()
}

// SetHistoryRecords sets the HistoryRecords field's value.
func (s *DescribeSpotFleetRequestHistoryOutput) SetHistoryRecords(v []*HistoryRecord) *DescribeSpotFleetRequestHistoryOutput {
	s.HistoryRecords = v
	return s
}

// SetLastEvaluatedTime sets the LastEvaluatedTime field's value.
func (s *DescribeSpotFleetRequestHistoryOutput) SetLastEvaluatedTime(v time.Time) *DescribeSpotFleetRequestHistoryOutput {
	s.LastEvaluatedTime = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotFleetRequestHistoryOutput) SetNextToken(v string) *DescribeSpotFleetRequestHistoryOutput {
	s.NextToken = &v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *DescribeSpotFleetRequestHistoryOutput) SetSpotFleetRequestId(v string) *DescribeSpotFleetRequestHistoryOutput {
	s.SpotFleetRequestId = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *DescribeSpotFleetRequestHistoryOutput) SetStartTime(v time.Time) *DescribeSpotFleetRequestHistoryOutput {
	s.StartTime = &v
	return s
}

// Contains the parameters for DescribeSpotFleetRequests.
type DescribeSpotFleetRequestsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The IDs of the Spot Fleet requests.
	SpotFleetRequestIds []*string `locationName:"spotFleetRequestId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSpotFleetRequestsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotFleetRequestsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSpotFleetRequestsInput) SetDryRun(v bool) *DescribeSpotFleetRequestsInput {
	s.DryRun = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSpotFleetRequestsInput) SetMaxResults(v int64) *DescribeSpotFleetRequestsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotFleetRequestsInput) SetNextToken(v string) *DescribeSpotFleetRequestsInput {
	s.NextToken = &v
	return s
}

// SetSpotFleetRequestIds sets the SpotFleetRequestIds field's value.
func (s *DescribeSpotFleetRequestsInput) SetSpotFleetRequestIds(v []*string) *DescribeSpotFleetRequestsInput {
	s.SpotFleetRequestIds = v
	return s
}

// Contains the output of DescribeSpotFleetRequests.
type DescribeSpotFleetRequestsOutput struct {
	_ struct{} `type:"structure"`

	// The token required to retrieve the next set of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the configuration of your Spot Fleet.
	SpotFleetRequestConfigs []*SpotFleetRequestConfig `locationName:"spotFleetRequestConfigSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSpotFleetRequestsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotFleetRequestsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotFleetRequestsOutput) SetNextToken(v string) *DescribeSpotFleetRequestsOutput {
	s.NextToken = &v
	return s
}

// SetSpotFleetRequestConfigs sets the SpotFleetRequestConfigs field's value.
func (s *DescribeSpotFleetRequestsOutput) SetSpotFleetRequestConfigs(v []*SpotFleetRequestConfig) *DescribeSpotFleetRequestsOutput {
	s.SpotFleetRequestConfigs = v
	return s
}

// Contains the parameters for DescribeSpotInstanceRequests.
type DescribeSpotInstanceRequestsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone-group - The Availability Zone group.
	//
	//    * create-time - The time stamp when the Spot Instance request was created.
	//
	//    * fault-code - The fault code related to the request.
	//
	//    * fault-message - The fault message related to the request.
	//
	//    * instance-id - The ID of the instance that fulfilled the request.
	//
	//    * launch-group - The Spot Instance launch group.
	//
	//    * launch.block-device-mapping.delete-on-termination - Indicates whether
	//    the EBS volume is deleted on instance termination.
	//
	//    * launch.block-device-mapping.device-name - The device name for the volume
	//    in the block device mapping (for example, /dev/sdh or xvdh).
	//
	//    * launch.block-device-mapping.snapshot-id - The ID of the snapshot for
	//    the EBS volume.
	//
	//    * launch.block-device-mapping.volume-size - The size of the EBS volume,
	//    in GiB.
	//
	//    * launch.block-device-mapping.volume-type - The type of EBS volume: gp2
	//    for General Purpose SSD, io1 for Provisioned IOPS SSD, st1 for Throughput
	//    Optimized HDD, sc1for Cold HDD, or standard for Magnetic.
	//
	//    * launch.group-id - The ID of the security group for the instance.
	//
	//    * launch.group-name - The name of the security group for the instance.
	//
	//    * launch.image-id - The ID of the AMI.
	//
	//    * launch.instance-type - The type of instance (for example, m3.medium).
	//
	//    * launch.kernel-id - The kernel ID.
	//
	//    * launch.key-name - The name of the key pair the instance launched with.
	//
	//    * launch.monitoring-enabled - Whether detailed monitoring is enabled for
	//    the Spot Instance.
	//
	//    * launch.ramdisk-id - The RAM disk ID.
	//
	//    * launched-availability-zone - The Availability Zone in which the request
	//    is launched.
	//
	//    * network-interface.addresses.primary - Indicates whether the IP address
	//    is the primary private IP address.
	//
	//    * network-interface.delete-on-termination - Indicates whether the network
	//    interface is deleted when the instance is terminated.
	//
	//    * network-interface.description - A description of the network interface.
	//
	//    * network-interface.device-index - The index of the device for the network
	//    interface attachment on the instance.
	//
	//    * network-interface.group-id - The ID of the security group associated
	//    with the network interface.
	//
	//    * network-interface.network-interface-id - The ID of the network interface.
	//
	//    * network-interface.private-ip-address - The primary private IP address
	//    of the network interface.
	//
	//    * network-interface.subnet-id - The ID of the subnet for the instance.
	//
	//    * product-description - The product description associated with the instance
	//    (Linux/UNIX | Windows).
	//
	//    * spot-instance-request-id - The Spot Instance request ID.
	//
	//    * spot-price - The maximum hourly price for any Spot Instance launched
	//    to fulfill the request.
	//
	//    * state - The state of the Spot Instance request (open | active | closed
	//    | cancelled | failed). Spot request status information can help you track
	//    your Amazon EC2 Spot Instance requests. For more information, see Spot
	//    Request Status (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-bid-status.html)
	//    in the Amazon EC2 User Guide for Linux Instances.
	//
	//    * status-code - The short code describing the most recent evaluation of
	//    your Spot Instance request.
	//
	//    * status-message - The message explaining the status of the Spot Instance
	//    request.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * type - The type of Spot Instance request (one-time | persistent).
	//
	//    * valid-from - The start date of the request.
	//
	//    * valid-until - The end date of the request.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. Specify a value
	// between 5 and 1000. To retrieve the remaining results, make another call
	// with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token to request the next set of results. This value is null when there
	// are no more results to return.
	NextToken *string `type:"string"`

	// One or more Spot Instance request IDs.
	SpotInstanceRequestIds []*string `locationName:"SpotInstanceRequestId" locationNameList:"SpotInstanceRequestId" type:"list"`
}

// String returns the string representation
func (s DescribeSpotInstanceRequestsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotInstanceRequestsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSpotInstanceRequestsInput) SetDryRun(v bool) *DescribeSpotInstanceRequestsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeSpotInstanceRequestsInput) SetFilters(v []*Filter) *DescribeSpotInstanceRequestsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSpotInstanceRequestsInput) SetMaxResults(v int64) *DescribeSpotInstanceRequestsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotInstanceRequestsInput) SetNextToken(v string) *DescribeSpotInstanceRequestsInput {
	s.NextToken = &v
	return s
}

// SetSpotInstanceRequestIds sets the SpotInstanceRequestIds field's value.
func (s *DescribeSpotInstanceRequestsInput) SetSpotInstanceRequestIds(v []*string) *DescribeSpotInstanceRequestsInput {
	s.SpotInstanceRequestIds = v
	return s
}

// Contains the output of DescribeSpotInstanceRequests.
type DescribeSpotInstanceRequestsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next set of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// One or more Spot Instance requests.
	SpotInstanceRequests []*SpotInstanceRequest `locationName:"spotInstanceRequestSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSpotInstanceRequestsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotInstanceRequestsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotInstanceRequestsOutput) SetNextToken(v string) *DescribeSpotInstanceRequestsOutput {
	s.NextToken = &v
	return s
}

// SetSpotInstanceRequests sets the SpotInstanceRequests field's value.
func (s *DescribeSpotInstanceRequestsOutput) SetSpotInstanceRequests(v []*SpotInstanceRequest) *DescribeSpotInstanceRequestsOutput {
	s.SpotInstanceRequests = v
	return s
}

// Contains the parameters for DescribeSpotPriceHistory.
type DescribeSpotPriceHistoryInput struct {
	_ struct{} `type:"structure"`

	// Filters the results by the specified Availability Zone.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The date and time, up to the current date, from which to stop retrieving
	// the price history data, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	EndTime *time.Time `locationName:"endTime" type:"timestamp"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone for which prices should be
	//    returned.
	//
	//    * instance-type - The type of instance (for example, m3.medium).
	//
	//    * product-description - The product description for the Spot price (Linux/UNIX
	//    | SUSE Linux | Windows | Linux/UNIX (Amazon VPC) | SUSE Linux (Amazon
	//    VPC) | Windows (Amazon VPC)).
	//
	//    * spot-price - The Spot price. The value must match exactly (or use wildcards;
	//    greater than or less than comparison is not supported).
	//
	//    * timestamp - The time stamp of the Spot price history, in UTC format
	//    (for example, YYYY-MM-DDTHH:MM:SSZ). You can use wildcards (* and ?).
	//    Greater than or less than comparison is not supported.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// Filters the results by the specified instance types.
	InstanceTypes []*string `locationName:"InstanceType" type:"list"`

	// The maximum number of results to return in a single call. Specify a value
	// between 1 and 1000. The default value is 1000. To retrieve the remaining
	// results, make another call with the returned NextToken value.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token for the next set of results.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Filters the results by the specified basic product descriptions.
	ProductDescriptions []*string `locationName:"ProductDescription" type:"list"`

	// The date and time, up to the past 90 days, from which to start retrieving
	// the price history data, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`
}

// String returns the string representation
func (s DescribeSpotPriceHistoryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotPriceHistoryInput) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *DescribeSpotPriceHistoryInput) SetAvailabilityZone(v string) *DescribeSpotPriceHistoryInput {
	s.AvailabilityZone = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSpotPriceHistoryInput) SetDryRun(v bool) *DescribeSpotPriceHistoryInput {
	s.DryRun = &v
	return s
}

// SetEndTime sets the EndTime field's value.
func (s *DescribeSpotPriceHistoryInput) SetEndTime(v time.Time) *DescribeSpotPriceHistoryInput {
	s.EndTime = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeSpotPriceHistoryInput) SetFilters(v []*Filter) *DescribeSpotPriceHistoryInput {
	s.Filters = v
	return s
}

// SetInstanceTypes sets the InstanceTypes field's value.
func (s *DescribeSpotPriceHistoryInput) SetInstanceTypes(v []*string) *DescribeSpotPriceHistoryInput {
	s.InstanceTypes = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeSpotPriceHistoryInput) SetMaxResults(v int64) *DescribeSpotPriceHistoryInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotPriceHistoryInput) SetNextToken(v string) *DescribeSpotPriceHistoryInput {
	s.NextToken = &v
	return s
}

// SetProductDescriptions sets the ProductDescriptions field's value.
func (s *DescribeSpotPriceHistoryInput) SetProductDescriptions(v []*string) *DescribeSpotPriceHistoryInput {
	s.ProductDescriptions = v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *DescribeSpotPriceHistoryInput) SetStartTime(v time.Time) *DescribeSpotPriceHistoryInput {
	s.StartTime = &v
	return s
}

// Contains the output of DescribeSpotPriceHistory.
type DescribeSpotPriceHistoryOutput struct {
	_ struct{} `type:"structure"`

	// The token required to retrieve the next set of results. This value is null
	// or an empty string when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The historical Spot prices.
	SpotPriceHistory []*SpotPrice `locationName:"spotPriceHistorySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSpotPriceHistoryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSpotPriceHistoryOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeSpotPriceHistoryOutput) SetNextToken(v string) *DescribeSpotPriceHistoryOutput {
	s.NextToken = &v
	return s
}

// SetSpotPriceHistory sets the SpotPriceHistory field's value.
func (s *DescribeSpotPriceHistoryOutput) SetSpotPriceHistory(v []*SpotPrice) *DescribeSpotPriceHistoryOutput {
	s.SpotPriceHistory = v
	return s
}

type DescribeStaleSecurityGroupsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next set of items to return. (You received this token from
	// a prior call.)
	NextToken *string `min:"1" type:"string"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeStaleSecurityGroupsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeStaleSecurityGroupsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeStaleSecurityGroupsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeStaleSecurityGroupsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeStaleSecurityGroupsInput) SetDryRun(v bool) *DescribeStaleSecurityGroupsInput {
	s.DryRun = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeStaleSecurityGroupsInput) SetMaxResults(v int64) *DescribeStaleSecurityGroupsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeStaleSecurityGroupsInput) SetNextToken(v string) *DescribeStaleSecurityGroupsInput {
	s.NextToken = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DescribeStaleSecurityGroupsInput) SetVpcId(v string) *DescribeStaleSecurityGroupsInput {
	s.VpcId = &v
	return s
}

type DescribeStaleSecurityGroupsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use when requesting the next set of items. If there are no additional
	// items to return, the string is empty.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the stale security groups.
	StaleSecurityGroupSet []*StaleSecurityGroup `locationName:"staleSecurityGroupSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeStaleSecurityGroupsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeStaleSecurityGroupsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeStaleSecurityGroupsOutput) SetNextToken(v string) *DescribeStaleSecurityGroupsOutput {
	s.NextToken = &v
	return s
}

// SetStaleSecurityGroupSet sets the StaleSecurityGroupSet field's value.
func (s *DescribeStaleSecurityGroupsOutput) SetStaleSecurityGroupSet(v []*StaleSecurityGroup) *DescribeStaleSecurityGroupsOutput {
	s.StaleSecurityGroupSet = v
	return s
}

type DescribeSubnetsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * availability-zone - The Availability Zone for the subnet. You can also
	//    use availabilityZone as the filter name.
	//
	//    * availability-zone-id - The ID of the Availability Zone for the subnet.
	//    You can also use availabilityZoneId as the filter name.
	//
	//    * available-ip-address-count - The number of IPv4 addresses in the subnet
	//    that are available.
	//
	//    * cidr-block - The IPv4 CIDR block of the subnet. The CIDR block you specify
	//    must exactly match the subnet's CIDR block for information to be returned
	//    for the subnet. You can also use cidr or cidrBlock as the filter names.
	//
	//    * default-for-az - Indicates whether this is the default subnet for the
	//    Availability Zone. You can also use defaultForAz as the filter name.
	//
	//    * ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR block associated
	//    with the subnet.
	//
	//    * ipv6-cidr-block-association.association-id - An association ID for an
	//    IPv6 CIDR block associated with the subnet.
	//
	//    * ipv6-cidr-block-association.state - The state of an IPv6 CIDR block
	//    associated with the subnet.
	//
	//    * owner-id - The ID of the AWS account that owns the subnet.
	//
	//    * state - The state of the subnet (pending | available).
	//
	//    * subnet-arn - The Amazon Resource Name (ARN) of the subnet.
	//
	//    * subnet-id - The ID of the subnet.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC for the subnet.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more subnet IDs.
	//
	// Default: Describes all your subnets.
	SubnetIds []*string `locationName:"SubnetId" locationNameList:"SubnetId" type:"list"`
}

// String returns the string representation
func (s DescribeSubnetsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSubnetsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeSubnetsInput) SetDryRun(v bool) *DescribeSubnetsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeSubnetsInput) SetFilters(v []*Filter) *DescribeSubnetsInput {
	s.Filters = v
	return s
}

// SetSubnetIds sets the SubnetIds field's value.
func (s *DescribeSubnetsInput) SetSubnetIds(v []*string) *DescribeSubnetsInput {
	s.SubnetIds = v
	return s
}

type DescribeSubnetsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more subnets.
	Subnets []*Subnet `locationName:"subnetSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeSubnetsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSubnetsOutput) GoString() string {
	return s.String()
}

// SetSubnets sets the Subnets field's value.
func (s *DescribeSubnetsOutput) SetSubnets(v []*Subnet) *DescribeSubnetsOutput {
	s.Subnets = v
	return s
}

type DescribeTagsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * key - The tag key.
	//
	//    * resource-id - The ID of the resource.
	//
	//    * resource-type - The resource type (customer-gateway | dedicated-host
	//    | dhcp-options | elastic-ip | fleet | fpga-image | image | instance |
	//    internet-gateway | launch-template | natgateway | network-acl | network-interface
	//    | reserved-instances | route-table | security-group | snapshot | spot-instances-request
	//    | subnet | volume | vpc | vpc-peering-connection | vpn-connection | vpn-gateway).
	//
	//    * tag:<key> - The key/value combination of the tag. For example, specify
	//    "tag:Owner" for the filter name and "TeamA" for the filter value to find
	//    resources with the tag "Owner=TeamA".
	//
	//    * value - The tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. This value can
	// be between 5 and 1000. To retrieve the remaining results, make another call
	// with the returned NextToken value.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeTagsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTagsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeTagsInput) SetDryRun(v bool) *DescribeTagsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeTagsInput) SetFilters(v []*Filter) *DescribeTagsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeTagsInput) SetMaxResults(v int64) *DescribeTagsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTagsInput) SetNextToken(v string) *DescribeTagsInput {
	s.NextToken = &v
	return s
}

type DescribeTagsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// The tags.
	Tags []*TagDescription `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTagsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTagsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTagsOutput) SetNextToken(v string) *DescribeTagsOutput {
	s.NextToken = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *DescribeTagsOutput) SetTags(v []*TagDescription) *DescribeTagsOutput {
	s.Tags = v
	return s
}

type DescribeTransitGatewayAttachmentsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * association.state - The state of the association (associating | associated
	//    | disassociating).
	//
	//    * association.transit-gateway-route-table-id - The ID of the route table
	//    for the transit gateway.
	//
	//    * resource-id - The ID of the resource.
	//
	//    * resource-owner-id - The ID of the AWS account that owns the resource.
	//
	//    * resource-type - The resource type (vpc | vpn).
	//
	//    * state - The state of the attachment (available | deleted | deleting
	//    | failed | modifying | pendingAcceptance | pending | rollingBack | rejected
	//    | rejecting).
	//
	//    * transit-gateway-attachment-id - The ID of the attachment.
	//
	//    * transit-gateway-id - The ID of the transit gateway.
	//
	//    * transit-gateway-owner-id - The ID of the AWS account that owns the transit
	//    gateway.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The IDs of the attachments.
	TransitGatewayAttachmentIds []*string `type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewayAttachmentsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewayAttachmentsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeTransitGatewayAttachmentsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeTransitGatewayAttachmentsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeTransitGatewayAttachmentsInput) SetDryRun(v bool) *DescribeTransitGatewayAttachmentsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeTransitGatewayAttachmentsInput) SetFilters(v []*Filter) *DescribeTransitGatewayAttachmentsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeTransitGatewayAttachmentsInput) SetMaxResults(v int64) *DescribeTransitGatewayAttachmentsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewayAttachmentsInput) SetNextToken(v string) *DescribeTransitGatewayAttachmentsInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayAttachmentIds sets the TransitGatewayAttachmentIds field's value.
func (s *DescribeTransitGatewayAttachmentsInput) SetTransitGatewayAttachmentIds(v []*string) *DescribeTransitGatewayAttachmentsInput {
	s.TransitGatewayAttachmentIds = v
	return s
}

type DescribeTransitGatewayAttachmentsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the attachments.
	TransitGatewayAttachments []*TransitGatewayAttachment `locationName:"transitGatewayAttachments" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewayAttachmentsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewayAttachmentsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewayAttachmentsOutput) SetNextToken(v string) *DescribeTransitGatewayAttachmentsOutput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayAttachments sets the TransitGatewayAttachments field's value.
func (s *DescribeTransitGatewayAttachmentsOutput) SetTransitGatewayAttachments(v []*TransitGatewayAttachment) *DescribeTransitGatewayAttachmentsOutput {
	s.TransitGatewayAttachments = v
	return s
}

type DescribeTransitGatewayRouteTablesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * default-association-route-table - Indicates whether this is the default
	//    association route table for the transit gateway (true | false).
	//
	//    * default-propagation-route-table - Indicates whether this is the default
	//    propagation route table for the transit gateway (true | false).
	//
	//    * state - The state of the attachment (available | deleted | deleting
	//    | failed | modifying | pendingAcceptance | pending | rollingBack | rejected
	//    | rejecting).
	//
	//    * transit-gateway-id - The ID of the transit gateway.
	//
	//    * transit-gateway-route-table-id - The ID of the transit gateway route
	//    table.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The IDs of the transit gateway route tables.
	TransitGatewayRouteTableIds []*string `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewayRouteTablesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewayRouteTablesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeTransitGatewayRouteTablesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeTransitGatewayRouteTablesInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeTransitGatewayRouteTablesInput) SetDryRun(v bool) *DescribeTransitGatewayRouteTablesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeTransitGatewayRouteTablesInput) SetFilters(v []*Filter) *DescribeTransitGatewayRouteTablesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeTransitGatewayRouteTablesInput) SetMaxResults(v int64) *DescribeTransitGatewayRouteTablesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewayRouteTablesInput) SetNextToken(v string) *DescribeTransitGatewayRouteTablesInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayRouteTableIds sets the TransitGatewayRouteTableIds field's value.
func (s *DescribeTransitGatewayRouteTablesInput) SetTransitGatewayRouteTableIds(v []*string) *DescribeTransitGatewayRouteTablesInput {
	s.TransitGatewayRouteTableIds = v
	return s
}

type DescribeTransitGatewayRouteTablesOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the transit gateway route tables.
	TransitGatewayRouteTables []*TransitGatewayRouteTable `locationName:"transitGatewayRouteTables" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewayRouteTablesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewayRouteTablesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewayRouteTablesOutput) SetNextToken(v string) *DescribeTransitGatewayRouteTablesOutput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayRouteTables sets the TransitGatewayRouteTables field's value.
func (s *DescribeTransitGatewayRouteTablesOutput) SetTransitGatewayRouteTables(v []*TransitGatewayRouteTable) *DescribeTransitGatewayRouteTablesOutput {
	s.TransitGatewayRouteTables = v
	return s
}

type DescribeTransitGatewayVpcAttachmentsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * state - The state of the attachment (available | deleted | deleting
	//    | failed | modifying | pendingAcceptance | pending | rollingBack | rejected
	//    | rejecting).
	//
	//    * transit-gateway-attachment-id - The ID of the attachment.
	//
	//    * transit-gateway-id - The ID of the transit gateway.
	//
	//    * vpc-id - The ID of the VPC.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The IDs of the attachments.
	TransitGatewayAttachmentIds []*string `type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewayVpcAttachmentsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewayVpcAttachmentsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeTransitGatewayVpcAttachmentsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeTransitGatewayVpcAttachmentsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeTransitGatewayVpcAttachmentsInput) SetDryRun(v bool) *DescribeTransitGatewayVpcAttachmentsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeTransitGatewayVpcAttachmentsInput) SetFilters(v []*Filter) *DescribeTransitGatewayVpcAttachmentsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeTransitGatewayVpcAttachmentsInput) SetMaxResults(v int64) *DescribeTransitGatewayVpcAttachmentsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewayVpcAttachmentsInput) SetNextToken(v string) *DescribeTransitGatewayVpcAttachmentsInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayAttachmentIds sets the TransitGatewayAttachmentIds field's value.
func (s *DescribeTransitGatewayVpcAttachmentsInput) SetTransitGatewayAttachmentIds(v []*string) *DescribeTransitGatewayVpcAttachmentsInput {
	s.TransitGatewayAttachmentIds = v
	return s
}

type DescribeTransitGatewayVpcAttachmentsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the VPC attachments.
	TransitGatewayVpcAttachments []*TransitGatewayVpcAttachment `locationName:"transitGatewayVpcAttachments" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewayVpcAttachmentsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewayVpcAttachmentsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewayVpcAttachmentsOutput) SetNextToken(v string) *DescribeTransitGatewayVpcAttachmentsOutput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayVpcAttachments sets the TransitGatewayVpcAttachments field's value.
func (s *DescribeTransitGatewayVpcAttachmentsOutput) SetTransitGatewayVpcAttachments(v []*TransitGatewayVpcAttachment) *DescribeTransitGatewayVpcAttachmentsOutput {
	s.TransitGatewayVpcAttachments = v
	return s
}

type DescribeTransitGatewaysInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * options.propagation-default-route-table-id - The ID of the default propagation
	//    route table.
	//
	//    * options.amazon-side-asn - The private ASN for the Amazon side of a BGP
	//    session.
	//
	//    * options.association-default-route-table-id - The ID of the default association
	//    route table.
	//
	//    * options.auto-accept-shared-attachments - Indicates whether there is
	//    automatic acceptance of attachment requests (enable | disable).
	//
	//    * options.default-route-table-association - Indicates whether resource
	//    attachments are automatically associated with the default association
	//    route table (enable | disable).
	//
	//    * options.default-route-table-propagation - Indicates whether resource
	//    attachments automatically propagate routes to the default propagation
	//    route table (enable | disable).
	//
	//    * options.dns-support - Indicates whether DNS support is enabled (enable
	//    | disable).
	//
	//    * options.vpn-ecmp-support - Indicates whether Equal Cost Multipath Protocol
	//    support is enabled (enable | disable).
	//
	//    * owner-id - The ID of the AWS account that owns the transit gateway.
	//
	//    * state - The state of the attachment (available | deleted | deleting
	//    | failed | modifying | pendingAcceptance | pending | rollingBack | rejected
	//    | rejecting).
	//
	//    * transit-gateway-id - The ID of the transit gateway.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The IDs of the transit gateways.
	TransitGatewayIds []*string `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewaysInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewaysInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeTransitGatewaysInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeTransitGatewaysInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeTransitGatewaysInput) SetDryRun(v bool) *DescribeTransitGatewaysInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeTransitGatewaysInput) SetFilters(v []*Filter) *DescribeTransitGatewaysInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeTransitGatewaysInput) SetMaxResults(v int64) *DescribeTransitGatewaysInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewaysInput) SetNextToken(v string) *DescribeTransitGatewaysInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayIds sets the TransitGatewayIds field's value.
func (s *DescribeTransitGatewaysInput) SetTransitGatewayIds(v []*string) *DescribeTransitGatewaysInput {
	s.TransitGatewayIds = v
	return s
}

type DescribeTransitGatewaysOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the transit gateways.
	TransitGateways []*TransitGateway `locationName:"transitGatewaySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeTransitGatewaysOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeTransitGatewaysOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeTransitGatewaysOutput) SetNextToken(v string) *DescribeTransitGatewaysOutput {
	s.NextToken = &v
	return s
}

// SetTransitGateways sets the TransitGateways field's value.
func (s *DescribeTransitGatewaysOutput) SetTransitGateways(v []*TransitGateway) *DescribeTransitGatewaysOutput {
	s.TransitGateways = v
	return s
}

// Contains the parameters for DescribeVolumeAttribute.
type DescribeVolumeAttributeInput struct {
	_ struct{} `type:"structure"`

	// The attribute of the volume. This parameter is required.
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"VolumeAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the volume.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeVolumeAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumeAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeVolumeAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeVolumeAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeVolumeAttributeInput) SetAttribute(v string) *DescribeVolumeAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVolumeAttributeInput) SetDryRun(v bool) *DescribeVolumeAttributeInput {
	s.DryRun = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *DescribeVolumeAttributeInput) SetVolumeId(v string) *DescribeVolumeAttributeInput {
	s.VolumeId = &v
	return s
}

// Contains the output of DescribeVolumeAttribute.
type DescribeVolumeAttributeOutput struct {
	_ struct{} `type:"structure"`

	// The state of autoEnableIO attribute.
	AutoEnableIO *AttributeBooleanValue `locationName:"autoEnableIO" type:"structure"`

	// A list of product codes.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// The ID of the volume.
	VolumeId *string `locationName:"volumeId" type:"string"`
}

// String returns the string representation
func (s DescribeVolumeAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumeAttributeOutput) GoString() string {
	return s.String()
}

// SetAutoEnableIO sets the AutoEnableIO field's value.
func (s *DescribeVolumeAttributeOutput) SetAutoEnableIO(v *AttributeBooleanValue) *DescribeVolumeAttributeOutput {
	s.AutoEnableIO = v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *DescribeVolumeAttributeOutput) SetProductCodes(v []*ProductCode) *DescribeVolumeAttributeOutput {
	s.ProductCodes = v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *DescribeVolumeAttributeOutput) SetVolumeId(v string) *DescribeVolumeAttributeOutput {
	s.VolumeId = &v
	return s
}

// Contains the parameters for DescribeVolumeStatus.
type DescribeVolumeStatusInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * action.code - The action code for the event (for example, enable-volume-io).
	//
	//    * action.description - A description of the action.
	//
	//    * action.event-id - The event ID associated with the action.
	//
	//    * availability-zone - The Availability Zone of the instance.
	//
	//    * event.description - A description of the event.
	//
	//    * event.event-id - The event ID.
	//
	//    * event.event-type - The event type (for io-enabled: passed | failed;
	//    for io-performance: io-performance:degraded | io-performance:severely-degraded
	//    | io-performance:stalled).
	//
	//    * event.not-after - The latest end time for the event.
	//
	//    * event.not-before - The earliest start time for the event.
	//
	//    * volume-status.details-name - The cause for volume-status.status (io-enabled
	//    | io-performance).
	//
	//    * volume-status.details-status - The status of volume-status.details-name
	//    (for io-enabled: passed | failed; for io-performance: normal | degraded
	//    | severely-degraded | stalled).
	//
	//    * volume-status.status - The status of the volume (ok | impaired | warning
	//    | insufficient-data).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of volume results returned by DescribeVolumeStatus in
	// paginated output. When this parameter is used, the request only returns MaxResults
	// results in a single page along with a NextToken response element. The remaining
	// results of the initial request can be seen by sending another request with
	// the returned NextToken value. This value can be between 5 and 1000; if MaxResults
	// is given a value larger than 1000, only 1000 results are returned. If this
	// parameter is not used, then DescribeVolumeStatus returns all results. You
	// cannot specify this parameter and the volume IDs parameter in the same request.
	MaxResults *int64 `type:"integer"`

	// The NextToken value to include in a future DescribeVolumeStatus request.
	// When the results of the request exceed MaxResults, this value can be used
	// to retrieve the next page of results. This value is null when there are no
	// more results to return.
	NextToken *string `type:"string"`

	// One or more volume IDs.
	//
	// Default: Describes all your volumes.
	VolumeIds []*string `locationName:"VolumeId" locationNameList:"VolumeId" type:"list"`
}

// String returns the string representation
func (s DescribeVolumeStatusInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumeStatusInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVolumeStatusInput) SetDryRun(v bool) *DescribeVolumeStatusInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVolumeStatusInput) SetFilters(v []*Filter) *DescribeVolumeStatusInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVolumeStatusInput) SetMaxResults(v int64) *DescribeVolumeStatusInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVolumeStatusInput) SetNextToken(v string) *DescribeVolumeStatusInput {
	s.NextToken = &v
	return s
}

// SetVolumeIds sets the VolumeIds field's value.
func (s *DescribeVolumeStatusInput) SetVolumeIds(v []*string) *DescribeVolumeStatusInput {
	s.VolumeIds = v
	return s
}

// Contains the output of DescribeVolumeStatus.
type DescribeVolumeStatusOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// A list of volumes.
	VolumeStatuses []*VolumeStatusItem `locationName:"volumeStatusSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVolumeStatusOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumeStatusOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVolumeStatusOutput) SetNextToken(v string) *DescribeVolumeStatusOutput {
	s.NextToken = &v
	return s
}

// SetVolumeStatuses sets the VolumeStatuses field's value.
func (s *DescribeVolumeStatusOutput) SetVolumeStatuses(v []*VolumeStatusItem) *DescribeVolumeStatusOutput {
	s.VolumeStatuses = v
	return s
}

// Contains the parameters for DescribeVolumes.
type DescribeVolumesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * attachment.attach-time - The time stamp when the attachment initiated.
	//
	//    * attachment.delete-on-termination - Whether the volume is deleted on
	//    instance termination.
	//
	//    * attachment.device - The device name specified in the block device mapping
	//    (for example, /dev/sda1).
	//
	//    * attachment.instance-id - The ID of the instance the volume is attached
	//    to.
	//
	//    * attachment.status - The attachment state (attaching | attached | detaching).
	//
	//    * availability-zone - The Availability Zone in which the volume was created.
	//
	//    * create-time - The time stamp when the volume was created.
	//
	//    * encrypted - The encryption status of the volume.
	//
	//    * size - The size of the volume, in GiB.
	//
	//    * snapshot-id - The snapshot from which the volume was created.
	//
	//    * status - The status of the volume (creating | available | in-use | deleting
	//    | deleted | error).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * volume-id - The volume ID.
	//
	//    * volume-type - The Amazon EBS volume type. This can be gp2 for General
	//    Purpose SSD, io1 for Provisioned IOPS SSD, st1 for Throughput Optimized
	//    HDD, sc1 for Cold HDD, or standard for Magnetic volumes.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of volume results returned by DescribeVolumes in paginated
	// output. When this parameter is used, DescribeVolumes only returns MaxResults
	// results in a single page along with a NextToken response element. The remaining
	// results of the initial request can be seen by sending another DescribeVolumes
	// request with the returned NextToken value. This value can be between 5 and
	// 500; if MaxResults is given a value larger than 500, only 500 results are
	// returned. If this parameter is not used, then DescribeVolumes returns all
	// results. You cannot specify this parameter and the volume IDs parameter in
	// the same request.
	MaxResults *int64 `locationName:"maxResults" type:"integer"`

	// The NextToken value returned from a previous paginated DescribeVolumes request
	// where MaxResults was used and the results exceeded the value of that parameter.
	// Pagination continues from the end of the previous results that returned the
	// NextToken value. This value is null when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// One or more volume IDs.
	VolumeIds []*string `locationName:"VolumeId" locationNameList:"VolumeId" type:"list"`
}

// String returns the string representation
func (s DescribeVolumesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVolumesInput) SetDryRun(v bool) *DescribeVolumesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVolumesInput) SetFilters(v []*Filter) *DescribeVolumesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVolumesInput) SetMaxResults(v int64) *DescribeVolumesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVolumesInput) SetNextToken(v string) *DescribeVolumesInput {
	s.NextToken = &v
	return s
}

// SetVolumeIds sets the VolumeIds field's value.
func (s *DescribeVolumesInput) SetVolumeIds(v []*string) *DescribeVolumesInput {
	s.VolumeIds = v
	return s
}

type DescribeVolumesModificationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. Supported filters: volume-id, modification-state, target-size,
	// target-iops, target-volume-type, original-size, original-iops, original-volume-type,
	// start-time.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results (up to a limit of 500) to be returned in a
	// paginated request.
	MaxResults *int64 `type:"integer"`

	// The nextToken value returned by a previous paginated request.
	NextToken *string `type:"string"`

	// One or more volume IDs for which in-progress modifications will be described.
	VolumeIds []*string `locationName:"VolumeId" locationNameList:"VolumeId" type:"list"`
}

// String returns the string representation
func (s DescribeVolumesModificationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumesModificationsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVolumesModificationsInput) SetDryRun(v bool) *DescribeVolumesModificationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVolumesModificationsInput) SetFilters(v []*Filter) *DescribeVolumesModificationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVolumesModificationsInput) SetMaxResults(v int64) *DescribeVolumesModificationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVolumesModificationsInput) SetNextToken(v string) *DescribeVolumesModificationsInput {
	s.NextToken = &v
	return s
}

// SetVolumeIds sets the VolumeIds field's value.
func (s *DescribeVolumesModificationsInput) SetVolumeIds(v []*string) *DescribeVolumesModificationsInput {
	s.VolumeIds = v
	return s
}

type DescribeVolumesModificationsOutput struct {
	_ struct{} `type:"structure"`

	// Token for pagination, null if there are no more results
	NextToken *string `locationName:"nextToken" type:"string"`

	// A list of returned VolumeModification objects.
	VolumesModifications []*VolumeModification `locationName:"volumeModificationSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVolumesModificationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumesModificationsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVolumesModificationsOutput) SetNextToken(v string) *DescribeVolumesModificationsOutput {
	s.NextToken = &v
	return s
}

// SetVolumesModifications sets the VolumesModifications field's value.
func (s *DescribeVolumesModificationsOutput) SetVolumesModifications(v []*VolumeModification) *DescribeVolumesModificationsOutput {
	s.VolumesModifications = v
	return s
}

// Contains the output of DescribeVolumes.
type DescribeVolumesOutput struct {
	_ struct{} `type:"structure"`

	// The NextToken value to include in a future DescribeVolumes request. When
	// the results of a DescribeVolumes request exceed MaxResults, this value can
	// be used to retrieve the next page of results. This value is null when there
	// are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the volumes.
	Volumes []*Volume `locationName:"volumeSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVolumesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVolumesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVolumesOutput) SetNextToken(v string) *DescribeVolumesOutput {
	s.NextToken = &v
	return s
}

// SetVolumes sets the Volumes field's value.
func (s *DescribeVolumesOutput) SetVolumes(v []*Volume) *DescribeVolumesOutput {
	s.Volumes = v
	return s
}

type DescribeVpcAttributeInput struct {
	_ struct{} `type:"structure"`

	// The VPC attribute.
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"VpcAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeVpcAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeVpcAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeVpcAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *DescribeVpcAttributeInput) SetAttribute(v string) *DescribeVpcAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcAttributeInput) SetDryRun(v bool) *DescribeVpcAttributeInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DescribeVpcAttributeInput) SetVpcId(v string) *DescribeVpcAttributeInput {
	s.VpcId = &v
	return s
}

type DescribeVpcAttributeOutput struct {
	_ struct{} `type:"structure"`

	// Indicates whether the instances launched in the VPC get DNS hostnames. If
	// this attribute is true, instances in the VPC get DNS hostnames; otherwise,
	// they do not.
	EnableDnsHostnames *AttributeBooleanValue `locationName:"enableDnsHostnames" type:"structure"`

	// Indicates whether DNS resolution is enabled for the VPC. If this attribute
	// is true, the Amazon DNS server resolves DNS hostnames for your instances
	// to their corresponding IP addresses; otherwise, it does not.
	EnableDnsSupport *AttributeBooleanValue `locationName:"enableDnsSupport" type:"structure"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s DescribeVpcAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcAttributeOutput) GoString() string {
	return s.String()
}

// SetEnableDnsHostnames sets the EnableDnsHostnames field's value.
func (s *DescribeVpcAttributeOutput) SetEnableDnsHostnames(v *AttributeBooleanValue) *DescribeVpcAttributeOutput {
	s.EnableDnsHostnames = v
	return s
}

// SetEnableDnsSupport sets the EnableDnsSupport field's value.
func (s *DescribeVpcAttributeOutput) SetEnableDnsSupport(v *AttributeBooleanValue) *DescribeVpcAttributeOutput {
	s.EnableDnsSupport = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DescribeVpcAttributeOutput) SetVpcId(v string) *DescribeVpcAttributeOutput {
	s.VpcId = &v
	return s
}

type DescribeVpcClassicLinkDnsSupportInput struct {
	_ struct{} `type:"structure"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	MaxResults *int64 `locationName:"maxResults" min:"5" type:"integer"`

	// The token for the next set of items to return. (You received this token from
	// a prior call.)
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`

	// One or more VPC IDs.
	VpcIds []*string `locationNameList:"VpcId" type:"list"`
}

// String returns the string representation
func (s DescribeVpcClassicLinkDnsSupportInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcClassicLinkDnsSupportInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeVpcClassicLinkDnsSupportInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeVpcClassicLinkDnsSupportInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.NextToken != nil && len(*s.NextToken) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("NextToken", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcClassicLinkDnsSupportInput) SetMaxResults(v int64) *DescribeVpcClassicLinkDnsSupportInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcClassicLinkDnsSupportInput) SetNextToken(v string) *DescribeVpcClassicLinkDnsSupportInput {
	s.NextToken = &v
	return s
}

// SetVpcIds sets the VpcIds field's value.
func (s *DescribeVpcClassicLinkDnsSupportInput) SetVpcIds(v []*string) *DescribeVpcClassicLinkDnsSupportInput {
	s.VpcIds = v
	return s
}

type DescribeVpcClassicLinkDnsSupportOutput struct {
	_ struct{} `type:"structure"`

	// The token to use when requesting the next set of items.
	NextToken *string `locationName:"nextToken" min:"1" type:"string"`

	// Information about the ClassicLink DNS support status of the VPCs.
	Vpcs []*ClassicLinkDnsSupport `locationName:"vpcs" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcClassicLinkDnsSupportOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcClassicLinkDnsSupportOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcClassicLinkDnsSupportOutput) SetNextToken(v string) *DescribeVpcClassicLinkDnsSupportOutput {
	s.NextToken = &v
	return s
}

// SetVpcs sets the Vpcs field's value.
func (s *DescribeVpcClassicLinkDnsSupportOutput) SetVpcs(v []*ClassicLinkDnsSupport) *DescribeVpcClassicLinkDnsSupportOutput {
	s.Vpcs = v
	return s
}

type DescribeVpcClassicLinkInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * is-classic-link-enabled - Whether the VPC is enabled for ClassicLink
	//    (true | false).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more VPCs for which you want to describe the ClassicLink status.
	VpcIds []*string `locationName:"VpcId" locationNameList:"VpcId" type:"list"`
}

// String returns the string representation
func (s DescribeVpcClassicLinkInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcClassicLinkInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcClassicLinkInput) SetDryRun(v bool) *DescribeVpcClassicLinkInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcClassicLinkInput) SetFilters(v []*Filter) *DescribeVpcClassicLinkInput {
	s.Filters = v
	return s
}

// SetVpcIds sets the VpcIds field's value.
func (s *DescribeVpcClassicLinkInput) SetVpcIds(v []*string) *DescribeVpcClassicLinkInput {
	s.VpcIds = v
	return s
}

type DescribeVpcClassicLinkOutput struct {
	_ struct{} `type:"structure"`

	// The ClassicLink status of one or more VPCs.
	Vpcs []*VpcClassicLink `locationName:"vpcSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcClassicLinkOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcClassicLinkOutput) GoString() string {
	return s.String()
}

// SetVpcs sets the Vpcs field's value.
func (s *DescribeVpcClassicLinkOutput) SetVpcs(v []*VpcClassicLink) *DescribeVpcClassicLinkOutput {
	s.Vpcs = v
	return s
}

type DescribeVpcEndpointConnectionNotificationsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the notification.
	ConnectionNotificationId *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * connection-notification-arn - The ARN of SNS topic for the notification.
	//
	//    * connection-notification-id - The ID of the notification.
	//
	//    * connection-notification-state - The state of the notification (Enabled
	//    | Disabled).
	//
	//    * connection-notification-type - The type of notification (Topic).
	//
	//    * service-id - The ID of the endpoint service.
	//
	//    * vpc-endpoint-id - The ID of the VPC endpoint.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return in a single call. To retrieve the
	// remaining results, make another request with the returned NextToken value.
	MaxResults *int64 `type:"integer"`

	// The token to request the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeVpcEndpointConnectionNotificationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointConnectionNotificationsInput) GoString() string {
	return s.String()
}

// SetConnectionNotificationId sets the ConnectionNotificationId field's value.
func (s *DescribeVpcEndpointConnectionNotificationsInput) SetConnectionNotificationId(v string) *DescribeVpcEndpointConnectionNotificationsInput {
	s.ConnectionNotificationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcEndpointConnectionNotificationsInput) SetDryRun(v bool) *DescribeVpcEndpointConnectionNotificationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcEndpointConnectionNotificationsInput) SetFilters(v []*Filter) *DescribeVpcEndpointConnectionNotificationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcEndpointConnectionNotificationsInput) SetMaxResults(v int64) *DescribeVpcEndpointConnectionNotificationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointConnectionNotificationsInput) SetNextToken(v string) *DescribeVpcEndpointConnectionNotificationsInput {
	s.NextToken = &v
	return s
}

type DescribeVpcEndpointConnectionNotificationsOutput struct {
	_ struct{} `type:"structure"`

	// One or more notifications.
	ConnectionNotificationSet []*ConnectionNotification `locationName:"connectionNotificationSet" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeVpcEndpointConnectionNotificationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointConnectionNotificationsOutput) GoString() string {
	return s.String()
}

// SetConnectionNotificationSet sets the ConnectionNotificationSet field's value.
func (s *DescribeVpcEndpointConnectionNotificationsOutput) SetConnectionNotificationSet(v []*ConnectionNotification) *DescribeVpcEndpointConnectionNotificationsOutput {
	s.ConnectionNotificationSet = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointConnectionNotificationsOutput) SetNextToken(v string) *DescribeVpcEndpointConnectionNotificationsOutput {
	s.NextToken = &v
	return s
}

type DescribeVpcEndpointConnectionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * service-id - The ID of the service.
	//
	//    * vpc-endpoint-owner - The AWS account number of the owner of the endpoint.
	//
	//    * vpc-endpoint-state - The state of the endpoint (pendingAcceptance |
	//    pending | available | deleting | deleted | rejected | failed).
	//
	//    * vpc-endpoint-id - The ID of the endpoint.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results of the initial request can be seen by sending another
	// request with the returned NextToken value. This value can be between 5 and
	// 1000; if MaxResults is given a value larger than 1000, only 1000 results
	// are returned.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeVpcEndpointConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointConnectionsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcEndpointConnectionsInput) SetDryRun(v bool) *DescribeVpcEndpointConnectionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcEndpointConnectionsInput) SetFilters(v []*Filter) *DescribeVpcEndpointConnectionsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcEndpointConnectionsInput) SetMaxResults(v int64) *DescribeVpcEndpointConnectionsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointConnectionsInput) SetNextToken(v string) *DescribeVpcEndpointConnectionsInput {
	s.NextToken = &v
	return s
}

type DescribeVpcEndpointConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about one or more VPC endpoint connections.
	VpcEndpointConnections []*VpcEndpointConnection `locationName:"vpcEndpointConnectionSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointConnectionsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointConnectionsOutput) SetNextToken(v string) *DescribeVpcEndpointConnectionsOutput {
	s.NextToken = &v
	return s
}

// SetVpcEndpointConnections sets the VpcEndpointConnections field's value.
func (s *DescribeVpcEndpointConnectionsOutput) SetVpcEndpointConnections(v []*VpcEndpointConnection) *DescribeVpcEndpointConnectionsOutput {
	s.VpcEndpointConnections = v
	return s
}

type DescribeVpcEndpointServiceConfigurationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * service-name - The name of the service.
	//
	//    * service-id - The ID of the service.
	//
	//    * service-state - The state of the service (Pending | Available | Deleting
	//    | Deleted | Failed).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results of the initial request can be seen by sending another
	// request with the returned NextToken value. This value can be between 5 and
	// 1000; if MaxResults is given a value larger than 1000, only 1000 results
	// are returned.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`

	// The IDs of one or more services.
	ServiceIds []*string `locationName:"ServiceId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointServiceConfigurationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointServiceConfigurationsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcEndpointServiceConfigurationsInput) SetDryRun(v bool) *DescribeVpcEndpointServiceConfigurationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcEndpointServiceConfigurationsInput) SetFilters(v []*Filter) *DescribeVpcEndpointServiceConfigurationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcEndpointServiceConfigurationsInput) SetMaxResults(v int64) *DescribeVpcEndpointServiceConfigurationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointServiceConfigurationsInput) SetNextToken(v string) *DescribeVpcEndpointServiceConfigurationsInput {
	s.NextToken = &v
	return s
}

// SetServiceIds sets the ServiceIds field's value.
func (s *DescribeVpcEndpointServiceConfigurationsInput) SetServiceIds(v []*string) *DescribeVpcEndpointServiceConfigurationsInput {
	s.ServiceIds = v
	return s
}

type DescribeVpcEndpointServiceConfigurationsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about one or more services.
	ServiceConfigurations []*ServiceConfiguration `locationName:"serviceConfigurationSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointServiceConfigurationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointServiceConfigurationsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointServiceConfigurationsOutput) SetNextToken(v string) *DescribeVpcEndpointServiceConfigurationsOutput {
	s.NextToken = &v
	return s
}

// SetServiceConfigurations sets the ServiceConfigurations field's value.
func (s *DescribeVpcEndpointServiceConfigurationsOutput) SetServiceConfigurations(v []*ServiceConfiguration) *DescribeVpcEndpointServiceConfigurationsOutput {
	s.ServiceConfigurations = v
	return s
}

type DescribeVpcEndpointServicePermissionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * principal - The ARN of the principal.
	//
	//    * principal-type - The principal type (All | Service | OrganizationUnit
	//    | Account | User | Role).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for the request in a single page.
	// The remaining results of the initial request can be seen by sending another
	// request with the returned NextToken value. This value can be between 5 and
	// 1000; if MaxResults is given a value larger than 1000, only 1000 results
	// are returned.
	MaxResults *int64 `type:"integer"`

	// The token to retrieve the next page of results.
	NextToken *string `type:"string"`

	// The ID of the service.
	//
	// ServiceId is a required field
	ServiceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeVpcEndpointServicePermissionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointServicePermissionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeVpcEndpointServicePermissionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeVpcEndpointServicePermissionsInput"}
	if s.ServiceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcEndpointServicePermissionsInput) SetDryRun(v bool) *DescribeVpcEndpointServicePermissionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcEndpointServicePermissionsInput) SetFilters(v []*Filter) *DescribeVpcEndpointServicePermissionsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcEndpointServicePermissionsInput) SetMaxResults(v int64) *DescribeVpcEndpointServicePermissionsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointServicePermissionsInput) SetNextToken(v string) *DescribeVpcEndpointServicePermissionsInput {
	s.NextToken = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *DescribeVpcEndpointServicePermissionsInput) SetServiceId(v string) *DescribeVpcEndpointServicePermissionsInput {
	s.ServiceId = &v
	return s
}

type DescribeVpcEndpointServicePermissionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more allowed principals.
	AllowedPrincipals []*AllowedPrincipal `locationName:"allowedPrincipals" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s DescribeVpcEndpointServicePermissionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointServicePermissionsOutput) GoString() string {
	return s.String()
}

// SetAllowedPrincipals sets the AllowedPrincipals field's value.
func (s *DescribeVpcEndpointServicePermissionsOutput) SetAllowedPrincipals(v []*AllowedPrincipal) *DescribeVpcEndpointServicePermissionsOutput {
	s.AllowedPrincipals = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointServicePermissionsOutput) SetNextToken(v string) *DescribeVpcEndpointServicePermissionsOutput {
	s.NextToken = &v
	return s
}

// Contains the parameters for DescribeVpcEndpointServices.
type DescribeVpcEndpointServicesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * service-name: The name of the service.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	//
	// Constraint: If the value is greater than 1000, we return only 1000 items.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of items to return. (You received this token from
	// a prior call.)
	NextToken *string `type:"string"`

	// One or more service names.
	ServiceNames []*string `locationName:"ServiceName" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointServicesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointServicesInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcEndpointServicesInput) SetDryRun(v bool) *DescribeVpcEndpointServicesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcEndpointServicesInput) SetFilters(v []*Filter) *DescribeVpcEndpointServicesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcEndpointServicesInput) SetMaxResults(v int64) *DescribeVpcEndpointServicesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointServicesInput) SetNextToken(v string) *DescribeVpcEndpointServicesInput {
	s.NextToken = &v
	return s
}

// SetServiceNames sets the ServiceNames field's value.
func (s *DescribeVpcEndpointServicesInput) SetServiceNames(v []*string) *DescribeVpcEndpointServicesInput {
	s.ServiceNames = v
	return s
}

// Contains the output of DescribeVpcEndpointServices.
type DescribeVpcEndpointServicesOutput struct {
	_ struct{} `type:"structure"`

	// The token to use when requesting the next set of items. If there are no additional
	// items to return, the string is empty.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the service.
	ServiceDetails []*ServiceDetail `locationName:"serviceDetailSet" locationNameList:"item" type:"list"`

	// A list of supported services.
	ServiceNames []*string `locationName:"serviceNameSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointServicesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointServicesOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointServicesOutput) SetNextToken(v string) *DescribeVpcEndpointServicesOutput {
	s.NextToken = &v
	return s
}

// SetServiceDetails sets the ServiceDetails field's value.
func (s *DescribeVpcEndpointServicesOutput) SetServiceDetails(v []*ServiceDetail) *DescribeVpcEndpointServicesOutput {
	s.ServiceDetails = v
	return s
}

// SetServiceNames sets the ServiceNames field's value.
func (s *DescribeVpcEndpointServicesOutput) SetServiceNames(v []*string) *DescribeVpcEndpointServicesOutput {
	s.ServiceNames = v
	return s
}

// Contains the parameters for DescribeVpcEndpoints.
type DescribeVpcEndpointsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters.
	//
	//    * service-name: The name of the service.
	//
	//    * vpc-id: The ID of the VPC in which the endpoint resides.
	//
	//    * vpc-endpoint-id: The ID of the endpoint.
	//
	//    * vpc-endpoint-state: The state of the endpoint. (pending | available
	//    | deleting | deleted)
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of items to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	//
	// Constraint: If the value is greater than 1000, we return only 1000 items.
	MaxResults *int64 `type:"integer"`

	// The token for the next set of items to return. (You received this token from
	// a prior call.)
	NextToken *string `type:"string"`

	// One or more endpoint IDs.
	VpcEndpointIds []*string `locationName:"VpcEndpointId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcEndpointsInput) SetDryRun(v bool) *DescribeVpcEndpointsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcEndpointsInput) SetFilters(v []*Filter) *DescribeVpcEndpointsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcEndpointsInput) SetMaxResults(v int64) *DescribeVpcEndpointsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointsInput) SetNextToken(v string) *DescribeVpcEndpointsInput {
	s.NextToken = &v
	return s
}

// SetVpcEndpointIds sets the VpcEndpointIds field's value.
func (s *DescribeVpcEndpointsInput) SetVpcEndpointIds(v []*string) *DescribeVpcEndpointsInput {
	s.VpcEndpointIds = v
	return s
}

// Contains the output of DescribeVpcEndpoints.
type DescribeVpcEndpointsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use when requesting the next set of items. If there are no additional
	// items to return, the string is empty.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the endpoints.
	VpcEndpoints []*VpcEndpoint `locationName:"vpcEndpointSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcEndpointsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcEndpointsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcEndpointsOutput) SetNextToken(v string) *DescribeVpcEndpointsOutput {
	s.NextToken = &v
	return s
}

// SetVpcEndpoints sets the VpcEndpoints field's value.
func (s *DescribeVpcEndpointsOutput) SetVpcEndpoints(v []*VpcEndpoint) *DescribeVpcEndpointsOutput {
	s.VpcEndpoints = v
	return s
}

type DescribeVpcPeeringConnectionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * accepter-vpc-info.cidr-block - The IPv4 CIDR block of the accepter VPC.
	//
	//    * accepter-vpc-info.owner-id - The AWS account ID of the owner of the
	//    accepter VPC.
	//
	//    * accepter-vpc-info.vpc-id - The ID of the accepter VPC.
	//
	//    * expiration-time - The expiration date and time for the VPC peering connection.
	//
	//    * requester-vpc-info.cidr-block - The IPv4 CIDR block of the requester's
	//    VPC.
	//
	//    * requester-vpc-info.owner-id - The AWS account ID of the owner of the
	//    requester VPC.
	//
	//    * requester-vpc-info.vpc-id - The ID of the requester VPC.
	//
	//    * status-code - The status of the VPC peering connection (pending-acceptance
	//    | failed | expired | provisioning | active | deleting | deleted | rejected).
	//
	//    * status-message - A message that provides more information about the
	//    status of the VPC peering connection, if applicable.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-peering-connection-id - The ID of the VPC peering connection.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return for this request. The request returns
	// a token that you can specify in a subsequent call to get the next set of
	// results.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token to request the next page of results. (You received this token from
	// a prior call.)
	NextToken *string `type:"string"`

	// One or more VPC peering connection IDs.
	//
	// Default: Describes all your VPC peering connections.
	VpcPeeringConnectionIds []*string `locationName:"VpcPeeringConnectionId" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcPeeringConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcPeeringConnectionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeVpcPeeringConnectionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeVpcPeeringConnectionsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcPeeringConnectionsInput) SetDryRun(v bool) *DescribeVpcPeeringConnectionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcPeeringConnectionsInput) SetFilters(v []*Filter) *DescribeVpcPeeringConnectionsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeVpcPeeringConnectionsInput) SetMaxResults(v int64) *DescribeVpcPeeringConnectionsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcPeeringConnectionsInput) SetNextToken(v string) *DescribeVpcPeeringConnectionsInput {
	s.NextToken = &v
	return s
}

// SetVpcPeeringConnectionIds sets the VpcPeeringConnectionIds field's value.
func (s *DescribeVpcPeeringConnectionsInput) SetVpcPeeringConnectionIds(v []*string) *DescribeVpcPeeringConnectionsInput {
	s.VpcPeeringConnectionIds = v
	return s
}

type DescribeVpcPeeringConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the VPC peering connections.
	VpcPeeringConnections []*VpcPeeringConnection `locationName:"vpcPeeringConnectionSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcPeeringConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcPeeringConnectionsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeVpcPeeringConnectionsOutput) SetNextToken(v string) *DescribeVpcPeeringConnectionsOutput {
	s.NextToken = &v
	return s
}

// SetVpcPeeringConnections sets the VpcPeeringConnections field's value.
func (s *DescribeVpcPeeringConnectionsOutput) SetVpcPeeringConnections(v []*VpcPeeringConnection) *DescribeVpcPeeringConnectionsOutput {
	s.VpcPeeringConnections = v
	return s
}

type DescribeVpcsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * cidr - The primary IPv4 CIDR block of the VPC. The CIDR block you specify
	//    must exactly match the VPC's CIDR block for information to be returned
	//    for the VPC. Must contain the slash followed by one or two digits (for
	//    example, /28).
	//
	//    * cidr-block-association.cidr-block - An IPv4 CIDR block associated with
	//    the VPC.
	//
	//    * cidr-block-association.association-id - The association ID for an IPv4
	//    CIDR block associated with the VPC.
	//
	//    * cidr-block-association.state - The state of an IPv4 CIDR block associated
	//    with the VPC.
	//
	//    * dhcp-options-id - The ID of a set of DHCP options.
	//
	//    * ipv6-cidr-block-association.ipv6-cidr-block - An IPv6 CIDR block associated
	//    with the VPC.
	//
	//    * ipv6-cidr-block-association.association-id - The association ID for
	//    an IPv6 CIDR block associated with the VPC.
	//
	//    * ipv6-cidr-block-association.state - The state of an IPv6 CIDR block
	//    associated with the VPC.
	//
	//    * isDefault - Indicates whether the VPC is the default VPC.
	//
	//    * owner-id - The ID of the AWS account that owns the VPC.
	//
	//    * state - The state of the VPC (pending | available).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * vpc-id - The ID of the VPC.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more VPC IDs.
	//
	// Default: Describes all your VPCs.
	VpcIds []*string `locationName:"VpcId" locationNameList:"VpcId" type:"list"`
}

// String returns the string representation
func (s DescribeVpcsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpcsInput) SetDryRun(v bool) *DescribeVpcsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpcsInput) SetFilters(v []*Filter) *DescribeVpcsInput {
	s.Filters = v
	return s
}

// SetVpcIds sets the VpcIds field's value.
func (s *DescribeVpcsInput) SetVpcIds(v []*string) *DescribeVpcsInput {
	s.VpcIds = v
	return s
}

type DescribeVpcsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more VPCs.
	Vpcs []*Vpc `locationName:"vpcSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpcsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpcsOutput) GoString() string {
	return s.String()
}

// SetVpcs sets the Vpcs field's value.
func (s *DescribeVpcsOutput) SetVpcs(v []*Vpc) *DescribeVpcsOutput {
	s.Vpcs = v
	return s
}

// Contains the parameters for DescribeVpnConnections.
type DescribeVpnConnectionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * customer-gateway-configuration - The configuration information for the
	//    customer gateway.
	//
	//    * customer-gateway-id - The ID of a customer gateway associated with the
	//    VPN connection.
	//
	//    * state - The state of the VPN connection (pending | available | deleting
	//    | deleted).
	//
	//    * option.static-routes-only - Indicates whether the connection has static
	//    routes only. Used for devices that do not support Border Gateway Protocol
	//    (BGP).
	//
	//    * route.destination-cidr-block - The destination CIDR block. This corresponds
	//    to the subnet used in a customer data center.
	//
	//    * bgp-asn - The BGP Autonomous System Number (ASN) associated with a BGP
	//    device.
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * type - The type of VPN connection. Currently the only supported type
	//    is ipsec.1.
	//
	//    * vpn-connection-id - The ID of the VPN connection.
	//
	//    * vpn-gateway-id - The ID of a virtual private gateway associated with
	//    the VPN connection.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more VPN connection IDs.
	//
	// Default: Describes your VPN connections.
	VpnConnectionIds []*string `locationName:"VpnConnectionId" locationNameList:"VpnConnectionId" type:"list"`
}

// String returns the string representation
func (s DescribeVpnConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpnConnectionsInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpnConnectionsInput) SetDryRun(v bool) *DescribeVpnConnectionsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpnConnectionsInput) SetFilters(v []*Filter) *DescribeVpnConnectionsInput {
	s.Filters = v
	return s
}

// SetVpnConnectionIds sets the VpnConnectionIds field's value.
func (s *DescribeVpnConnectionsInput) SetVpnConnectionIds(v []*string) *DescribeVpnConnectionsInput {
	s.VpnConnectionIds = v
	return s
}

// Contains the output of DescribeVpnConnections.
type DescribeVpnConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more VPN connections.
	VpnConnections []*VpnConnection `locationName:"vpnConnectionSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpnConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpnConnectionsOutput) GoString() string {
	return s.String()
}

// SetVpnConnections sets the VpnConnections field's value.
func (s *DescribeVpnConnectionsOutput) SetVpnConnections(v []*VpnConnection) *DescribeVpnConnectionsOutput {
	s.VpnConnections = v
	return s
}

// Contains the parameters for DescribeVpnGateways.
type DescribeVpnGatewaysInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more filters.
	//
	//    * amazon-side-asn - The Autonomous System Number (ASN) for the Amazon
	//    side of the gateway.
	//
	//    * attachment.state - The current state of the attachment between the gateway
	//    and the VPC (attaching | attached | detaching | detached).
	//
	//    * attachment.vpc-id - The ID of an attached VPC.
	//
	//    * availability-zone - The Availability Zone for the virtual private gateway
	//    (if applicable).
	//
	//    * state - The state of the virtual private gateway (pending | available
	//    | deleting | deleted).
	//
	//    * tag:<key> - The key/value combination of a tag assigned to the resource.
	//    Use the tag key in the filter name and the tag value as the filter value.
	//    For example, to find all resources that have a tag with the key Owner
	//    and the value TeamA, specify tag:Owner for the filter name and TeamA for
	//    the filter value.
	//
	//    * tag-key - The key of a tag assigned to the resource. Use this filter
	//    to find all resources assigned a tag with a specific key, regardless of
	//    the tag value.
	//
	//    * type - The type of virtual private gateway. Currently the only supported
	//    type is ipsec.1.
	//
	//    * vpn-gateway-id - The ID of the virtual private gateway.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// One or more virtual private gateway IDs.
	//
	// Default: Describes all your virtual private gateways.
	VpnGatewayIds []*string `locationName:"VpnGatewayId" locationNameList:"VpnGatewayId" type:"list"`
}

// String returns the string representation
func (s DescribeVpnGatewaysInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpnGatewaysInput) GoString() string {
	return s.String()
}

// SetDryRun sets the DryRun field's value.
func (s *DescribeVpnGatewaysInput) SetDryRun(v bool) *DescribeVpnGatewaysInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *DescribeVpnGatewaysInput) SetFilters(v []*Filter) *DescribeVpnGatewaysInput {
	s.Filters = v
	return s
}

// SetVpnGatewayIds sets the VpnGatewayIds field's value.
func (s *DescribeVpnGatewaysInput) SetVpnGatewayIds(v []*string) *DescribeVpnGatewaysInput {
	s.VpnGatewayIds = v
	return s
}

// Contains the output of DescribeVpnGateways.
type DescribeVpnGatewaysOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more virtual private gateways.
	VpnGateways []*VpnGateway `locationName:"vpnGatewaySet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DescribeVpnGatewaysOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeVpnGatewaysOutput) GoString() string {
	return s.String()
}

// SetVpnGateways sets the VpnGateways field's value.
func (s *DescribeVpnGatewaysOutput) SetVpnGateways(v []*VpnGateway) *DescribeVpnGatewaysOutput {
	s.VpnGateways = v
	return s
}

type DetachClassicLinkVpcInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance to unlink from the VPC.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// The ID of the VPC to which the instance is linked.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s DetachClassicLinkVpcInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachClassicLinkVpcInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DetachClassicLinkVpcInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DetachClassicLinkVpcInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DetachClassicLinkVpcInput) SetDryRun(v bool) *DetachClassicLinkVpcInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *DetachClassicLinkVpcInput) SetInstanceId(v string) *DetachClassicLinkVpcInput {
	s.InstanceId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DetachClassicLinkVpcInput) SetVpcId(v string) *DetachClassicLinkVpcInput {
	s.VpcId = &v
	return s
}

type DetachClassicLinkVpcOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s DetachClassicLinkVpcOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachClassicLinkVpcOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *DetachClassicLinkVpcOutput) SetReturn(v bool) *DetachClassicLinkVpcOutput {
	s.Return = &v
	return s
}

type DetachInternetGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the internet gateway.
	//
	// InternetGatewayId is a required field
	InternetGatewayId *string `locationName:"internetGatewayId" type:"string" required:"true"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s DetachInternetGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachInternetGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DetachInternetGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DetachInternetGatewayInput"}
	if s.InternetGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("InternetGatewayId"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DetachInternetGatewayInput) SetDryRun(v bool) *DetachInternetGatewayInput {
	s.DryRun = &v
	return s
}

// SetInternetGatewayId sets the InternetGatewayId field's value.
func (s *DetachInternetGatewayInput) SetInternetGatewayId(v string) *DetachInternetGatewayInput {
	s.InternetGatewayId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DetachInternetGatewayInput) SetVpcId(v string) *DetachInternetGatewayInput {
	s.VpcId = &v
	return s
}

type DetachInternetGatewayOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DetachInternetGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachInternetGatewayOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DetachNetworkInterface.
type DetachNetworkInterfaceInput struct {
	_ struct{} `type:"structure"`

	// The ID of the attachment.
	//
	// AttachmentId is a required field
	AttachmentId *string `locationName:"attachmentId" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Specifies whether to force a detachment.
	Force *bool `locationName:"force" type:"boolean"`
}

// String returns the string representation
func (s DetachNetworkInterfaceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachNetworkInterfaceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DetachNetworkInterfaceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DetachNetworkInterfaceInput"}
	if s.AttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("AttachmentId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttachmentId sets the AttachmentId field's value.
func (s *DetachNetworkInterfaceInput) SetAttachmentId(v string) *DetachNetworkInterfaceInput {
	s.AttachmentId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DetachNetworkInterfaceInput) SetDryRun(v bool) *DetachNetworkInterfaceInput {
	s.DryRun = &v
	return s
}

// SetForce sets the Force field's value.
func (s *DetachNetworkInterfaceInput) SetForce(v bool) *DetachNetworkInterfaceInput {
	s.Force = &v
	return s
}

type DetachNetworkInterfaceOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DetachNetworkInterfaceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachNetworkInterfaceOutput) GoString() string {
	return s.String()
}

// Contains the parameters for DetachVolume.
type DetachVolumeInput struct {
	_ struct{} `type:"structure"`

	// The device name.
	Device *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Forces detachment if the previous detachment attempt did not occur cleanly
	// (for example, logging into an instance, unmounting the volume, and detaching
	// normally). This option can lead to data loss or a corrupted file system.
	// Use this option only as a last resort to detach a volume from a failed instance.
	// The instance won't have an opportunity to flush file system caches or file
	// system metadata. If you use this option, you must perform file system check
	// and repair procedures.
	Force *bool `type:"boolean"`

	// The ID of the instance.
	InstanceId *string `type:"string"`

	// The ID of the volume.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DetachVolumeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachVolumeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DetachVolumeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DetachVolumeInput"}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDevice sets the Device field's value.
func (s *DetachVolumeInput) SetDevice(v string) *DetachVolumeInput {
	s.Device = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DetachVolumeInput) SetDryRun(v bool) *DetachVolumeInput {
	s.DryRun = &v
	return s
}

// SetForce sets the Force field's value.
func (s *DetachVolumeInput) SetForce(v bool) *DetachVolumeInput {
	s.Force = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *DetachVolumeInput) SetInstanceId(v string) *DetachVolumeInput {
	s.InstanceId = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *DetachVolumeInput) SetVolumeId(v string) *DetachVolumeInput {
	s.VolumeId = &v
	return s
}

// Contains the parameters for DetachVpnGateway.
type DetachVpnGatewayInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`

	// The ID of the virtual private gateway.
	//
	// VpnGatewayId is a required field
	VpnGatewayId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DetachVpnGatewayInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachVpnGatewayInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DetachVpnGatewayInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DetachVpnGatewayInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}
	if s.VpnGatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpnGatewayId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DetachVpnGatewayInput) SetDryRun(v bool) *DetachVpnGatewayInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DetachVpnGatewayInput) SetVpcId(v string) *DetachVpnGatewayInput {
	s.VpcId = &v
	return s
}

// SetVpnGatewayId sets the VpnGatewayId field's value.
func (s *DetachVpnGatewayInput) SetVpnGatewayId(v string) *DetachVpnGatewayInput {
	s.VpnGatewayId = &v
	return s
}

type DetachVpnGatewayOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DetachVpnGatewayOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DetachVpnGatewayOutput) GoString() string {
	return s.String()
}

// Describes a DHCP configuration option.
type DhcpConfiguration struct {
	_ struct{} `type:"structure"`

	// The name of a DHCP option.
	Key *string `locationName:"key" type:"string"`

	// One or more values for the DHCP option.
	Values []*AttributeValue `locationName:"valueSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DhcpConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DhcpConfiguration) GoString() string {
	return s.String()
}

// SetKey sets the Key field's value.
func (s *DhcpConfiguration) SetKey(v string) *DhcpConfiguration {
	s.Key = &v
	return s
}

// SetValues sets the Values field's value.
func (s *DhcpConfiguration) SetValues(v []*AttributeValue) *DhcpConfiguration {
	s.Values = v
	return s
}

// Describes a set of DHCP options.
type DhcpOptions struct {
	_ struct{} `type:"structure"`

	// One or more DHCP options in the set.
	DhcpConfigurations []*DhcpConfiguration `locationName:"dhcpConfigurationSet" locationNameList:"item" type:"list"`

	// The ID of the set of DHCP options.
	DhcpOptionsId *string `locationName:"dhcpOptionsId" type:"string"`

	// The ID of the AWS account that owns the DHCP options set.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Any tags assigned to the DHCP options set.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s DhcpOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DhcpOptions) GoString() string {
	return s.String()
}

// SetDhcpConfigurations sets the DhcpConfigurations field's value.
func (s *DhcpOptions) SetDhcpConfigurations(v []*DhcpConfiguration) *DhcpOptions {
	s.DhcpConfigurations = v
	return s
}

// SetDhcpOptionsId sets the DhcpOptionsId field's value.
func (s *DhcpOptions) SetDhcpOptionsId(v string) *DhcpOptions {
	s.DhcpOptionsId = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *DhcpOptions) SetOwnerId(v string) *DhcpOptions {
	s.OwnerId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *DhcpOptions) SetTags(v []*Tag) *DhcpOptions {
	s.Tags = v
	return s
}

// Describes an Active Directory.
type DirectoryServiceAuthentication struct {
	_ struct{} `type:"structure"`

	// The ID of the Active Directory used for authentication.
	DirectoryId *string `locationName:"directoryId" type:"string"`
}

// String returns the string representation
func (s DirectoryServiceAuthentication) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DirectoryServiceAuthentication) GoString() string {
	return s.String()
}

// SetDirectoryId sets the DirectoryId field's value.
func (s *DirectoryServiceAuthentication) SetDirectoryId(v string) *DirectoryServiceAuthentication {
	s.DirectoryId = &v
	return s
}

// Describes the Active Directory to be used for client authentication.
type DirectoryServiceAuthenticationRequest struct {
	_ struct{} `type:"structure"`

	// The ID of the Active Directory to be used for authentication.
	DirectoryId *string `type:"string"`
}

// String returns the string representation
func (s DirectoryServiceAuthenticationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DirectoryServiceAuthenticationRequest) GoString() string {
	return s.String()
}

// SetDirectoryId sets the DirectoryId field's value.
func (s *DirectoryServiceAuthenticationRequest) SetDirectoryId(v string) *DirectoryServiceAuthenticationRequest {
	s.DirectoryId = &v
	return s
}

type DisableTransitGatewayRouteTablePropagationInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`

	// The ID of the propagation route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DisableTransitGatewayRouteTablePropagationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableTransitGatewayRouteTablePropagationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisableTransitGatewayRouteTablePropagationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisableTransitGatewayRouteTablePropagationInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DisableTransitGatewayRouteTablePropagationInput) SetDryRun(v bool) *DisableTransitGatewayRouteTablePropagationInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *DisableTransitGatewayRouteTablePropagationInput) SetTransitGatewayAttachmentId(v string) *DisableTransitGatewayRouteTablePropagationInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *DisableTransitGatewayRouteTablePropagationInput) SetTransitGatewayRouteTableId(v string) *DisableTransitGatewayRouteTablePropagationInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type DisableTransitGatewayRouteTablePropagationOutput struct {
	_ struct{} `type:"structure"`

	// Information about route propagation.
	Propagation *TransitGatewayPropagation `locationName:"propagation" type:"structure"`
}

// String returns the string representation
func (s DisableTransitGatewayRouteTablePropagationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableTransitGatewayRouteTablePropagationOutput) GoString() string {
	return s.String()
}

// SetPropagation sets the Propagation field's value.
func (s *DisableTransitGatewayRouteTablePropagationOutput) SetPropagation(v *TransitGatewayPropagation) *DisableTransitGatewayRouteTablePropagationOutput {
	s.Propagation = v
	return s
}

// Contains the parameters for DisableVgwRoutePropagation.
type DisableVgwRoutePropagationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the virtual private gateway.
	//
	// GatewayId is a required field
	GatewayId *string `type:"string" required:"true"`

	// The ID of the route table.
	//
	// RouteTableId is a required field
	RouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DisableVgwRoutePropagationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableVgwRoutePropagationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisableVgwRoutePropagationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisableVgwRoutePropagationInput"}
	if s.GatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("GatewayId"))
	}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetGatewayId sets the GatewayId field's value.
func (s *DisableVgwRoutePropagationInput) SetGatewayId(v string) *DisableVgwRoutePropagationInput {
	s.GatewayId = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *DisableVgwRoutePropagationInput) SetRouteTableId(v string) *DisableVgwRoutePropagationInput {
	s.RouteTableId = &v
	return s
}

type DisableVgwRoutePropagationOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DisableVgwRoutePropagationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableVgwRoutePropagationOutput) GoString() string {
	return s.String()
}

type DisableVpcClassicLinkDnsSupportInput struct {
	_ struct{} `type:"structure"`

	// The ID of the VPC.
	VpcId *string `type:"string"`
}

// String returns the string representation
func (s DisableVpcClassicLinkDnsSupportInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableVpcClassicLinkDnsSupportInput) GoString() string {
	return s.String()
}

// SetVpcId sets the VpcId field's value.
func (s *DisableVpcClassicLinkDnsSupportInput) SetVpcId(v string) *DisableVpcClassicLinkDnsSupportInput {
	s.VpcId = &v
	return s
}

type DisableVpcClassicLinkDnsSupportOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s DisableVpcClassicLinkDnsSupportOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableVpcClassicLinkDnsSupportOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *DisableVpcClassicLinkDnsSupportOutput) SetReturn(v bool) *DisableVpcClassicLinkDnsSupportOutput {
	s.Return = &v
	return s
}

type DisableVpcClassicLinkInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s DisableVpcClassicLinkInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableVpcClassicLinkInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisableVpcClassicLinkInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisableVpcClassicLinkInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DisableVpcClassicLinkInput) SetDryRun(v bool) *DisableVpcClassicLinkInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DisableVpcClassicLinkInput) SetVpcId(v string) *DisableVpcClassicLinkInput {
	s.VpcId = &v
	return s
}

type DisableVpcClassicLinkOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s DisableVpcClassicLinkOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableVpcClassicLinkOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *DisableVpcClassicLinkOutput) SetReturn(v bool) *DisableVpcClassicLinkOutput {
	s.Return = &v
	return s
}

type DisassociateAddressInput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] The association ID. Required for EC2-VPC.
	AssociationId *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// [EC2-Classic] The Elastic IP address. Required for EC2-Classic.
	PublicIp *string `type:"string"`
}

// String returns the string representation
func (s DisassociateAddressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateAddressInput) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateAddressInput) SetAssociationId(v string) *DisassociateAddressInput {
	s.AssociationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DisassociateAddressInput) SetDryRun(v bool) *DisassociateAddressInput {
	s.DryRun = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *DisassociateAddressInput) SetPublicIp(v string) *DisassociateAddressInput {
	s.PublicIp = &v
	return s
}

type DisassociateAddressOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DisassociateAddressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateAddressOutput) GoString() string {
	return s.String()
}

type DisassociateClientVpnTargetNetworkInput struct {
	_ struct{} `type:"structure"`

	// The ID of the target network association.
	//
	// AssociationId is a required field
	AssociationId *string `type:"string" required:"true"`

	// The ID of the Client VPN endpoint from which to disassociate the target network.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s DisassociateClientVpnTargetNetworkInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateClientVpnTargetNetworkInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisassociateClientVpnTargetNetworkInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisassociateClientVpnTargetNetworkInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateClientVpnTargetNetworkInput) SetAssociationId(v string) *DisassociateClientVpnTargetNetworkInput {
	s.AssociationId = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *DisassociateClientVpnTargetNetworkInput) SetClientVpnEndpointId(v string) *DisassociateClientVpnTargetNetworkInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DisassociateClientVpnTargetNetworkInput) SetDryRun(v bool) *DisassociateClientVpnTargetNetworkInput {
	s.DryRun = &v
	return s
}

type DisassociateClientVpnTargetNetworkOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the target network association.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The current state of the target network association.
	Status *AssociationStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s DisassociateClientVpnTargetNetworkOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateClientVpnTargetNetworkOutput) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateClientVpnTargetNetworkOutput) SetAssociationId(v string) *DisassociateClientVpnTargetNetworkOutput {
	s.AssociationId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *DisassociateClientVpnTargetNetworkOutput) SetStatus(v *AssociationStatus) *DisassociateClientVpnTargetNetworkOutput {
	s.Status = v
	return s
}

type DisassociateIamInstanceProfileInput struct {
	_ struct{} `type:"structure"`

	// The ID of the IAM instance profile association.
	//
	// AssociationId is a required field
	AssociationId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DisassociateIamInstanceProfileInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateIamInstanceProfileInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisassociateIamInstanceProfileInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisassociateIamInstanceProfileInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateIamInstanceProfileInput) SetAssociationId(v string) *DisassociateIamInstanceProfileInput {
	s.AssociationId = &v
	return s
}

type DisassociateIamInstanceProfileOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IAM instance profile association.
	IamInstanceProfileAssociation *IamInstanceProfileAssociation `locationName:"iamInstanceProfileAssociation" type:"structure"`
}

// String returns the string representation
func (s DisassociateIamInstanceProfileOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateIamInstanceProfileOutput) GoString() string {
	return s.String()
}

// SetIamInstanceProfileAssociation sets the IamInstanceProfileAssociation field's value.
func (s *DisassociateIamInstanceProfileOutput) SetIamInstanceProfileAssociation(v *IamInstanceProfileAssociation) *DisassociateIamInstanceProfileOutput {
	s.IamInstanceProfileAssociation = v
	return s
}

type DisassociateRouteTableInput struct {
	_ struct{} `type:"structure"`

	// The association ID representing the current association between the route
	// table and subnet.
	//
	// AssociationId is a required field
	AssociationId *string `locationName:"associationId" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`
}

// String returns the string representation
func (s DisassociateRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisassociateRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisassociateRouteTableInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateRouteTableInput) SetAssociationId(v string) *DisassociateRouteTableInput {
	s.AssociationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *DisassociateRouteTableInput) SetDryRun(v bool) *DisassociateRouteTableInput {
	s.DryRun = &v
	return s
}

type DisassociateRouteTableOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DisassociateRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateRouteTableOutput) GoString() string {
	return s.String()
}

type DisassociateSubnetCidrBlockInput struct {
	_ struct{} `type:"structure"`

	// The association ID for the CIDR block.
	//
	// AssociationId is a required field
	AssociationId *string `locationName:"associationId" type:"string" required:"true"`
}

// String returns the string representation
func (s DisassociateSubnetCidrBlockInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateSubnetCidrBlockInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisassociateSubnetCidrBlockInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisassociateSubnetCidrBlockInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateSubnetCidrBlockInput) SetAssociationId(v string) *DisassociateSubnetCidrBlockInput {
	s.AssociationId = &v
	return s
}

type DisassociateSubnetCidrBlockOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IPv6 CIDR block association.
	Ipv6CidrBlockAssociation *SubnetIpv6CidrBlockAssociation `locationName:"ipv6CidrBlockAssociation" type:"structure"`

	// The ID of the subnet.
	SubnetId *string `locationName:"subnetId" type:"string"`
}

// String returns the string representation
func (s DisassociateSubnetCidrBlockOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateSubnetCidrBlockOutput) GoString() string {
	return s.String()
}

// SetIpv6CidrBlockAssociation sets the Ipv6CidrBlockAssociation field's value.
func (s *DisassociateSubnetCidrBlockOutput) SetIpv6CidrBlockAssociation(v *SubnetIpv6CidrBlockAssociation) *DisassociateSubnetCidrBlockOutput {
	s.Ipv6CidrBlockAssociation = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *DisassociateSubnetCidrBlockOutput) SetSubnetId(v string) *DisassociateSubnetCidrBlockOutput {
	s.SubnetId = &v
	return s
}

type DisassociateTransitGatewayRouteTableInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DisassociateTransitGatewayRouteTableInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateTransitGatewayRouteTableInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisassociateTransitGatewayRouteTableInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisassociateTransitGatewayRouteTableInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *DisassociateTransitGatewayRouteTableInput) SetDryRun(v bool) *DisassociateTransitGatewayRouteTableInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *DisassociateTransitGatewayRouteTableInput) SetTransitGatewayAttachmentId(v string) *DisassociateTransitGatewayRouteTableInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *DisassociateTransitGatewayRouteTableInput) SetTransitGatewayRouteTableId(v string) *DisassociateTransitGatewayRouteTableInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type DisassociateTransitGatewayRouteTableOutput struct {
	_ struct{} `type:"structure"`

	// Information about the association.
	Association *TransitGatewayAssociation `locationName:"association" type:"structure"`
}

// String returns the string representation
func (s DisassociateTransitGatewayRouteTableOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateTransitGatewayRouteTableOutput) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *DisassociateTransitGatewayRouteTableOutput) SetAssociation(v *TransitGatewayAssociation) *DisassociateTransitGatewayRouteTableOutput {
	s.Association = v
	return s
}

type DisassociateVpcCidrBlockInput struct {
	_ struct{} `type:"structure"`

	// The association ID for the CIDR block.
	//
	// AssociationId is a required field
	AssociationId *string `locationName:"associationId" type:"string" required:"true"`
}

// String returns the string representation
func (s DisassociateVpcCidrBlockInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateVpcCidrBlockInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DisassociateVpcCidrBlockInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DisassociateVpcCidrBlockInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *DisassociateVpcCidrBlockInput) SetAssociationId(v string) *DisassociateVpcCidrBlockInput {
	s.AssociationId = &v
	return s
}

type DisassociateVpcCidrBlockOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IPv4 CIDR block association.
	CidrBlockAssociation *VpcCidrBlockAssociation `locationName:"cidrBlockAssociation" type:"structure"`

	// Information about the IPv6 CIDR block association.
	Ipv6CidrBlockAssociation *VpcIpv6CidrBlockAssociation `locationName:"ipv6CidrBlockAssociation" type:"structure"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s DisassociateVpcCidrBlockOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisassociateVpcCidrBlockOutput) GoString() string {
	return s.String()
}

// SetCidrBlockAssociation sets the CidrBlockAssociation field's value.
func (s *DisassociateVpcCidrBlockOutput) SetCidrBlockAssociation(v *VpcCidrBlockAssociation) *DisassociateVpcCidrBlockOutput {
	s.CidrBlockAssociation = v
	return s
}

// SetIpv6CidrBlockAssociation sets the Ipv6CidrBlockAssociation field's value.
func (s *DisassociateVpcCidrBlockOutput) SetIpv6CidrBlockAssociation(v *VpcIpv6CidrBlockAssociation) *DisassociateVpcCidrBlockOutput {
	s.Ipv6CidrBlockAssociation = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *DisassociateVpcCidrBlockOutput) SetVpcId(v string) *DisassociateVpcCidrBlockOutput {
	s.VpcId = &v
	return s
}

// Describes a disk image.
type DiskImage struct {
	_ struct{} `type:"structure"`

	// A description of the disk image.
	Description *string `type:"string"`

	// Information about the disk image.
	Image *DiskImageDetail `type:"structure"`

	// Information about the volume.
	Volume *VolumeDetail `type:"structure"`
}

// String returns the string representation
func (s DiskImage) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DiskImage) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DiskImage) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DiskImage"}
	if s.Image != nil {
		if err := s.Image.Validate(); err != nil {
			invalidParams.AddNested("Image", err.(request.ErrInvalidParams))
		}
	}
	if s.Volume != nil {
		if err := s.Volume.Validate(); err != nil {
			invalidParams.AddNested("Volume", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *DiskImage) SetDescription(v string) *DiskImage {
	s.Description = &v
	return s
}

// SetImage sets the Image field's value.
func (s *DiskImage) SetImage(v *DiskImageDetail) *DiskImage {
	s.Image = v
	return s
}

// SetVolume sets the Volume field's value.
func (s *DiskImage) SetVolume(v *VolumeDetail) *DiskImage {
	s.Volume = v
	return s
}

// Describes a disk image.
type DiskImageDescription struct {
	_ struct{} `type:"structure"`

	// The checksum computed for the disk image.
	Checksum *string `locationName:"checksum" type:"string"`

	// The disk image format.
	Format *string `locationName:"format" type:"string" enum:"DiskImageFormat"`

	// A presigned URL for the import manifest stored in Amazon S3. For information
	// about creating a presigned URL for an Amazon S3 object, read the "Query String
	// Request Authentication Alternative" section of the Authenticating REST Requests
	// (https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html)
	// topic in the Amazon Simple Storage Service Developer Guide.
	//
	// For information about the import manifest referenced by this API action,
	// see VM Import Manifest (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html).
	ImportManifestUrl *string `locationName:"importManifestUrl" type:"string"`

	// The size of the disk image, in GiB.
	Size *int64 `locationName:"size" type:"long"`
}

// String returns the string representation
func (s DiskImageDescription) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DiskImageDescription) GoString() string {
	return s.String()
}

// SetChecksum sets the Checksum field's value.
func (s *DiskImageDescription) SetChecksum(v string) *DiskImageDescription {
	s.Checksum = &v
	return s
}

// SetFormat sets the Format field's value.
func (s *DiskImageDescription) SetFormat(v string) *DiskImageDescription {
	s.Format = &v
	return s
}

// SetImportManifestUrl sets the ImportManifestUrl field's value.
func (s *DiskImageDescription) SetImportManifestUrl(v string) *DiskImageDescription {
	s.ImportManifestUrl = &v
	return s
}

// SetSize sets the Size field's value.
func (s *DiskImageDescription) SetSize(v int64) *DiskImageDescription {
	s.Size = &v
	return s
}

// Describes a disk image.
type DiskImageDetail struct {
	_ struct{} `type:"structure"`

	// The size of the disk image, in GiB.
	//
	// Bytes is a required field
	Bytes *int64 `locationName:"bytes" type:"long" required:"true"`

	// The disk image format.
	//
	// Format is a required field
	Format *string `locationName:"format" type:"string" required:"true" enum:"DiskImageFormat"`

	// A presigned URL for the import manifest stored in Amazon S3 and presented
	// here as an Amazon S3 presigned URL. For information about creating a presigned
	// URL for an Amazon S3 object, read the "Query String Request Authentication
	// Alternative" section of the Authenticating REST Requests (https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html)
	// topic in the Amazon Simple Storage Service Developer Guide.
	//
	// For information about the import manifest referenced by this API action,
	// see VM Import Manifest (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html).
	//
	// ImportManifestUrl is a required field
	ImportManifestUrl *string `locationName:"importManifestUrl" type:"string" required:"true"`
}

// String returns the string representation
func (s DiskImageDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DiskImageDetail) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DiskImageDetail) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DiskImageDetail"}
	if s.Bytes == nil {
		invalidParams.Add(request.NewErrParamRequired("Bytes"))
	}
	if s.Format == nil {
		invalidParams.Add(request.NewErrParamRequired("Format"))
	}
	if s.ImportManifestUrl == nil {
		invalidParams.Add(request.NewErrParamRequired("ImportManifestUrl"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBytes sets the Bytes field's value.
func (s *DiskImageDetail) SetBytes(v int64) *DiskImageDetail {
	s.Bytes = &v
	return s
}

// SetFormat sets the Format field's value.
func (s *DiskImageDetail) SetFormat(v string) *DiskImageDetail {
	s.Format = &v
	return s
}

// SetImportManifestUrl sets the ImportManifestUrl field's value.
func (s *DiskImageDetail) SetImportManifestUrl(v string) *DiskImageDetail {
	s.ImportManifestUrl = &v
	return s
}

// Describes a disk image volume.
type DiskImageVolumeDescription struct {
	_ struct{} `type:"structure"`

	// The volume identifier.
	Id *string `locationName:"id" type:"string"`

	// The size of the volume, in GiB.
	Size *int64 `locationName:"size" type:"long"`
}

// String returns the string representation
func (s DiskImageVolumeDescription) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DiskImageVolumeDescription) GoString() string {
	return s.String()
}

// SetId sets the Id field's value.
func (s *DiskImageVolumeDescription) SetId(v string) *DiskImageVolumeDescription {
	s.Id = &v
	return s
}

// SetSize sets the Size field's value.
func (s *DiskImageVolumeDescription) SetSize(v int64) *DiskImageVolumeDescription {
	s.Size = &v
	return s
}

// Describes a DNS entry.
type DnsEntry struct {
	_ struct{} `type:"structure"`

	// The DNS name.
	DnsName *string `locationName:"dnsName" type:"string"`

	// The ID of the private hosted zone.
	HostedZoneId *string `locationName:"hostedZoneId" type:"string"`
}

// String returns the string representation
func (s DnsEntry) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DnsEntry) GoString() string {
	return s.String()
}

// SetDnsName sets the DnsName field's value.
func (s *DnsEntry) SetDnsName(v string) *DnsEntry {
	s.DnsName = &v
	return s
}

// SetHostedZoneId sets the HostedZoneId field's value.
func (s *DnsEntry) SetHostedZoneId(v string) *DnsEntry {
	s.HostedZoneId = &v
	return s
}

// Information about the DNS server to be used.
type DnsServersOptionsModifyStructure struct {
	_ struct{} `type:"structure"`

	// The IPv4 address range, in CIDR notation, of the DNS servers to be used.
	// You can specify up to two DNS servers. Ensure that the DNS servers can be
	// reached by the clients. The specified values overwrite the existing values.
	CustomDnsServers []*string `locationNameList:"item" type:"list"`

	// Indicates whether DNS servers should be used. Specify False to delete the
	// existing DNS servers.
	Enabled *bool `type:"boolean"`
}

// String returns the string representation
func (s DnsServersOptionsModifyStructure) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DnsServersOptionsModifyStructure) GoString() string {
	return s.String()
}

// SetCustomDnsServers sets the CustomDnsServers field's value.
func (s *DnsServersOptionsModifyStructure) SetCustomDnsServers(v []*string) *DnsServersOptionsModifyStructure {
	s.CustomDnsServers = v
	return s
}

// SetEnabled sets the Enabled field's value.
func (s *DnsServersOptionsModifyStructure) SetEnabled(v bool) *DnsServersOptionsModifyStructure {
	s.Enabled = &v
	return s
}

// Describes a block device for an EBS volume.
type EbsBlockDevice struct {
	_ struct{} `type:"structure"`

	// Indicates whether the EBS volume is deleted on instance termination.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// Indicates whether the EBS volume is encrypted. Encrypted volumes can only
	// be attached to instances that support Amazon EBS encryption.
	//
	// If you are creating a volume from a snapshot, you cannot specify an encryption
	// value. This is because only blank volumes can be encrypted on creation. If
	// you are creating a snapshot from an existing EBS volume, you cannot specify
	// an encryption value that differs from that of the EBS volume. We recommend
	// that you omit the encryption value from the block device mappings when creating
	// an image from an instance.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The number of I/O operations per second (IOPS) that the volume supports.
	// For io1, this represents the number of IOPS that are provisioned for the
	// volume. For gp2, this represents the baseline performance of the volume and
	// the rate at which the volume accumulates I/O credits for bursting. For more
	// information about General Purpose SSD baseline performance, I/O credits,
	// and bursting, see Amazon EBS Volume Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Constraints: Range is 100-16,000 IOPS for gp2 volumes and 100 to 64,000IOPS
	// for io1 volumes in most Regions. Maximum io1IOPS of 64,000 is guaranteed
	// only on Nitro-based instances (AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances).
	// Other instance families guarantee performance up to 32,000 IOPS. For more
	// information, see Amazon EBS Volume Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Condition: This parameter is required for requests to create io1 volumes;
	// it is not used in requests to create gp2, st1, sc1, or standard volumes.
	Iops *int64 `locationName:"iops" type:"integer"`

	// Identifier (key ID, key alias, ID ARN, or alias ARN) for a user-managed CMK
	// under which the EBS volume is encrypted.
	//
	// This parameter is only supported on BlockDeviceMapping objects called by
	// RunInstances (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html),
	// RequestSpotFleet (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet.html),
	// and RequestSpotInstances (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html).
	KmsKeyId *string `type:"string"`

	// The ID of the snapshot.
	SnapshotId *string `locationName:"snapshotId" type:"string"`

	// The size of the volume, in GiB.
	//
	// Constraints: 1-16384 for General Purpose SSD (gp2), 4-16384 for Provisioned
	// IOPS SSD (io1), 500-16384 for Throughput Optimized HDD (st1), 500-16384 for
	// Cold HDD (sc1), and 1-1024 for Magnetic (standard) volumes. If you specify
	// a snapshot, the volume size must be equal to or larger than the snapshot
	// size.
	//
	// Default: If you're creating the volume from a snapshot and don't specify
	// a volume size, the default is the snapshot size.
	VolumeSize *int64 `locationName:"volumeSize" type:"integer"`

	// The volume type: gp2, io1, st1, sc1, or standard.
	//
	// Default: standard
	VolumeType *string `locationName:"volumeType" type:"string" enum:"VolumeType"`
}

// String returns the string representation
func (s EbsBlockDevice) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EbsBlockDevice) GoString() string {
	return s.String()
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *EbsBlockDevice) SetDeleteOnTermination(v bool) *EbsBlockDevice {
	s.DeleteOnTermination = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *EbsBlockDevice) SetEncrypted(v bool) *EbsBlockDevice {
	s.Encrypted = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *EbsBlockDevice) SetIops(v int64) *EbsBlockDevice {
	s.Iops = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *EbsBlockDevice) SetKmsKeyId(v string) *EbsBlockDevice {
	s.KmsKeyId = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *EbsBlockDevice) SetSnapshotId(v string) *EbsBlockDevice {
	s.SnapshotId = &v
	return s
}

// SetVolumeSize sets the VolumeSize field's value.
func (s *EbsBlockDevice) SetVolumeSize(v int64) *EbsBlockDevice {
	s.VolumeSize = &v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *EbsBlockDevice) SetVolumeType(v string) *EbsBlockDevice {
	s.VolumeType = &v
	return s
}

// Describes a parameter used to set up an EBS volume in a block device mapping.
type EbsInstanceBlockDevice struct {
	_ struct{} `type:"structure"`

	// The time stamp when the attachment initiated.
	AttachTime *time.Time `locationName:"attachTime" type:"timestamp"`

	// Indicates whether the volume is deleted on instance termination.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// The attachment state.
	Status *string `locationName:"status" type:"string" enum:"AttachmentStatus"`

	// The ID of the EBS volume.
	VolumeId *string `locationName:"volumeId" type:"string"`
}

// String returns the string representation
func (s EbsInstanceBlockDevice) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EbsInstanceBlockDevice) GoString() string {
	return s.String()
}

// SetAttachTime sets the AttachTime field's value.
func (s *EbsInstanceBlockDevice) SetAttachTime(v time.Time) *EbsInstanceBlockDevice {
	s.AttachTime = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *EbsInstanceBlockDevice) SetDeleteOnTermination(v bool) *EbsInstanceBlockDevice {
	s.DeleteOnTermination = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *EbsInstanceBlockDevice) SetStatus(v string) *EbsInstanceBlockDevice {
	s.Status = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *EbsInstanceBlockDevice) SetVolumeId(v string) *EbsInstanceBlockDevice {
	s.VolumeId = &v
	return s
}

// Describes information used to set up an EBS volume specified in a block device
// mapping.
type EbsInstanceBlockDeviceSpecification struct {
	_ struct{} `type:"structure"`

	// Indicates whether the volume is deleted on instance termination.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// The ID of the EBS volume.
	VolumeId *string `locationName:"volumeId" type:"string"`
}

// String returns the string representation
func (s EbsInstanceBlockDeviceSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EbsInstanceBlockDeviceSpecification) GoString() string {
	return s.String()
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *EbsInstanceBlockDeviceSpecification) SetDeleteOnTermination(v bool) *EbsInstanceBlockDeviceSpecification {
	s.DeleteOnTermination = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *EbsInstanceBlockDeviceSpecification) SetVolumeId(v string) *EbsInstanceBlockDeviceSpecification {
	s.VolumeId = &v
	return s
}

// Describes an egress-only internet gateway.
type EgressOnlyInternetGateway struct {
	_ struct{} `type:"structure"`

	// Information about the attachment of the egress-only internet gateway.
	Attachments []*InternetGatewayAttachment `locationName:"attachmentSet" locationNameList:"item" type:"list"`

	// The ID of the egress-only internet gateway.
	EgressOnlyInternetGatewayId *string `locationName:"egressOnlyInternetGatewayId" type:"string"`
}

// String returns the string representation
func (s EgressOnlyInternetGateway) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EgressOnlyInternetGateway) GoString() string {
	return s.String()
}

// SetAttachments sets the Attachments field's value.
func (s *EgressOnlyInternetGateway) SetAttachments(v []*InternetGatewayAttachment) *EgressOnlyInternetGateway {
	s.Attachments = v
	return s
}

// SetEgressOnlyInternetGatewayId sets the EgressOnlyInternetGatewayId field's value.
func (s *EgressOnlyInternetGateway) SetEgressOnlyInternetGatewayId(v string) *EgressOnlyInternetGateway {
	s.EgressOnlyInternetGatewayId = &v
	return s
}

// Describes the association between an instance and an Elastic Graphics accelerator.
type ElasticGpuAssociation struct {
	_ struct{} `type:"structure"`

	// The ID of the association.
	ElasticGpuAssociationId *string `locationName:"elasticGpuAssociationId" type:"string"`

	// The state of the association between the instance and the Elastic Graphics
	// accelerator.
	ElasticGpuAssociationState *string `locationName:"elasticGpuAssociationState" type:"string"`

	// The time the Elastic Graphics accelerator was associated with the instance.
	ElasticGpuAssociationTime *string `locationName:"elasticGpuAssociationTime" type:"string"`

	// The ID of the Elastic Graphics accelerator.
	ElasticGpuId *string `locationName:"elasticGpuId" type:"string"`
}

// String returns the string representation
func (s ElasticGpuAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticGpuAssociation) GoString() string {
	return s.String()
}

// SetElasticGpuAssociationId sets the ElasticGpuAssociationId field's value.
func (s *ElasticGpuAssociation) SetElasticGpuAssociationId(v string) *ElasticGpuAssociation {
	s.ElasticGpuAssociationId = &v
	return s
}

// SetElasticGpuAssociationState sets the ElasticGpuAssociationState field's value.
func (s *ElasticGpuAssociation) SetElasticGpuAssociationState(v string) *ElasticGpuAssociation {
	s.ElasticGpuAssociationState = &v
	return s
}

// SetElasticGpuAssociationTime sets the ElasticGpuAssociationTime field's value.
func (s *ElasticGpuAssociation) SetElasticGpuAssociationTime(v string) *ElasticGpuAssociation {
	s.ElasticGpuAssociationTime = &v
	return s
}

// SetElasticGpuId sets the ElasticGpuId field's value.
func (s *ElasticGpuAssociation) SetElasticGpuId(v string) *ElasticGpuAssociation {
	s.ElasticGpuId = &v
	return s
}

// Describes the status of an Elastic Graphics accelerator.
type ElasticGpuHealth struct {
	_ struct{} `type:"structure"`

	// The health status.
	Status *string `locationName:"status" type:"string" enum:"ElasticGpuStatus"`
}

// String returns the string representation
func (s ElasticGpuHealth) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticGpuHealth) GoString() string {
	return s.String()
}

// SetStatus sets the Status field's value.
func (s *ElasticGpuHealth) SetStatus(v string) *ElasticGpuHealth {
	s.Status = &v
	return s
}

// A specification for an Elastic Graphics accelerator.
type ElasticGpuSpecification struct {
	_ struct{} `type:"structure"`

	// The type of Elastic Graphics accelerator.
	//
	// Type is a required field
	Type *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ElasticGpuSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticGpuSpecification) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ElasticGpuSpecification) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ElasticGpuSpecification"}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetType sets the Type field's value.
func (s *ElasticGpuSpecification) SetType(v string) *ElasticGpuSpecification {
	s.Type = &v
	return s
}

// Describes an elastic GPU.
type ElasticGpuSpecificationResponse struct {
	_ struct{} `type:"structure"`

	// The elastic GPU type.
	Type *string `locationName:"type" type:"string"`
}

// String returns the string representation
func (s ElasticGpuSpecificationResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticGpuSpecificationResponse) GoString() string {
	return s.String()
}

// SetType sets the Type field's value.
func (s *ElasticGpuSpecificationResponse) SetType(v string) *ElasticGpuSpecificationResponse {
	s.Type = &v
	return s
}

// Describes an Elastic Graphics accelerator.
type ElasticGpus struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in the which the Elastic Graphics accelerator resides.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The status of the Elastic Graphics accelerator.
	ElasticGpuHealth *ElasticGpuHealth `locationName:"elasticGpuHealth" type:"structure"`

	// The ID of the Elastic Graphics accelerator.
	ElasticGpuId *string `locationName:"elasticGpuId" type:"string"`

	// The state of the Elastic Graphics accelerator.
	ElasticGpuState *string `locationName:"elasticGpuState" type:"string" enum:"ElasticGpuState"`

	// The type of Elastic Graphics accelerator.
	ElasticGpuType *string `locationName:"elasticGpuType" type:"string"`

	// The ID of the instance to which the Elastic Graphics accelerator is attached.
	InstanceId *string `locationName:"instanceId" type:"string"`
}

// String returns the string representation
func (s ElasticGpus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticGpus) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ElasticGpus) SetAvailabilityZone(v string) *ElasticGpus {
	s.AvailabilityZone = &v
	return s
}

// SetElasticGpuHealth sets the ElasticGpuHealth field's value.
func (s *ElasticGpus) SetElasticGpuHealth(v *ElasticGpuHealth) *ElasticGpus {
	s.ElasticGpuHealth = v
	return s
}

// SetElasticGpuId sets the ElasticGpuId field's value.
func (s *ElasticGpus) SetElasticGpuId(v string) *ElasticGpus {
	s.ElasticGpuId = &v
	return s
}

// SetElasticGpuState sets the ElasticGpuState field's value.
func (s *ElasticGpus) SetElasticGpuState(v string) *ElasticGpus {
	s.ElasticGpuState = &v
	return s
}

// SetElasticGpuType sets the ElasticGpuType field's value.
func (s *ElasticGpus) SetElasticGpuType(v string) *ElasticGpus {
	s.ElasticGpuType = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ElasticGpus) SetInstanceId(v string) *ElasticGpus {
	s.InstanceId = &v
	return s
}

// Describes an elastic inference accelerator.
type ElasticInferenceAccelerator struct {
	_ struct{} `type:"structure"`

	// The type of elastic inference accelerator. The possible values are eia1.small,
	// eia1.medium, and eia1.large.
	//
	// Type is a required field
	Type *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ElasticInferenceAccelerator) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticInferenceAccelerator) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ElasticInferenceAccelerator) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ElasticInferenceAccelerator"}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetType sets the Type field's value.
func (s *ElasticInferenceAccelerator) SetType(v string) *ElasticInferenceAccelerator {
	s.Type = &v
	return s
}

// Describes the association between an instance and an elastic inference accelerator.
type ElasticInferenceAcceleratorAssociation struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the elastic inference accelerator.
	ElasticInferenceAcceleratorArn *string `locationName:"elasticInferenceAcceleratorArn" type:"string"`

	// The ID of the association.
	ElasticInferenceAcceleratorAssociationId *string `locationName:"elasticInferenceAcceleratorAssociationId" type:"string"`

	// The state of the elastic inference accelerator.
	ElasticInferenceAcceleratorAssociationState *string `locationName:"elasticInferenceAcceleratorAssociationState" type:"string"`

	// The time at which the elastic inference accelerator is associated with an
	// instance.
	ElasticInferenceAcceleratorAssociationTime *time.Time `locationName:"elasticInferenceAcceleratorAssociationTime" type:"timestamp"`
}

// String returns the string representation
func (s ElasticInferenceAcceleratorAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ElasticInferenceAcceleratorAssociation) GoString() string {
	return s.String()
}

// SetElasticInferenceAcceleratorArn sets the ElasticInferenceAcceleratorArn field's value.
func (s *ElasticInferenceAcceleratorAssociation) SetElasticInferenceAcceleratorArn(v string) *ElasticInferenceAcceleratorAssociation {
	s.ElasticInferenceAcceleratorArn = &v
	return s
}

// SetElasticInferenceAcceleratorAssociationId sets the ElasticInferenceAcceleratorAssociationId field's value.
func (s *ElasticInferenceAcceleratorAssociation) SetElasticInferenceAcceleratorAssociationId(v string) *ElasticInferenceAcceleratorAssociation {
	s.ElasticInferenceAcceleratorAssociationId = &v
	return s
}

// SetElasticInferenceAcceleratorAssociationState sets the ElasticInferenceAcceleratorAssociationState field's value.
func (s *ElasticInferenceAcceleratorAssociation) SetElasticInferenceAcceleratorAssociationState(v string) *ElasticInferenceAcceleratorAssociation {
	s.ElasticInferenceAcceleratorAssociationState = &v
	return s
}

// SetElasticInferenceAcceleratorAssociationTime sets the ElasticInferenceAcceleratorAssociationTime field's value.
func (s *ElasticInferenceAcceleratorAssociation) SetElasticInferenceAcceleratorAssociationTime(v time.Time) *ElasticInferenceAcceleratorAssociation {
	s.ElasticInferenceAcceleratorAssociationTime = &v
	return s
}

type EnableTransitGatewayRouteTablePropagationInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`

	// The ID of the propagation route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s EnableTransitGatewayRouteTablePropagationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableTransitGatewayRouteTablePropagationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *EnableTransitGatewayRouteTablePropagationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "EnableTransitGatewayRouteTablePropagationInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *EnableTransitGatewayRouteTablePropagationInput) SetDryRun(v bool) *EnableTransitGatewayRouteTablePropagationInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *EnableTransitGatewayRouteTablePropagationInput) SetTransitGatewayAttachmentId(v string) *EnableTransitGatewayRouteTablePropagationInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *EnableTransitGatewayRouteTablePropagationInput) SetTransitGatewayRouteTableId(v string) *EnableTransitGatewayRouteTablePropagationInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type EnableTransitGatewayRouteTablePropagationOutput struct {
	_ struct{} `type:"structure"`

	// Information about route propagation.
	Propagation *TransitGatewayPropagation `locationName:"propagation" type:"structure"`
}

// String returns the string representation
func (s EnableTransitGatewayRouteTablePropagationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableTransitGatewayRouteTablePropagationOutput) GoString() string {
	return s.String()
}

// SetPropagation sets the Propagation field's value.
func (s *EnableTransitGatewayRouteTablePropagationOutput) SetPropagation(v *TransitGatewayPropagation) *EnableTransitGatewayRouteTablePropagationOutput {
	s.Propagation = v
	return s
}

// Contains the parameters for EnableVgwRoutePropagation.
type EnableVgwRoutePropagationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the virtual private gateway.
	//
	// GatewayId is a required field
	GatewayId *string `type:"string" required:"true"`

	// The ID of the route table.
	//
	// RouteTableId is a required field
	RouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s EnableVgwRoutePropagationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVgwRoutePropagationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *EnableVgwRoutePropagationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "EnableVgwRoutePropagationInput"}
	if s.GatewayId == nil {
		invalidParams.Add(request.NewErrParamRequired("GatewayId"))
	}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetGatewayId sets the GatewayId field's value.
func (s *EnableVgwRoutePropagationInput) SetGatewayId(v string) *EnableVgwRoutePropagationInput {
	s.GatewayId = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *EnableVgwRoutePropagationInput) SetRouteTableId(v string) *EnableVgwRoutePropagationInput {
	s.RouteTableId = &v
	return s
}

type EnableVgwRoutePropagationOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s EnableVgwRoutePropagationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVgwRoutePropagationOutput) GoString() string {
	return s.String()
}

// Contains the parameters for EnableVolumeIO.
type EnableVolumeIOInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the volume.
	//
	// VolumeId is a required field
	VolumeId *string `locationName:"volumeId" type:"string" required:"true"`
}

// String returns the string representation
func (s EnableVolumeIOInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVolumeIOInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *EnableVolumeIOInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "EnableVolumeIOInput"}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *EnableVolumeIOInput) SetDryRun(v bool) *EnableVolumeIOInput {
	s.DryRun = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *EnableVolumeIOInput) SetVolumeId(v string) *EnableVolumeIOInput {
	s.VolumeId = &v
	return s
}

type EnableVolumeIOOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s EnableVolumeIOOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVolumeIOOutput) GoString() string {
	return s.String()
}

type EnableVpcClassicLinkDnsSupportInput struct {
	_ struct{} `type:"structure"`

	// The ID of the VPC.
	VpcId *string `type:"string"`
}

// String returns the string representation
func (s EnableVpcClassicLinkDnsSupportInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVpcClassicLinkDnsSupportInput) GoString() string {
	return s.String()
}

// SetVpcId sets the VpcId field's value.
func (s *EnableVpcClassicLinkDnsSupportInput) SetVpcId(v string) *EnableVpcClassicLinkDnsSupportInput {
	s.VpcId = &v
	return s
}

type EnableVpcClassicLinkDnsSupportOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s EnableVpcClassicLinkDnsSupportOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVpcClassicLinkDnsSupportOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *EnableVpcClassicLinkDnsSupportOutput) SetReturn(v bool) *EnableVpcClassicLinkDnsSupportOutput {
	s.Return = &v
	return s
}

type EnableVpcClassicLinkInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s EnableVpcClassicLinkInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVpcClassicLinkInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *EnableVpcClassicLinkInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "EnableVpcClassicLinkInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *EnableVpcClassicLinkInput) SetDryRun(v bool) *EnableVpcClassicLinkInput {
	s.DryRun = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *EnableVpcClassicLinkInput) SetVpcId(v string) *EnableVpcClassicLinkInput {
	s.VpcId = &v
	return s
}

type EnableVpcClassicLinkOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s EnableVpcClassicLinkOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableVpcClassicLinkOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *EnableVpcClassicLinkOutput) SetReturn(v bool) *EnableVpcClassicLinkOutput {
	s.Return = &v
	return s
}

// Describes a Spot Fleet event.
type EventInformation struct {
	_ struct{} `type:"structure"`

	// The description of the event.
	EventDescription *string `locationName:"eventDescription" type:"string"`

	// The event.
	//
	// The following are the error events:
	//
	//    * iamFleetRoleInvalid - The Spot Fleet did not have the required permissions
	//    either to launch or terminate an instance.
	//
	//    * launchSpecTemporarilyBlacklisted - The configuration is not valid and
	//    several attempts to launch instances have failed. For more information,
	//    see the description of the event.
	//
	//    * spotFleetRequestConfigurationInvalid - The configuration is not valid.
	//    For more information, see the description of the event.
	//
	//    * spotInstanceCountLimitExceeded - You've reached the limit on the number
	//    of Spot Instances that you can launch.
	//
	// The following are the fleetRequestChange events:
	//
	//    * active - The Spot Fleet has been validated and Amazon EC2 is attempting
	//    to maintain the target number of running Spot Instances.
	//
	//    * cancelled - The Spot Fleet is canceled and has no running Spot Instances.
	//    The Spot Fleet will be deleted two days after its instances were terminated.
	//
	//    * cancelled_running - The Spot Fleet is canceled and does not launch additional
	//    Spot Instances. Existing Spot Instances continue to run until they are
	//    interrupted or terminated.
	//
	//    * cancelled_terminating - The Spot Fleet is canceled and its Spot Instances
	//    are terminating.
	//
	//    * expired - The Spot Fleet request has expired. A subsequent event indicates
	//    that the instances were terminated, if the request was created with TerminateInstancesWithExpiration
	//    set.
	//
	//    * modify_in_progress - A request to modify the Spot Fleet request was
	//    accepted and is in progress.
	//
	//    * modify_successful - The Spot Fleet request was modified.
	//
	//    * price_update - The price for a launch configuration was adjusted because
	//    it was too high. This change is permanent.
	//
	//    * submitted - The Spot Fleet request is being evaluated and Amazon EC2
	//    is preparing to launch the target number of Spot Instances.
	//
	// The following are the instanceChange events:
	//
	//    * launched - A request was fulfilled and a new instance was launched.
	//
	//    * terminated - An instance was terminated by the user.
	//
	// The following are the Information events:
	//
	//    * launchSpecUnusable - The price in a launch specification is not valid
	//    because it is below the Spot price or the Spot price is above the On-Demand
	//    price.
	//
	//    * fleetProgressHalted - The price in every launch specification is not
	//    valid. A launch specification might become valid if the Spot price changes.
	EventSubType *string `locationName:"eventSubType" type:"string"`

	// The ID of the instance. This information is available only for instanceChange
	// events.
	InstanceId *string `locationName:"instanceId" type:"string"`
}

// String returns the string representation
func (s EventInformation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EventInformation) GoString() string {
	return s.String()
}

// SetEventDescription sets the EventDescription field's value.
func (s *EventInformation) SetEventDescription(v string) *EventInformation {
	s.EventDescription = &v
	return s
}

// SetEventSubType sets the EventSubType field's value.
func (s *EventInformation) SetEventSubType(v string) *EventInformation {
	s.EventSubType = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *EventInformation) SetInstanceId(v string) *EventInformation {
	s.InstanceId = &v
	return s
}

type ExportClientVpnClientCertificateRevocationListInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s ExportClientVpnClientCertificateRevocationListInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportClientVpnClientCertificateRevocationListInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ExportClientVpnClientCertificateRevocationListInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ExportClientVpnClientCertificateRevocationListInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ExportClientVpnClientCertificateRevocationListInput) SetClientVpnEndpointId(v string) *ExportClientVpnClientCertificateRevocationListInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ExportClientVpnClientCertificateRevocationListInput) SetDryRun(v bool) *ExportClientVpnClientCertificateRevocationListInput {
	s.DryRun = &v
	return s
}

type ExportClientVpnClientCertificateRevocationListOutput struct {
	_ struct{} `type:"structure"`

	// Information about the client certificate revocation list.
	CertificateRevocationList *string `locationName:"certificateRevocationList" type:"string"`

	// The current state of the client certificate revocation list.
	Status *ClientCertificateRevocationListStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s ExportClientVpnClientCertificateRevocationListOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportClientVpnClientCertificateRevocationListOutput) GoString() string {
	return s.String()
}

// SetCertificateRevocationList sets the CertificateRevocationList field's value.
func (s *ExportClientVpnClientCertificateRevocationListOutput) SetCertificateRevocationList(v string) *ExportClientVpnClientCertificateRevocationListOutput {
	s.CertificateRevocationList = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ExportClientVpnClientCertificateRevocationListOutput) SetStatus(v *ClientCertificateRevocationListStatus) *ExportClientVpnClientCertificateRevocationListOutput {
	s.Status = v
	return s
}

type ExportClientVpnClientConfigurationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s ExportClientVpnClientConfigurationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportClientVpnClientConfigurationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ExportClientVpnClientConfigurationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ExportClientVpnClientConfigurationInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ExportClientVpnClientConfigurationInput) SetClientVpnEndpointId(v string) *ExportClientVpnClientConfigurationInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ExportClientVpnClientConfigurationInput) SetDryRun(v bool) *ExportClientVpnClientConfigurationInput {
	s.DryRun = &v
	return s
}

type ExportClientVpnClientConfigurationOutput struct {
	_ struct{} `type:"structure"`

	// The contents of the Client VPN endpoint configuration file.
	ClientConfiguration *string `locationName:"clientConfiguration" type:"string"`
}

// String returns the string representation
func (s ExportClientVpnClientConfigurationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportClientVpnClientConfigurationOutput) GoString() string {
	return s.String()
}

// SetClientConfiguration sets the ClientConfiguration field's value.
func (s *ExportClientVpnClientConfigurationOutput) SetClientConfiguration(v string) *ExportClientVpnClientConfigurationOutput {
	s.ClientConfiguration = &v
	return s
}

// Describes an instance export task.
type ExportTask struct {
	_ struct{} `type:"structure"`

	// A description of the resource being exported.
	Description *string `locationName:"description" type:"string"`

	// The ID of the export task.
	ExportTaskId *string `locationName:"exportTaskId" type:"string"`

	// Information about the export task.
	ExportToS3Task *ExportToS3Task `locationName:"exportToS3" type:"structure"`

	// Information about the instance to export.
	InstanceExportDetails *InstanceExportDetails `locationName:"instanceExport" type:"structure"`

	// The state of the export task.
	State *string `locationName:"state" type:"string" enum:"ExportTaskState"`

	// The status message related to the export task.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s ExportTask) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportTask) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *ExportTask) SetDescription(v string) *ExportTask {
	s.Description = &v
	return s
}

// SetExportTaskId sets the ExportTaskId field's value.
func (s *ExportTask) SetExportTaskId(v string) *ExportTask {
	s.ExportTaskId = &v
	return s
}

// SetExportToS3Task sets the ExportToS3Task field's value.
func (s *ExportTask) SetExportToS3Task(v *ExportToS3Task) *ExportTask {
	s.ExportToS3Task = v
	return s
}

// SetInstanceExportDetails sets the InstanceExportDetails field's value.
func (s *ExportTask) SetInstanceExportDetails(v *InstanceExportDetails) *ExportTask {
	s.InstanceExportDetails = v
	return s
}

// SetState sets the State field's value.
func (s *ExportTask) SetState(v string) *ExportTask {
	s.State = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ExportTask) SetStatusMessage(v string) *ExportTask {
	s.StatusMessage = &v
	return s
}

// Describes the format and location for an instance export task.
type ExportToS3Task struct {
	_ struct{} `type:"structure"`

	// The container format used to combine disk images with metadata (such as OVF).
	// If absent, only the disk image is exported.
	ContainerFormat *string `locationName:"containerFormat" type:"string" enum:"ContainerFormat"`

	// The format for the exported image.
	DiskImageFormat *string `locationName:"diskImageFormat" type:"string" enum:"DiskImageFormat"`

	// The S3 bucket for the destination image. The destination bucket must exist
	// and grant WRITE and READ_ACP permissions to the AWS account vm-import-export@amazon.com.
	S3Bucket *string `locationName:"s3Bucket" type:"string"`

	// The encryption key for your S3 bucket.
	S3Key *string `locationName:"s3Key" type:"string"`
}

// String returns the string representation
func (s ExportToS3Task) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportToS3Task) GoString() string {
	return s.String()
}

// SetContainerFormat sets the ContainerFormat field's value.
func (s *ExportToS3Task) SetContainerFormat(v string) *ExportToS3Task {
	s.ContainerFormat = &v
	return s
}

// SetDiskImageFormat sets the DiskImageFormat field's value.
func (s *ExportToS3Task) SetDiskImageFormat(v string) *ExportToS3Task {
	s.DiskImageFormat = &v
	return s
}

// SetS3Bucket sets the S3Bucket field's value.
func (s *ExportToS3Task) SetS3Bucket(v string) *ExportToS3Task {
	s.S3Bucket = &v
	return s
}

// SetS3Key sets the S3Key field's value.
func (s *ExportToS3Task) SetS3Key(v string) *ExportToS3Task {
	s.S3Key = &v
	return s
}

// Describes an instance export task.
type ExportToS3TaskSpecification struct {
	_ struct{} `type:"structure"`

	// The container format used to combine disk images with metadata (such as OVF).
	// If absent, only the disk image is exported.
	ContainerFormat *string `locationName:"containerFormat" type:"string" enum:"ContainerFormat"`

	// The format for the exported image.
	DiskImageFormat *string `locationName:"diskImageFormat" type:"string" enum:"DiskImageFormat"`

	// The S3 bucket for the destination image. The destination bucket must exist
	// and grant WRITE and READ_ACP permissions to the AWS account vm-import-export@amazon.com.
	S3Bucket *string `locationName:"s3Bucket" type:"string"`

	// The image is written to a single object in the S3 bucket at the S3 key s3prefix
	// + exportTaskId + '.' + diskImageFormat.
	S3Prefix *string `locationName:"s3Prefix" type:"string"`
}

// String returns the string representation
func (s ExportToS3TaskSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportToS3TaskSpecification) GoString() string {
	return s.String()
}

// SetContainerFormat sets the ContainerFormat field's value.
func (s *ExportToS3TaskSpecification) SetContainerFormat(v string) *ExportToS3TaskSpecification {
	s.ContainerFormat = &v
	return s
}

// SetDiskImageFormat sets the DiskImageFormat field's value.
func (s *ExportToS3TaskSpecification) SetDiskImageFormat(v string) *ExportToS3TaskSpecification {
	s.DiskImageFormat = &v
	return s
}

// SetS3Bucket sets the S3Bucket field's value.
func (s *ExportToS3TaskSpecification) SetS3Bucket(v string) *ExportToS3TaskSpecification {
	s.S3Bucket = &v
	return s
}

// SetS3Prefix sets the S3Prefix field's value.
func (s *ExportToS3TaskSpecification) SetS3Prefix(v string) *ExportToS3TaskSpecification {
	s.S3Prefix = &v
	return s
}

type ExportTransitGatewayRoutesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * attachment.transit-gateway-attachment-id- The id of the transit gateway
	//    attachment.
	//
	//    * attachment.resource-id - The resource id of the transit gateway attachment.
	//
	//    * route-search.exact-match - The exact match of the specified filter.
	//
	//    * route-search.longest-prefix-match - The longest prefix that matches
	//    the route.
	//
	//    * route-search.subnet-of-match - The routes with a subnet that match the
	//    specified CIDR filter.
	//
	//    * route-search.supernet-of-match - The routes with a CIDR that encompass
	//    the CIDR filter. For example, if you have 10.0.1.0/29 and 10.0.1.0/31
	//    routes in your route table and you specify supernet-of-match as 10.0.1.0/30,
	//    then the result returns 10.0.1.0/29.
	//
	//    * state - The state of the attachment (available | deleted | deleting
	//    | failed | modifying | pendingAcceptance | pending | rollingBack | rejected
	//    | rejecting).
	//
	//    * transit-gateway-route-destination-cidr-block - The CIDR range.
	//
	//    * type - The type of roue (active | blackhole).
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The name of the S3 bucket.
	//
	// S3Bucket is a required field
	S3Bucket *string `type:"string" required:"true"`

	// The ID of the route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ExportTransitGatewayRoutesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportTransitGatewayRoutesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ExportTransitGatewayRoutesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ExportTransitGatewayRoutesInput"}
	if s.S3Bucket == nil {
		invalidParams.Add(request.NewErrParamRequired("S3Bucket"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ExportTransitGatewayRoutesInput) SetDryRun(v bool) *ExportTransitGatewayRoutesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *ExportTransitGatewayRoutesInput) SetFilters(v []*Filter) *ExportTransitGatewayRoutesInput {
	s.Filters = v
	return s
}

// SetS3Bucket sets the S3Bucket field's value.
func (s *ExportTransitGatewayRoutesInput) SetS3Bucket(v string) *ExportTransitGatewayRoutesInput {
	s.S3Bucket = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *ExportTransitGatewayRoutesInput) SetTransitGatewayRouteTableId(v string) *ExportTransitGatewayRoutesInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type ExportTransitGatewayRoutesOutput struct {
	_ struct{} `type:"structure"`

	// The URL of the exported file in Amazon S3. For example, s3://bucket_name/VPCTransitGateway/TransitGatewayRouteTables/file_name.
	S3Location *string `locationName:"s3Location" type:"string"`
}

// String returns the string representation
func (s ExportTransitGatewayRoutesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ExportTransitGatewayRoutesOutput) GoString() string {
	return s.String()
}

// SetS3Location sets the S3Location field's value.
func (s *ExportTransitGatewayRoutesOutput) SetS3Location(v string) *ExportTransitGatewayRoutesOutput {
	s.S3Location = &v
	return s
}

// A filter name and value pair that is used to return a more specific list
// of results from a describe operation. Filters can be used to match a set
// of resources by specific criteria, such as tags, attributes, or IDs. The
// filters supported by a describe operation are documented with the describe
// operation. For example:
//
//    * DescribeAvailabilityZones
//
//    * DescribeImages
//
//    * DescribeInstances
//
//    * DescribeKeyPairs
//
//    * DescribeSecurityGroups
//
//    * DescribeSnapshots
//
//    * DescribeSubnets
//
//    * DescribeTags
//
//    * DescribeVolumes
//
//    * DescribeVpcs
type Filter struct {
	_ struct{} `type:"structure"`

	// The name of the filter. Filter names are case-sensitive.
	Name *string `type:"string"`

	// One or more filter values. Filter values are case-sensitive.
	Values []*string `locationName:"Value" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s Filter) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Filter) GoString() string {
	return s.String()
}

// SetName sets the Name field's value.
func (s *Filter) SetName(v string) *Filter {
	s.Name = &v
	return s
}

// SetValues sets the Values field's value.
func (s *Filter) SetValues(v []*string) *Filter {
	s.Values = v
	return s
}

// Describes an EC2 Fleet.
type FleetData struct {
	_ struct{} `type:"structure"`

	// The progress of the EC2 Fleet. If there is an error, the status is error.
	// After all requests are placed, the status is pending_fulfillment. If the
	// size of the EC2 Fleet is equal to or greater than its target capacity, the
	// status is fulfilled. If the size of the EC2 Fleet is decreased, the status
	// is pending_termination while instances are terminating.
	ActivityStatus *string `locationName:"activityStatus" type:"string" enum:"FleetActivityStatus"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	//
	// Constraints: Maximum 64 ASCII characters
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The creation date and time of the EC2 Fleet.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// Information about the instances that could not be launched by the fleet.
	// Valid only when Type is set to instant.
	Errors []*DescribeFleetError `locationName:"errorSet" locationNameList:"item" type:"list"`

	// Indicates whether running instances should be terminated if the target capacity
	// of the EC2 Fleet is decreased below the current size of the EC2 Fleet.
	ExcessCapacityTerminationPolicy *string `locationName:"excessCapacityTerminationPolicy" type:"string" enum:"FleetExcessCapacityTerminationPolicy"`

	// The ID of the EC2 Fleet.
	FleetId *string `locationName:"fleetId" type:"string"`

	// The state of the EC2 Fleet.
	FleetState *string `locationName:"fleetState" type:"string" enum:"FleetStateCode"`

	// The number of units fulfilled by this request compared to the set target
	// capacity.
	FulfilledCapacity *float64 `locationName:"fulfilledCapacity" type:"double"`

	// The number of units fulfilled by this request compared to the set target
	// On-Demand capacity.
	FulfilledOnDemandCapacity *float64 `locationName:"fulfilledOnDemandCapacity" type:"double"`

	// Information about the instances that were launched by the fleet. Valid only
	// when Type is set to instant.
	Instances []*DescribeFleetsInstances `locationName:"fleetInstanceSet" locationNameList:"item" type:"list"`

	// The launch template and overrides.
	LaunchTemplateConfigs []*FleetLaunchTemplateConfig `locationName:"launchTemplateConfigs" locationNameList:"item" type:"list"`

	// The allocation strategy of On-Demand Instances in an EC2 Fleet.
	OnDemandOptions *OnDemandOptions `locationName:"onDemandOptions" type:"structure"`

	// Indicates whether EC2 Fleet should replace unhealthy instances.
	ReplaceUnhealthyInstances *bool `locationName:"replaceUnhealthyInstances" type:"boolean"`

	// The configuration of Spot Instances in an EC2 Fleet.
	SpotOptions *SpotOptions `locationName:"spotOptions" type:"structure"`

	// The tags for an EC2 Fleet resource.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The number of units to request. You can choose to set the target capacity
	// in terms of instances or a performance characteristic that is important to
	// your application workload, such as vCPUs, memory, or I/O. If the request
	// type is maintain, you can specify a target capacity of 0 and add capacity
	// later.
	TargetCapacitySpecification *TargetCapacitySpecification `locationName:"targetCapacitySpecification" type:"structure"`

	// Indicates whether running instances should be terminated when the EC2 Fleet
	// expires.
	TerminateInstancesWithExpiration *bool `locationName:"terminateInstancesWithExpiration" type:"boolean"`

	// The type of request. Indicates whether the EC2 Fleet only requests the target
	// capacity, or also attempts to maintain it. If you request a certain target
	// capacity, EC2 Fleet only places the required requests; it does not attempt
	// to replenish instances if capacity is diminished, and does not submit requests
	// in alternative capacity pools if capacity is unavailable. To maintain a certain
	// target capacity, EC2 Fleet places the required requests to meet this target
	// capacity. It also automatically replenishes any interrupted Spot Instances.
	// Default: maintain.
	Type *string `locationName:"type" type:"string" enum:"FleetType"`

	// The start date and time of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// The default is to start fulfilling the request immediately.
	ValidFrom *time.Time `locationName:"validFrom" type:"timestamp"`

	// The end date and time of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// At this point, no new instance requests are placed or able to fulfill the
	// request. The default end date is 7 days from the current date.
	ValidUntil *time.Time `locationName:"validUntil" type:"timestamp"`
}

// String returns the string representation
func (s FleetData) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetData) GoString() string {
	return s.String()
}

// SetActivityStatus sets the ActivityStatus field's value.
func (s *FleetData) SetActivityStatus(v string) *FleetData {
	s.ActivityStatus = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *FleetData) SetClientToken(v string) *FleetData {
	s.ClientToken = &v
	return s
}

// SetCreateTime sets the CreateTime field's value.
func (s *FleetData) SetCreateTime(v time.Time) *FleetData {
	s.CreateTime = &v
	return s
}

// SetErrors sets the Errors field's value.
func (s *FleetData) SetErrors(v []*DescribeFleetError) *FleetData {
	s.Errors = v
	return s
}

// SetExcessCapacityTerminationPolicy sets the ExcessCapacityTerminationPolicy field's value.
func (s *FleetData) SetExcessCapacityTerminationPolicy(v string) *FleetData {
	s.ExcessCapacityTerminationPolicy = &v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *FleetData) SetFleetId(v string) *FleetData {
	s.FleetId = &v
	return s
}

// SetFleetState sets the FleetState field's value.
func (s *FleetData) SetFleetState(v string) *FleetData {
	s.FleetState = &v
	return s
}

// SetFulfilledCapacity sets the FulfilledCapacity field's value.
func (s *FleetData) SetFulfilledCapacity(v float64) *FleetData {
	s.FulfilledCapacity = &v
	return s
}

// SetFulfilledOnDemandCapacity sets the FulfilledOnDemandCapacity field's value.
func (s *FleetData) SetFulfilledOnDemandCapacity(v float64) *FleetData {
	s.FulfilledOnDemandCapacity = &v
	return s
}

// SetInstances sets the Instances field's value.
func (s *FleetData) SetInstances(v []*DescribeFleetsInstances) *FleetData {
	s.Instances = v
	return s
}

// SetLaunchTemplateConfigs sets the LaunchTemplateConfigs field's value.
func (s *FleetData) SetLaunchTemplateConfigs(v []*FleetLaunchTemplateConfig) *FleetData {
	s.LaunchTemplateConfigs = v
	return s
}

// SetOnDemandOptions sets the OnDemandOptions field's value.
func (s *FleetData) SetOnDemandOptions(v *OnDemandOptions) *FleetData {
	s.OnDemandOptions = v
	return s
}

// SetReplaceUnhealthyInstances sets the ReplaceUnhealthyInstances field's value.
func (s *FleetData) SetReplaceUnhealthyInstances(v bool) *FleetData {
	s.ReplaceUnhealthyInstances = &v
	return s
}

// SetSpotOptions sets the SpotOptions field's value.
func (s *FleetData) SetSpotOptions(v *SpotOptions) *FleetData {
	s.SpotOptions = v
	return s
}

// SetTags sets the Tags field's value.
func (s *FleetData) SetTags(v []*Tag) *FleetData {
	s.Tags = v
	return s
}

// SetTargetCapacitySpecification sets the TargetCapacitySpecification field's value.
func (s *FleetData) SetTargetCapacitySpecification(v *TargetCapacitySpecification) *FleetData {
	s.TargetCapacitySpecification = v
	return s
}

// SetTerminateInstancesWithExpiration sets the TerminateInstancesWithExpiration field's value.
func (s *FleetData) SetTerminateInstancesWithExpiration(v bool) *FleetData {
	s.TerminateInstancesWithExpiration = &v
	return s
}

// SetType sets the Type field's value.
func (s *FleetData) SetType(v string) *FleetData {
	s.Type = &v
	return s
}

// SetValidFrom sets the ValidFrom field's value.
func (s *FleetData) SetValidFrom(v time.Time) *FleetData {
	s.ValidFrom = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *FleetData) SetValidUntil(v time.Time) *FleetData {
	s.ValidUntil = &v
	return s
}

// Describes a launch template and overrides.
type FleetLaunchTemplateConfig struct {
	_ struct{} `type:"structure"`

	// The launch template.
	LaunchTemplateSpecification *FleetLaunchTemplateSpecification `locationName:"launchTemplateSpecification" type:"structure"`

	// Any parameters that you specify override the same parameters in the launch
	// template.
	Overrides []*FleetLaunchTemplateOverrides `locationName:"overrides" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s FleetLaunchTemplateConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetLaunchTemplateConfig) GoString() string {
	return s.String()
}

// SetLaunchTemplateSpecification sets the LaunchTemplateSpecification field's value.
func (s *FleetLaunchTemplateConfig) SetLaunchTemplateSpecification(v *FleetLaunchTemplateSpecification) *FleetLaunchTemplateConfig {
	s.LaunchTemplateSpecification = v
	return s
}

// SetOverrides sets the Overrides field's value.
func (s *FleetLaunchTemplateConfig) SetOverrides(v []*FleetLaunchTemplateOverrides) *FleetLaunchTemplateConfig {
	s.Overrides = v
	return s
}

// Describes a launch template and overrides.
type FleetLaunchTemplateConfigRequest struct {
	_ struct{} `type:"structure"`

	// The launch template to use. You must specify either the launch template ID
	// or launch template name in the request.
	LaunchTemplateSpecification *FleetLaunchTemplateSpecificationRequest `type:"structure"`

	// Any parameters that you specify override the same parameters in the launch
	// template.
	Overrides []*FleetLaunchTemplateOverridesRequest `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s FleetLaunchTemplateConfigRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetLaunchTemplateConfigRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *FleetLaunchTemplateConfigRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "FleetLaunchTemplateConfigRequest"}
	if s.LaunchTemplateSpecification != nil {
		if err := s.LaunchTemplateSpecification.Validate(); err != nil {
			invalidParams.AddNested("LaunchTemplateSpecification", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetLaunchTemplateSpecification sets the LaunchTemplateSpecification field's value.
func (s *FleetLaunchTemplateConfigRequest) SetLaunchTemplateSpecification(v *FleetLaunchTemplateSpecificationRequest) *FleetLaunchTemplateConfigRequest {
	s.LaunchTemplateSpecification = v
	return s
}

// SetOverrides sets the Overrides field's value.
func (s *FleetLaunchTemplateConfigRequest) SetOverrides(v []*FleetLaunchTemplateOverridesRequest) *FleetLaunchTemplateConfigRequest {
	s.Overrides = v
	return s
}

// Describes overrides for a launch template.
type FleetLaunchTemplateOverrides struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which to launch the instances.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The maximum price per unit hour that you are willing to pay for a Spot Instance.
	MaxPrice *string `locationName:"maxPrice" type:"string"`

	// The location where the instance launched, if applicable.
	Placement *PlacementResponse `locationName:"placement" type:"structure"`

	// The priority for the launch template override. If AllocationStrategy is set
	// to prioritized, EC2 Fleet uses priority to determine which launch template
	// override to use first in fulfilling On-Demand capacity. The highest priority
	// is launched first. Valid values are whole numbers starting at 0. The lower
	// the number, the higher the priority. If no number is set, the override has
	// the lowest priority.
	Priority *float64 `locationName:"priority" type:"double"`

	// The ID of the subnet in which to launch the instances.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The number of units provided by the specified instance type.
	WeightedCapacity *float64 `locationName:"weightedCapacity" type:"double"`
}

// String returns the string representation
func (s FleetLaunchTemplateOverrides) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetLaunchTemplateOverrides) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *FleetLaunchTemplateOverrides) SetAvailabilityZone(v string) *FleetLaunchTemplateOverrides {
	s.AvailabilityZone = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *FleetLaunchTemplateOverrides) SetInstanceType(v string) *FleetLaunchTemplateOverrides {
	s.InstanceType = &v
	return s
}

// SetMaxPrice sets the MaxPrice field's value.
func (s *FleetLaunchTemplateOverrides) SetMaxPrice(v string) *FleetLaunchTemplateOverrides {
	s.MaxPrice = &v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *FleetLaunchTemplateOverrides) SetPlacement(v *PlacementResponse) *FleetLaunchTemplateOverrides {
	s.Placement = v
	return s
}

// SetPriority sets the Priority field's value.
func (s *FleetLaunchTemplateOverrides) SetPriority(v float64) *FleetLaunchTemplateOverrides {
	s.Priority = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *FleetLaunchTemplateOverrides) SetSubnetId(v string) *FleetLaunchTemplateOverrides {
	s.SubnetId = &v
	return s
}

// SetWeightedCapacity sets the WeightedCapacity field's value.
func (s *FleetLaunchTemplateOverrides) SetWeightedCapacity(v float64) *FleetLaunchTemplateOverrides {
	s.WeightedCapacity = &v
	return s
}

// Describes overrides for a launch template.
type FleetLaunchTemplateOverridesRequest struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which to launch the instances.
	AvailabilityZone *string `type:"string"`

	// The instance type.
	InstanceType *string `type:"string" enum:"InstanceType"`

	// The maximum price per unit hour that you are willing to pay for a Spot Instance.
	MaxPrice *string `type:"string"`

	// The location where the instance launched, if applicable.
	Placement *Placement `type:"structure"`

	// The priority for the launch template override. If AllocationStrategy is set
	// to prioritized, EC2 Fleet uses priority to determine which launch template
	// override to use first in fulfilling On-Demand capacity. The highest priority
	// is launched first. Valid values are whole numbers starting at 0. The lower
	// the number, the higher the priority. If no number is set, the launch template
	// override has the lowest priority.
	Priority *float64 `type:"double"`

	// The ID of the subnet in which to launch the instances.
	SubnetId *string `type:"string"`

	// The number of units provided by the specified instance type.
	WeightedCapacity *float64 `type:"double"`
}

// String returns the string representation
func (s FleetLaunchTemplateOverridesRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetLaunchTemplateOverridesRequest) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetAvailabilityZone(v string) *FleetLaunchTemplateOverridesRequest {
	s.AvailabilityZone = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetInstanceType(v string) *FleetLaunchTemplateOverridesRequest {
	s.InstanceType = &v
	return s
}

// SetMaxPrice sets the MaxPrice field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetMaxPrice(v string) *FleetLaunchTemplateOverridesRequest {
	s.MaxPrice = &v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetPlacement(v *Placement) *FleetLaunchTemplateOverridesRequest {
	s.Placement = v
	return s
}

// SetPriority sets the Priority field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetPriority(v float64) *FleetLaunchTemplateOverridesRequest {
	s.Priority = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetSubnetId(v string) *FleetLaunchTemplateOverridesRequest {
	s.SubnetId = &v
	return s
}

// SetWeightedCapacity sets the WeightedCapacity field's value.
func (s *FleetLaunchTemplateOverridesRequest) SetWeightedCapacity(v float64) *FleetLaunchTemplateOverridesRequest {
	s.WeightedCapacity = &v
	return s
}

// Describes a launch template.
type FleetLaunchTemplateSpecification struct {
	_ struct{} `type:"structure"`

	// The ID of the launch template. You must specify either a template ID or a
	// template name.
	LaunchTemplateId *string `locationName:"launchTemplateId" type:"string"`

	// The name of the launch template. You must specify either a template name
	// or a template ID.
	LaunchTemplateName *string `locationName:"launchTemplateName" min:"3" type:"string"`

	// The version number of the launch template. You must specify a version number.
	Version *string `locationName:"version" type:"string"`
}

// String returns the string representation
func (s FleetLaunchTemplateSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetLaunchTemplateSpecification) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *FleetLaunchTemplateSpecification) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "FleetLaunchTemplateSpecification"}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *FleetLaunchTemplateSpecification) SetLaunchTemplateId(v string) *FleetLaunchTemplateSpecification {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *FleetLaunchTemplateSpecification) SetLaunchTemplateName(v string) *FleetLaunchTemplateSpecification {
	s.LaunchTemplateName = &v
	return s
}

// SetVersion sets the Version field's value.
func (s *FleetLaunchTemplateSpecification) SetVersion(v string) *FleetLaunchTemplateSpecification {
	s.Version = &v
	return s
}

// The launch template to use. You must specify either the launch template ID
// or launch template name in the request.
type FleetLaunchTemplateSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// The ID of the launch template.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template.
	LaunchTemplateName *string `min:"3" type:"string"`

	// The version number of the launch template.
	Version *string `type:"string"`
}

// String returns the string representation
func (s FleetLaunchTemplateSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FleetLaunchTemplateSpecificationRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *FleetLaunchTemplateSpecificationRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "FleetLaunchTemplateSpecificationRequest"}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *FleetLaunchTemplateSpecificationRequest) SetLaunchTemplateId(v string) *FleetLaunchTemplateSpecificationRequest {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *FleetLaunchTemplateSpecificationRequest) SetLaunchTemplateName(v string) *FleetLaunchTemplateSpecificationRequest {
	s.LaunchTemplateName = &v
	return s
}

// SetVersion sets the Version field's value.
func (s *FleetLaunchTemplateSpecificationRequest) SetVersion(v string) *FleetLaunchTemplateSpecificationRequest {
	s.Version = &v
	return s
}

// Describes a flow log.
type FlowLog struct {
	_ struct{} `type:"structure"`

	// The date and time the flow log was created.
	CreationTime *time.Time `locationName:"creationTime" type:"timestamp"`

	// Information about the error that occurred. Rate limited indicates that CloudWatch
	// Logs throttling has been applied for one or more network interfaces, or that
	// you've reached the limit on the number of log groups that you can create.
	// Access error indicates that the IAM role associated with the flow log does
	// not have sufficient permissions to publish to CloudWatch Logs. Unknown error
	// indicates an internal error.
	DeliverLogsErrorMessage *string `locationName:"deliverLogsErrorMessage" type:"string"`

	// The ARN of the IAM role that posts logs to CloudWatch Logs.
	DeliverLogsPermissionArn *string `locationName:"deliverLogsPermissionArn" type:"string"`

	// The status of the logs delivery (SUCCESS | FAILED).
	DeliverLogsStatus *string `locationName:"deliverLogsStatus" type:"string"`

	// The flow log ID.
	FlowLogId *string `locationName:"flowLogId" type:"string"`

	// The status of the flow log (ACTIVE).
	FlowLogStatus *string `locationName:"flowLogStatus" type:"string"`

	// Specifies the destination to which the flow log data is published. Flow log
	// data can be published to an CloudWatch Logs log group or an Amazon S3 bucket.
	// If the flow log publishes to CloudWatch Logs, this element indicates the
	// Amazon Resource Name (ARN) of the CloudWatch Logs log group to which the
	// data is published. If the flow log publishes to Amazon S3, this element indicates
	// the ARN of the Amazon S3 bucket to which the data is published.
	LogDestination *string `locationName:"logDestination" type:"string"`

	// Specifies the type of destination to which the flow log data is published.
	// Flow log data can be published to CloudWatch Logs or Amazon S3.
	LogDestinationType *string `locationName:"logDestinationType" type:"string" enum:"LogDestinationType"`

	// The name of the flow log group.
	LogGroupName *string `locationName:"logGroupName" type:"string"`

	// The ID of the resource on which the flow log was created.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The type of traffic captured for the flow log.
	TrafficType *string `locationName:"trafficType" type:"string" enum:"TrafficType"`
}

// String returns the string representation
func (s FlowLog) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FlowLog) GoString() string {
	return s.String()
}

// SetCreationTime sets the CreationTime field's value.
func (s *FlowLog) SetCreationTime(v time.Time) *FlowLog {
	s.CreationTime = &v
	return s
}

// SetDeliverLogsErrorMessage sets the DeliverLogsErrorMessage field's value.
func (s *FlowLog) SetDeliverLogsErrorMessage(v string) *FlowLog {
	s.DeliverLogsErrorMessage = &v
	return s
}

// SetDeliverLogsPermissionArn sets the DeliverLogsPermissionArn field's value.
func (s *FlowLog) SetDeliverLogsPermissionArn(v string) *FlowLog {
	s.DeliverLogsPermissionArn = &v
	return s
}

// SetDeliverLogsStatus sets the DeliverLogsStatus field's value.
func (s *FlowLog) SetDeliverLogsStatus(v string) *FlowLog {
	s.DeliverLogsStatus = &v
	return s
}

// SetFlowLogId sets the FlowLogId field's value.
func (s *FlowLog) SetFlowLogId(v string) *FlowLog {
	s.FlowLogId = &v
	return s
}

// SetFlowLogStatus sets the FlowLogStatus field's value.
func (s *FlowLog) SetFlowLogStatus(v string) *FlowLog {
	s.FlowLogStatus = &v
	return s
}

// SetLogDestination sets the LogDestination field's value.
func (s *FlowLog) SetLogDestination(v string) *FlowLog {
	s.LogDestination = &v
	return s
}

// SetLogDestinationType sets the LogDestinationType field's value.
func (s *FlowLog) SetLogDestinationType(v string) *FlowLog {
	s.LogDestinationType = &v
	return s
}

// SetLogGroupName sets the LogGroupName field's value.
func (s *FlowLog) SetLogGroupName(v string) *FlowLog {
	s.LogGroupName = &v
	return s
}

// SetResourceId sets the ResourceId field's value.
func (s *FlowLog) SetResourceId(v string) *FlowLog {
	s.ResourceId = &v
	return s
}

// SetTrafficType sets the TrafficType field's value.
func (s *FlowLog) SetTrafficType(v string) *FlowLog {
	s.TrafficType = &v
	return s
}

// Describes an Amazon FPGA image (AFI).
type FpgaImage struct {
	_ struct{} `type:"structure"`

	// The date and time the AFI was created.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// The description of the AFI.
	Description *string `locationName:"description" type:"string"`

	// The global FPGA image identifier (AGFI ID).
	FpgaImageGlobalId *string `locationName:"fpgaImageGlobalId" type:"string"`

	// The FPGA image identifier (AFI ID).
	FpgaImageId *string `locationName:"fpgaImageId" type:"string"`

	// The name of the AFI.
	Name *string `locationName:"name" type:"string"`

	// The alias of the AFI owner. Possible values include self, amazon, and aws-marketplace.
	OwnerAlias *string `locationName:"ownerAlias" type:"string"`

	// The AWS account ID of the AFI owner.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Information about the PCI bus.
	PciId *PciId `locationName:"pciId" type:"structure"`

	// The product codes for the AFI.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// Indicates whether the AFI is public.
	Public *bool `locationName:"public" type:"boolean"`

	// The version of the AWS Shell that was used to create the bitstream.
	ShellVersion *string `locationName:"shellVersion" type:"string"`

	// Information about the state of the AFI.
	State *FpgaImageState `locationName:"state" type:"structure"`

	// Any tags assigned to the AFI.
	Tags []*Tag `locationName:"tags" locationNameList:"item" type:"list"`

	// The time of the most recent update to the AFI.
	UpdateTime *time.Time `locationName:"updateTime" type:"timestamp"`
}

// String returns the string representation
func (s FpgaImage) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FpgaImage) GoString() string {
	return s.String()
}

// SetCreateTime sets the CreateTime field's value.
func (s *FpgaImage) SetCreateTime(v time.Time) *FpgaImage {
	s.CreateTime = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *FpgaImage) SetDescription(v string) *FpgaImage {
	s.Description = &v
	return s
}

// SetFpgaImageGlobalId sets the FpgaImageGlobalId field's value.
func (s *FpgaImage) SetFpgaImageGlobalId(v string) *FpgaImage {
	s.FpgaImageGlobalId = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *FpgaImage) SetFpgaImageId(v string) *FpgaImage {
	s.FpgaImageId = &v
	return s
}

// SetName sets the Name field's value.
func (s *FpgaImage) SetName(v string) *FpgaImage {
	s.Name = &v
	return s
}

// SetOwnerAlias sets the OwnerAlias field's value.
func (s *FpgaImage) SetOwnerAlias(v string) *FpgaImage {
	s.OwnerAlias = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *FpgaImage) SetOwnerId(v string) *FpgaImage {
	s.OwnerId = &v
	return s
}

// SetPciId sets the PciId field's value.
func (s *FpgaImage) SetPciId(v *PciId) *FpgaImage {
	s.PciId = v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *FpgaImage) SetProductCodes(v []*ProductCode) *FpgaImage {
	s.ProductCodes = v
	return s
}

// SetPublic sets the Public field's value.
func (s *FpgaImage) SetPublic(v bool) *FpgaImage {
	s.Public = &v
	return s
}

// SetShellVersion sets the ShellVersion field's value.
func (s *FpgaImage) SetShellVersion(v string) *FpgaImage {
	s.ShellVersion = &v
	return s
}

// SetState sets the State field's value.
func (s *FpgaImage) SetState(v *FpgaImageState) *FpgaImage {
	s.State = v
	return s
}

// SetTags sets the Tags field's value.
func (s *FpgaImage) SetTags(v []*Tag) *FpgaImage {
	s.Tags = v
	return s
}

// SetUpdateTime sets the UpdateTime field's value.
func (s *FpgaImage) SetUpdateTime(v time.Time) *FpgaImage {
	s.UpdateTime = &v
	return s
}

// Describes an Amazon FPGA image (AFI) attribute.
type FpgaImageAttribute struct {
	_ struct{} `type:"structure"`

	// The description of the AFI.
	Description *string `locationName:"description" type:"string"`

	// The ID of the AFI.
	FpgaImageId *string `locationName:"fpgaImageId" type:"string"`

	// One or more load permissions.
	LoadPermissions []*LoadPermission `locationName:"loadPermissions" locationNameList:"item" type:"list"`

	// The name of the AFI.
	Name *string `locationName:"name" type:"string"`

	// One or more product codes.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s FpgaImageAttribute) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FpgaImageAttribute) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *FpgaImageAttribute) SetDescription(v string) *FpgaImageAttribute {
	s.Description = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *FpgaImageAttribute) SetFpgaImageId(v string) *FpgaImageAttribute {
	s.FpgaImageId = &v
	return s
}

// SetLoadPermissions sets the LoadPermissions field's value.
func (s *FpgaImageAttribute) SetLoadPermissions(v []*LoadPermission) *FpgaImageAttribute {
	s.LoadPermissions = v
	return s
}

// SetName sets the Name field's value.
func (s *FpgaImageAttribute) SetName(v string) *FpgaImageAttribute {
	s.Name = &v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *FpgaImageAttribute) SetProductCodes(v []*ProductCode) *FpgaImageAttribute {
	s.ProductCodes = v
	return s
}

// Describes the state of the bitstream generation process for an Amazon FPGA
// image (AFI).
type FpgaImageState struct {
	_ struct{} `type:"structure"`

	// The state. The following are the possible values:
	//
	//    * pending - AFI bitstream generation is in progress.
	//
	//    * available - The AFI is available for use.
	//
	//    * failed - AFI bitstream generation failed.
	//
	//    * unavailable - The AFI is no longer available for use.
	Code *string `locationName:"code" type:"string" enum:"FpgaImageStateCode"`

	// If the state is failed, this is the error message.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s FpgaImageState) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s FpgaImageState) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *FpgaImageState) SetCode(v string) *FpgaImageState {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *FpgaImageState) SetMessage(v string) *FpgaImageState {
	s.Message = &v
	return s
}

type GetConsoleOutputInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`

	// When enabled, retrieves the latest console output for the instance.
	//
	// Default: disabled (false)
	Latest *bool `type:"boolean"`
}

// String returns the string representation
func (s GetConsoleOutputInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetConsoleOutputInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetConsoleOutputInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetConsoleOutputInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetConsoleOutputInput) SetDryRun(v bool) *GetConsoleOutputInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetConsoleOutputInput) SetInstanceId(v string) *GetConsoleOutputInput {
	s.InstanceId = &v
	return s
}

// SetLatest sets the Latest field's value.
func (s *GetConsoleOutputInput) SetLatest(v bool) *GetConsoleOutputInput {
	s.Latest = &v
	return s
}

type GetConsoleOutputOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The console output, base64-encoded. If you are using a command line tool,
	// the tool decodes the output for you.
	Output *string `locationName:"output" type:"string"`

	// The time at which the output was last updated.
	Timestamp *time.Time `locationName:"timestamp" type:"timestamp"`
}

// String returns the string representation
func (s GetConsoleOutputOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetConsoleOutputOutput) GoString() string {
	return s.String()
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetConsoleOutputOutput) SetInstanceId(v string) *GetConsoleOutputOutput {
	s.InstanceId = &v
	return s
}

// SetOutput sets the Output field's value.
func (s *GetConsoleOutputOutput) SetOutput(v string) *GetConsoleOutputOutput {
	s.Output = &v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *GetConsoleOutputOutput) SetTimestamp(v time.Time) *GetConsoleOutputOutput {
	s.Timestamp = &v
	return s
}

type GetConsoleScreenshotInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`

	// When set to true, acts as keystroke input and wakes up an instance that's
	// in standby or "sleep" mode.
	WakeUp *bool `type:"boolean"`
}

// String returns the string representation
func (s GetConsoleScreenshotInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetConsoleScreenshotInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetConsoleScreenshotInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetConsoleScreenshotInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetConsoleScreenshotInput) SetDryRun(v bool) *GetConsoleScreenshotInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetConsoleScreenshotInput) SetInstanceId(v string) *GetConsoleScreenshotInput {
	s.InstanceId = &v
	return s
}

// SetWakeUp sets the WakeUp field's value.
func (s *GetConsoleScreenshotInput) SetWakeUp(v bool) *GetConsoleScreenshotInput {
	s.WakeUp = &v
	return s
}

type GetConsoleScreenshotOutput struct {
	_ struct{} `type:"structure"`

	// The data that comprises the image.
	ImageData *string `locationName:"imageData" type:"string"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`
}

// String returns the string representation
func (s GetConsoleScreenshotOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetConsoleScreenshotOutput) GoString() string {
	return s.String()
}

// SetImageData sets the ImageData field's value.
func (s *GetConsoleScreenshotOutput) SetImageData(v string) *GetConsoleScreenshotOutput {
	s.ImageData = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetConsoleScreenshotOutput) SetInstanceId(v string) *GetConsoleScreenshotOutput {
	s.InstanceId = &v
	return s
}

type GetHostReservationPurchasePreviewInput struct {
	_ struct{} `type:"structure"`

	// The IDs of the Dedicated Hosts with which the reservation is associated.
	//
	// HostIdSet is a required field
	HostIdSet []*string `locationNameList:"item" type:"list" required:"true"`

	// The offering ID of the reservation.
	//
	// OfferingId is a required field
	OfferingId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s GetHostReservationPurchasePreviewInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetHostReservationPurchasePreviewInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetHostReservationPurchasePreviewInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetHostReservationPurchasePreviewInput"}
	if s.HostIdSet == nil {
		invalidParams.Add(request.NewErrParamRequired("HostIdSet"))
	}
	if s.OfferingId == nil {
		invalidParams.Add(request.NewErrParamRequired("OfferingId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetHostIdSet sets the HostIdSet field's value.
func (s *GetHostReservationPurchasePreviewInput) SetHostIdSet(v []*string) *GetHostReservationPurchasePreviewInput {
	s.HostIdSet = v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *GetHostReservationPurchasePreviewInput) SetOfferingId(v string) *GetHostReservationPurchasePreviewInput {
	s.OfferingId = &v
	return s
}

type GetHostReservationPurchasePreviewOutput struct {
	_ struct{} `type:"structure"`

	// The currency in which the totalUpfrontPrice and totalHourlyPrice amounts
	// are specified. At this time, the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The purchase information of the Dedicated Host reservation and the Dedicated
	// Hosts associated with it.
	Purchase []*Purchase `locationName:"purchase" locationNameList:"item" type:"list"`

	// The potential total hourly price of the reservation per hour.
	TotalHourlyPrice *string `locationName:"totalHourlyPrice" type:"string"`

	// The potential total upfront price. This is billed immediately.
	TotalUpfrontPrice *string `locationName:"totalUpfrontPrice" type:"string"`
}

// String returns the string representation
func (s GetHostReservationPurchasePreviewOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetHostReservationPurchasePreviewOutput) GoString() string {
	return s.String()
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *GetHostReservationPurchasePreviewOutput) SetCurrencyCode(v string) *GetHostReservationPurchasePreviewOutput {
	s.CurrencyCode = &v
	return s
}

// SetPurchase sets the Purchase field's value.
func (s *GetHostReservationPurchasePreviewOutput) SetPurchase(v []*Purchase) *GetHostReservationPurchasePreviewOutput {
	s.Purchase = v
	return s
}

// SetTotalHourlyPrice sets the TotalHourlyPrice field's value.
func (s *GetHostReservationPurchasePreviewOutput) SetTotalHourlyPrice(v string) *GetHostReservationPurchasePreviewOutput {
	s.TotalHourlyPrice = &v
	return s
}

// SetTotalUpfrontPrice sets the TotalUpfrontPrice field's value.
func (s *GetHostReservationPurchasePreviewOutput) SetTotalUpfrontPrice(v string) *GetHostReservationPurchasePreviewOutput {
	s.TotalUpfrontPrice = &v
	return s
}

type GetLaunchTemplateDataInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s GetLaunchTemplateDataInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetLaunchTemplateDataInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetLaunchTemplateDataInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetLaunchTemplateDataInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetLaunchTemplateDataInput) SetDryRun(v bool) *GetLaunchTemplateDataInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetLaunchTemplateDataInput) SetInstanceId(v string) *GetLaunchTemplateDataInput {
	s.InstanceId = &v
	return s
}

type GetLaunchTemplateDataOutput struct {
	_ struct{} `type:"structure"`

	// The instance data.
	LaunchTemplateData *ResponseLaunchTemplateData `locationName:"launchTemplateData" type:"structure"`
}

// String returns the string representation
func (s GetLaunchTemplateDataOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetLaunchTemplateDataOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplateData sets the LaunchTemplateData field's value.
func (s *GetLaunchTemplateDataOutput) SetLaunchTemplateData(v *ResponseLaunchTemplateData) *GetLaunchTemplateDataOutput {
	s.LaunchTemplateData = v
	return s
}

type GetPasswordDataInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the Windows instance.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s GetPasswordDataInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetPasswordDataInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetPasswordDataInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetPasswordDataInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetPasswordDataInput) SetDryRun(v bool) *GetPasswordDataInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetPasswordDataInput) SetInstanceId(v string) *GetPasswordDataInput {
	s.InstanceId = &v
	return s
}

type GetPasswordDataOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the Windows instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The password of the instance. Returns an empty string if the password is
	// not available.
	PasswordData *string `locationName:"passwordData" type:"string"`

	// The time the data was last updated.
	Timestamp *time.Time `locationName:"timestamp" type:"timestamp"`
}

// String returns the string representation
func (s GetPasswordDataOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetPasswordDataOutput) GoString() string {
	return s.String()
}

// SetInstanceId sets the InstanceId field's value.
func (s *GetPasswordDataOutput) SetInstanceId(v string) *GetPasswordDataOutput {
	s.InstanceId = &v
	return s
}

// SetPasswordData sets the PasswordData field's value.
func (s *GetPasswordDataOutput) SetPasswordData(v string) *GetPasswordDataOutput {
	s.PasswordData = &v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *GetPasswordDataOutput) SetTimestamp(v time.Time) *GetPasswordDataOutput {
	s.Timestamp = &v
	return s
}

// Contains the parameters for GetReservedInstanceExchangeQuote.
type GetReservedInstancesExchangeQuoteInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The IDs of the Convertible Reserved Instances to exchange.
	//
	// ReservedInstanceIds is a required field
	ReservedInstanceIds []*string `locationName:"ReservedInstanceId" locationNameList:"ReservedInstanceId" type:"list" required:"true"`

	// The configuration of the target Convertible Reserved Instance to exchange
	// for your current Convertible Reserved Instances.
	TargetConfigurations []*TargetConfigurationRequest `locationName:"TargetConfiguration" locationNameList:"TargetConfigurationRequest" type:"list"`
}

// String returns the string representation
func (s GetReservedInstancesExchangeQuoteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetReservedInstancesExchangeQuoteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetReservedInstancesExchangeQuoteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetReservedInstancesExchangeQuoteInput"}
	if s.ReservedInstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("ReservedInstanceIds"))
	}
	if s.TargetConfigurations != nil {
		for i, v := range s.TargetConfigurations {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "TargetConfigurations", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetReservedInstancesExchangeQuoteInput) SetDryRun(v bool) *GetReservedInstancesExchangeQuoteInput {
	s.DryRun = &v
	return s
}

// SetReservedInstanceIds sets the ReservedInstanceIds field's value.
func (s *GetReservedInstancesExchangeQuoteInput) SetReservedInstanceIds(v []*string) *GetReservedInstancesExchangeQuoteInput {
	s.ReservedInstanceIds = v
	return s
}

// SetTargetConfigurations sets the TargetConfigurations field's value.
func (s *GetReservedInstancesExchangeQuoteInput) SetTargetConfigurations(v []*TargetConfigurationRequest) *GetReservedInstancesExchangeQuoteInput {
	s.TargetConfigurations = v
	return s
}

// Contains the output of GetReservedInstancesExchangeQuote.
type GetReservedInstancesExchangeQuoteOutput struct {
	_ struct{} `type:"structure"`

	// The currency of the transaction.
	CurrencyCode *string `locationName:"currencyCode" type:"string"`

	// If true, the exchange is valid. If false, the exchange cannot be completed.
	IsValidExchange *bool `locationName:"isValidExchange" type:"boolean"`

	// The new end date of the reservation term.
	OutputReservedInstancesWillExpireAt *time.Time `locationName:"outputReservedInstancesWillExpireAt" type:"timestamp"`

	// The total true upfront charge for the exchange.
	PaymentDue *string `locationName:"paymentDue" type:"string"`

	// The cost associated with the Reserved Instance.
	ReservedInstanceValueRollup *ReservationValue `locationName:"reservedInstanceValueRollup" type:"structure"`

	// The configuration of your Convertible Reserved Instances.
	ReservedInstanceValueSet []*ReservedInstanceReservationValue `locationName:"reservedInstanceValueSet" locationNameList:"item" type:"list"`

	// The cost associated with the Reserved Instance.
	TargetConfigurationValueRollup *ReservationValue `locationName:"targetConfigurationValueRollup" type:"structure"`

	// The values of the target Convertible Reserved Instances.
	TargetConfigurationValueSet []*TargetReservationValue `locationName:"targetConfigurationValueSet" locationNameList:"item" type:"list"`

	// Describes the reason why the exchange cannot be completed.
	ValidationFailureReason *string `locationName:"validationFailureReason" type:"string"`
}

// String returns the string representation
func (s GetReservedInstancesExchangeQuoteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetReservedInstancesExchangeQuoteOutput) GoString() string {
	return s.String()
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetCurrencyCode(v string) *GetReservedInstancesExchangeQuoteOutput {
	s.CurrencyCode = &v
	return s
}

// SetIsValidExchange sets the IsValidExchange field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetIsValidExchange(v bool) *GetReservedInstancesExchangeQuoteOutput {
	s.IsValidExchange = &v
	return s
}

// SetOutputReservedInstancesWillExpireAt sets the OutputReservedInstancesWillExpireAt field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetOutputReservedInstancesWillExpireAt(v time.Time) *GetReservedInstancesExchangeQuoteOutput {
	s.OutputReservedInstancesWillExpireAt = &v
	return s
}

// SetPaymentDue sets the PaymentDue field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetPaymentDue(v string) *GetReservedInstancesExchangeQuoteOutput {
	s.PaymentDue = &v
	return s
}

// SetReservedInstanceValueRollup sets the ReservedInstanceValueRollup field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetReservedInstanceValueRollup(v *ReservationValue) *GetReservedInstancesExchangeQuoteOutput {
	s.ReservedInstanceValueRollup = v
	return s
}

// SetReservedInstanceValueSet sets the ReservedInstanceValueSet field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetReservedInstanceValueSet(v []*ReservedInstanceReservationValue) *GetReservedInstancesExchangeQuoteOutput {
	s.ReservedInstanceValueSet = v
	return s
}

// SetTargetConfigurationValueRollup sets the TargetConfigurationValueRollup field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetTargetConfigurationValueRollup(v *ReservationValue) *GetReservedInstancesExchangeQuoteOutput {
	s.TargetConfigurationValueRollup = v
	return s
}

// SetTargetConfigurationValueSet sets the TargetConfigurationValueSet field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetTargetConfigurationValueSet(v []*TargetReservationValue) *GetReservedInstancesExchangeQuoteOutput {
	s.TargetConfigurationValueSet = v
	return s
}

// SetValidationFailureReason sets the ValidationFailureReason field's value.
func (s *GetReservedInstancesExchangeQuoteOutput) SetValidationFailureReason(v string) *GetReservedInstancesExchangeQuoteOutput {
	s.ValidationFailureReason = &v
	return s
}

type GetTransitGatewayAttachmentPropagationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * transit-gateway-route-table-id - The ID of the transit gateway route
	//    table.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s GetTransitGatewayAttachmentPropagationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetTransitGatewayAttachmentPropagationsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetTransitGatewayAttachmentPropagationsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetTransitGatewayAttachmentPropagationsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetTransitGatewayAttachmentPropagationsInput) SetDryRun(v bool) *GetTransitGatewayAttachmentPropagationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *GetTransitGatewayAttachmentPropagationsInput) SetFilters(v []*Filter) *GetTransitGatewayAttachmentPropagationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *GetTransitGatewayAttachmentPropagationsInput) SetMaxResults(v int64) *GetTransitGatewayAttachmentPropagationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetTransitGatewayAttachmentPropagationsInput) SetNextToken(v string) *GetTransitGatewayAttachmentPropagationsInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *GetTransitGatewayAttachmentPropagationsInput) SetTransitGatewayAttachmentId(v string) *GetTransitGatewayAttachmentPropagationsInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

type GetTransitGatewayAttachmentPropagationsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the propagation route tables.
	TransitGatewayAttachmentPropagations []*TransitGatewayAttachmentPropagation `locationName:"transitGatewayAttachmentPropagations" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s GetTransitGatewayAttachmentPropagationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetTransitGatewayAttachmentPropagationsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *GetTransitGatewayAttachmentPropagationsOutput) SetNextToken(v string) *GetTransitGatewayAttachmentPropagationsOutput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayAttachmentPropagations sets the TransitGatewayAttachmentPropagations field's value.
func (s *GetTransitGatewayAttachmentPropagationsOutput) SetTransitGatewayAttachmentPropagations(v []*TransitGatewayAttachmentPropagation) *GetTransitGatewayAttachmentPropagationsOutput {
	s.TransitGatewayAttachmentPropagations = v
	return s
}

type GetTransitGatewayRouteTableAssociationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * resource-id - The ID of the resource.
	//
	//    * resource-type - The resource type (vpc | vpn).
	//
	//    * transit-gateway-attachment-id - The ID of the attachment.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s GetTransitGatewayRouteTableAssociationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetTransitGatewayRouteTableAssociationsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetTransitGatewayRouteTableAssociationsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetTransitGatewayRouteTableAssociationsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetTransitGatewayRouteTableAssociationsInput) SetDryRun(v bool) *GetTransitGatewayRouteTableAssociationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *GetTransitGatewayRouteTableAssociationsInput) SetFilters(v []*Filter) *GetTransitGatewayRouteTableAssociationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *GetTransitGatewayRouteTableAssociationsInput) SetMaxResults(v int64) *GetTransitGatewayRouteTableAssociationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetTransitGatewayRouteTableAssociationsInput) SetNextToken(v string) *GetTransitGatewayRouteTableAssociationsInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *GetTransitGatewayRouteTableAssociationsInput) SetTransitGatewayRouteTableId(v string) *GetTransitGatewayRouteTableAssociationsInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type GetTransitGatewayRouteTableAssociationsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the associations.
	Associations []*TransitGatewayRouteTableAssociation `locationName:"associations" locationNameList:"item" type:"list"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`
}

// String returns the string representation
func (s GetTransitGatewayRouteTableAssociationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetTransitGatewayRouteTableAssociationsOutput) GoString() string {
	return s.String()
}

// SetAssociations sets the Associations field's value.
func (s *GetTransitGatewayRouteTableAssociationsOutput) SetAssociations(v []*TransitGatewayRouteTableAssociation) *GetTransitGatewayRouteTableAssociationsOutput {
	s.Associations = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetTransitGatewayRouteTableAssociationsOutput) SetNextToken(v string) *GetTransitGatewayRouteTableAssociationsOutput {
	s.NextToken = &v
	return s
}

type GetTransitGatewayRouteTablePropagationsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * resource-id - The ID of the resource.
	//
	//    * resource-type - The resource type (vpc | vpn).
	//
	//    * transit-gateway-attachment-id - The ID of the attachment.
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list"`

	// The maximum number of results to return with a single call. To retrieve the
	// remaining results, make another call with the returned nextToken value.
	MaxResults *int64 `min:"5" type:"integer"`

	// The token for the next page of results.
	NextToken *string `type:"string"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s GetTransitGatewayRouteTablePropagationsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetTransitGatewayRouteTablePropagationsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetTransitGatewayRouteTablePropagationsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetTransitGatewayRouteTablePropagationsInput"}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *GetTransitGatewayRouteTablePropagationsInput) SetDryRun(v bool) *GetTransitGatewayRouteTablePropagationsInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *GetTransitGatewayRouteTablePropagationsInput) SetFilters(v []*Filter) *GetTransitGatewayRouteTablePropagationsInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *GetTransitGatewayRouteTablePropagationsInput) SetMaxResults(v int64) *GetTransitGatewayRouteTablePropagationsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetTransitGatewayRouteTablePropagationsInput) SetNextToken(v string) *GetTransitGatewayRouteTablePropagationsInput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *GetTransitGatewayRouteTablePropagationsInput) SetTransitGatewayRouteTableId(v string) *GetTransitGatewayRouteTablePropagationsInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type GetTransitGatewayRouteTablePropagationsOutput struct {
	_ struct{} `type:"structure"`

	// The token to use to retrieve the next page of results. This value is null
	// when there are no more results to return.
	NextToken *string `locationName:"nextToken" type:"string"`

	// Information about the route table propagations.
	TransitGatewayRouteTablePropagations []*TransitGatewayRouteTablePropagation `locationName:"transitGatewayRouteTablePropagations" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s GetTransitGatewayRouteTablePropagationsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetTransitGatewayRouteTablePropagationsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *GetTransitGatewayRouteTablePropagationsOutput) SetNextToken(v string) *GetTransitGatewayRouteTablePropagationsOutput {
	s.NextToken = &v
	return s
}

// SetTransitGatewayRouteTablePropagations sets the TransitGatewayRouteTablePropagations field's value.
func (s *GetTransitGatewayRouteTablePropagationsOutput) SetTransitGatewayRouteTablePropagations(v []*TransitGatewayRouteTablePropagation) *GetTransitGatewayRouteTablePropagationsOutput {
	s.TransitGatewayRouteTablePropagations = v
	return s
}

// Describes a security group.
type GroupIdentifier struct {
	_ struct{} `type:"structure"`

	// The ID of the security group.
	GroupId *string `locationName:"groupId" type:"string"`

	// The name of the security group.
	GroupName *string `locationName:"groupName" type:"string"`
}

// String returns the string representation
func (s GroupIdentifier) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GroupIdentifier) GoString() string {
	return s.String()
}

// SetGroupId sets the GroupId field's value.
func (s *GroupIdentifier) SetGroupId(v string) *GroupIdentifier {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *GroupIdentifier) SetGroupName(v string) *GroupIdentifier {
	s.GroupName = &v
	return s
}

// Indicates whether your instance is configured for hibernation. This parameter
// is valid only if the instance meets the hibernation prerequisites (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#hibernating-prerequisites).
// Hibernation is currently supported only for Amazon Linux. For more information,
// see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
// in the Amazon Elastic Compute Cloud User Guide.
type HibernationOptions struct {
	_ struct{} `type:"structure"`

	// If this parameter is set to true, your instance is enabled for hibernation;
	// otherwise, it is not enabled for hibernation.
	Configured *bool `locationName:"configured" type:"boolean"`
}

// String returns the string representation
func (s HibernationOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HibernationOptions) GoString() string {
	return s.String()
}

// SetConfigured sets the Configured field's value.
func (s *HibernationOptions) SetConfigured(v bool) *HibernationOptions {
	s.Configured = &v
	return s
}

// Indicates whether your instance is configured for hibernation. This parameter
// is valid only if the instance meets the hibernation prerequisites (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#hibernating-prerequisites).
// Hibernation is currently supported only for Amazon Linux. For more information,
// see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
// in the Amazon Elastic Compute Cloud User Guide.
type HibernationOptionsRequest struct {
	_ struct{} `type:"structure"`

	// If you set this parameter to true, your instance is enabled for hibernation.
	//
	// Default: false
	Configured *bool `type:"boolean"`
}

// String returns the string representation
func (s HibernationOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HibernationOptionsRequest) GoString() string {
	return s.String()
}

// SetConfigured sets the Configured field's value.
func (s *HibernationOptionsRequest) SetConfigured(v bool) *HibernationOptionsRequest {
	s.Configured = &v
	return s
}

// Describes an event in the history of the Spot Fleet request.
type HistoryRecord struct {
	_ struct{} `type:"structure"`

	// Information about the event.
	EventInformation *EventInformation `locationName:"eventInformation" type:"structure"`

	// The event type.
	//
	//    * error - An error with the Spot Fleet request.
	//
	//    * fleetRequestChange - A change in the status or configuration of the
	//    Spot Fleet request.
	//
	//    * instanceChange - An instance was launched or terminated.
	//
	//    * Information - An informational event.
	EventType *string `locationName:"eventType" type:"string" enum:"EventType"`

	// The date and time of the event, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	Timestamp *time.Time `locationName:"timestamp" type:"timestamp"`
}

// String returns the string representation
func (s HistoryRecord) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HistoryRecord) GoString() string {
	return s.String()
}

// SetEventInformation sets the EventInformation field's value.
func (s *HistoryRecord) SetEventInformation(v *EventInformation) *HistoryRecord {
	s.EventInformation = v
	return s
}

// SetEventType sets the EventType field's value.
func (s *HistoryRecord) SetEventType(v string) *HistoryRecord {
	s.EventType = &v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *HistoryRecord) SetTimestamp(v time.Time) *HistoryRecord {
	s.Timestamp = &v
	return s
}

// Describes an event in the history of an EC2 Fleet.
type HistoryRecordEntry struct {
	_ struct{} `type:"structure"`

	// Information about the event.
	EventInformation *EventInformation `locationName:"eventInformation" type:"structure"`

	// The event type.
	EventType *string `locationName:"eventType" type:"string" enum:"FleetEventType"`

	// The date and time of the event, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	Timestamp *time.Time `locationName:"timestamp" type:"timestamp"`
}

// String returns the string representation
func (s HistoryRecordEntry) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HistoryRecordEntry) GoString() string {
	return s.String()
}

// SetEventInformation sets the EventInformation field's value.
func (s *HistoryRecordEntry) SetEventInformation(v *EventInformation) *HistoryRecordEntry {
	s.EventInformation = v
	return s
}

// SetEventType sets the EventType field's value.
func (s *HistoryRecordEntry) SetEventType(v string) *HistoryRecordEntry {
	s.EventType = &v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *HistoryRecordEntry) SetTimestamp(v time.Time) *HistoryRecordEntry {
	s.Timestamp = &v
	return s
}

// Describes the properties of the Dedicated Host.
type Host struct {
	_ struct{} `type:"structure"`

	// The time that the Dedicated Host was allocated.
	AllocationTime *time.Time `locationName:"allocationTime" type:"timestamp"`

	// Whether auto-placement is on or off.
	AutoPlacement *string `locationName:"autoPlacement" type:"string" enum:"AutoPlacement"`

	// The Availability Zone of the Dedicated Host.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The number of new instances that can be launched onto the Dedicated Host.
	AvailableCapacity *AvailableCapacity `locationName:"availableCapacity" type:"structure"`

	// Unique, case-sensitive identifier that you provide to ensure idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The ID of the Dedicated Host.
	HostId *string `locationName:"hostId" type:"string"`

	// The hardware specifications of the Dedicated Host.
	HostProperties *HostProperties `locationName:"hostProperties" type:"structure"`

	// The reservation ID of the Dedicated Host. This returns a null response if
	// the Dedicated Host doesn't have an associated reservation.
	HostReservationId *string `locationName:"hostReservationId" type:"string"`

	// The IDs and instance type that are currently running on the Dedicated Host.
	Instances []*HostInstance `locationName:"instances" locationNameList:"item" type:"list"`

	// The time that the Dedicated Host was released.
	ReleaseTime *time.Time `locationName:"releaseTime" type:"timestamp"`

	// The Dedicated Host's state.
	State *string `locationName:"state" type:"string" enum:"AllocationState"`

	// Any tags assigned to the Dedicated Host.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s Host) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Host) GoString() string {
	return s.String()
}

// SetAllocationTime sets the AllocationTime field's value.
func (s *Host) SetAllocationTime(v time.Time) *Host {
	s.AllocationTime = &v
	return s
}

// SetAutoPlacement sets the AutoPlacement field's value.
func (s *Host) SetAutoPlacement(v string) *Host {
	s.AutoPlacement = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *Host) SetAvailabilityZone(v string) *Host {
	s.AvailabilityZone = &v
	return s
}

// SetAvailableCapacity sets the AvailableCapacity field's value.
func (s *Host) SetAvailableCapacity(v *AvailableCapacity) *Host {
	s.AvailableCapacity = v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *Host) SetClientToken(v string) *Host {
	s.ClientToken = &v
	return s
}

// SetHostId sets the HostId field's value.
func (s *Host) SetHostId(v string) *Host {
	s.HostId = &v
	return s
}

// SetHostProperties sets the HostProperties field's value.
func (s *Host) SetHostProperties(v *HostProperties) *Host {
	s.HostProperties = v
	return s
}

// SetHostReservationId sets the HostReservationId field's value.
func (s *Host) SetHostReservationId(v string) *Host {
	s.HostReservationId = &v
	return s
}

// SetInstances sets the Instances field's value.
func (s *Host) SetInstances(v []*HostInstance) *Host {
	s.Instances = v
	return s
}

// SetReleaseTime sets the ReleaseTime field's value.
func (s *Host) SetReleaseTime(v time.Time) *Host {
	s.ReleaseTime = &v
	return s
}

// SetState sets the State field's value.
func (s *Host) SetState(v string) *Host {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Host) SetTags(v []*Tag) *Host {
	s.Tags = v
	return s
}

// Describes an instance running on a Dedicated Host.
type HostInstance struct {
	_ struct{} `type:"structure"`

	// the IDs of instances that are running on the Dedicated Host.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The instance type size (for example, m3.medium) of the running instance.
	InstanceType *string `locationName:"instanceType" type:"string"`
}

// String returns the string representation
func (s HostInstance) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HostInstance) GoString() string {
	return s.String()
}

// SetInstanceId sets the InstanceId field's value.
func (s *HostInstance) SetInstanceId(v string) *HostInstance {
	s.InstanceId = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *HostInstance) SetInstanceType(v string) *HostInstance {
	s.InstanceType = &v
	return s
}

// Details about the Dedicated Host Reservation offering.
type HostOffering struct {
	_ struct{} `type:"structure"`

	// The currency of the offering.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The duration of the offering (in seconds).
	Duration *int64 `locationName:"duration" type:"integer"`

	// The hourly price of the offering.
	HourlyPrice *string `locationName:"hourlyPrice" type:"string"`

	// The instance family of the offering.
	InstanceFamily *string `locationName:"instanceFamily" type:"string"`

	// The ID of the offering.
	OfferingId *string `locationName:"offeringId" type:"string"`

	// The available payment option.
	PaymentOption *string `locationName:"paymentOption" type:"string" enum:"PaymentOption"`

	// The upfront price of the offering. Does not apply to No Upfront offerings.
	UpfrontPrice *string `locationName:"upfrontPrice" type:"string"`
}

// String returns the string representation
func (s HostOffering) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HostOffering) GoString() string {
	return s.String()
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *HostOffering) SetCurrencyCode(v string) *HostOffering {
	s.CurrencyCode = &v
	return s
}

// SetDuration sets the Duration field's value.
func (s *HostOffering) SetDuration(v int64) *HostOffering {
	s.Duration = &v
	return s
}

// SetHourlyPrice sets the HourlyPrice field's value.
func (s *HostOffering) SetHourlyPrice(v string) *HostOffering {
	s.HourlyPrice = &v
	return s
}

// SetInstanceFamily sets the InstanceFamily field's value.
func (s *HostOffering) SetInstanceFamily(v string) *HostOffering {
	s.InstanceFamily = &v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *HostOffering) SetOfferingId(v string) *HostOffering {
	s.OfferingId = &v
	return s
}

// SetPaymentOption sets the PaymentOption field's value.
func (s *HostOffering) SetPaymentOption(v string) *HostOffering {
	s.PaymentOption = &v
	return s
}

// SetUpfrontPrice sets the UpfrontPrice field's value.
func (s *HostOffering) SetUpfrontPrice(v string) *HostOffering {
	s.UpfrontPrice = &v
	return s
}

// Describes properties of a Dedicated Host.
type HostProperties struct {
	_ struct{} `type:"structure"`

	// The number of cores on the Dedicated Host.
	Cores *int64 `locationName:"cores" type:"integer"`

	// The instance type size that the Dedicated Host supports (for example, m3.medium).
	InstanceType *string `locationName:"instanceType" type:"string"`

	// The number of sockets on the Dedicated Host.
	Sockets *int64 `locationName:"sockets" type:"integer"`

	// The number of vCPUs on the Dedicated Host.
	TotalVCpus *int64 `locationName:"totalVCpus" type:"integer"`
}

// String returns the string representation
func (s HostProperties) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HostProperties) GoString() string {
	return s.String()
}

// SetCores sets the Cores field's value.
func (s *HostProperties) SetCores(v int64) *HostProperties {
	s.Cores = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *HostProperties) SetInstanceType(v string) *HostProperties {
	s.InstanceType = &v
	return s
}

// SetSockets sets the Sockets field's value.
func (s *HostProperties) SetSockets(v int64) *HostProperties {
	s.Sockets = &v
	return s
}

// SetTotalVCpus sets the TotalVCpus field's value.
func (s *HostProperties) SetTotalVCpus(v int64) *HostProperties {
	s.TotalVCpus = &v
	return s
}

// Details about the Dedicated Host Reservation and associated Dedicated Hosts.
type HostReservation struct {
	_ struct{} `type:"structure"`

	// The number of Dedicated Hosts the reservation is associated with.
	Count *int64 `locationName:"count" type:"integer"`

	// The currency in which the upfrontPrice and hourlyPrice amounts are specified.
	// At this time, the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The length of the reservation's term, specified in seconds. Can be 31536000
	// (1 year) | 94608000 (3 years).
	Duration *int64 `locationName:"duration" type:"integer"`

	// The date and time that the reservation ends.
	End *time.Time `locationName:"end" type:"timestamp"`

	// The IDs of the Dedicated Hosts associated with the reservation.
	HostIdSet []*string `locationName:"hostIdSet" locationNameList:"item" type:"list"`

	// The ID of the reservation that specifies the associated Dedicated Hosts.
	HostReservationId *string `locationName:"hostReservationId" type:"string"`

	// The hourly price of the reservation.
	HourlyPrice *string `locationName:"hourlyPrice" type:"string"`

	// The instance family of the Dedicated Host Reservation. The instance family
	// on the Dedicated Host must be the same in order for it to benefit from the
	// reservation.
	InstanceFamily *string `locationName:"instanceFamily" type:"string"`

	// The ID of the reservation. This remains the same regardless of which Dedicated
	// Hosts are associated with it.
	OfferingId *string `locationName:"offeringId" type:"string"`

	// The payment option selected for this reservation.
	PaymentOption *string `locationName:"paymentOption" type:"string" enum:"PaymentOption"`

	// The date and time that the reservation started.
	Start *time.Time `locationName:"start" type:"timestamp"`

	// The state of the reservation.
	State *string `locationName:"state" type:"string" enum:"ReservationState"`

	// The upfront price of the reservation.
	UpfrontPrice *string `locationName:"upfrontPrice" type:"string"`
}

// String returns the string representation
func (s HostReservation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s HostReservation) GoString() string {
	return s.String()
}

// SetCount sets the Count field's value.
func (s *HostReservation) SetCount(v int64) *HostReservation {
	s.Count = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *HostReservation) SetCurrencyCode(v string) *HostReservation {
	s.CurrencyCode = &v
	return s
}

// SetDuration sets the Duration field's value.
func (s *HostReservation) SetDuration(v int64) *HostReservation {
	s.Duration = &v
	return s
}

// SetEnd sets the End field's value.
func (s *HostReservation) SetEnd(v time.Time) *HostReservation {
	s.End = &v
	return s
}

// SetHostIdSet sets the HostIdSet field's value.
func (s *HostReservation) SetHostIdSet(v []*string) *HostReservation {
	s.HostIdSet = v
	return s
}

// SetHostReservationId sets the HostReservationId field's value.
func (s *HostReservation) SetHostReservationId(v string) *HostReservation {
	s.HostReservationId = &v
	return s
}

// SetHourlyPrice sets the HourlyPrice field's value.
func (s *HostReservation) SetHourlyPrice(v string) *HostReservation {
	s.HourlyPrice = &v
	return s
}

// SetInstanceFamily sets the InstanceFamily field's value.
func (s *HostReservation) SetInstanceFamily(v string) *HostReservation {
	s.InstanceFamily = &v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *HostReservation) SetOfferingId(v string) *HostReservation {
	s.OfferingId = &v
	return s
}

// SetPaymentOption sets the PaymentOption field's value.
func (s *HostReservation) SetPaymentOption(v string) *HostReservation {
	s.PaymentOption = &v
	return s
}

// SetStart sets the Start field's value.
func (s *HostReservation) SetStart(v time.Time) *HostReservation {
	s.Start = &v
	return s
}

// SetState sets the State field's value.
func (s *HostReservation) SetState(v string) *HostReservation {
	s.State = &v
	return s
}

// SetUpfrontPrice sets the UpfrontPrice field's value.
func (s *HostReservation) SetUpfrontPrice(v string) *HostReservation {
	s.UpfrontPrice = &v
	return s
}

// Describes an IAM instance profile.
type IamInstanceProfile struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the instance profile.
	Arn *string `locationName:"arn" type:"string"`

	// The ID of the instance profile.
	Id *string `locationName:"id" type:"string"`
}

// String returns the string representation
func (s IamInstanceProfile) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IamInstanceProfile) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *IamInstanceProfile) SetArn(v string) *IamInstanceProfile {
	s.Arn = &v
	return s
}

// SetId sets the Id field's value.
func (s *IamInstanceProfile) SetId(v string) *IamInstanceProfile {
	s.Id = &v
	return s
}

// Describes an association between an IAM instance profile and an instance.
type IamInstanceProfileAssociation struct {
	_ struct{} `type:"structure"`

	// The ID of the association.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The IAM instance profile.
	IamInstanceProfile *IamInstanceProfile `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The state of the association.
	State *string `locationName:"state" type:"string" enum:"IamInstanceProfileAssociationState"`

	// The time the IAM instance profile was associated with the instance.
	Timestamp *time.Time `locationName:"timestamp" type:"timestamp"`
}

// String returns the string representation
func (s IamInstanceProfileAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IamInstanceProfileAssociation) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *IamInstanceProfileAssociation) SetAssociationId(v string) *IamInstanceProfileAssociation {
	s.AssociationId = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *IamInstanceProfileAssociation) SetIamInstanceProfile(v *IamInstanceProfile) *IamInstanceProfileAssociation {
	s.IamInstanceProfile = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *IamInstanceProfileAssociation) SetInstanceId(v string) *IamInstanceProfileAssociation {
	s.InstanceId = &v
	return s
}

// SetState sets the State field's value.
func (s *IamInstanceProfileAssociation) SetState(v string) *IamInstanceProfileAssociation {
	s.State = &v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *IamInstanceProfileAssociation) SetTimestamp(v time.Time) *IamInstanceProfileAssociation {
	s.Timestamp = &v
	return s
}

// Describes an IAM instance profile.
type IamInstanceProfileSpecification struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the instance profile.
	Arn *string `locationName:"arn" type:"string"`

	// The name of the instance profile.
	Name *string `locationName:"name" type:"string"`
}

// String returns the string representation
func (s IamInstanceProfileSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IamInstanceProfileSpecification) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *IamInstanceProfileSpecification) SetArn(v string) *IamInstanceProfileSpecification {
	s.Arn = &v
	return s
}

// SetName sets the Name field's value.
func (s *IamInstanceProfileSpecification) SetName(v string) *IamInstanceProfileSpecification {
	s.Name = &v
	return s
}

// Describes the ICMP type and code.
type IcmpTypeCode struct {
	_ struct{} `type:"structure"`

	// The ICMP code. A value of -1 means all codes for the specified ICMP type.
	Code *int64 `locationName:"code" type:"integer"`

	// The ICMP type. A value of -1 means all types.
	Type *int64 `locationName:"type" type:"integer"`
}

// String returns the string representation
func (s IcmpTypeCode) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IcmpTypeCode) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *IcmpTypeCode) SetCode(v int64) *IcmpTypeCode {
	s.Code = &v
	return s
}

// SetType sets the Type field's value.
func (s *IcmpTypeCode) SetType(v int64) *IcmpTypeCode {
	s.Type = &v
	return s
}

// Describes the ID format for a resource.
type IdFormat struct {
	_ struct{} `type:"structure"`

	// The date in UTC at which you are permanently switched over to using longer
	// IDs. If a deadline is not yet available for this resource type, this field
	// is not returned.
	Deadline *time.Time `locationName:"deadline" type:"timestamp"`

	// The type of resource.
	Resource *string `locationName:"resource" type:"string"`

	// Indicates whether longer IDs (17-character IDs) are enabled for the resource.
	UseLongIds *bool `locationName:"useLongIds" type:"boolean"`
}

// String returns the string representation
func (s IdFormat) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IdFormat) GoString() string {
	return s.String()
}

// SetDeadline sets the Deadline field's value.
func (s *IdFormat) SetDeadline(v time.Time) *IdFormat {
	s.Deadline = &v
	return s
}

// SetResource sets the Resource field's value.
func (s *IdFormat) SetResource(v string) *IdFormat {
	s.Resource = &v
	return s
}

// SetUseLongIds sets the UseLongIds field's value.
func (s *IdFormat) SetUseLongIds(v bool) *IdFormat {
	s.UseLongIds = &v
	return s
}

// Describes an image.
type Image struct {
	_ struct{} `type:"structure"`

	// The architecture of the image.
	Architecture *string `locationName:"architecture" type:"string" enum:"ArchitectureValues"`

	// Any block device mapping entries.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// The date and time the image was created.
	CreationDate *string `locationName:"creationDate" type:"string"`

	// The description of the AMI that was provided during image creation.
	Description *string `locationName:"description" type:"string"`

	// Specifies whether enhanced networking with ENA is enabled.
	EnaSupport *bool `locationName:"enaSupport" type:"boolean"`

	// The hypervisor type of the image.
	Hypervisor *string `locationName:"hypervisor" type:"string" enum:"HypervisorType"`

	// The ID of the AMI.
	ImageId *string `locationName:"imageId" type:"string"`

	// The location of the AMI.
	ImageLocation *string `locationName:"imageLocation" type:"string"`

	// The AWS account alias (for example, amazon, self) or the AWS account ID of
	// the AMI owner.
	ImageOwnerAlias *string `locationName:"imageOwnerAlias" type:"string"`

	// The type of image.
	ImageType *string `locationName:"imageType" type:"string" enum:"ImageTypeValues"`

	// The kernel associated with the image, if any. Only applicable for machine
	// images.
	KernelId *string `locationName:"kernelId" type:"string"`

	// The name of the AMI that was provided during image creation.
	Name *string `locationName:"name" type:"string"`

	// The AWS account ID of the image owner.
	OwnerId *string `locationName:"imageOwnerId" type:"string"`

	// The value is Windows for Windows AMIs; otherwise blank.
	Platform *string `locationName:"platform" type:"string" enum:"PlatformValues"`

	// Any product codes associated with the AMI.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// Indicates whether the image has public launch permissions. The value is true
	// if this image has public launch permissions or false if it has only implicit
	// and explicit launch permissions.
	Public *bool `locationName:"isPublic" type:"boolean"`

	// The RAM disk associated with the image, if any. Only applicable for machine
	// images.
	RamdiskId *string `locationName:"ramdiskId" type:"string"`

	// The device name of the root device volume (for example, /dev/sda1).
	RootDeviceName *string `locationName:"rootDeviceName" type:"string"`

	// The type of root device used by the AMI. The AMI can use an EBS volume or
	// an instance store volume.
	RootDeviceType *string `locationName:"rootDeviceType" type:"string" enum:"DeviceType"`

	// Specifies whether enhanced networking with the Intel 82599 Virtual Function
	// interface is enabled.
	SriovNetSupport *string `locationName:"sriovNetSupport" type:"string"`

	// The current state of the AMI. If the state is available, the image is successfully
	// registered and can be used to launch an instance.
	State *string `locationName:"imageState" type:"string" enum:"ImageState"`

	// The reason for the state change.
	StateReason *StateReason `locationName:"stateReason" type:"structure"`

	// Any tags assigned to the image.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The type of virtualization of the AMI.
	VirtualizationType *string `locationName:"virtualizationType" type:"string" enum:"VirtualizationType"`
}

// String returns the string representation
func (s Image) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Image) GoString() string {
	return s.String()
}

// SetArchitecture sets the Architecture field's value.
func (s *Image) SetArchitecture(v string) *Image {
	s.Architecture = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *Image) SetBlockDeviceMappings(v []*BlockDeviceMapping) *Image {
	s.BlockDeviceMappings = v
	return s
}

// SetCreationDate sets the CreationDate field's value.
func (s *Image) SetCreationDate(v string) *Image {
	s.CreationDate = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *Image) SetDescription(v string) *Image {
	s.Description = &v
	return s
}

// SetEnaSupport sets the EnaSupport field's value.
func (s *Image) SetEnaSupport(v bool) *Image {
	s.EnaSupport = &v
	return s
}

// SetHypervisor sets the Hypervisor field's value.
func (s *Image) SetHypervisor(v string) *Image {
	s.Hypervisor = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *Image) SetImageId(v string) *Image {
	s.ImageId = &v
	return s
}

// SetImageLocation sets the ImageLocation field's value.
func (s *Image) SetImageLocation(v string) *Image {
	s.ImageLocation = &v
	return s
}

// SetImageOwnerAlias sets the ImageOwnerAlias field's value.
func (s *Image) SetImageOwnerAlias(v string) *Image {
	s.ImageOwnerAlias = &v
	return s
}

// SetImageType sets the ImageType field's value.
func (s *Image) SetImageType(v string) *Image {
	s.ImageType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *Image) SetKernelId(v string) *Image {
	s.KernelId = &v
	return s
}

// SetName sets the Name field's value.
func (s *Image) SetName(v string) *Image {
	s.Name = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *Image) SetOwnerId(v string) *Image {
	s.OwnerId = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *Image) SetPlatform(v string) *Image {
	s.Platform = &v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *Image) SetProductCodes(v []*ProductCode) *Image {
	s.ProductCodes = v
	return s
}

// SetPublic sets the Public field's value.
func (s *Image) SetPublic(v bool) *Image {
	s.Public = &v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *Image) SetRamdiskId(v string) *Image {
	s.RamdiskId = &v
	return s
}

// SetRootDeviceName sets the RootDeviceName field's value.
func (s *Image) SetRootDeviceName(v string) *Image {
	s.RootDeviceName = &v
	return s
}

// SetRootDeviceType sets the RootDeviceType field's value.
func (s *Image) SetRootDeviceType(v string) *Image {
	s.RootDeviceType = &v
	return s
}

// SetSriovNetSupport sets the SriovNetSupport field's value.
func (s *Image) SetSriovNetSupport(v string) *Image {
	s.SriovNetSupport = &v
	return s
}

// SetState sets the State field's value.
func (s *Image) SetState(v string) *Image {
	s.State = &v
	return s
}

// SetStateReason sets the StateReason field's value.
func (s *Image) SetStateReason(v *StateReason) *Image {
	s.StateReason = v
	return s
}

// SetTags sets the Tags field's value.
func (s *Image) SetTags(v []*Tag) *Image {
	s.Tags = v
	return s
}

// SetVirtualizationType sets the VirtualizationType field's value.
func (s *Image) SetVirtualizationType(v string) *Image {
	s.VirtualizationType = &v
	return s
}

// Describes the disk container object for an import image task.
type ImageDiskContainer struct {
	_ struct{} `type:"structure"`

	// The description of the disk image.
	Description *string `type:"string"`

	// The block device mapping for the disk.
	DeviceName *string `type:"string"`

	// The format of the disk image being imported.
	//
	// Valid values: VHD | VMDK | OVA
	Format *string `type:"string"`

	// The ID of the EBS snapshot to be used for importing the snapshot.
	SnapshotId *string `type:"string"`

	// The URL to the Amazon S3-based disk image being imported. The URL can either
	// be a https URL (https://..) or an Amazon S3 URL (s3://..)
	Url *string `type:"string"`

	// The S3 bucket for the disk image.
	UserBucket *UserBucket `type:"structure"`
}

// String returns the string representation
func (s ImageDiskContainer) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImageDiskContainer) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *ImageDiskContainer) SetDescription(v string) *ImageDiskContainer {
	s.Description = &v
	return s
}

// SetDeviceName sets the DeviceName field's value.
func (s *ImageDiskContainer) SetDeviceName(v string) *ImageDiskContainer {
	s.DeviceName = &v
	return s
}

// SetFormat sets the Format field's value.
func (s *ImageDiskContainer) SetFormat(v string) *ImageDiskContainer {
	s.Format = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *ImageDiskContainer) SetSnapshotId(v string) *ImageDiskContainer {
	s.SnapshotId = &v
	return s
}

// SetUrl sets the Url field's value.
func (s *ImageDiskContainer) SetUrl(v string) *ImageDiskContainer {
	s.Url = &v
	return s
}

// SetUserBucket sets the UserBucket field's value.
func (s *ImageDiskContainer) SetUserBucket(v *UserBucket) *ImageDiskContainer {
	s.UserBucket = v
	return s
}

type ImportClientVpnClientCertificateRevocationListInput struct {
	_ struct{} `type:"structure"`

	// The client certificate revocation list file. For more information, see Generate
	// a Client Certificate Revocation List (vpn/latest/clientvpn-admin/cvpn-working-certificates.html#cvpn-working-certificates-generate)
	// in the AWS Client VPN Admin Guide.
	//
	// CertificateRevocationList is a required field
	CertificateRevocationList *string `type:"string" required:"true"`

	// The ID of the Client VPN endpoint to which the client certificate revocation
	// list applies.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s ImportClientVpnClientCertificateRevocationListInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportClientVpnClientCertificateRevocationListInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ImportClientVpnClientCertificateRevocationListInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ImportClientVpnClientCertificateRevocationListInput"}
	if s.CertificateRevocationList == nil {
		invalidParams.Add(request.NewErrParamRequired("CertificateRevocationList"))
	}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCertificateRevocationList sets the CertificateRevocationList field's value.
func (s *ImportClientVpnClientCertificateRevocationListInput) SetCertificateRevocationList(v string) *ImportClientVpnClientCertificateRevocationListInput {
	s.CertificateRevocationList = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ImportClientVpnClientCertificateRevocationListInput) SetClientVpnEndpointId(v string) *ImportClientVpnClientCertificateRevocationListInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ImportClientVpnClientCertificateRevocationListInput) SetDryRun(v bool) *ImportClientVpnClientCertificateRevocationListInput {
	s.DryRun = &v
	return s
}

type ImportClientVpnClientCertificateRevocationListOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ImportClientVpnClientCertificateRevocationListOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportClientVpnClientCertificateRevocationListOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ImportClientVpnClientCertificateRevocationListOutput) SetReturn(v bool) *ImportClientVpnClientCertificateRevocationListOutput {
	s.Return = &v
	return s
}

// Contains the parameters for ImportImage.
type ImportImageInput struct {
	_ struct{} `type:"structure"`

	// The architecture of the virtual machine.
	//
	// Valid values: i386 | x86_64
	Architecture *string `type:"string"`

	// The client-specific data.
	ClientData *ClientData `type:"structure"`

	// The token to enable idempotency for VM import requests.
	ClientToken *string `type:"string"`

	// A description string for the import image task.
	Description *string `type:"string"`

	// Information about the disk containers.
	DiskContainers []*ImageDiskContainer `locationName:"DiskContainer" locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Specifies whether the destination AMI of the imported image should be encrypted.
	// The default CMK for EBS is used unless you specify a non-default AWS Key
	// Management Service (AWS KMS) CMK using KmsKeyId. For more information, see
	// Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	Encrypted *bool `type:"boolean"`

	// The target hypervisor platform.
	//
	// Valid values: xen
	Hypervisor *string `type:"string"`

	// An identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) to use when creating the encrypted AMI. This parameter is only
	// required if you want to use a non-default CMK; if this parameter is not specified,
	// the default CMK for EBS is used. If a KmsKeyId is specified, the Encrypted
	// flag must also be set.
	//
	// The CMK identifier may be provided in any of the following formats:
	//
	//    * Key ID
	//
	//    * Key alias, in the form alias/ExampleAlias
	//
	//    * ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed
	//    by the region of the CMK, the AWS account ID of the CMK owner, the key
	//    namespace, and then the CMK ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.
	//
	//    * ARN using key alias. The alias ARN contains the arn:aws:kms namespace,
	//    followed by the region of the CMK, the AWS account ID of the CMK owner,
	//    the alias namespace, and then the CMK alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.
	//
	//
	// AWS parses KmsKeyId asynchronously, meaning that the action you call may
	// appear to complete even though you provided an invalid identifier. This action
	// will eventually report failure.
	//
	// The specified CMK must exist in the region that the AMI is being copied to.
	KmsKeyId *string `type:"string"`

	// The license type to be used for the Amazon Machine Image (AMI) after importing.
	//
	// Note: You may only use BYOL if you have existing licenses with rights to
	// use these licenses in a third party cloud like AWS. For more information,
	// see Prerequisites (https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html#prerequisites-image)
	// in the VM Import/Export User Guide.
	//
	// Valid values: AWS | BYOL
	LicenseType *string `type:"string"`

	// The operating system of the virtual machine.
	//
	// Valid values: Windows | Linux
	Platform *string `type:"string"`

	// The name of the role to use when not using the default role, 'vmimport'.
	RoleName *string `type:"string"`
}

// String returns the string representation
func (s ImportImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportImageInput) GoString() string {
	return s.String()
}

// SetArchitecture sets the Architecture field's value.
func (s *ImportImageInput) SetArchitecture(v string) *ImportImageInput {
	s.Architecture = &v
	return s
}

// SetClientData sets the ClientData field's value.
func (s *ImportImageInput) SetClientData(v *ClientData) *ImportImageInput {
	s.ClientData = v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *ImportImageInput) SetClientToken(v string) *ImportImageInput {
	s.ClientToken = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportImageInput) SetDescription(v string) *ImportImageInput {
	s.Description = &v
	return s
}

// SetDiskContainers sets the DiskContainers field's value.
func (s *ImportImageInput) SetDiskContainers(v []*ImageDiskContainer) *ImportImageInput {
	s.DiskContainers = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ImportImageInput) SetDryRun(v bool) *ImportImageInput {
	s.DryRun = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *ImportImageInput) SetEncrypted(v bool) *ImportImageInput {
	s.Encrypted = &v
	return s
}

// SetHypervisor sets the Hypervisor field's value.
func (s *ImportImageInput) SetHypervisor(v string) *ImportImageInput {
	s.Hypervisor = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *ImportImageInput) SetKmsKeyId(v string) *ImportImageInput {
	s.KmsKeyId = &v
	return s
}

// SetLicenseType sets the LicenseType field's value.
func (s *ImportImageInput) SetLicenseType(v string) *ImportImageInput {
	s.LicenseType = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ImportImageInput) SetPlatform(v string) *ImportImageInput {
	s.Platform = &v
	return s
}

// SetRoleName sets the RoleName field's value.
func (s *ImportImageInput) SetRoleName(v string) *ImportImageInput {
	s.RoleName = &v
	return s
}

// Contains the output for ImportImage.
type ImportImageOutput struct {
	_ struct{} `type:"structure"`

	// The architecture of the virtual machine.
	Architecture *string `locationName:"architecture" type:"string"`

	// A description of the import task.
	Description *string `locationName:"description" type:"string"`

	// Indicates whether the AMI is encypted.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The target hypervisor of the import task.
	Hypervisor *string `locationName:"hypervisor" type:"string"`

	// The ID of the Amazon Machine Image (AMI) created by the import task.
	ImageId *string `locationName:"imageId" type:"string"`

	// The task ID of the import image task.
	ImportTaskId *string `locationName:"importTaskId" type:"string"`

	// The identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) that was used to create the encrypted AMI.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// The license type of the virtual machine.
	LicenseType *string `locationName:"licenseType" type:"string"`

	// The operating system of the virtual machine.
	Platform *string `locationName:"platform" type:"string"`

	// The progress of the task.
	Progress *string `locationName:"progress" type:"string"`

	// Information about the snapshots.
	SnapshotDetails []*SnapshotDetail `locationName:"snapshotDetailSet" locationNameList:"item" type:"list"`

	// A brief status of the task.
	Status *string `locationName:"status" type:"string"`

	// A detailed status message of the import task.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s ImportImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportImageOutput) GoString() string {
	return s.String()
}

// SetArchitecture sets the Architecture field's value.
func (s *ImportImageOutput) SetArchitecture(v string) *ImportImageOutput {
	s.Architecture = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportImageOutput) SetDescription(v string) *ImportImageOutput {
	s.Description = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *ImportImageOutput) SetEncrypted(v bool) *ImportImageOutput {
	s.Encrypted = &v
	return s
}

// SetHypervisor sets the Hypervisor field's value.
func (s *ImportImageOutput) SetHypervisor(v string) *ImportImageOutput {
	s.Hypervisor = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *ImportImageOutput) SetImageId(v string) *ImportImageOutput {
	s.ImageId = &v
	return s
}

// SetImportTaskId sets the ImportTaskId field's value.
func (s *ImportImageOutput) SetImportTaskId(v string) *ImportImageOutput {
	s.ImportTaskId = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *ImportImageOutput) SetKmsKeyId(v string) *ImportImageOutput {
	s.KmsKeyId = &v
	return s
}

// SetLicenseType sets the LicenseType field's value.
func (s *ImportImageOutput) SetLicenseType(v string) *ImportImageOutput {
	s.LicenseType = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ImportImageOutput) SetPlatform(v string) *ImportImageOutput {
	s.Platform = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *ImportImageOutput) SetProgress(v string) *ImportImageOutput {
	s.Progress = &v
	return s
}

// SetSnapshotDetails sets the SnapshotDetails field's value.
func (s *ImportImageOutput) SetSnapshotDetails(v []*SnapshotDetail) *ImportImageOutput {
	s.SnapshotDetails = v
	return s
}

// SetStatus sets the Status field's value.
func (s *ImportImageOutput) SetStatus(v string) *ImportImageOutput {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ImportImageOutput) SetStatusMessage(v string) *ImportImageOutput {
	s.StatusMessage = &v
	return s
}

// Describes an import image task.
type ImportImageTask struct {
	_ struct{} `type:"structure"`

	// The architecture of the virtual machine.
	//
	// Valid values: i386 | x86_64
	Architecture *string `locationName:"architecture" type:"string"`

	// A description of the import task.
	Description *string `locationName:"description" type:"string"`

	// Indicates whether the image is encrypted.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The target hypervisor for the import task.
	//
	// Valid values: xen
	Hypervisor *string `locationName:"hypervisor" type:"string"`

	// The ID of the Amazon Machine Image (AMI) of the imported virtual machine.
	ImageId *string `locationName:"imageId" type:"string"`

	// The ID of the import image task.
	ImportTaskId *string `locationName:"importTaskId" type:"string"`

	// The identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) that was used to create the encrypted image.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// The license type of the virtual machine.
	LicenseType *string `locationName:"licenseType" type:"string"`

	// The description string for the import image task.
	Platform *string `locationName:"platform" type:"string"`

	// The percentage of progress of the import image task.
	Progress *string `locationName:"progress" type:"string"`

	// Information about the snapshots.
	SnapshotDetails []*SnapshotDetail `locationName:"snapshotDetailSet" locationNameList:"item" type:"list"`

	// A brief status for the import image task.
	Status *string `locationName:"status" type:"string"`

	// A descriptive status message for the import image task.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s ImportImageTask) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportImageTask) GoString() string {
	return s.String()
}

// SetArchitecture sets the Architecture field's value.
func (s *ImportImageTask) SetArchitecture(v string) *ImportImageTask {
	s.Architecture = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportImageTask) SetDescription(v string) *ImportImageTask {
	s.Description = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *ImportImageTask) SetEncrypted(v bool) *ImportImageTask {
	s.Encrypted = &v
	return s
}

// SetHypervisor sets the Hypervisor field's value.
func (s *ImportImageTask) SetHypervisor(v string) *ImportImageTask {
	s.Hypervisor = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *ImportImageTask) SetImageId(v string) *ImportImageTask {
	s.ImageId = &v
	return s
}

// SetImportTaskId sets the ImportTaskId field's value.
func (s *ImportImageTask) SetImportTaskId(v string) *ImportImageTask {
	s.ImportTaskId = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *ImportImageTask) SetKmsKeyId(v string) *ImportImageTask {
	s.KmsKeyId = &v
	return s
}

// SetLicenseType sets the LicenseType field's value.
func (s *ImportImageTask) SetLicenseType(v string) *ImportImageTask {
	s.LicenseType = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ImportImageTask) SetPlatform(v string) *ImportImageTask {
	s.Platform = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *ImportImageTask) SetProgress(v string) *ImportImageTask {
	s.Progress = &v
	return s
}

// SetSnapshotDetails sets the SnapshotDetails field's value.
func (s *ImportImageTask) SetSnapshotDetails(v []*SnapshotDetail) *ImportImageTask {
	s.SnapshotDetails = v
	return s
}

// SetStatus sets the Status field's value.
func (s *ImportImageTask) SetStatus(v string) *ImportImageTask {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ImportImageTask) SetStatusMessage(v string) *ImportImageTask {
	s.StatusMessage = &v
	return s
}

// Contains the parameters for ImportInstance.
type ImportInstanceInput struct {
	_ struct{} `type:"structure"`

	// A description for the instance being imported.
	Description *string `locationName:"description" type:"string"`

	// The disk image.
	DiskImages []*DiskImage `locationName:"diskImage" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The launch specification.
	LaunchSpecification *ImportInstanceLaunchSpecification `locationName:"launchSpecification" type:"structure"`

	// The instance operating system.
	//
	// Platform is a required field
	Platform *string `locationName:"platform" type:"string" required:"true" enum:"PlatformValues"`
}

// String returns the string representation
func (s ImportInstanceInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportInstanceInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ImportInstanceInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ImportInstanceInput"}
	if s.Platform == nil {
		invalidParams.Add(request.NewErrParamRequired("Platform"))
	}
	if s.DiskImages != nil {
		for i, v := range s.DiskImages {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "DiskImages", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *ImportInstanceInput) SetDescription(v string) *ImportInstanceInput {
	s.Description = &v
	return s
}

// SetDiskImages sets the DiskImages field's value.
func (s *ImportInstanceInput) SetDiskImages(v []*DiskImage) *ImportInstanceInput {
	s.DiskImages = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ImportInstanceInput) SetDryRun(v bool) *ImportInstanceInput {
	s.DryRun = &v
	return s
}

// SetLaunchSpecification sets the LaunchSpecification field's value.
func (s *ImportInstanceInput) SetLaunchSpecification(v *ImportInstanceLaunchSpecification) *ImportInstanceInput {
	s.LaunchSpecification = v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ImportInstanceInput) SetPlatform(v string) *ImportInstanceInput {
	s.Platform = &v
	return s
}

// Describes the launch specification for VM import.
type ImportInstanceLaunchSpecification struct {
	_ struct{} `type:"structure"`

	// Reserved.
	AdditionalInfo *string `locationName:"additionalInfo" type:"string"`

	// The architecture of the instance.
	Architecture *string `locationName:"architecture" type:"string" enum:"ArchitectureValues"`

	// One or more security group IDs.
	GroupIds []*string `locationName:"GroupId" locationNameList:"SecurityGroupId" type:"list"`

	// One or more security group names.
	GroupNames []*string `locationName:"GroupName" locationNameList:"SecurityGroup" type:"list"`

	// Indicates whether an instance stops or terminates when you initiate shutdown
	// from the instance (using the operating system command for system shutdown).
	InstanceInitiatedShutdownBehavior *string `locationName:"instanceInitiatedShutdownBehavior" type:"string" enum:"ShutdownBehavior"`

	// The instance type. For more information about the instance types that you
	// can import, see Instance Types (https://docs.aws.amazon.com/vm-import/latest/userguide/vmie_prereqs.html#vmimport-instance-types)
	// in the VM Import/Export User Guide.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// Indicates whether monitoring is enabled.
	Monitoring *bool `locationName:"monitoring" type:"boolean"`

	// The placement information for the instance.
	Placement *Placement `locationName:"placement" type:"structure"`

	// [EC2-VPC] An available IP address from the IP address range of the subnet.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// [EC2-VPC] The ID of the subnet in which to launch the instance.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The Base64-encoded user data to make available to the instance.
	UserData *UserData `locationName:"userData" type:"structure"`
}

// String returns the string representation
func (s ImportInstanceLaunchSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportInstanceLaunchSpecification) GoString() string {
	return s.String()
}

// SetAdditionalInfo sets the AdditionalInfo field's value.
func (s *ImportInstanceLaunchSpecification) SetAdditionalInfo(v string) *ImportInstanceLaunchSpecification {
	s.AdditionalInfo = &v
	return s
}

// SetArchitecture sets the Architecture field's value.
func (s *ImportInstanceLaunchSpecification) SetArchitecture(v string) *ImportInstanceLaunchSpecification {
	s.Architecture = &v
	return s
}

// SetGroupIds sets the GroupIds field's value.
func (s *ImportInstanceLaunchSpecification) SetGroupIds(v []*string) *ImportInstanceLaunchSpecification {
	s.GroupIds = v
	return s
}

// SetGroupNames sets the GroupNames field's value.
func (s *ImportInstanceLaunchSpecification) SetGroupNames(v []*string) *ImportInstanceLaunchSpecification {
	s.GroupNames = v
	return s
}

// SetInstanceInitiatedShutdownBehavior sets the InstanceInitiatedShutdownBehavior field's value.
func (s *ImportInstanceLaunchSpecification) SetInstanceInitiatedShutdownBehavior(v string) *ImportInstanceLaunchSpecification {
	s.InstanceInitiatedShutdownBehavior = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ImportInstanceLaunchSpecification) SetInstanceType(v string) *ImportInstanceLaunchSpecification {
	s.InstanceType = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *ImportInstanceLaunchSpecification) SetMonitoring(v bool) *ImportInstanceLaunchSpecification {
	s.Monitoring = &v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *ImportInstanceLaunchSpecification) SetPlacement(v *Placement) *ImportInstanceLaunchSpecification {
	s.Placement = v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *ImportInstanceLaunchSpecification) SetPrivateIpAddress(v string) *ImportInstanceLaunchSpecification {
	s.PrivateIpAddress = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *ImportInstanceLaunchSpecification) SetSubnetId(v string) *ImportInstanceLaunchSpecification {
	s.SubnetId = &v
	return s
}

// SetUserData sets the UserData field's value.
func (s *ImportInstanceLaunchSpecification) SetUserData(v *UserData) *ImportInstanceLaunchSpecification {
	s.UserData = v
	return s
}

// Contains the output for ImportInstance.
type ImportInstanceOutput struct {
	_ struct{} `type:"structure"`

	// Information about the conversion task.
	ConversionTask *ConversionTask `locationName:"conversionTask" type:"structure"`
}

// String returns the string representation
func (s ImportInstanceOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportInstanceOutput) GoString() string {
	return s.String()
}

// SetConversionTask sets the ConversionTask field's value.
func (s *ImportInstanceOutput) SetConversionTask(v *ConversionTask) *ImportInstanceOutput {
	s.ConversionTask = v
	return s
}

// Describes an import instance task.
type ImportInstanceTaskDetails struct {
	_ struct{} `type:"structure"`

	// A description of the task.
	Description *string `locationName:"description" type:"string"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The instance operating system.
	Platform *string `locationName:"platform" type:"string" enum:"PlatformValues"`

	// One or more volumes.
	Volumes []*ImportInstanceVolumeDetailItem `locationName:"volumes" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ImportInstanceTaskDetails) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportInstanceTaskDetails) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *ImportInstanceTaskDetails) SetDescription(v string) *ImportInstanceTaskDetails {
	s.Description = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ImportInstanceTaskDetails) SetInstanceId(v string) *ImportInstanceTaskDetails {
	s.InstanceId = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ImportInstanceTaskDetails) SetPlatform(v string) *ImportInstanceTaskDetails {
	s.Platform = &v
	return s
}

// SetVolumes sets the Volumes field's value.
func (s *ImportInstanceTaskDetails) SetVolumes(v []*ImportInstanceVolumeDetailItem) *ImportInstanceTaskDetails {
	s.Volumes = v
	return s
}

// Describes an import volume task.
type ImportInstanceVolumeDetailItem struct {
	_ struct{} `type:"structure"`

	// The Availability Zone where the resulting instance will reside.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The number of bytes converted so far.
	BytesConverted *int64 `locationName:"bytesConverted" type:"long"`

	// A description of the task.
	Description *string `locationName:"description" type:"string"`

	// The image.
	Image *DiskImageDescription `locationName:"image" type:"structure"`

	// The status of the import of this particular disk image.
	Status *string `locationName:"status" type:"string"`

	// The status information or errors related to the disk image.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// The volume.
	Volume *DiskImageVolumeDescription `locationName:"volume" type:"structure"`
}

// String returns the string representation
func (s ImportInstanceVolumeDetailItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportInstanceVolumeDetailItem) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ImportInstanceVolumeDetailItem) SetAvailabilityZone(v string) *ImportInstanceVolumeDetailItem {
	s.AvailabilityZone = &v
	return s
}

// SetBytesConverted sets the BytesConverted field's value.
func (s *ImportInstanceVolumeDetailItem) SetBytesConverted(v int64) *ImportInstanceVolumeDetailItem {
	s.BytesConverted = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportInstanceVolumeDetailItem) SetDescription(v string) *ImportInstanceVolumeDetailItem {
	s.Description = &v
	return s
}

// SetImage sets the Image field's value.
func (s *ImportInstanceVolumeDetailItem) SetImage(v *DiskImageDescription) *ImportInstanceVolumeDetailItem {
	s.Image = v
	return s
}

// SetStatus sets the Status field's value.
func (s *ImportInstanceVolumeDetailItem) SetStatus(v string) *ImportInstanceVolumeDetailItem {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ImportInstanceVolumeDetailItem) SetStatusMessage(v string) *ImportInstanceVolumeDetailItem {
	s.StatusMessage = &v
	return s
}

// SetVolume sets the Volume field's value.
func (s *ImportInstanceVolumeDetailItem) SetVolume(v *DiskImageVolumeDescription) *ImportInstanceVolumeDetailItem {
	s.Volume = v
	return s
}

type ImportKeyPairInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// A unique name for the key pair.
	//
	// KeyName is a required field
	KeyName *string `locationName:"keyName" type:"string" required:"true"`

	// The public key. For API calls, the text must be base64-encoded. For command
	// line tools, base64 encoding is performed for you.
	//
	// PublicKeyMaterial is automatically base64 encoded/decoded by the SDK.
	//
	// PublicKeyMaterial is a required field
	PublicKeyMaterial []byte `locationName:"publicKeyMaterial" type:"blob" required:"true"`
}

// String returns the string representation
func (s ImportKeyPairInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportKeyPairInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ImportKeyPairInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ImportKeyPairInput"}
	if s.KeyName == nil {
		invalidParams.Add(request.NewErrParamRequired("KeyName"))
	}
	if s.PublicKeyMaterial == nil {
		invalidParams.Add(request.NewErrParamRequired("PublicKeyMaterial"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ImportKeyPairInput) SetDryRun(v bool) *ImportKeyPairInput {
	s.DryRun = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *ImportKeyPairInput) SetKeyName(v string) *ImportKeyPairInput {
	s.KeyName = &v
	return s
}

// SetPublicKeyMaterial sets the PublicKeyMaterial field's value.
func (s *ImportKeyPairInput) SetPublicKeyMaterial(v []byte) *ImportKeyPairInput {
	s.PublicKeyMaterial = v
	return s
}

type ImportKeyPairOutput struct {
	_ struct{} `type:"structure"`

	// The MD5 public key fingerprint as specified in section 4 of RFC 4716.
	KeyFingerprint *string `locationName:"keyFingerprint" type:"string"`

	// The key pair name you provided.
	KeyName *string `locationName:"keyName" type:"string"`
}

// String returns the string representation
func (s ImportKeyPairOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportKeyPairOutput) GoString() string {
	return s.String()
}

// SetKeyFingerprint sets the KeyFingerprint field's value.
func (s *ImportKeyPairOutput) SetKeyFingerprint(v string) *ImportKeyPairOutput {
	s.KeyFingerprint = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *ImportKeyPairOutput) SetKeyName(v string) *ImportKeyPairOutput {
	s.KeyName = &v
	return s
}

// Contains the parameters for ImportSnapshot.
type ImportSnapshotInput struct {
	_ struct{} `type:"structure"`

	// The client-specific data.
	ClientData *ClientData `type:"structure"`

	// Token to enable idempotency for VM import requests.
	ClientToken *string `type:"string"`

	// The description string for the import snapshot task.
	Description *string `type:"string"`

	// Information about the disk container.
	DiskContainer *SnapshotDiskContainer `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Specifies whether the destination snapshot of the imported image should be
	// encrypted. The default CMK for EBS is used unless you specify a non-default
	// AWS Key Management Service (AWS KMS) CMK using KmsKeyId. For more information,
	// see Amazon EBS Encryption (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	Encrypted *bool `type:"boolean"`

	// An identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) to use when creating the encrypted snapshot. This parameter is
	// only required if you want to use a non-default CMK; if this parameter is
	// not specified, the default CMK for EBS is used. If a KmsKeyId is specified,
	// the Encrypted flag must also be set.
	//
	// The CMK identifier may be provided in any of the following formats:
	//
	//    * Key ID
	//
	//    * Key alias, in the form alias/ExampleAlias
	//
	//    * ARN using key ID. The ID ARN contains the arn:aws:kms namespace, followed
	//    by the region of the CMK, the AWS account ID of the CMK owner, the key
	//    namespace, and then the CMK ID. For example, arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef.
	//
	//    * ARN using key alias. The alias ARN contains the arn:aws:kms namespace,
	//    followed by the region of the CMK, the AWS account ID of the CMK owner,
	//    the alias namespace, and then the CMK alias. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.
	//
	//
	// AWS parses KmsKeyId asynchronously, meaning that the action you call may
	// appear to complete even though you provided an invalid identifier. This action
	// will eventually report failure.
	//
	// The specified CMK must exist in the region that the snapshot is being copied
	// to.
	KmsKeyId *string `type:"string"`

	// The name of the role to use when not using the default role, 'vmimport'.
	RoleName *string `type:"string"`
}

// String returns the string representation
func (s ImportSnapshotInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportSnapshotInput) GoString() string {
	return s.String()
}

// SetClientData sets the ClientData field's value.
func (s *ImportSnapshotInput) SetClientData(v *ClientData) *ImportSnapshotInput {
	s.ClientData = v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *ImportSnapshotInput) SetClientToken(v string) *ImportSnapshotInput {
	s.ClientToken = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportSnapshotInput) SetDescription(v string) *ImportSnapshotInput {
	s.Description = &v
	return s
}

// SetDiskContainer sets the DiskContainer field's value.
func (s *ImportSnapshotInput) SetDiskContainer(v *SnapshotDiskContainer) *ImportSnapshotInput {
	s.DiskContainer = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ImportSnapshotInput) SetDryRun(v bool) *ImportSnapshotInput {
	s.DryRun = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *ImportSnapshotInput) SetEncrypted(v bool) *ImportSnapshotInput {
	s.Encrypted = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *ImportSnapshotInput) SetKmsKeyId(v string) *ImportSnapshotInput {
	s.KmsKeyId = &v
	return s
}

// SetRoleName sets the RoleName field's value.
func (s *ImportSnapshotInput) SetRoleName(v string) *ImportSnapshotInput {
	s.RoleName = &v
	return s
}

// Contains the output for ImportSnapshot.
type ImportSnapshotOutput struct {
	_ struct{} `type:"structure"`

	// A description of the import snapshot task.
	Description *string `locationName:"description" type:"string"`

	// The ID of the import snapshot task.
	ImportTaskId *string `locationName:"importTaskId" type:"string"`

	// Information about the import snapshot task.
	SnapshotTaskDetail *SnapshotTaskDetail `locationName:"snapshotTaskDetail" type:"structure"`
}

// String returns the string representation
func (s ImportSnapshotOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportSnapshotOutput) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *ImportSnapshotOutput) SetDescription(v string) *ImportSnapshotOutput {
	s.Description = &v
	return s
}

// SetImportTaskId sets the ImportTaskId field's value.
func (s *ImportSnapshotOutput) SetImportTaskId(v string) *ImportSnapshotOutput {
	s.ImportTaskId = &v
	return s
}

// SetSnapshotTaskDetail sets the SnapshotTaskDetail field's value.
func (s *ImportSnapshotOutput) SetSnapshotTaskDetail(v *SnapshotTaskDetail) *ImportSnapshotOutput {
	s.SnapshotTaskDetail = v
	return s
}

// Describes an import snapshot task.
type ImportSnapshotTask struct {
	_ struct{} `type:"structure"`

	// A description of the import snapshot task.
	Description *string `locationName:"description" type:"string"`

	// The ID of the import snapshot task.
	ImportTaskId *string `locationName:"importTaskId" type:"string"`

	// Describes an import snapshot task.
	SnapshotTaskDetail *SnapshotTaskDetail `locationName:"snapshotTaskDetail" type:"structure"`
}

// String returns the string representation
func (s ImportSnapshotTask) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportSnapshotTask) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *ImportSnapshotTask) SetDescription(v string) *ImportSnapshotTask {
	s.Description = &v
	return s
}

// SetImportTaskId sets the ImportTaskId field's value.
func (s *ImportSnapshotTask) SetImportTaskId(v string) *ImportSnapshotTask {
	s.ImportTaskId = &v
	return s
}

// SetSnapshotTaskDetail sets the SnapshotTaskDetail field's value.
func (s *ImportSnapshotTask) SetSnapshotTaskDetail(v *SnapshotTaskDetail) *ImportSnapshotTask {
	s.SnapshotTaskDetail = v
	return s
}

// Contains the parameters for ImportVolume.
type ImportVolumeInput struct {
	_ struct{} `type:"structure"`

	// The Availability Zone for the resulting EBS volume.
	//
	// AvailabilityZone is a required field
	AvailabilityZone *string `locationName:"availabilityZone" type:"string" required:"true"`

	// A description of the volume.
	Description *string `locationName:"description" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The disk image.
	//
	// Image is a required field
	Image *DiskImageDetail `locationName:"image" type:"structure" required:"true"`

	// The volume size.
	//
	// Volume is a required field
	Volume *VolumeDetail `locationName:"volume" type:"structure" required:"true"`
}

// String returns the string representation
func (s ImportVolumeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportVolumeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ImportVolumeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ImportVolumeInput"}
	if s.AvailabilityZone == nil {
		invalidParams.Add(request.NewErrParamRequired("AvailabilityZone"))
	}
	if s.Image == nil {
		invalidParams.Add(request.NewErrParamRequired("Image"))
	}
	if s.Volume == nil {
		invalidParams.Add(request.NewErrParamRequired("Volume"))
	}
	if s.Image != nil {
		if err := s.Image.Validate(); err != nil {
			invalidParams.AddNested("Image", err.(request.ErrInvalidParams))
		}
	}
	if s.Volume != nil {
		if err := s.Volume.Validate(); err != nil {
			invalidParams.AddNested("Volume", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ImportVolumeInput) SetAvailabilityZone(v string) *ImportVolumeInput {
	s.AvailabilityZone = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportVolumeInput) SetDescription(v string) *ImportVolumeInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ImportVolumeInput) SetDryRun(v bool) *ImportVolumeInput {
	s.DryRun = &v
	return s
}

// SetImage sets the Image field's value.
func (s *ImportVolumeInput) SetImage(v *DiskImageDetail) *ImportVolumeInput {
	s.Image = v
	return s
}

// SetVolume sets the Volume field's value.
func (s *ImportVolumeInput) SetVolume(v *VolumeDetail) *ImportVolumeInput {
	s.Volume = v
	return s
}

// Contains the output for ImportVolume.
type ImportVolumeOutput struct {
	_ struct{} `type:"structure"`

	// Information about the conversion task.
	ConversionTask *ConversionTask `locationName:"conversionTask" type:"structure"`
}

// String returns the string representation
func (s ImportVolumeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportVolumeOutput) GoString() string {
	return s.String()
}

// SetConversionTask sets the ConversionTask field's value.
func (s *ImportVolumeOutput) SetConversionTask(v *ConversionTask) *ImportVolumeOutput {
	s.ConversionTask = v
	return s
}

// Describes an import volume task.
type ImportVolumeTaskDetails struct {
	_ struct{} `type:"structure"`

	// The Availability Zone where the resulting volume will reside.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The number of bytes converted so far.
	BytesConverted *int64 `locationName:"bytesConverted" type:"long"`

	// The description you provided when starting the import volume task.
	Description *string `locationName:"description" type:"string"`

	// The image.
	Image *DiskImageDescription `locationName:"image" type:"structure"`

	// The volume.
	Volume *DiskImageVolumeDescription `locationName:"volume" type:"structure"`
}

// String returns the string representation
func (s ImportVolumeTaskDetails) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ImportVolumeTaskDetails) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ImportVolumeTaskDetails) SetAvailabilityZone(v string) *ImportVolumeTaskDetails {
	s.AvailabilityZone = &v
	return s
}

// SetBytesConverted sets the BytesConverted field's value.
func (s *ImportVolumeTaskDetails) SetBytesConverted(v int64) *ImportVolumeTaskDetails {
	s.BytesConverted = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ImportVolumeTaskDetails) SetDescription(v string) *ImportVolumeTaskDetails {
	s.Description = &v
	return s
}

// SetImage sets the Image field's value.
func (s *ImportVolumeTaskDetails) SetImage(v *DiskImageDescription) *ImportVolumeTaskDetails {
	s.Image = v
	return s
}

// SetVolume sets the Volume field's value.
func (s *ImportVolumeTaskDetails) SetVolume(v *DiskImageVolumeDescription) *ImportVolumeTaskDetails {
	s.Volume = v
	return s
}

// Describes an instance.
type Instance struct {
	_ struct{} `type:"structure"`

	// The AMI launch index, which can be used to find this instance in the launch
	// group.
	AmiLaunchIndex *int64 `locationName:"amiLaunchIndex" type:"integer"`

	// The architecture of the image.
	Architecture *string `locationName:"architecture" type:"string" enum:"ArchitectureValues"`

	// Any block device mapping entries for the instance.
	BlockDeviceMappings []*InstanceBlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// The ID of the Capacity Reservation.
	CapacityReservationId *string `locationName:"capacityReservationId" type:"string"`

	// Information about the Capacity Reservation targeting option.
	CapacityReservationSpecification *CapacityReservationSpecificationResponse `locationName:"capacityReservationSpecification" type:"structure"`

	// The idempotency token you provided when you launched the instance, if applicable.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The CPU options for the instance.
	CpuOptions *CpuOptions `locationName:"cpuOptions" type:"structure"`

	// Indicates whether the instance is optimized for Amazon EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal I/O performance. This optimization isn't available
	// with all instance types. Additional usage charges apply when using an EBS
	// Optimized instance.
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// The Elastic GPU associated with the instance.
	ElasticGpuAssociations []*ElasticGpuAssociation `locationName:"elasticGpuAssociationSet" locationNameList:"item" type:"list"`

	// The elastic inference accelerator associated with the instance.
	ElasticInferenceAcceleratorAssociations []*ElasticInferenceAcceleratorAssociation `locationName:"elasticInferenceAcceleratorAssociationSet" locationNameList:"item" type:"list"`

	// Specifies whether enhanced networking with ENA is enabled.
	EnaSupport *bool `locationName:"enaSupport" type:"boolean"`

	// Indicates whether the instance is enabled for hibernation.
	HibernationOptions *HibernationOptions `locationName:"hibernationOptions" type:"structure"`

	// The hypervisor type of the instance.
	Hypervisor *string `locationName:"hypervisor" type:"string" enum:"HypervisorType"`

	// The IAM instance profile associated with the instance, if applicable.
	IamInstanceProfile *IamInstanceProfile `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the AMI used to launch the instance.
	ImageId *string `locationName:"imageId" type:"string"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// Indicates whether this is a Spot Instance or a Scheduled Instance.
	InstanceLifecycle *string `locationName:"instanceLifecycle" type:"string" enum:"InstanceLifecycleType"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The kernel associated with this instance, if applicable.
	KernelId *string `locationName:"kernelId" type:"string"`

	// The name of the key pair, if this instance was launched with an associated
	// key pair.
	KeyName *string `locationName:"keyName" type:"string"`

	// The time the instance was launched.
	LaunchTime *time.Time `locationName:"launchTime" type:"timestamp"`

	// The license configurations.
	Licenses []*LicenseConfiguration `locationName:"licenseSet" locationNameList:"item" type:"list"`

	// The monitoring for the instance.
	Monitoring *Monitoring `locationName:"monitoring" type:"structure"`

	// [EC2-VPC] One or more network interfaces for the instance.
	NetworkInterfaces []*InstanceNetworkInterface `locationName:"networkInterfaceSet" locationNameList:"item" type:"list"`

	// The location where the instance launched, if applicable.
	Placement *Placement `locationName:"placement" type:"structure"`

	// The value is Windows for Windows instances; otherwise blank.
	Platform *string `locationName:"platform" type:"string" enum:"PlatformValues"`

	// (IPv4 only) The private DNS hostname name assigned to the instance. This
	// DNS hostname can only be used inside the Amazon EC2 network. This name is
	// not available until the instance enters the running state.
	//
	// [EC2-VPC] The Amazon-provided DNS server resolves Amazon-provided private
	// DNS hostnames if you've enabled DNS resolution and DNS hostnames in your
	// VPC. If you are not using the Amazon-provided DNS server in your VPC, your
	// custom domain name servers must resolve the hostname as appropriate.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The private IPv4 address assigned to the instance.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// The product codes attached to this instance, if applicable.
	ProductCodes []*ProductCode `locationName:"productCodes" locationNameList:"item" type:"list"`

	// (IPv4 only) The public DNS name assigned to the instance. This name is not
	// available until the instance enters the running state. For EC2-VPC, this
	// name is only available if you've enabled DNS hostnames for your VPC.
	PublicDnsName *string `locationName:"dnsName" type:"string"`

	// The public IPv4 address assigned to the instance, if applicable.
	PublicIpAddress *string `locationName:"ipAddress" type:"string"`

	// The RAM disk associated with this instance, if applicable.
	RamdiskId *string `locationName:"ramdiskId" type:"string"`

	// The device name of the root device volume (for example, /dev/sda1).
	RootDeviceName *string `locationName:"rootDeviceName" type:"string"`

	// The root device type used by the AMI. The AMI can use an EBS volume or an
	// instance store volume.
	RootDeviceType *string `locationName:"rootDeviceType" type:"string" enum:"DeviceType"`

	// One or more security groups for the instance.
	SecurityGroups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// Specifies whether to enable an instance launched in a VPC to perform NAT.
	// This controls whether source/destination checking is enabled on the instance.
	// A value of true means that checking is enabled, and false means that checking
	// is disabled. The value must be false for the instance to perform NAT. For
	// more information, see NAT Instances (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html)
	// in the Amazon Virtual Private Cloud User Guide.
	SourceDestCheck *bool `locationName:"sourceDestCheck" type:"boolean"`

	// If the request is a Spot Instance request, the ID of the request.
	SpotInstanceRequestId *string `locationName:"spotInstanceRequestId" type:"string"`

	// Specifies whether enhanced networking with the Intel 82599 Virtual Function
	// interface is enabled.
	SriovNetSupport *string `locationName:"sriovNetSupport" type:"string"`

	// The current state of the instance.
	State *InstanceState `locationName:"instanceState" type:"structure"`

	// The reason for the most recent state transition.
	StateReason *StateReason `locationName:"stateReason" type:"structure"`

	// The reason for the most recent state transition. This might be an empty string.
	StateTransitionReason *string `locationName:"reason" type:"string"`

	// [EC2-VPC] The ID of the subnet in which the instance is running.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// Any tags assigned to the instance.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The virtualization type of the instance.
	VirtualizationType *string `locationName:"virtualizationType" type:"string" enum:"VirtualizationType"`

	// [EC2-VPC] The ID of the VPC in which the instance is running.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s Instance) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Instance) GoString() string {
	return s.String()
}

// SetAmiLaunchIndex sets the AmiLaunchIndex field's value.
func (s *Instance) SetAmiLaunchIndex(v int64) *Instance {
	s.AmiLaunchIndex = &v
	return s
}

// SetArchitecture sets the Architecture field's value.
func (s *Instance) SetArchitecture(v string) *Instance {
	s.Architecture = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *Instance) SetBlockDeviceMappings(v []*InstanceBlockDeviceMapping) *Instance {
	s.BlockDeviceMappings = v
	return s
}

// SetCapacityReservationId sets the CapacityReservationId field's value.
func (s *Instance) SetCapacityReservationId(v string) *Instance {
	s.CapacityReservationId = &v
	return s
}

// SetCapacityReservationSpecification sets the CapacityReservationSpecification field's value.
func (s *Instance) SetCapacityReservationSpecification(v *CapacityReservationSpecificationResponse) *Instance {
	s.CapacityReservationSpecification = v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *Instance) SetClientToken(v string) *Instance {
	s.ClientToken = &v
	return s
}

// SetCpuOptions sets the CpuOptions field's value.
func (s *Instance) SetCpuOptions(v *CpuOptions) *Instance {
	s.CpuOptions = v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *Instance) SetEbsOptimized(v bool) *Instance {
	s.EbsOptimized = &v
	return s
}

// SetElasticGpuAssociations sets the ElasticGpuAssociations field's value.
func (s *Instance) SetElasticGpuAssociations(v []*ElasticGpuAssociation) *Instance {
	s.ElasticGpuAssociations = v
	return s
}

// SetElasticInferenceAcceleratorAssociations sets the ElasticInferenceAcceleratorAssociations field's value.
func (s *Instance) SetElasticInferenceAcceleratorAssociations(v []*ElasticInferenceAcceleratorAssociation) *Instance {
	s.ElasticInferenceAcceleratorAssociations = v
	return s
}

// SetEnaSupport sets the EnaSupport field's value.
func (s *Instance) SetEnaSupport(v bool) *Instance {
	s.EnaSupport = &v
	return s
}

// SetHibernationOptions sets the HibernationOptions field's value.
func (s *Instance) SetHibernationOptions(v *HibernationOptions) *Instance {
	s.HibernationOptions = v
	return s
}

// SetHypervisor sets the Hypervisor field's value.
func (s *Instance) SetHypervisor(v string) *Instance {
	s.Hypervisor = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *Instance) SetIamInstanceProfile(v *IamInstanceProfile) *Instance {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *Instance) SetImageId(v string) *Instance {
	s.ImageId = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *Instance) SetInstanceId(v string) *Instance {
	s.InstanceId = &v
	return s
}

// SetInstanceLifecycle sets the InstanceLifecycle field's value.
func (s *Instance) SetInstanceLifecycle(v string) *Instance {
	s.InstanceLifecycle = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *Instance) SetInstanceType(v string) *Instance {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *Instance) SetKernelId(v string) *Instance {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *Instance) SetKeyName(v string) *Instance {
	s.KeyName = &v
	return s
}

// SetLaunchTime sets the LaunchTime field's value.
func (s *Instance) SetLaunchTime(v time.Time) *Instance {
	s.LaunchTime = &v
	return s
}

// SetLicenses sets the Licenses field's value.
func (s *Instance) SetLicenses(v []*LicenseConfiguration) *Instance {
	s.Licenses = v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *Instance) SetMonitoring(v *Monitoring) *Instance {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *Instance) SetNetworkInterfaces(v []*InstanceNetworkInterface) *Instance {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *Instance) SetPlacement(v *Placement) *Instance {
	s.Placement = v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *Instance) SetPlatform(v string) *Instance {
	s.Platform = &v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *Instance) SetPrivateDnsName(v string) *Instance {
	s.PrivateDnsName = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *Instance) SetPrivateIpAddress(v string) *Instance {
	s.PrivateIpAddress = &v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *Instance) SetProductCodes(v []*ProductCode) *Instance {
	s.ProductCodes = v
	return s
}

// SetPublicDnsName sets the PublicDnsName field's value.
func (s *Instance) SetPublicDnsName(v string) *Instance {
	s.PublicDnsName = &v
	return s
}

// SetPublicIpAddress sets the PublicIpAddress field's value.
func (s *Instance) SetPublicIpAddress(v string) *Instance {
	s.PublicIpAddress = &v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *Instance) SetRamdiskId(v string) *Instance {
	s.RamdiskId = &v
	return s
}

// SetRootDeviceName sets the RootDeviceName field's value.
func (s *Instance) SetRootDeviceName(v string) *Instance {
	s.RootDeviceName = &v
	return s
}

// SetRootDeviceType sets the RootDeviceType field's value.
func (s *Instance) SetRootDeviceType(v string) *Instance {
	s.RootDeviceType = &v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *Instance) SetSecurityGroups(v []*GroupIdentifier) *Instance {
	s.SecurityGroups = v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *Instance) SetSourceDestCheck(v bool) *Instance {
	s.SourceDestCheck = &v
	return s
}

// SetSpotInstanceRequestId sets the SpotInstanceRequestId field's value.
func (s *Instance) SetSpotInstanceRequestId(v string) *Instance {
	s.SpotInstanceRequestId = &v
	return s
}

// SetSriovNetSupport sets the SriovNetSupport field's value.
func (s *Instance) SetSriovNetSupport(v string) *Instance {
	s.SriovNetSupport = &v
	return s
}

// SetState sets the State field's value.
func (s *Instance) SetState(v *InstanceState) *Instance {
	s.State = v
	return s
}

// SetStateReason sets the StateReason field's value.
func (s *Instance) SetStateReason(v *StateReason) *Instance {
	s.StateReason = v
	return s
}

// SetStateTransitionReason sets the StateTransitionReason field's value.
func (s *Instance) SetStateTransitionReason(v string) *Instance {
	s.StateTransitionReason = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *Instance) SetSubnetId(v string) *Instance {
	s.SubnetId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Instance) SetTags(v []*Tag) *Instance {
	s.Tags = v
	return s
}

// SetVirtualizationType sets the VirtualizationType field's value.
func (s *Instance) SetVirtualizationType(v string) *Instance {
	s.VirtualizationType = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *Instance) SetVpcId(v string) *Instance {
	s.VpcId = &v
	return s
}

// Describes a block device mapping.
type InstanceBlockDeviceMapping struct {
	_ struct{} `type:"structure"`

	// The device name (for example, /dev/sdh or xvdh).
	DeviceName *string `locationName:"deviceName" type:"string"`

	// Parameters used to automatically set up EBS volumes when the instance is
	// launched.
	Ebs *EbsInstanceBlockDevice `locationName:"ebs" type:"structure"`
}

// String returns the string representation
func (s InstanceBlockDeviceMapping) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceBlockDeviceMapping) GoString() string {
	return s.String()
}

// SetDeviceName sets the DeviceName field's value.
func (s *InstanceBlockDeviceMapping) SetDeviceName(v string) *InstanceBlockDeviceMapping {
	s.DeviceName = &v
	return s
}

// SetEbs sets the Ebs field's value.
func (s *InstanceBlockDeviceMapping) SetEbs(v *EbsInstanceBlockDevice) *InstanceBlockDeviceMapping {
	s.Ebs = v
	return s
}

// Describes a block device mapping entry.
type InstanceBlockDeviceMappingSpecification struct {
	_ struct{} `type:"structure"`

	// The device name (for example, /dev/sdh or xvdh).
	DeviceName *string `locationName:"deviceName" type:"string"`

	// Parameters used to automatically set up EBS volumes when the instance is
	// launched.
	Ebs *EbsInstanceBlockDeviceSpecification `locationName:"ebs" type:"structure"`

	// suppress the specified device included in the block device mapping.
	NoDevice *string `locationName:"noDevice" type:"string"`

	// The virtual device name.
	VirtualName *string `locationName:"virtualName" type:"string"`
}

// String returns the string representation
func (s InstanceBlockDeviceMappingSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceBlockDeviceMappingSpecification) GoString() string {
	return s.String()
}

// SetDeviceName sets the DeviceName field's value.
func (s *InstanceBlockDeviceMappingSpecification) SetDeviceName(v string) *InstanceBlockDeviceMappingSpecification {
	s.DeviceName = &v
	return s
}

// SetEbs sets the Ebs field's value.
func (s *InstanceBlockDeviceMappingSpecification) SetEbs(v *EbsInstanceBlockDeviceSpecification) *InstanceBlockDeviceMappingSpecification {
	s.Ebs = v
	return s
}

// SetNoDevice sets the NoDevice field's value.
func (s *InstanceBlockDeviceMappingSpecification) SetNoDevice(v string) *InstanceBlockDeviceMappingSpecification {
	s.NoDevice = &v
	return s
}

// SetVirtualName sets the VirtualName field's value.
func (s *InstanceBlockDeviceMappingSpecification) SetVirtualName(v string) *InstanceBlockDeviceMappingSpecification {
	s.VirtualName = &v
	return s
}

// Information about the instance type that the Dedicated Host supports.
type InstanceCapacity struct {
	_ struct{} `type:"structure"`

	// The number of instances that can still be launched onto the Dedicated Host.
	AvailableCapacity *int64 `locationName:"availableCapacity" type:"integer"`

	// The instance type size supported by the Dedicated Host.
	InstanceType *string `locationName:"instanceType" type:"string"`

	// The total number of instances that can be launched onto the Dedicated Host.
	TotalCapacity *int64 `locationName:"totalCapacity" type:"integer"`
}

// String returns the string representation
func (s InstanceCapacity) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceCapacity) GoString() string {
	return s.String()
}

// SetAvailableCapacity sets the AvailableCapacity field's value.
func (s *InstanceCapacity) SetAvailableCapacity(v int64) *InstanceCapacity {
	s.AvailableCapacity = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *InstanceCapacity) SetInstanceType(v string) *InstanceCapacity {
	s.InstanceType = &v
	return s
}

// SetTotalCapacity sets the TotalCapacity field's value.
func (s *InstanceCapacity) SetTotalCapacity(v int64) *InstanceCapacity {
	s.TotalCapacity = &v
	return s
}

// Describes a Reserved Instance listing state.
type InstanceCount struct {
	_ struct{} `type:"structure"`

	// The number of listed Reserved Instances in the state specified by the state.
	InstanceCount *int64 `locationName:"instanceCount" type:"integer"`

	// The states of the listed Reserved Instances.
	State *string `locationName:"state" type:"string" enum:"ListingState"`
}

// String returns the string representation
func (s InstanceCount) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceCount) GoString() string {
	return s.String()
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *InstanceCount) SetInstanceCount(v int64) *InstanceCount {
	s.InstanceCount = &v
	return s
}

// SetState sets the State field's value.
func (s *InstanceCount) SetState(v string) *InstanceCount {
	s.State = &v
	return s
}

// Describes the credit option for CPU usage of a T2 or T3 instance.
type InstanceCreditSpecification struct {
	_ struct{} `type:"structure"`

	// The credit option for CPU usage of the instance. Valid values are standard
	// and unlimited.
	CpuCredits *string `locationName:"cpuCredits" type:"string"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`
}

// String returns the string representation
func (s InstanceCreditSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceCreditSpecification) GoString() string {
	return s.String()
}

// SetCpuCredits sets the CpuCredits field's value.
func (s *InstanceCreditSpecification) SetCpuCredits(v string) *InstanceCreditSpecification {
	s.CpuCredits = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *InstanceCreditSpecification) SetInstanceId(v string) *InstanceCreditSpecification {
	s.InstanceId = &v
	return s
}

// Describes the credit option for CPU usage of a T2 or T3 instance.
type InstanceCreditSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// The credit option for CPU usage of the instance. Valid values are standard
	// and unlimited.
	CpuCredits *string `type:"string"`

	// The ID of the instance.
	InstanceId *string `type:"string"`
}

// String returns the string representation
func (s InstanceCreditSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceCreditSpecificationRequest) GoString() string {
	return s.String()
}

// SetCpuCredits sets the CpuCredits field's value.
func (s *InstanceCreditSpecificationRequest) SetCpuCredits(v string) *InstanceCreditSpecificationRequest {
	s.CpuCredits = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *InstanceCreditSpecificationRequest) SetInstanceId(v string) *InstanceCreditSpecificationRequest {
	s.InstanceId = &v
	return s
}

// Describes an instance to export.
type InstanceExportDetails struct {
	_ struct{} `type:"structure"`

	// The ID of the resource being exported.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The target virtualization environment.
	TargetEnvironment *string `locationName:"targetEnvironment" type:"string" enum:"ExportEnvironment"`
}

// String returns the string representation
func (s InstanceExportDetails) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceExportDetails) GoString() string {
	return s.String()
}

// SetInstanceId sets the InstanceId field's value.
func (s *InstanceExportDetails) SetInstanceId(v string) *InstanceExportDetails {
	s.InstanceId = &v
	return s
}

// SetTargetEnvironment sets the TargetEnvironment field's value.
func (s *InstanceExportDetails) SetTargetEnvironment(v string) *InstanceExportDetails {
	s.TargetEnvironment = &v
	return s
}

// Describes an IPv6 address.
type InstanceIpv6Address struct {
	_ struct{} `type:"structure"`

	// The IPv6 address.
	Ipv6Address *string `locationName:"ipv6Address" type:"string"`
}

// String returns the string representation
func (s InstanceIpv6Address) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceIpv6Address) GoString() string {
	return s.String()
}

// SetIpv6Address sets the Ipv6Address field's value.
func (s *InstanceIpv6Address) SetIpv6Address(v string) *InstanceIpv6Address {
	s.Ipv6Address = &v
	return s
}

// Describes an IPv6 address.
type InstanceIpv6AddressRequest struct {
	_ struct{} `type:"structure"`

	// The IPv6 address.
	Ipv6Address *string `type:"string"`
}

// String returns the string representation
func (s InstanceIpv6AddressRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceIpv6AddressRequest) GoString() string {
	return s.String()
}

// SetIpv6Address sets the Ipv6Address field's value.
func (s *InstanceIpv6AddressRequest) SetIpv6Address(v string) *InstanceIpv6AddressRequest {
	s.Ipv6Address = &v
	return s
}

// Describes the market (purchasing) option for the instances.
type InstanceMarketOptionsRequest struct {
	_ struct{} `type:"structure"`

	// The market type.
	MarketType *string `type:"string" enum:"MarketType"`

	// The options for Spot Instances.
	SpotOptions *SpotMarketOptions `type:"structure"`
}

// String returns the string representation
func (s InstanceMarketOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceMarketOptionsRequest) GoString() string {
	return s.String()
}

// SetMarketType sets the MarketType field's value.
func (s *InstanceMarketOptionsRequest) SetMarketType(v string) *InstanceMarketOptionsRequest {
	s.MarketType = &v
	return s
}

// SetSpotOptions sets the SpotOptions field's value.
func (s *InstanceMarketOptionsRequest) SetSpotOptions(v *SpotMarketOptions) *InstanceMarketOptionsRequest {
	s.SpotOptions = v
	return s
}

// Describes the monitoring of an instance.
type InstanceMonitoring struct {
	_ struct{} `type:"structure"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The monitoring for the instance.
	Monitoring *Monitoring `locationName:"monitoring" type:"structure"`
}

// String returns the string representation
func (s InstanceMonitoring) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceMonitoring) GoString() string {
	return s.String()
}

// SetInstanceId sets the InstanceId field's value.
func (s *InstanceMonitoring) SetInstanceId(v string) *InstanceMonitoring {
	s.InstanceId = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *InstanceMonitoring) SetMonitoring(v *Monitoring) *InstanceMonitoring {
	s.Monitoring = v
	return s
}

// Describes a network interface.
type InstanceNetworkInterface struct {
	_ struct{} `type:"structure"`

	// The association information for an Elastic IPv4 associated with the network
	// interface.
	Association *InstanceNetworkInterfaceAssociation `locationName:"association" type:"structure"`

	// The network interface attachment.
	Attachment *InstanceNetworkInterfaceAttachment `locationName:"attachment" type:"structure"`

	// The description.
	Description *string `locationName:"description" type:"string"`

	// One or more security groups.
	Groups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// One or more IPv6 addresses associated with the network interface.
	Ipv6Addresses []*InstanceIpv6Address `locationName:"ipv6AddressesSet" locationNameList:"item" type:"list"`

	// The MAC address.
	MacAddress *string `locationName:"macAddress" type:"string"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The ID of the AWS account that created the network interface.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The private DNS name.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The IPv4 address of the network interface within the subnet.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// One or more private IPv4 addresses associated with the network interface.
	PrivateIpAddresses []*InstancePrivateIpAddress `locationName:"privateIpAddressesSet" locationNameList:"item" type:"list"`

	// Indicates whether to validate network traffic to or from this network interface.
	SourceDestCheck *bool `locationName:"sourceDestCheck" type:"boolean"`

	// The status of the network interface.
	Status *string `locationName:"status" type:"string" enum:"NetworkInterfaceStatus"`

	// The ID of the subnet.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s InstanceNetworkInterface) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceNetworkInterface) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *InstanceNetworkInterface) SetAssociation(v *InstanceNetworkInterfaceAssociation) *InstanceNetworkInterface {
	s.Association = v
	return s
}

// SetAttachment sets the Attachment field's value.
func (s *InstanceNetworkInterface) SetAttachment(v *InstanceNetworkInterfaceAttachment) *InstanceNetworkInterface {
	s.Attachment = v
	return s
}

// SetDescription sets the Description field's value.
func (s *InstanceNetworkInterface) SetDescription(v string) *InstanceNetworkInterface {
	s.Description = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *InstanceNetworkInterface) SetGroups(v []*GroupIdentifier) *InstanceNetworkInterface {
	s.Groups = v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *InstanceNetworkInterface) SetIpv6Addresses(v []*InstanceIpv6Address) *InstanceNetworkInterface {
	s.Ipv6Addresses = v
	return s
}

// SetMacAddress sets the MacAddress field's value.
func (s *InstanceNetworkInterface) SetMacAddress(v string) *InstanceNetworkInterface {
	s.MacAddress = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *InstanceNetworkInterface) SetNetworkInterfaceId(v string) *InstanceNetworkInterface {
	s.NetworkInterfaceId = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *InstanceNetworkInterface) SetOwnerId(v string) *InstanceNetworkInterface {
	s.OwnerId = &v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *InstanceNetworkInterface) SetPrivateDnsName(v string) *InstanceNetworkInterface {
	s.PrivateDnsName = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *InstanceNetworkInterface) SetPrivateIpAddress(v string) *InstanceNetworkInterface {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *InstanceNetworkInterface) SetPrivateIpAddresses(v []*InstancePrivateIpAddress) *InstanceNetworkInterface {
	s.PrivateIpAddresses = v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *InstanceNetworkInterface) SetSourceDestCheck(v bool) *InstanceNetworkInterface {
	s.SourceDestCheck = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *InstanceNetworkInterface) SetStatus(v string) *InstanceNetworkInterface {
	s.Status = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *InstanceNetworkInterface) SetSubnetId(v string) *InstanceNetworkInterface {
	s.SubnetId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *InstanceNetworkInterface) SetVpcId(v string) *InstanceNetworkInterface {
	s.VpcId = &v
	return s
}

// Describes association information for an Elastic IP address (IPv4).
type InstanceNetworkInterfaceAssociation struct {
	_ struct{} `type:"structure"`

	// The ID of the owner of the Elastic IP address.
	IpOwnerId *string `locationName:"ipOwnerId" type:"string"`

	// The public DNS name.
	PublicDnsName *string `locationName:"publicDnsName" type:"string"`

	// The public IP address or Elastic IP address bound to the network interface.
	PublicIp *string `locationName:"publicIp" type:"string"`
}

// String returns the string representation
func (s InstanceNetworkInterfaceAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceNetworkInterfaceAssociation) GoString() string {
	return s.String()
}

// SetIpOwnerId sets the IpOwnerId field's value.
func (s *InstanceNetworkInterfaceAssociation) SetIpOwnerId(v string) *InstanceNetworkInterfaceAssociation {
	s.IpOwnerId = &v
	return s
}

// SetPublicDnsName sets the PublicDnsName field's value.
func (s *InstanceNetworkInterfaceAssociation) SetPublicDnsName(v string) *InstanceNetworkInterfaceAssociation {
	s.PublicDnsName = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *InstanceNetworkInterfaceAssociation) SetPublicIp(v string) *InstanceNetworkInterfaceAssociation {
	s.PublicIp = &v
	return s
}

// Describes a network interface attachment.
type InstanceNetworkInterfaceAttachment struct {
	_ struct{} `type:"structure"`

	// The time stamp when the attachment initiated.
	AttachTime *time.Time `locationName:"attachTime" type:"timestamp"`

	// The ID of the network interface attachment.
	AttachmentId *string `locationName:"attachmentId" type:"string"`

	// Indicates whether the network interface is deleted when the instance is terminated.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// The index of the device on the instance for the network interface attachment.
	DeviceIndex *int64 `locationName:"deviceIndex" type:"integer"`

	// The attachment state.
	Status *string `locationName:"status" type:"string" enum:"AttachmentStatus"`
}

// String returns the string representation
func (s InstanceNetworkInterfaceAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceNetworkInterfaceAttachment) GoString() string {
	return s.String()
}

// SetAttachTime sets the AttachTime field's value.
func (s *InstanceNetworkInterfaceAttachment) SetAttachTime(v time.Time) *InstanceNetworkInterfaceAttachment {
	s.AttachTime = &v
	return s
}

// SetAttachmentId sets the AttachmentId field's value.
func (s *InstanceNetworkInterfaceAttachment) SetAttachmentId(v string) *InstanceNetworkInterfaceAttachment {
	s.AttachmentId = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *InstanceNetworkInterfaceAttachment) SetDeleteOnTermination(v bool) *InstanceNetworkInterfaceAttachment {
	s.DeleteOnTermination = &v
	return s
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *InstanceNetworkInterfaceAttachment) SetDeviceIndex(v int64) *InstanceNetworkInterfaceAttachment {
	s.DeviceIndex = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *InstanceNetworkInterfaceAttachment) SetStatus(v string) *InstanceNetworkInterfaceAttachment {
	s.Status = &v
	return s
}

// Describes a network interface.
type InstanceNetworkInterfaceSpecification struct {
	_ struct{} `type:"structure"`

	// Indicates whether to assign a public IPv4 address to an instance you launch
	// in a VPC. The public IP address can only be assigned to a network interface
	// for eth0, and can only be assigned to a new network interface, not an existing
	// one. You cannot specify more than one network interface in the request. If
	// launching into a default subnet, the default value is true.
	AssociatePublicIpAddress *bool `locationName:"associatePublicIpAddress" type:"boolean"`

	// If set to true, the interface is deleted when the instance is terminated.
	// You can specify true only if creating a new network interface when launching
	// an instance.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// The description of the network interface. Applies only if creating a network
	// interface when launching an instance.
	Description *string `locationName:"description" type:"string"`

	// The index of the device on the instance for the network interface attachment.
	// If you are specifying a network interface in a RunInstances request, you
	// must provide the device index.
	DeviceIndex *int64 `locationName:"deviceIndex" type:"integer"`

	// The IDs of the security groups for the network interface. Applies only if
	// creating a network interface when launching an instance.
	Groups []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// A number of IPv6 addresses to assign to the network interface. Amazon EC2
	// chooses the IPv6 addresses from the range of the subnet. You cannot specify
	// this option and the option to assign specific IPv6 addresses in the same
	// request. You can specify this option if you've specified a minimum number
	// of instances to launch.
	Ipv6AddressCount *int64 `locationName:"ipv6AddressCount" type:"integer"`

	// One or more IPv6 addresses to assign to the network interface. You cannot
	// specify this option and the option to assign a number of IPv6 addresses in
	// the same request. You cannot specify this option if you've specified a minimum
	// number of instances to launch.
	Ipv6Addresses []*InstanceIpv6Address `locationName:"ipv6AddressesSet" queryName:"Ipv6Addresses" locationNameList:"item" type:"list"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The private IPv4 address of the network interface. Applies only if creating
	// a network interface when launching an instance. You cannot specify this option
	// if you're launching more than one instance in a RunInstances request.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// One or more private IPv4 addresses to assign to the network interface. Only
	// one private IPv4 address can be designated as primary. You cannot specify
	// this option if you're launching more than one instance in a RunInstances
	// request.
	PrivateIpAddresses []*PrivateIpAddressSpecification `locationName:"privateIpAddressesSet" queryName:"PrivateIpAddresses" locationNameList:"item" type:"list"`

	// The number of secondary private IPv4 addresses. You can't specify this option
	// and specify more than one private IP address using the private IP addresses
	// option. You cannot specify this option if you're launching more than one
	// instance in a RunInstances request.
	SecondaryPrivateIpAddressCount *int64 `locationName:"secondaryPrivateIpAddressCount" type:"integer"`

	// The ID of the subnet associated with the network string. Applies only if
	// creating a network interface when launching an instance.
	SubnetId *string `locationName:"subnetId" type:"string"`
}

// String returns the string representation
func (s InstanceNetworkInterfaceSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceNetworkInterfaceSpecification) GoString() string {
	return s.String()
}

// SetAssociatePublicIpAddress sets the AssociatePublicIpAddress field's value.
func (s *InstanceNetworkInterfaceSpecification) SetAssociatePublicIpAddress(v bool) *InstanceNetworkInterfaceSpecification {
	s.AssociatePublicIpAddress = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *InstanceNetworkInterfaceSpecification) SetDeleteOnTermination(v bool) *InstanceNetworkInterfaceSpecification {
	s.DeleteOnTermination = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *InstanceNetworkInterfaceSpecification) SetDescription(v string) *InstanceNetworkInterfaceSpecification {
	s.Description = &v
	return s
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *InstanceNetworkInterfaceSpecification) SetDeviceIndex(v int64) *InstanceNetworkInterfaceSpecification {
	s.DeviceIndex = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *InstanceNetworkInterfaceSpecification) SetGroups(v []*string) *InstanceNetworkInterfaceSpecification {
	s.Groups = v
	return s
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *InstanceNetworkInterfaceSpecification) SetIpv6AddressCount(v int64) *InstanceNetworkInterfaceSpecification {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *InstanceNetworkInterfaceSpecification) SetIpv6Addresses(v []*InstanceIpv6Address) *InstanceNetworkInterfaceSpecification {
	s.Ipv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *InstanceNetworkInterfaceSpecification) SetNetworkInterfaceId(v string) *InstanceNetworkInterfaceSpecification {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *InstanceNetworkInterfaceSpecification) SetPrivateIpAddress(v string) *InstanceNetworkInterfaceSpecification {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *InstanceNetworkInterfaceSpecification) SetPrivateIpAddresses(v []*PrivateIpAddressSpecification) *InstanceNetworkInterfaceSpecification {
	s.PrivateIpAddresses = v
	return s
}

// SetSecondaryPrivateIpAddressCount sets the SecondaryPrivateIpAddressCount field's value.
func (s *InstanceNetworkInterfaceSpecification) SetSecondaryPrivateIpAddressCount(v int64) *InstanceNetworkInterfaceSpecification {
	s.SecondaryPrivateIpAddressCount = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *InstanceNetworkInterfaceSpecification) SetSubnetId(v string) *InstanceNetworkInterfaceSpecification {
	s.SubnetId = &v
	return s
}

// Describes a private IPv4 address.
type InstancePrivateIpAddress struct {
	_ struct{} `type:"structure"`

	// The association information for an Elastic IP address for the network interface.
	Association *InstanceNetworkInterfaceAssociation `locationName:"association" type:"structure"`

	// Indicates whether this IPv4 address is the primary private IP address of
	// the network interface.
	Primary *bool `locationName:"primary" type:"boolean"`

	// The private IPv4 DNS name.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The private IPv4 address of the network interface.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`
}

// String returns the string representation
func (s InstancePrivateIpAddress) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstancePrivateIpAddress) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *InstancePrivateIpAddress) SetAssociation(v *InstanceNetworkInterfaceAssociation) *InstancePrivateIpAddress {
	s.Association = v
	return s
}

// SetPrimary sets the Primary field's value.
func (s *InstancePrivateIpAddress) SetPrimary(v bool) *InstancePrivateIpAddress {
	s.Primary = &v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *InstancePrivateIpAddress) SetPrivateDnsName(v string) *InstancePrivateIpAddress {
	s.PrivateDnsName = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *InstancePrivateIpAddress) SetPrivateIpAddress(v string) *InstancePrivateIpAddress {
	s.PrivateIpAddress = &v
	return s
}

// Describes the current state of an instance.
type InstanceState struct {
	_ struct{} `type:"structure"`

	// The low byte represents the state. The high byte is used for internal purposes
	// and should be ignored.
	//
	//    * 0 : pending
	//
	//    * 16 : running
	//
	//    * 32 : shutting-down
	//
	//    * 48 : terminated
	//
	//    * 64 : stopping
	//
	//    * 80 : stopped
	Code *int64 `locationName:"code" type:"integer"`

	// The current state of the instance.
	Name *string `locationName:"name" type:"string" enum:"InstanceStateName"`
}

// String returns the string representation
func (s InstanceState) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceState) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *InstanceState) SetCode(v int64) *InstanceState {
	s.Code = &v
	return s
}

// SetName sets the Name field's value.
func (s *InstanceState) SetName(v string) *InstanceState {
	s.Name = &v
	return s
}

// Describes an instance state change.
type InstanceStateChange struct {
	_ struct{} `type:"structure"`

	// The current state of the instance.
	CurrentState *InstanceState `locationName:"currentState" type:"structure"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The previous state of the instance.
	PreviousState *InstanceState `locationName:"previousState" type:"structure"`
}

// String returns the string representation
func (s InstanceStateChange) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceStateChange) GoString() string {
	return s.String()
}

// SetCurrentState sets the CurrentState field's value.
func (s *InstanceStateChange) SetCurrentState(v *InstanceState) *InstanceStateChange {
	s.CurrentState = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *InstanceStateChange) SetInstanceId(v string) *InstanceStateChange {
	s.InstanceId = &v
	return s
}

// SetPreviousState sets the PreviousState field's value.
func (s *InstanceStateChange) SetPreviousState(v *InstanceState) *InstanceStateChange {
	s.PreviousState = v
	return s
}

// Describes the status of an instance.
type InstanceStatus struct {
	_ struct{} `type:"structure"`

	// The Availability Zone of the instance.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// Any scheduled events associated with the instance.
	Events []*InstanceStatusEvent `locationName:"eventsSet" locationNameList:"item" type:"list"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The intended state of the instance. DescribeInstanceStatus requires that
	// an instance be in the running state.
	InstanceState *InstanceState `locationName:"instanceState" type:"structure"`

	// Reports impaired functionality that stems from issues internal to the instance,
	// such as impaired reachability.
	InstanceStatus *InstanceStatusSummary `locationName:"instanceStatus" type:"structure"`

	// Reports impaired functionality that stems from issues related to the systems
	// that support an instance, such as hardware failures and network connectivity
	// problems.
	SystemStatus *InstanceStatusSummary `locationName:"systemStatus" type:"structure"`
}

// String returns the string representation
func (s InstanceStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceStatus) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *InstanceStatus) SetAvailabilityZone(v string) *InstanceStatus {
	s.AvailabilityZone = &v
	return s
}

// SetEvents sets the Events field's value.
func (s *InstanceStatus) SetEvents(v []*InstanceStatusEvent) *InstanceStatus {
	s.Events = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *InstanceStatus) SetInstanceId(v string) *InstanceStatus {
	s.InstanceId = &v
	return s
}

// SetInstanceState sets the InstanceState field's value.
func (s *InstanceStatus) SetInstanceState(v *InstanceState) *InstanceStatus {
	s.InstanceState = v
	return s
}

// SetInstanceStatus sets the InstanceStatus field's value.
func (s *InstanceStatus) SetInstanceStatus(v *InstanceStatusSummary) *InstanceStatus {
	s.InstanceStatus = v
	return s
}

// SetSystemStatus sets the SystemStatus field's value.
func (s *InstanceStatus) SetSystemStatus(v *InstanceStatusSummary) *InstanceStatus {
	s.SystemStatus = v
	return s
}

// Describes the instance status.
type InstanceStatusDetails struct {
	_ struct{} `type:"structure"`

	// The time when a status check failed. For an instance that was launched and
	// impaired, this is the time when the instance was launched.
	ImpairedSince *time.Time `locationName:"impairedSince" type:"timestamp"`

	// The type of instance status.
	Name *string `locationName:"name" type:"string" enum:"StatusName"`

	// The status.
	Status *string `locationName:"status" type:"string" enum:"StatusType"`
}

// String returns the string representation
func (s InstanceStatusDetails) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceStatusDetails) GoString() string {
	return s.String()
}

// SetImpairedSince sets the ImpairedSince field's value.
func (s *InstanceStatusDetails) SetImpairedSince(v time.Time) *InstanceStatusDetails {
	s.ImpairedSince = &v
	return s
}

// SetName sets the Name field's value.
func (s *InstanceStatusDetails) SetName(v string) *InstanceStatusDetails {
	s.Name = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *InstanceStatusDetails) SetStatus(v string) *InstanceStatusDetails {
	s.Status = &v
	return s
}

// Describes a scheduled event for an instance.
type InstanceStatusEvent struct {
	_ struct{} `type:"structure"`

	// The event code.
	Code *string `locationName:"code" type:"string" enum:"EventCode"`

	// A description of the event.
	//
	// After a scheduled event is completed, it can still be described for up to
	// a week. If the event has been completed, this description starts with the
	// following text: [Completed].
	Description *string `locationName:"description" type:"string"`

	// The latest scheduled end time for the event.
	NotAfter *time.Time `locationName:"notAfter" type:"timestamp"`

	// The earliest scheduled start time for the event.
	NotBefore *time.Time `locationName:"notBefore" type:"timestamp"`
}

// String returns the string representation
func (s InstanceStatusEvent) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceStatusEvent) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *InstanceStatusEvent) SetCode(v string) *InstanceStatusEvent {
	s.Code = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *InstanceStatusEvent) SetDescription(v string) *InstanceStatusEvent {
	s.Description = &v
	return s
}

// SetNotAfter sets the NotAfter field's value.
func (s *InstanceStatusEvent) SetNotAfter(v time.Time) *InstanceStatusEvent {
	s.NotAfter = &v
	return s
}

// SetNotBefore sets the NotBefore field's value.
func (s *InstanceStatusEvent) SetNotBefore(v time.Time) *InstanceStatusEvent {
	s.NotBefore = &v
	return s
}

// Describes the status of an instance.
type InstanceStatusSummary struct {
	_ struct{} `type:"structure"`

	// The system instance health or application instance health.
	Details []*InstanceStatusDetails `locationName:"details" locationNameList:"item" type:"list"`

	// The status.
	Status *string `locationName:"status" type:"string" enum:"SummaryStatus"`
}

// String returns the string representation
func (s InstanceStatusSummary) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InstanceStatusSummary) GoString() string {
	return s.String()
}

// SetDetails sets the Details field's value.
func (s *InstanceStatusSummary) SetDetails(v []*InstanceStatusDetails) *InstanceStatusSummary {
	s.Details = v
	return s
}

// SetStatus sets the Status field's value.
func (s *InstanceStatusSummary) SetStatus(v string) *InstanceStatusSummary {
	s.Status = &v
	return s
}

// Describes an internet gateway.
type InternetGateway struct {
	_ struct{} `type:"structure"`

	// Any VPCs attached to the internet gateway.
	Attachments []*InternetGatewayAttachment `locationName:"attachmentSet" locationNameList:"item" type:"list"`

	// The ID of the internet gateway.
	InternetGatewayId *string `locationName:"internetGatewayId" type:"string"`

	// The ID of the AWS account that owns the internet gateway.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Any tags assigned to the internet gateway.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s InternetGateway) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InternetGateway) GoString() string {
	return s.String()
}

// SetAttachments sets the Attachments field's value.
func (s *InternetGateway) SetAttachments(v []*InternetGatewayAttachment) *InternetGateway {
	s.Attachments = v
	return s
}

// SetInternetGatewayId sets the InternetGatewayId field's value.
func (s *InternetGateway) SetInternetGatewayId(v string) *InternetGateway {
	s.InternetGatewayId = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *InternetGateway) SetOwnerId(v string) *InternetGateway {
	s.OwnerId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *InternetGateway) SetTags(v []*Tag) *InternetGateway {
	s.Tags = v
	return s
}

// Describes the attachment of a VPC to an internet gateway or an egress-only
// internet gateway.
type InternetGatewayAttachment struct {
	_ struct{} `type:"structure"`

	// The current state of the attachment. For an internet gateway, the state is
	// available when attached to a VPC; otherwise, this value is not returned.
	State *string `locationName:"state" type:"string" enum:"AttachmentStatus"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s InternetGatewayAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s InternetGatewayAttachment) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *InternetGatewayAttachment) SetState(v string) *InternetGatewayAttachment {
	s.State = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *InternetGatewayAttachment) SetVpcId(v string) *InternetGatewayAttachment {
	s.VpcId = &v
	return s
}

// Describes a set of permissions for a security group rule.
type IpPermission struct {
	_ struct{} `type:"structure"`

	// The start of port range for the TCP and UDP protocols, or an ICMP/ICMPv6
	// type number. A value of -1 indicates all ICMP/ICMPv6 types. If you specify
	// all ICMP/ICMPv6 types, you must specify all codes.
	FromPort *int64 `locationName:"fromPort" type:"integer"`

	// The IP protocol name (tcp, udp, icmp) or number (see Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)).
	//
	// [EC2-VPC only] Use -1 to specify all protocols. When authorizing security
	// group rules, specifying -1 or a protocol number other than tcp, udp, icmp,
	// or 58 (ICMPv6) allows traffic on all ports, regardless of any port range
	// you specify. For tcp, udp, and icmp, you must specify a port range. For 58
	// (ICMPv6), you can optionally specify a port range; if you don't, traffic
	// for all types and codes is allowed when authorizing rules.
	IpProtocol *string `locationName:"ipProtocol" type:"string"`

	// One or more IPv4 ranges.
	IpRanges []*IpRange `locationName:"ipRanges" locationNameList:"item" type:"list"`

	// [EC2-VPC only] One or more IPv6 ranges.
	Ipv6Ranges []*Ipv6Range `locationName:"ipv6Ranges" locationNameList:"item" type:"list"`

	// [EC2-VPC only] One or more prefix list IDs for an AWS service. With AuthorizeSecurityGroupEgress,
	// this is the AWS service that you want to access through a VPC endpoint from
	// instances associated with the security group.
	PrefixListIds []*PrefixListId `locationName:"prefixListIds" locationNameList:"item" type:"list"`

	// The end of port range for the TCP and UDP protocols, or an ICMP/ICMPv6 code.
	// A value of -1 indicates all ICMP/ICMPv6 codes for the specified ICMP type.
	// If you specify all ICMP/ICMPv6 types, you must specify all codes.
	ToPort *int64 `locationName:"toPort" type:"integer"`

	// One or more security group and AWS account ID pairs.
	UserIdGroupPairs []*UserIdGroupPair `locationName:"groups" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s IpPermission) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IpPermission) GoString() string {
	return s.String()
}

// SetFromPort sets the FromPort field's value.
func (s *IpPermission) SetFromPort(v int64) *IpPermission {
	s.FromPort = &v
	return s
}

// SetIpProtocol sets the IpProtocol field's value.
func (s *IpPermission) SetIpProtocol(v string) *IpPermission {
	s.IpProtocol = &v
	return s
}

// SetIpRanges sets the IpRanges field's value.
func (s *IpPermission) SetIpRanges(v []*IpRange) *IpPermission {
	s.IpRanges = v
	return s
}

// SetIpv6Ranges sets the Ipv6Ranges field's value.
func (s *IpPermission) SetIpv6Ranges(v []*Ipv6Range) *IpPermission {
	s.Ipv6Ranges = v
	return s
}

// SetPrefixListIds sets the PrefixListIds field's value.
func (s *IpPermission) SetPrefixListIds(v []*PrefixListId) *IpPermission {
	s.PrefixListIds = v
	return s
}

// SetToPort sets the ToPort field's value.
func (s *IpPermission) SetToPort(v int64) *IpPermission {
	s.ToPort = &v
	return s
}

// SetUserIdGroupPairs sets the UserIdGroupPairs field's value.
func (s *IpPermission) SetUserIdGroupPairs(v []*UserIdGroupPair) *IpPermission {
	s.UserIdGroupPairs = v
	return s
}

// Describes an IPv4 range.
type IpRange struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR range. You can either specify a CIDR range or a source security
	// group, not both. To specify a single IPv4 address, use the /32 prefix length.
	CidrIp *string `locationName:"cidrIp" type:"string"`

	// A description for the security group rule that references this IPv4 address
	// range.
	//
	// Constraints: Up to 255 characters in length. Allowed characters are a-z,
	// A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*
	Description *string `locationName:"description" type:"string"`
}

// String returns the string representation
func (s IpRange) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s IpRange) GoString() string {
	return s.String()
}

// SetCidrIp sets the CidrIp field's value.
func (s *IpRange) SetCidrIp(v string) *IpRange {
	s.CidrIp = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *IpRange) SetDescription(v string) *IpRange {
	s.Description = &v
	return s
}

// Describes an IPv6 CIDR block.
type Ipv6CidrBlock struct {
	_ struct{} `type:"structure"`

	// The IPv6 CIDR block.
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string"`
}

// String returns the string representation
func (s Ipv6CidrBlock) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Ipv6CidrBlock) GoString() string {
	return s.String()
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *Ipv6CidrBlock) SetIpv6CidrBlock(v string) *Ipv6CidrBlock {
	s.Ipv6CidrBlock = &v
	return s
}

// [EC2-VPC only] Describes an IPv6 range.
type Ipv6Range struct {
	_ struct{} `type:"structure"`

	// The IPv6 CIDR range. You can either specify a CIDR range or a source security
	// group, not both. To specify a single IPv6 address, use the /128 prefix length.
	CidrIpv6 *string `locationName:"cidrIpv6" type:"string"`

	// A description for the security group rule that references this IPv6 address
	// range.
	//
	// Constraints: Up to 255 characters in length. Allowed characters are a-z,
	// A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*
	Description *string `locationName:"description" type:"string"`
}

// String returns the string representation
func (s Ipv6Range) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Ipv6Range) GoString() string {
	return s.String()
}

// SetCidrIpv6 sets the CidrIpv6 field's value.
func (s *Ipv6Range) SetCidrIpv6(v string) *Ipv6Range {
	s.CidrIpv6 = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *Ipv6Range) SetDescription(v string) *Ipv6Range {
	s.Description = &v
	return s
}

// Describes a key pair.
type KeyPairInfo struct {
	_ struct{} `type:"structure"`

	// If you used CreateKeyPair to create the key pair, this is the SHA-1 digest
	// of the DER encoded private key. If you used ImportKeyPair to provide AWS
	// the public key, this is the MD5 public key fingerprint as specified in section
	// 4 of RFC4716.
	KeyFingerprint *string `locationName:"keyFingerprint" type:"string"`

	// The name of the key pair.
	KeyName *string `locationName:"keyName" type:"string"`
}

// String returns the string representation
func (s KeyPairInfo) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s KeyPairInfo) GoString() string {
	return s.String()
}

// SetKeyFingerprint sets the KeyFingerprint field's value.
func (s *KeyPairInfo) SetKeyFingerprint(v string) *KeyPairInfo {
	s.KeyFingerprint = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *KeyPairInfo) SetKeyName(v string) *KeyPairInfo {
	s.KeyName = &v
	return s
}

// Describes a launch permission.
type LaunchPermission struct {
	_ struct{} `type:"structure"`

	// The name of the group.
	Group *string `locationName:"group" type:"string" enum:"PermissionGroup"`

	// The AWS account ID.
	UserId *string `locationName:"userId" type:"string"`
}

// String returns the string representation
func (s LaunchPermission) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchPermission) GoString() string {
	return s.String()
}

// SetGroup sets the Group field's value.
func (s *LaunchPermission) SetGroup(v string) *LaunchPermission {
	s.Group = &v
	return s
}

// SetUserId sets the UserId field's value.
func (s *LaunchPermission) SetUserId(v string) *LaunchPermission {
	s.UserId = &v
	return s
}

// Describes a launch permission modification.
type LaunchPermissionModifications struct {
	_ struct{} `type:"structure"`

	// The AWS account ID to add to the list of launch permissions for the AMI.
	Add []*LaunchPermission `locationNameList:"item" type:"list"`

	// The AWS account ID to remove from the list of launch permissions for the
	// AMI.
	Remove []*LaunchPermission `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s LaunchPermissionModifications) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchPermissionModifications) GoString() string {
	return s.String()
}

// SetAdd sets the Add field's value.
func (s *LaunchPermissionModifications) SetAdd(v []*LaunchPermission) *LaunchPermissionModifications {
	s.Add = v
	return s
}

// SetRemove sets the Remove field's value.
func (s *LaunchPermissionModifications) SetRemove(v []*LaunchPermission) *LaunchPermissionModifications {
	s.Remove = v
	return s
}

// Describes the launch specification for an instance.
type LaunchSpecification struct {
	_ struct{} `type:"structure"`

	// Deprecated.
	AddressingType *string `locationName:"addressingType" type:"string"`

	// One or more block device mapping entries.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// Indicates whether the instance is optimized for EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal EBS I/O performance. This optimization isn't available
	// with all instance types. Additional usage charges apply when using an EBS
	// Optimized instance.
	//
	// Default: false
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// The IAM instance profile.
	IamInstanceProfile *IamInstanceProfileSpecification `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the AMI.
	ImageId *string `locationName:"imageId" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The ID of the kernel.
	KernelId *string `locationName:"kernelId" type:"string"`

	// The name of the key pair.
	KeyName *string `locationName:"keyName" type:"string"`

	// Describes the monitoring of an instance.
	Monitoring *RunInstancesMonitoringEnabled `locationName:"monitoring" type:"structure"`

	// One or more network interfaces. If you specify a network interface, you must
	// specify subnet IDs and security group IDs using the network interface.
	NetworkInterfaces []*InstanceNetworkInterfaceSpecification `locationName:"networkInterfaceSet" locationNameList:"item" type:"list"`

	// The placement information for the instance.
	Placement *SpotPlacement `locationName:"placement" type:"structure"`

	// The ID of the RAM disk.
	RamdiskId *string `locationName:"ramdiskId" type:"string"`

	// One or more security groups. When requesting instances in a VPC, you must
	// specify the IDs of the security groups. When requesting instances in EC2-Classic,
	// you can specify the names or the IDs of the security groups.
	SecurityGroups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// The ID of the subnet in which to launch the instance.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The Base64-encoded user data for the instance.
	UserData *string `locationName:"userData" type:"string"`
}

// String returns the string representation
func (s LaunchSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchSpecification) GoString() string {
	return s.String()
}

// SetAddressingType sets the AddressingType field's value.
func (s *LaunchSpecification) SetAddressingType(v string) *LaunchSpecification {
	s.AddressingType = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *LaunchSpecification) SetBlockDeviceMappings(v []*BlockDeviceMapping) *LaunchSpecification {
	s.BlockDeviceMappings = v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *LaunchSpecification) SetEbsOptimized(v bool) *LaunchSpecification {
	s.EbsOptimized = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *LaunchSpecification) SetIamInstanceProfile(v *IamInstanceProfileSpecification) *LaunchSpecification {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *LaunchSpecification) SetImageId(v string) *LaunchSpecification {
	s.ImageId = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *LaunchSpecification) SetInstanceType(v string) *LaunchSpecification {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *LaunchSpecification) SetKernelId(v string) *LaunchSpecification {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *LaunchSpecification) SetKeyName(v string) *LaunchSpecification {
	s.KeyName = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *LaunchSpecification) SetMonitoring(v *RunInstancesMonitoringEnabled) *LaunchSpecification {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *LaunchSpecification) SetNetworkInterfaces(v []*InstanceNetworkInterfaceSpecification) *LaunchSpecification {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *LaunchSpecification) SetPlacement(v *SpotPlacement) *LaunchSpecification {
	s.Placement = v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *LaunchSpecification) SetRamdiskId(v string) *LaunchSpecification {
	s.RamdiskId = &v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *LaunchSpecification) SetSecurityGroups(v []*GroupIdentifier) *LaunchSpecification {
	s.SecurityGroups = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *LaunchSpecification) SetSubnetId(v string) *LaunchSpecification {
	s.SubnetId = &v
	return s
}

// SetUserData sets the UserData field's value.
func (s *LaunchSpecification) SetUserData(v string) *LaunchSpecification {
	s.UserData = &v
	return s
}

// Describes a launch template.
type LaunchTemplate struct {
	_ struct{} `type:"structure"`

	// The time launch template was created.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// The principal that created the launch template.
	CreatedBy *string `locationName:"createdBy" type:"string"`

	// The version number of the default version of the launch template.
	DefaultVersionNumber *int64 `locationName:"defaultVersionNumber" type:"long"`

	// The version number of the latest version of the launch template.
	LatestVersionNumber *int64 `locationName:"latestVersionNumber" type:"long"`

	// The ID of the launch template.
	LaunchTemplateId *string `locationName:"launchTemplateId" type:"string"`

	// The name of the launch template.
	LaunchTemplateName *string `locationName:"launchTemplateName" min:"3" type:"string"`

	// The tags for the launch template.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s LaunchTemplate) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplate) GoString() string {
	return s.String()
}

// SetCreateTime sets the CreateTime field's value.
func (s *LaunchTemplate) SetCreateTime(v time.Time) *LaunchTemplate {
	s.CreateTime = &v
	return s
}

// SetCreatedBy sets the CreatedBy field's value.
func (s *LaunchTemplate) SetCreatedBy(v string) *LaunchTemplate {
	s.CreatedBy = &v
	return s
}

// SetDefaultVersionNumber sets the DefaultVersionNumber field's value.
func (s *LaunchTemplate) SetDefaultVersionNumber(v int64) *LaunchTemplate {
	s.DefaultVersionNumber = &v
	return s
}

// SetLatestVersionNumber sets the LatestVersionNumber field's value.
func (s *LaunchTemplate) SetLatestVersionNumber(v int64) *LaunchTemplate {
	s.LatestVersionNumber = &v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *LaunchTemplate) SetLaunchTemplateId(v string) *LaunchTemplate {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *LaunchTemplate) SetLaunchTemplateName(v string) *LaunchTemplate {
	s.LaunchTemplateName = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *LaunchTemplate) SetTags(v []*Tag) *LaunchTemplate {
	s.Tags = v
	return s
}

// Describes a launch template and overrides.
type LaunchTemplateAndOverridesResponse struct {
	_ struct{} `type:"structure"`

	// The launch template.
	LaunchTemplateSpecification *FleetLaunchTemplateSpecification `locationName:"launchTemplateSpecification" type:"structure"`

	// Any parameters that you specify override the same parameters in the launch
	// template.
	Overrides *FleetLaunchTemplateOverrides `locationName:"overrides" type:"structure"`
}

// String returns the string representation
func (s LaunchTemplateAndOverridesResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateAndOverridesResponse) GoString() string {
	return s.String()
}

// SetLaunchTemplateSpecification sets the LaunchTemplateSpecification field's value.
func (s *LaunchTemplateAndOverridesResponse) SetLaunchTemplateSpecification(v *FleetLaunchTemplateSpecification) *LaunchTemplateAndOverridesResponse {
	s.LaunchTemplateSpecification = v
	return s
}

// SetOverrides sets the Overrides field's value.
func (s *LaunchTemplateAndOverridesResponse) SetOverrides(v *FleetLaunchTemplateOverrides) *LaunchTemplateAndOverridesResponse {
	s.Overrides = v
	return s
}

// Describes a block device mapping.
type LaunchTemplateBlockDeviceMapping struct {
	_ struct{} `type:"structure"`

	// The device name.
	DeviceName *string `locationName:"deviceName" type:"string"`

	// Information about the block device for an EBS volume.
	Ebs *LaunchTemplateEbsBlockDevice `locationName:"ebs" type:"structure"`

	// Suppresses the specified device included in the block device mapping of the
	// AMI.
	NoDevice *string `locationName:"noDevice" type:"string"`

	// The virtual device name (ephemeralN).
	VirtualName *string `locationName:"virtualName" type:"string"`
}

// String returns the string representation
func (s LaunchTemplateBlockDeviceMapping) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateBlockDeviceMapping) GoString() string {
	return s.String()
}

// SetDeviceName sets the DeviceName field's value.
func (s *LaunchTemplateBlockDeviceMapping) SetDeviceName(v string) *LaunchTemplateBlockDeviceMapping {
	s.DeviceName = &v
	return s
}

// SetEbs sets the Ebs field's value.
func (s *LaunchTemplateBlockDeviceMapping) SetEbs(v *LaunchTemplateEbsBlockDevice) *LaunchTemplateBlockDeviceMapping {
	s.Ebs = v
	return s
}

// SetNoDevice sets the NoDevice field's value.
func (s *LaunchTemplateBlockDeviceMapping) SetNoDevice(v string) *LaunchTemplateBlockDeviceMapping {
	s.NoDevice = &v
	return s
}

// SetVirtualName sets the VirtualName field's value.
func (s *LaunchTemplateBlockDeviceMapping) SetVirtualName(v string) *LaunchTemplateBlockDeviceMapping {
	s.VirtualName = &v
	return s
}

// Describes a block device mapping.
type LaunchTemplateBlockDeviceMappingRequest struct {
	_ struct{} `type:"structure"`

	// The device name (for example, /dev/sdh or xvdh).
	DeviceName *string `type:"string"`

	// Parameters used to automatically set up EBS volumes when the instance is
	// launched.
	Ebs *LaunchTemplateEbsBlockDeviceRequest `type:"structure"`

	// Suppresses the specified device included in the block device mapping of the
	// AMI.
	NoDevice *string `type:"string"`

	// The virtual device name (ephemeralN). Instance store volumes are numbered
	// starting from 0. An instance type with 2 available instance store volumes
	// can specify mappings for ephemeral0 and ephemeral1. The number of available
	// instance store volumes depends on the instance type. After you connect to
	// the instance, you must mount the volume.
	VirtualName *string `type:"string"`
}

// String returns the string representation
func (s LaunchTemplateBlockDeviceMappingRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateBlockDeviceMappingRequest) GoString() string {
	return s.String()
}

// SetDeviceName sets the DeviceName field's value.
func (s *LaunchTemplateBlockDeviceMappingRequest) SetDeviceName(v string) *LaunchTemplateBlockDeviceMappingRequest {
	s.DeviceName = &v
	return s
}

// SetEbs sets the Ebs field's value.
func (s *LaunchTemplateBlockDeviceMappingRequest) SetEbs(v *LaunchTemplateEbsBlockDeviceRequest) *LaunchTemplateBlockDeviceMappingRequest {
	s.Ebs = v
	return s
}

// SetNoDevice sets the NoDevice field's value.
func (s *LaunchTemplateBlockDeviceMappingRequest) SetNoDevice(v string) *LaunchTemplateBlockDeviceMappingRequest {
	s.NoDevice = &v
	return s
}

// SetVirtualName sets the VirtualName field's value.
func (s *LaunchTemplateBlockDeviceMappingRequest) SetVirtualName(v string) *LaunchTemplateBlockDeviceMappingRequest {
	s.VirtualName = &v
	return s
}

// Describes an instance's Capacity Reservation targeting option. You can specify
// only one option at a time. Use the CapacityReservationPreference parameter
// to configure the instance to run in On-Demand capacity or to run in any open
// Capacity Reservation that has matching attributes (instance type, platform,
// Availability Zone). Use the CapacityReservationTarget parameter to explicitly
// target a specific Capacity Reservation.
type LaunchTemplateCapacityReservationSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// Indicates the instance's Capacity Reservation preferences. Possible preferences
	// include:
	//
	//    * open - The instance can run in any open Capacity Reservation that has
	//    matching attributes (instance type, platform, Availability Zone).
	//
	//    * none - The instance avoids running in a Capacity Reservation even if
	//    one is available. The instance runs in On-Demand capacity.
	CapacityReservationPreference *string `type:"string" enum:"CapacityReservationPreference"`

	// Information about the target Capacity Reservation.
	CapacityReservationTarget *CapacityReservationTarget `type:"structure"`
}

// String returns the string representation
func (s LaunchTemplateCapacityReservationSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateCapacityReservationSpecificationRequest) GoString() string {
	return s.String()
}

// SetCapacityReservationPreference sets the CapacityReservationPreference field's value.
func (s *LaunchTemplateCapacityReservationSpecificationRequest) SetCapacityReservationPreference(v string) *LaunchTemplateCapacityReservationSpecificationRequest {
	s.CapacityReservationPreference = &v
	return s
}

// SetCapacityReservationTarget sets the CapacityReservationTarget field's value.
func (s *LaunchTemplateCapacityReservationSpecificationRequest) SetCapacityReservationTarget(v *CapacityReservationTarget) *LaunchTemplateCapacityReservationSpecificationRequest {
	s.CapacityReservationTarget = v
	return s
}

// Information about the Capacity Reservation targeting option.
type LaunchTemplateCapacityReservationSpecificationResponse struct {
	_ struct{} `type:"structure"`

	// Indicates the instance's Capacity Reservation preferences. Possible preferences
	// include:
	//
	//    * open - The instance can run in any open Capacity Reservation that has
	//    matching attributes (instance type, platform, Availability Zone).
	//
	//    * none - The instance avoids running in a Capacity Reservation even if
	//    one is available. The instance runs in On-Demand capacity.
	CapacityReservationPreference *string `locationName:"capacityReservationPreference" type:"string" enum:"CapacityReservationPreference"`

	// Information about the target Capacity Reservation.
	CapacityReservationTarget *CapacityReservationTargetResponse `locationName:"capacityReservationTarget" type:"structure"`
}

// String returns the string representation
func (s LaunchTemplateCapacityReservationSpecificationResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateCapacityReservationSpecificationResponse) GoString() string {
	return s.String()
}

// SetCapacityReservationPreference sets the CapacityReservationPreference field's value.
func (s *LaunchTemplateCapacityReservationSpecificationResponse) SetCapacityReservationPreference(v string) *LaunchTemplateCapacityReservationSpecificationResponse {
	s.CapacityReservationPreference = &v
	return s
}

// SetCapacityReservationTarget sets the CapacityReservationTarget field's value.
func (s *LaunchTemplateCapacityReservationSpecificationResponse) SetCapacityReservationTarget(v *CapacityReservationTargetResponse) *LaunchTemplateCapacityReservationSpecificationResponse {
	s.CapacityReservationTarget = v
	return s
}

// Describes a launch template and overrides.
type LaunchTemplateConfig struct {
	_ struct{} `type:"structure"`

	// The launch template.
	LaunchTemplateSpecification *FleetLaunchTemplateSpecification `locationName:"launchTemplateSpecification" type:"structure"`

	// Any parameters that you specify override the same parameters in the launch
	// template.
	Overrides []*LaunchTemplateOverrides `locationName:"overrides" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s LaunchTemplateConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateConfig) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *LaunchTemplateConfig) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "LaunchTemplateConfig"}
	if s.LaunchTemplateSpecification != nil {
		if err := s.LaunchTemplateSpecification.Validate(); err != nil {
			invalidParams.AddNested("LaunchTemplateSpecification", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetLaunchTemplateSpecification sets the LaunchTemplateSpecification field's value.
func (s *LaunchTemplateConfig) SetLaunchTemplateSpecification(v *FleetLaunchTemplateSpecification) *LaunchTemplateConfig {
	s.LaunchTemplateSpecification = v
	return s
}

// SetOverrides sets the Overrides field's value.
func (s *LaunchTemplateConfig) SetOverrides(v []*LaunchTemplateOverrides) *LaunchTemplateConfig {
	s.Overrides = v
	return s
}

// The CPU options for the instance.
type LaunchTemplateCpuOptions struct {
	_ struct{} `type:"structure"`

	// The number of CPU cores for the instance.
	CoreCount *int64 `locationName:"coreCount" type:"integer"`

	// The number of threads per CPU core.
	ThreadsPerCore *int64 `locationName:"threadsPerCore" type:"integer"`
}

// String returns the string representation
func (s LaunchTemplateCpuOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateCpuOptions) GoString() string {
	return s.String()
}

// SetCoreCount sets the CoreCount field's value.
func (s *LaunchTemplateCpuOptions) SetCoreCount(v int64) *LaunchTemplateCpuOptions {
	s.CoreCount = &v
	return s
}

// SetThreadsPerCore sets the ThreadsPerCore field's value.
func (s *LaunchTemplateCpuOptions) SetThreadsPerCore(v int64) *LaunchTemplateCpuOptions {
	s.ThreadsPerCore = &v
	return s
}

// The CPU options for the instance. Both the core count and threads per core
// must be specified in the request.
type LaunchTemplateCpuOptionsRequest struct {
	_ struct{} `type:"structure"`

	// The number of CPU cores for the instance.
	CoreCount *int64 `type:"integer"`

	// The number of threads per CPU core. To disable Intel Hyper-Threading Technology
	// for the instance, specify a value of 1. Otherwise, specify the default value
	// of 2.
	ThreadsPerCore *int64 `type:"integer"`
}

// String returns the string representation
func (s LaunchTemplateCpuOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateCpuOptionsRequest) GoString() string {
	return s.String()
}

// SetCoreCount sets the CoreCount field's value.
func (s *LaunchTemplateCpuOptionsRequest) SetCoreCount(v int64) *LaunchTemplateCpuOptionsRequest {
	s.CoreCount = &v
	return s
}

// SetThreadsPerCore sets the ThreadsPerCore field's value.
func (s *LaunchTemplateCpuOptionsRequest) SetThreadsPerCore(v int64) *LaunchTemplateCpuOptionsRequest {
	s.ThreadsPerCore = &v
	return s
}

// Describes a block device for an EBS volume.
type LaunchTemplateEbsBlockDevice struct {
	_ struct{} `type:"structure"`

	// Indicates whether the EBS volume is deleted on instance termination.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// Indicates whether the EBS volume is encrypted.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The number of I/O operations per second (IOPS) that the volume supports.
	Iops *int64 `locationName:"iops" type:"integer"`

	// The ARN of the AWS Key Management Service (AWS KMS) CMK used for encryption.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// The ID of the snapshot.
	SnapshotId *string `locationName:"snapshotId" type:"string"`

	// The size of the volume, in GiB.
	VolumeSize *int64 `locationName:"volumeSize" type:"integer"`

	// The volume type.
	VolumeType *string `locationName:"volumeType" type:"string" enum:"VolumeType"`
}

// String returns the string representation
func (s LaunchTemplateEbsBlockDevice) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateEbsBlockDevice) GoString() string {
	return s.String()
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *LaunchTemplateEbsBlockDevice) SetDeleteOnTermination(v bool) *LaunchTemplateEbsBlockDevice {
	s.DeleteOnTermination = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *LaunchTemplateEbsBlockDevice) SetEncrypted(v bool) *LaunchTemplateEbsBlockDevice {
	s.Encrypted = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *LaunchTemplateEbsBlockDevice) SetIops(v int64) *LaunchTemplateEbsBlockDevice {
	s.Iops = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *LaunchTemplateEbsBlockDevice) SetKmsKeyId(v string) *LaunchTemplateEbsBlockDevice {
	s.KmsKeyId = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *LaunchTemplateEbsBlockDevice) SetSnapshotId(v string) *LaunchTemplateEbsBlockDevice {
	s.SnapshotId = &v
	return s
}

// SetVolumeSize sets the VolumeSize field's value.
func (s *LaunchTemplateEbsBlockDevice) SetVolumeSize(v int64) *LaunchTemplateEbsBlockDevice {
	s.VolumeSize = &v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *LaunchTemplateEbsBlockDevice) SetVolumeType(v string) *LaunchTemplateEbsBlockDevice {
	s.VolumeType = &v
	return s
}

// The parameters for a block device for an EBS volume.
type LaunchTemplateEbsBlockDeviceRequest struct {
	_ struct{} `type:"structure"`

	// Indicates whether the EBS volume is deleted on instance termination.
	DeleteOnTermination *bool `type:"boolean"`

	// Indicates whether the EBS volume is encrypted. Encrypted volumes can only
	// be attached to instances that support Amazon EBS encryption. If you are creating
	// a volume from a snapshot, you can't specify an encryption value.
	Encrypted *bool `type:"boolean"`

	// The number of I/O operations per second (IOPS) that the volume supports.
	// For io1, this represents the number of IOPS that are provisioned for the
	// volume. For gp2, this represents the baseline performance of the volume and
	// the rate at which the volume accumulates I/O credits for bursting. For more
	// information about General Purpose SSD baseline performance, I/O credits,
	// and bursting, see Amazon EBS Volume Types in the Amazon Elastic Compute Cloud
	// User Guide.
	//
	// Condition: This parameter is required for requests to create io1 volumes;
	// it is not used in requests to create gp2, st1, sc1, or standard volumes.
	Iops *int64 `type:"integer"`

	// The ARN of the AWS Key Management Service (AWS KMS) CMK used for encryption.
	KmsKeyId *string `type:"string"`

	// The ID of the snapshot.
	SnapshotId *string `type:"string"`

	// The size of the volume, in GiB.
	//
	// Default: If you're creating the volume from a snapshot and don't specify
	// a volume size, the default is the snapshot size.
	VolumeSize *int64 `type:"integer"`

	// The volume type.
	VolumeType *string `type:"string" enum:"VolumeType"`
}

// String returns the string representation
func (s LaunchTemplateEbsBlockDeviceRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateEbsBlockDeviceRequest) GoString() string {
	return s.String()
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetDeleteOnTermination(v bool) *LaunchTemplateEbsBlockDeviceRequest {
	s.DeleteOnTermination = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetEncrypted(v bool) *LaunchTemplateEbsBlockDeviceRequest {
	s.Encrypted = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetIops(v int64) *LaunchTemplateEbsBlockDeviceRequest {
	s.Iops = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetKmsKeyId(v string) *LaunchTemplateEbsBlockDeviceRequest {
	s.KmsKeyId = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetSnapshotId(v string) *LaunchTemplateEbsBlockDeviceRequest {
	s.SnapshotId = &v
	return s
}

// SetVolumeSize sets the VolumeSize field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetVolumeSize(v int64) *LaunchTemplateEbsBlockDeviceRequest {
	s.VolumeSize = &v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *LaunchTemplateEbsBlockDeviceRequest) SetVolumeType(v string) *LaunchTemplateEbsBlockDeviceRequest {
	s.VolumeType = &v
	return s
}

// Describes an elastic inference accelerator.
type LaunchTemplateElasticInferenceAccelerator struct {
	_ struct{} `type:"structure"`

	// The type of elastic inference accelerator. The possible values are eia1.medium,
	// eia1.large, and eia1.xlarge.
	//
	// Type is a required field
	Type *string `type:"string" required:"true"`
}

// String returns the string representation
func (s LaunchTemplateElasticInferenceAccelerator) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateElasticInferenceAccelerator) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *LaunchTemplateElasticInferenceAccelerator) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "LaunchTemplateElasticInferenceAccelerator"}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetType sets the Type field's value.
func (s *LaunchTemplateElasticInferenceAccelerator) SetType(v string) *LaunchTemplateElasticInferenceAccelerator {
	s.Type = &v
	return s
}

// Describes an elastic inference accelerator.
type LaunchTemplateElasticInferenceAcceleratorResponse struct {
	_ struct{} `type:"structure"`

	// The type of elastic inference accelerator. The possible values are eia1.medium,
	// eia1.large, and eia1.xlarge.
	Type *string `locationName:"type" type:"string"`
}

// String returns the string representation
func (s LaunchTemplateElasticInferenceAcceleratorResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateElasticInferenceAcceleratorResponse) GoString() string {
	return s.String()
}

// SetType sets the Type field's value.
func (s *LaunchTemplateElasticInferenceAcceleratorResponse) SetType(v string) *LaunchTemplateElasticInferenceAcceleratorResponse {
	s.Type = &v
	return s
}

// Indicates whether an instance is configured for hibernation.
type LaunchTemplateHibernationOptions struct {
	_ struct{} `type:"structure"`

	// If this parameter is set to true, the instance is enabled for hibernation;
	// otherwise, it is not enabled for hibernation.
	Configured *bool `locationName:"configured" type:"boolean"`
}

// String returns the string representation
func (s LaunchTemplateHibernationOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateHibernationOptions) GoString() string {
	return s.String()
}

// SetConfigured sets the Configured field's value.
func (s *LaunchTemplateHibernationOptions) SetConfigured(v bool) *LaunchTemplateHibernationOptions {
	s.Configured = &v
	return s
}

// Indicates whether the instance is configured for hibernation. This parameter
// is valid only if the instance meets the hibernation prerequisites (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#hibernating-prerequisites).
// Hibernation is currently supported only for Amazon Linux.
type LaunchTemplateHibernationOptionsRequest struct {
	_ struct{} `type:"structure"`

	// If you set this parameter to true, the instance is enabled for hibernation.
	//
	// Default: false
	Configured *bool `type:"boolean"`
}

// String returns the string representation
func (s LaunchTemplateHibernationOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateHibernationOptionsRequest) GoString() string {
	return s.String()
}

// SetConfigured sets the Configured field's value.
func (s *LaunchTemplateHibernationOptionsRequest) SetConfigured(v bool) *LaunchTemplateHibernationOptionsRequest {
	s.Configured = &v
	return s
}

// Describes an IAM instance profile.
type LaunchTemplateIamInstanceProfileSpecification struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the instance profile.
	Arn *string `locationName:"arn" type:"string"`

	// The name of the instance profile.
	Name *string `locationName:"name" type:"string"`
}

// String returns the string representation
func (s LaunchTemplateIamInstanceProfileSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateIamInstanceProfileSpecification) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *LaunchTemplateIamInstanceProfileSpecification) SetArn(v string) *LaunchTemplateIamInstanceProfileSpecification {
	s.Arn = &v
	return s
}

// SetName sets the Name field's value.
func (s *LaunchTemplateIamInstanceProfileSpecification) SetName(v string) *LaunchTemplateIamInstanceProfileSpecification {
	s.Name = &v
	return s
}

// An IAM instance profile.
type LaunchTemplateIamInstanceProfileSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the instance profile.
	Arn *string `type:"string"`

	// The name of the instance profile.
	Name *string `type:"string"`
}

// String returns the string representation
func (s LaunchTemplateIamInstanceProfileSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateIamInstanceProfileSpecificationRequest) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *LaunchTemplateIamInstanceProfileSpecificationRequest) SetArn(v string) *LaunchTemplateIamInstanceProfileSpecificationRequest {
	s.Arn = &v
	return s
}

// SetName sets the Name field's value.
func (s *LaunchTemplateIamInstanceProfileSpecificationRequest) SetName(v string) *LaunchTemplateIamInstanceProfileSpecificationRequest {
	s.Name = &v
	return s
}

// The market (purchasing) option for the instances.
type LaunchTemplateInstanceMarketOptions struct {
	_ struct{} `type:"structure"`

	// The market type.
	MarketType *string `locationName:"marketType" type:"string" enum:"MarketType"`

	// The options for Spot Instances.
	SpotOptions *LaunchTemplateSpotMarketOptions `locationName:"spotOptions" type:"structure"`
}

// String returns the string representation
func (s LaunchTemplateInstanceMarketOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateInstanceMarketOptions) GoString() string {
	return s.String()
}

// SetMarketType sets the MarketType field's value.
func (s *LaunchTemplateInstanceMarketOptions) SetMarketType(v string) *LaunchTemplateInstanceMarketOptions {
	s.MarketType = &v
	return s
}

// SetSpotOptions sets the SpotOptions field's value.
func (s *LaunchTemplateInstanceMarketOptions) SetSpotOptions(v *LaunchTemplateSpotMarketOptions) *LaunchTemplateInstanceMarketOptions {
	s.SpotOptions = v
	return s
}

// The market (purchasing) option for the instances.
type LaunchTemplateInstanceMarketOptionsRequest struct {
	_ struct{} `type:"structure"`

	// The market type.
	MarketType *string `type:"string" enum:"MarketType"`

	// The options for Spot Instances.
	SpotOptions *LaunchTemplateSpotMarketOptionsRequest `type:"structure"`
}

// String returns the string representation
func (s LaunchTemplateInstanceMarketOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateInstanceMarketOptionsRequest) GoString() string {
	return s.String()
}

// SetMarketType sets the MarketType field's value.
func (s *LaunchTemplateInstanceMarketOptionsRequest) SetMarketType(v string) *LaunchTemplateInstanceMarketOptionsRequest {
	s.MarketType = &v
	return s
}

// SetSpotOptions sets the SpotOptions field's value.
func (s *LaunchTemplateInstanceMarketOptionsRequest) SetSpotOptions(v *LaunchTemplateSpotMarketOptionsRequest) *LaunchTemplateInstanceMarketOptionsRequest {
	s.SpotOptions = v
	return s
}

// Describes a network interface.
type LaunchTemplateInstanceNetworkInterfaceSpecification struct {
	_ struct{} `type:"structure"`

	// Indicates whether to associate a public IPv4 address with eth0 for a new
	// network interface.
	AssociatePublicIpAddress *bool `locationName:"associatePublicIpAddress" type:"boolean"`

	// Indicates whether the network interface is deleted when the instance is terminated.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// A description for the network interface.
	Description *string `locationName:"description" type:"string"`

	// The device index for the network interface attachment.
	DeviceIndex *int64 `locationName:"deviceIndex" type:"integer"`

	// The IDs of one or more security groups.
	Groups []*string `locationName:"groupSet" locationNameList:"groupId" type:"list"`

	// The number of IPv6 addresses for the network interface.
	Ipv6AddressCount *int64 `locationName:"ipv6AddressCount" type:"integer"`

	// The IPv6 addresses for the network interface.
	Ipv6Addresses []*InstanceIpv6Address `locationName:"ipv6AddressesSet" locationNameList:"item" type:"list"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The primary private IPv4 address of the network interface.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// One or more private IPv4 addresses.
	PrivateIpAddresses []*PrivateIpAddressSpecification `locationName:"privateIpAddressesSet" locationNameList:"item" type:"list"`

	// The number of secondary private IPv4 addresses for the network interface.
	SecondaryPrivateIpAddressCount *int64 `locationName:"secondaryPrivateIpAddressCount" type:"integer"`

	// The ID of the subnet for the network interface.
	SubnetId *string `locationName:"subnetId" type:"string"`
}

// String returns the string representation
func (s LaunchTemplateInstanceNetworkInterfaceSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateInstanceNetworkInterfaceSpecification) GoString() string {
	return s.String()
}

// SetAssociatePublicIpAddress sets the AssociatePublicIpAddress field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetAssociatePublicIpAddress(v bool) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.AssociatePublicIpAddress = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetDeleteOnTermination(v bool) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.DeleteOnTermination = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetDescription(v string) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.Description = &v
	return s
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetDeviceIndex(v int64) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.DeviceIndex = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetGroups(v []*string) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.Groups = v
	return s
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetIpv6AddressCount(v int64) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetIpv6Addresses(v []*InstanceIpv6Address) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.Ipv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetNetworkInterfaceId(v string) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetPrivateIpAddress(v string) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetPrivateIpAddresses(v []*PrivateIpAddressSpecification) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.PrivateIpAddresses = v
	return s
}

// SetSecondaryPrivateIpAddressCount sets the SecondaryPrivateIpAddressCount field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetSecondaryPrivateIpAddressCount(v int64) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.SecondaryPrivateIpAddressCount = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecification) SetSubnetId(v string) *LaunchTemplateInstanceNetworkInterfaceSpecification {
	s.SubnetId = &v
	return s
}

// The parameters for a network interface.
type LaunchTemplateInstanceNetworkInterfaceSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// Associates a public IPv4 address with eth0 for a new network interface.
	AssociatePublicIpAddress *bool `type:"boolean"`

	// Indicates whether the network interface is deleted when the instance is terminated.
	DeleteOnTermination *bool `type:"boolean"`

	// A description for the network interface.
	Description *string `type:"string"`

	// The device index for the network interface attachment.
	DeviceIndex *int64 `type:"integer"`

	// The IDs of one or more security groups.
	Groups []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// The number of IPv6 addresses to assign to a network interface. Amazon EC2
	// automatically selects the IPv6 addresses from the subnet range. You can't
	// use this option if specifying specific IPv6 addresses.
	Ipv6AddressCount *int64 `type:"integer"`

	// One or more specific IPv6 addresses from the IPv6 CIDR block range of your
	// subnet. You can't use this option if you're specifying a number of IPv6 addresses.
	Ipv6Addresses []*InstanceIpv6AddressRequest `locationNameList:"InstanceIpv6Address" type:"list"`

	// The ID of the network interface.
	NetworkInterfaceId *string `type:"string"`

	// The primary private IPv4 address of the network interface.
	PrivateIpAddress *string `type:"string"`

	// One or more private IPv4 addresses.
	PrivateIpAddresses []*PrivateIpAddressSpecification `locationNameList:"item" type:"list"`

	// The number of secondary private IPv4 addresses to assign to a network interface.
	SecondaryPrivateIpAddressCount *int64 `type:"integer"`

	// The ID of the subnet for the network interface.
	SubnetId *string `type:"string"`
}

// String returns the string representation
func (s LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) GoString() string {
	return s.String()
}

// SetAssociatePublicIpAddress sets the AssociatePublicIpAddress field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetAssociatePublicIpAddress(v bool) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.AssociatePublicIpAddress = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetDeleteOnTermination(v bool) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.DeleteOnTermination = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetDescription(v string) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.Description = &v
	return s
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetDeviceIndex(v int64) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.DeviceIndex = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetGroups(v []*string) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.Groups = v
	return s
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetIpv6AddressCount(v int64) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetIpv6Addresses(v []*InstanceIpv6AddressRequest) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.Ipv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetNetworkInterfaceId(v string) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetPrivateIpAddress(v string) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetPrivateIpAddresses(v []*PrivateIpAddressSpecification) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.PrivateIpAddresses = v
	return s
}

// SetSecondaryPrivateIpAddressCount sets the SecondaryPrivateIpAddressCount field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetSecondaryPrivateIpAddressCount(v int64) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.SecondaryPrivateIpAddressCount = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) SetSubnetId(v string) *LaunchTemplateInstanceNetworkInterfaceSpecificationRequest {
	s.SubnetId = &v
	return s
}

// Describes a license configuration.
type LaunchTemplateLicenseConfiguration struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the license configuration.
	LicenseConfigurationArn *string `locationName:"licenseConfigurationArn" type:"string"`
}

// String returns the string representation
func (s LaunchTemplateLicenseConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateLicenseConfiguration) GoString() string {
	return s.String()
}

// SetLicenseConfigurationArn sets the LicenseConfigurationArn field's value.
func (s *LaunchTemplateLicenseConfiguration) SetLicenseConfigurationArn(v string) *LaunchTemplateLicenseConfiguration {
	s.LicenseConfigurationArn = &v
	return s
}

// Describes a license configuration.
type LaunchTemplateLicenseConfigurationRequest struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the license configuration.
	LicenseConfigurationArn *string `type:"string"`
}

// String returns the string representation
func (s LaunchTemplateLicenseConfigurationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateLicenseConfigurationRequest) GoString() string {
	return s.String()
}

// SetLicenseConfigurationArn sets the LicenseConfigurationArn field's value.
func (s *LaunchTemplateLicenseConfigurationRequest) SetLicenseConfigurationArn(v string) *LaunchTemplateLicenseConfigurationRequest {
	s.LicenseConfigurationArn = &v
	return s
}

// Describes overrides for a launch template.
type LaunchTemplateOverrides struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which to launch the instances.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The priority for the launch template override. If OnDemandAllocationStrategy
	// is set to prioritized, Spot Fleet uses priority to determine which launch
	// template override to use first in fulfilling On-Demand capacity. The highest
	// priority is launched first. Valid values are whole numbers starting at 0.
	// The lower the number, the higher the priority. If no number is set, the launch
	// template override has the lowest priority.
	Priority *float64 `locationName:"priority" type:"double"`

	// The maximum price per unit hour that you are willing to pay for a Spot Instance.
	SpotPrice *string `locationName:"spotPrice" type:"string"`

	// The ID of the subnet in which to launch the instances.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The number of units provided by the specified instance type.
	WeightedCapacity *float64 `locationName:"weightedCapacity" type:"double"`
}

// String returns the string representation
func (s LaunchTemplateOverrides) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateOverrides) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *LaunchTemplateOverrides) SetAvailabilityZone(v string) *LaunchTemplateOverrides {
	s.AvailabilityZone = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *LaunchTemplateOverrides) SetInstanceType(v string) *LaunchTemplateOverrides {
	s.InstanceType = &v
	return s
}

// SetPriority sets the Priority field's value.
func (s *LaunchTemplateOverrides) SetPriority(v float64) *LaunchTemplateOverrides {
	s.Priority = &v
	return s
}

// SetSpotPrice sets the SpotPrice field's value.
func (s *LaunchTemplateOverrides) SetSpotPrice(v string) *LaunchTemplateOverrides {
	s.SpotPrice = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *LaunchTemplateOverrides) SetSubnetId(v string) *LaunchTemplateOverrides {
	s.SubnetId = &v
	return s
}

// SetWeightedCapacity sets the WeightedCapacity field's value.
func (s *LaunchTemplateOverrides) SetWeightedCapacity(v float64) *LaunchTemplateOverrides {
	s.WeightedCapacity = &v
	return s
}

// Describes the placement of an instance.
type LaunchTemplatePlacement struct {
	_ struct{} `type:"structure"`

	// The affinity setting for the instance on the Dedicated Host.
	Affinity *string `locationName:"affinity" type:"string"`

	// The Availability Zone of the instance.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The name of the placement group for the instance.
	GroupName *string `locationName:"groupName" type:"string"`

	// The ID of the Dedicated Host for the instance.
	HostId *string `locationName:"hostId" type:"string"`

	// Reserved for future use.
	SpreadDomain *string `locationName:"spreadDomain" type:"string"`

	// The tenancy of the instance (if the instance is running in a VPC). An instance
	// with a tenancy of dedicated runs on single-tenant hardware.
	Tenancy *string `locationName:"tenancy" type:"string" enum:"Tenancy"`
}

// String returns the string representation
func (s LaunchTemplatePlacement) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplatePlacement) GoString() string {
	return s.String()
}

// SetAffinity sets the Affinity field's value.
func (s *LaunchTemplatePlacement) SetAffinity(v string) *LaunchTemplatePlacement {
	s.Affinity = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *LaunchTemplatePlacement) SetAvailabilityZone(v string) *LaunchTemplatePlacement {
	s.AvailabilityZone = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *LaunchTemplatePlacement) SetGroupName(v string) *LaunchTemplatePlacement {
	s.GroupName = &v
	return s
}

// SetHostId sets the HostId field's value.
func (s *LaunchTemplatePlacement) SetHostId(v string) *LaunchTemplatePlacement {
	s.HostId = &v
	return s
}

// SetSpreadDomain sets the SpreadDomain field's value.
func (s *LaunchTemplatePlacement) SetSpreadDomain(v string) *LaunchTemplatePlacement {
	s.SpreadDomain = &v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *LaunchTemplatePlacement) SetTenancy(v string) *LaunchTemplatePlacement {
	s.Tenancy = &v
	return s
}

// Describes the placement of an instance.
type LaunchTemplatePlacementRequest struct {
	_ struct{} `type:"structure"`

	// The affinity setting for an instance on a Dedicated Host.
	Affinity *string `type:"string"`

	// The Availability Zone for the instance.
	AvailabilityZone *string `type:"string"`

	// The name of the placement group for the instance.
	GroupName *string `type:"string"`

	// The ID of the Dedicated Host for the instance.
	HostId *string `type:"string"`

	// Reserved for future use.
	SpreadDomain *string `type:"string"`

	// The tenancy of the instance (if the instance is running in a VPC). An instance
	// with a tenancy of dedicated runs on single-tenant hardware.
	Tenancy *string `type:"string" enum:"Tenancy"`
}

// String returns the string representation
func (s LaunchTemplatePlacementRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplatePlacementRequest) GoString() string {
	return s.String()
}

// SetAffinity sets the Affinity field's value.
func (s *LaunchTemplatePlacementRequest) SetAffinity(v string) *LaunchTemplatePlacementRequest {
	s.Affinity = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *LaunchTemplatePlacementRequest) SetAvailabilityZone(v string) *LaunchTemplatePlacementRequest {
	s.AvailabilityZone = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *LaunchTemplatePlacementRequest) SetGroupName(v string) *LaunchTemplatePlacementRequest {
	s.GroupName = &v
	return s
}

// SetHostId sets the HostId field's value.
func (s *LaunchTemplatePlacementRequest) SetHostId(v string) *LaunchTemplatePlacementRequest {
	s.HostId = &v
	return s
}

// SetSpreadDomain sets the SpreadDomain field's value.
func (s *LaunchTemplatePlacementRequest) SetSpreadDomain(v string) *LaunchTemplatePlacementRequest {
	s.SpreadDomain = &v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *LaunchTemplatePlacementRequest) SetTenancy(v string) *LaunchTemplatePlacementRequest {
	s.Tenancy = &v
	return s
}

// The launch template to use. You must specify either the launch template ID
// or launch template name in the request, but not both.
type LaunchTemplateSpecification struct {
	_ struct{} `type:"structure"`

	// The ID of the launch template.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template.
	LaunchTemplateName *string `type:"string"`

	// The version number of the launch template.
	//
	// Default: The default version for the launch template.
	Version *string `type:"string"`
}

// String returns the string representation
func (s LaunchTemplateSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateSpecification) GoString() string {
	return s.String()
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *LaunchTemplateSpecification) SetLaunchTemplateId(v string) *LaunchTemplateSpecification {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *LaunchTemplateSpecification) SetLaunchTemplateName(v string) *LaunchTemplateSpecification {
	s.LaunchTemplateName = &v
	return s
}

// SetVersion sets the Version field's value.
func (s *LaunchTemplateSpecification) SetVersion(v string) *LaunchTemplateSpecification {
	s.Version = &v
	return s
}

// The options for Spot Instances.
type LaunchTemplateSpotMarketOptions struct {
	_ struct{} `type:"structure"`

	// The required duration for the Spot Instances (also known as Spot blocks),
	// in minutes. This value must be a multiple of 60 (60, 120, 180, 240, 300,
	// or 360).
	BlockDurationMinutes *int64 `locationName:"blockDurationMinutes" type:"integer"`

	// The behavior when a Spot Instance is interrupted.
	InstanceInterruptionBehavior *string `locationName:"instanceInterruptionBehavior" type:"string" enum:"InstanceInterruptionBehavior"`

	// The maximum hourly price you're willing to pay for the Spot Instances.
	MaxPrice *string `locationName:"maxPrice" type:"string"`

	// The Spot Instance request type.
	SpotInstanceType *string `locationName:"spotInstanceType" type:"string" enum:"SpotInstanceType"`

	// The end date of the request. For a one-time request, the request remains
	// active until all instances launch, the request is canceled, or this date
	// is reached. If the request is persistent, it remains active until it is canceled
	// or this date and time is reached.
	ValidUntil *time.Time `locationName:"validUntil" type:"timestamp"`
}

// String returns the string representation
func (s LaunchTemplateSpotMarketOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateSpotMarketOptions) GoString() string {
	return s.String()
}

// SetBlockDurationMinutes sets the BlockDurationMinutes field's value.
func (s *LaunchTemplateSpotMarketOptions) SetBlockDurationMinutes(v int64) *LaunchTemplateSpotMarketOptions {
	s.BlockDurationMinutes = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *LaunchTemplateSpotMarketOptions) SetInstanceInterruptionBehavior(v string) *LaunchTemplateSpotMarketOptions {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetMaxPrice sets the MaxPrice field's value.
func (s *LaunchTemplateSpotMarketOptions) SetMaxPrice(v string) *LaunchTemplateSpotMarketOptions {
	s.MaxPrice = &v
	return s
}

// SetSpotInstanceType sets the SpotInstanceType field's value.
func (s *LaunchTemplateSpotMarketOptions) SetSpotInstanceType(v string) *LaunchTemplateSpotMarketOptions {
	s.SpotInstanceType = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *LaunchTemplateSpotMarketOptions) SetValidUntil(v time.Time) *LaunchTemplateSpotMarketOptions {
	s.ValidUntil = &v
	return s
}

// The options for Spot Instances.
type LaunchTemplateSpotMarketOptionsRequest struct {
	_ struct{} `type:"structure"`

	// The required duration for the Spot Instances (also known as Spot blocks),
	// in minutes. This value must be a multiple of 60 (60, 120, 180, 240, 300,
	// or 360).
	BlockDurationMinutes *int64 `type:"integer"`

	// The behavior when a Spot Instance is interrupted. The default is terminate.
	InstanceInterruptionBehavior *string `type:"string" enum:"InstanceInterruptionBehavior"`

	// The maximum hourly price you're willing to pay for the Spot Instances.
	MaxPrice *string `type:"string"`

	// The Spot Instance request type.
	SpotInstanceType *string `type:"string" enum:"SpotInstanceType"`

	// The end date of the request. For a one-time request, the request remains
	// active until all instances launch, the request is canceled, or this date
	// is reached. If the request is persistent, it remains active until it is canceled
	// or this date and time is reached. The default end date is 7 days from the
	// current date.
	ValidUntil *time.Time `type:"timestamp"`
}

// String returns the string representation
func (s LaunchTemplateSpotMarketOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateSpotMarketOptionsRequest) GoString() string {
	return s.String()
}

// SetBlockDurationMinutes sets the BlockDurationMinutes field's value.
func (s *LaunchTemplateSpotMarketOptionsRequest) SetBlockDurationMinutes(v int64) *LaunchTemplateSpotMarketOptionsRequest {
	s.BlockDurationMinutes = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *LaunchTemplateSpotMarketOptionsRequest) SetInstanceInterruptionBehavior(v string) *LaunchTemplateSpotMarketOptionsRequest {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetMaxPrice sets the MaxPrice field's value.
func (s *LaunchTemplateSpotMarketOptionsRequest) SetMaxPrice(v string) *LaunchTemplateSpotMarketOptionsRequest {
	s.MaxPrice = &v
	return s
}

// SetSpotInstanceType sets the SpotInstanceType field's value.
func (s *LaunchTemplateSpotMarketOptionsRequest) SetSpotInstanceType(v string) *LaunchTemplateSpotMarketOptionsRequest {
	s.SpotInstanceType = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *LaunchTemplateSpotMarketOptionsRequest) SetValidUntil(v time.Time) *LaunchTemplateSpotMarketOptionsRequest {
	s.ValidUntil = &v
	return s
}

// The tag specification for the launch template.
type LaunchTemplateTagSpecification struct {
	_ struct{} `type:"structure"`

	// The type of resource.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"ResourceType"`

	// The tags for the resource.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s LaunchTemplateTagSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateTagSpecification) GoString() string {
	return s.String()
}

// SetResourceType sets the ResourceType field's value.
func (s *LaunchTemplateTagSpecification) SetResourceType(v string) *LaunchTemplateTagSpecification {
	s.ResourceType = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *LaunchTemplateTagSpecification) SetTags(v []*Tag) *LaunchTemplateTagSpecification {
	s.Tags = v
	return s
}

// The tags specification for the launch template.
type LaunchTemplateTagSpecificationRequest struct {
	_ struct{} `type:"structure"`

	// The type of resource to tag. Currently, the resource types that support tagging
	// on creation are instance and volume. To tag a resource after it has been
	// created, see CreateTags.
	ResourceType *string `type:"string" enum:"ResourceType"`

	// The tags to apply to the resource.
	Tags []*Tag `locationName:"Tag" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s LaunchTemplateTagSpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateTagSpecificationRequest) GoString() string {
	return s.String()
}

// SetResourceType sets the ResourceType field's value.
func (s *LaunchTemplateTagSpecificationRequest) SetResourceType(v string) *LaunchTemplateTagSpecificationRequest {
	s.ResourceType = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *LaunchTemplateTagSpecificationRequest) SetTags(v []*Tag) *LaunchTemplateTagSpecificationRequest {
	s.Tags = v
	return s
}

// Describes a launch template version.
type LaunchTemplateVersion struct {
	_ struct{} `type:"structure"`

	// The time the version was created.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// The principal that created the version.
	CreatedBy *string `locationName:"createdBy" type:"string"`

	// Indicates whether the version is the default version.
	DefaultVersion *bool `locationName:"defaultVersion" type:"boolean"`

	// Information about the launch template.
	LaunchTemplateData *ResponseLaunchTemplateData `locationName:"launchTemplateData" type:"structure"`

	// The ID of the launch template.
	LaunchTemplateId *string `locationName:"launchTemplateId" type:"string"`

	// The name of the launch template.
	LaunchTemplateName *string `locationName:"launchTemplateName" min:"3" type:"string"`

	// The description for the version.
	VersionDescription *string `locationName:"versionDescription" type:"string"`

	// The version number.
	VersionNumber *int64 `locationName:"versionNumber" type:"long"`
}

// String returns the string representation
func (s LaunchTemplateVersion) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplateVersion) GoString() string {
	return s.String()
}

// SetCreateTime sets the CreateTime field's value.
func (s *LaunchTemplateVersion) SetCreateTime(v time.Time) *LaunchTemplateVersion {
	s.CreateTime = &v
	return s
}

// SetCreatedBy sets the CreatedBy field's value.
func (s *LaunchTemplateVersion) SetCreatedBy(v string) *LaunchTemplateVersion {
	s.CreatedBy = &v
	return s
}

// SetDefaultVersion sets the DefaultVersion field's value.
func (s *LaunchTemplateVersion) SetDefaultVersion(v bool) *LaunchTemplateVersion {
	s.DefaultVersion = &v
	return s
}

// SetLaunchTemplateData sets the LaunchTemplateData field's value.
func (s *LaunchTemplateVersion) SetLaunchTemplateData(v *ResponseLaunchTemplateData) *LaunchTemplateVersion {
	s.LaunchTemplateData = v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *LaunchTemplateVersion) SetLaunchTemplateId(v string) *LaunchTemplateVersion {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *LaunchTemplateVersion) SetLaunchTemplateName(v string) *LaunchTemplateVersion {
	s.LaunchTemplateName = &v
	return s
}

// SetVersionDescription sets the VersionDescription field's value.
func (s *LaunchTemplateVersion) SetVersionDescription(v string) *LaunchTemplateVersion {
	s.VersionDescription = &v
	return s
}

// SetVersionNumber sets the VersionNumber field's value.
func (s *LaunchTemplateVersion) SetVersionNumber(v int64) *LaunchTemplateVersion {
	s.VersionNumber = &v
	return s
}

// Describes the monitoring for the instance.
type LaunchTemplatesMonitoring struct {
	_ struct{} `type:"structure"`

	// Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring
	// is enabled.
	Enabled *bool `locationName:"enabled" type:"boolean"`
}

// String returns the string representation
func (s LaunchTemplatesMonitoring) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplatesMonitoring) GoString() string {
	return s.String()
}

// SetEnabled sets the Enabled field's value.
func (s *LaunchTemplatesMonitoring) SetEnabled(v bool) *LaunchTemplatesMonitoring {
	s.Enabled = &v
	return s
}

// Describes the monitoring for the instance.
type LaunchTemplatesMonitoringRequest struct {
	_ struct{} `type:"structure"`

	// Specify true to enable detailed monitoring. Otherwise, basic monitoring is
	// enabled.
	Enabled *bool `type:"boolean"`
}

// String returns the string representation
func (s LaunchTemplatesMonitoringRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LaunchTemplatesMonitoringRequest) GoString() string {
	return s.String()
}

// SetEnabled sets the Enabled field's value.
func (s *LaunchTemplatesMonitoringRequest) SetEnabled(v bool) *LaunchTemplatesMonitoringRequest {
	s.Enabled = &v
	return s
}

// Describes a license configuration.
type LicenseConfiguration struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the license configuration.
	LicenseConfigurationArn *string `locationName:"licenseConfigurationArn" type:"string"`
}

// String returns the string representation
func (s LicenseConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LicenseConfiguration) GoString() string {
	return s.String()
}

// SetLicenseConfigurationArn sets the LicenseConfigurationArn field's value.
func (s *LicenseConfiguration) SetLicenseConfigurationArn(v string) *LicenseConfiguration {
	s.LicenseConfigurationArn = &v
	return s
}

// Describes a license configuration.
type LicenseConfigurationRequest struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the license configuration.
	LicenseConfigurationArn *string `type:"string"`
}

// String returns the string representation
func (s LicenseConfigurationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LicenseConfigurationRequest) GoString() string {
	return s.String()
}

// SetLicenseConfigurationArn sets the LicenseConfigurationArn field's value.
func (s *LicenseConfigurationRequest) SetLicenseConfigurationArn(v string) *LicenseConfigurationRequest {
	s.LicenseConfigurationArn = &v
	return s
}

// Describes the Classic Load Balancers and target groups to attach to a Spot
// Fleet request.
type LoadBalancersConfig struct {
	_ struct{} `type:"structure"`

	// The Classic Load Balancers.
	ClassicLoadBalancersConfig *ClassicLoadBalancersConfig `locationName:"classicLoadBalancersConfig" type:"structure"`

	// The target groups.
	TargetGroupsConfig *TargetGroupsConfig `locationName:"targetGroupsConfig" type:"structure"`
}

// String returns the string representation
func (s LoadBalancersConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LoadBalancersConfig) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *LoadBalancersConfig) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "LoadBalancersConfig"}
	if s.ClassicLoadBalancersConfig != nil {
		if err := s.ClassicLoadBalancersConfig.Validate(); err != nil {
			invalidParams.AddNested("ClassicLoadBalancersConfig", err.(request.ErrInvalidParams))
		}
	}
	if s.TargetGroupsConfig != nil {
		if err := s.TargetGroupsConfig.Validate(); err != nil {
			invalidParams.AddNested("TargetGroupsConfig", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClassicLoadBalancersConfig sets the ClassicLoadBalancersConfig field's value.
func (s *LoadBalancersConfig) SetClassicLoadBalancersConfig(v *ClassicLoadBalancersConfig) *LoadBalancersConfig {
	s.ClassicLoadBalancersConfig = v
	return s
}

// SetTargetGroupsConfig sets the TargetGroupsConfig field's value.
func (s *LoadBalancersConfig) SetTargetGroupsConfig(v *TargetGroupsConfig) *LoadBalancersConfig {
	s.TargetGroupsConfig = v
	return s
}

// Describes a load permission.
type LoadPermission struct {
	_ struct{} `type:"structure"`

	// The name of the group.
	Group *string `locationName:"group" type:"string" enum:"PermissionGroup"`

	// The AWS account ID.
	UserId *string `locationName:"userId" type:"string"`
}

// String returns the string representation
func (s LoadPermission) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LoadPermission) GoString() string {
	return s.String()
}

// SetGroup sets the Group field's value.
func (s *LoadPermission) SetGroup(v string) *LoadPermission {
	s.Group = &v
	return s
}

// SetUserId sets the UserId field's value.
func (s *LoadPermission) SetUserId(v string) *LoadPermission {
	s.UserId = &v
	return s
}

// Describes modifications to the load permissions of an Amazon FPGA image (AFI).
type LoadPermissionModifications struct {
	_ struct{} `type:"structure"`

	// The load permissions to add.
	Add []*LoadPermissionRequest `locationNameList:"item" type:"list"`

	// The load permissions to remove.
	Remove []*LoadPermissionRequest `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s LoadPermissionModifications) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LoadPermissionModifications) GoString() string {
	return s.String()
}

// SetAdd sets the Add field's value.
func (s *LoadPermissionModifications) SetAdd(v []*LoadPermissionRequest) *LoadPermissionModifications {
	s.Add = v
	return s
}

// SetRemove sets the Remove field's value.
func (s *LoadPermissionModifications) SetRemove(v []*LoadPermissionRequest) *LoadPermissionModifications {
	s.Remove = v
	return s
}

// Describes a load permission.
type LoadPermissionRequest struct {
	_ struct{} `type:"structure"`

	// The name of the group.
	Group *string `type:"string" enum:"PermissionGroup"`

	// The AWS account ID.
	UserId *string `type:"string"`
}

// String returns the string representation
func (s LoadPermissionRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s LoadPermissionRequest) GoString() string {
	return s.String()
}

// SetGroup sets the Group field's value.
func (s *LoadPermissionRequest) SetGroup(v string) *LoadPermissionRequest {
	s.Group = &v
	return s
}

// SetUserId sets the UserId field's value.
func (s *LoadPermissionRequest) SetUserId(v string) *LoadPermissionRequest {
	s.UserId = &v
	return s
}

type ModifyCapacityReservationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Capacity Reservation.
	//
	// CapacityReservationId is a required field
	CapacityReservationId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The date and time at which the Capacity Reservation expires. When a Capacity
	// Reservation expires, the reserved capacity is released and you can no longer
	// launch instances into it. The Capacity Reservation's state changes to expired
	// when it reaches its end date and time.
	//
	// The Capacity Reservation is cancelled within an hour from the specified time.
	// For example, if you specify 5/31/2019, 13:30:55, the Capacity Reservation
	// is guaranteed to end between 13:30:55 and 14:30:55 on 5/31/2019.
	//
	// You must provide an EndDate value if EndDateType is limited. Omit EndDate
	// if EndDateType is unlimited.
	EndDate *time.Time `type:"timestamp"`

	// Indicates the way in which the Capacity Reservation ends. A Capacity Reservation
	// can have one of the following end types:
	//
	//    * unlimited - The Capacity Reservation remains active until you explicitly
	//    cancel it. Do not provide an EndDate value if EndDateType is unlimited.
	//
	//    * limited - The Capacity Reservation expires automatically at a specified
	//    date and time. You must provide an EndDate value if EndDateType is limited.
	EndDateType *string `type:"string" enum:"EndDateType"`

	// The number of instances for which to reserve capacity.
	InstanceCount *int64 `type:"integer"`
}

// String returns the string representation
func (s ModifyCapacityReservationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyCapacityReservationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyCapacityReservationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyCapacityReservationInput"}
	if s.CapacityReservationId == nil {
		invalidParams.Add(request.NewErrParamRequired("CapacityReservationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCapacityReservationId sets the CapacityReservationId field's value.
func (s *ModifyCapacityReservationInput) SetCapacityReservationId(v string) *ModifyCapacityReservationInput {
	s.CapacityReservationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyCapacityReservationInput) SetDryRun(v bool) *ModifyCapacityReservationInput {
	s.DryRun = &v
	return s
}

// SetEndDate sets the EndDate field's value.
func (s *ModifyCapacityReservationInput) SetEndDate(v time.Time) *ModifyCapacityReservationInput {
	s.EndDate = &v
	return s
}

// SetEndDateType sets the EndDateType field's value.
func (s *ModifyCapacityReservationInput) SetEndDateType(v string) *ModifyCapacityReservationInput {
	s.EndDateType = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *ModifyCapacityReservationInput) SetInstanceCount(v int64) *ModifyCapacityReservationInput {
	s.InstanceCount = &v
	return s
}

type ModifyCapacityReservationOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Capacity Reservation.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyCapacityReservationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyCapacityReservationOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyCapacityReservationOutput) SetReturn(v bool) *ModifyCapacityReservationOutput {
	s.Return = &v
	return s
}

type ModifyClientVpnEndpointInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint to modify.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Information about the client connection logging options.
	//
	// If you enable client connection logging, data about client connections is
	// sent to a Cloudwatch Logs log stream. The following information is logged:
	//
	//    * Client connection requests
	//
	//    * Client connection results (successful and unsuccessful)
	//
	//    * Reasons for unsuccessful client connection requests
	//
	//    * Client connection termination time
	ConnectionLogOptions *ConnectionLogOptions `type:"structure"`

	// A brief description of the Client VPN endpoint.
	Description *string `type:"string"`

	// Information about the DNS servers to be used by Client VPN connections. A
	// Client VPN endpoint can have up to two DNS servers.
	DnsServers *DnsServersOptionsModifyStructure `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ARN of the server certificate to be used. The server certificate must
	// be provisioned in AWS Certificate Manager (ACM).
	ServerCertificateArn *string `type:"string"`
}

// String returns the string representation
func (s ModifyClientVpnEndpointInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyClientVpnEndpointInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyClientVpnEndpointInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyClientVpnEndpointInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *ModifyClientVpnEndpointInput) SetClientVpnEndpointId(v string) *ModifyClientVpnEndpointInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetConnectionLogOptions sets the ConnectionLogOptions field's value.
func (s *ModifyClientVpnEndpointInput) SetConnectionLogOptions(v *ConnectionLogOptions) *ModifyClientVpnEndpointInput {
	s.ConnectionLogOptions = v
	return s
}

// SetDescription sets the Description field's value.
func (s *ModifyClientVpnEndpointInput) SetDescription(v string) *ModifyClientVpnEndpointInput {
	s.Description = &v
	return s
}

// SetDnsServers sets the DnsServers field's value.
func (s *ModifyClientVpnEndpointInput) SetDnsServers(v *DnsServersOptionsModifyStructure) *ModifyClientVpnEndpointInput {
	s.DnsServers = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyClientVpnEndpointInput) SetDryRun(v bool) *ModifyClientVpnEndpointInput {
	s.DryRun = &v
	return s
}

// SetServerCertificateArn sets the ServerCertificateArn field's value.
func (s *ModifyClientVpnEndpointInput) SetServerCertificateArn(v string) *ModifyClientVpnEndpointInput {
	s.ServerCertificateArn = &v
	return s
}

type ModifyClientVpnEndpointOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyClientVpnEndpointOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyClientVpnEndpointOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyClientVpnEndpointOutput) SetReturn(v bool) *ModifyClientVpnEndpointOutput {
	s.Return = &v
	return s
}

type ModifyFleetInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Indicates whether running instances should be terminated if the total target
	// capacity of the EC2 Fleet is decreased below the current size of the EC2
	// Fleet.
	ExcessCapacityTerminationPolicy *string `type:"string" enum:"FleetExcessCapacityTerminationPolicy"`

	// The ID of the EC2 Fleet.
	//
	// FleetId is a required field
	FleetId *string `type:"string" required:"true"`

	// The size of the EC2 Fleet.
	//
	// TargetCapacitySpecification is a required field
	TargetCapacitySpecification *TargetCapacitySpecificationRequest `type:"structure" required:"true"`
}

// String returns the string representation
func (s ModifyFleetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyFleetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyFleetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyFleetInput"}
	if s.FleetId == nil {
		invalidParams.Add(request.NewErrParamRequired("FleetId"))
	}
	if s.TargetCapacitySpecification == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetCapacitySpecification"))
	}
	if s.TargetCapacitySpecification != nil {
		if err := s.TargetCapacitySpecification.Validate(); err != nil {
			invalidParams.AddNested("TargetCapacitySpecification", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyFleetInput) SetDryRun(v bool) *ModifyFleetInput {
	s.DryRun = &v
	return s
}

// SetExcessCapacityTerminationPolicy sets the ExcessCapacityTerminationPolicy field's value.
func (s *ModifyFleetInput) SetExcessCapacityTerminationPolicy(v string) *ModifyFleetInput {
	s.ExcessCapacityTerminationPolicy = &v
	return s
}

// SetFleetId sets the FleetId field's value.
func (s *ModifyFleetInput) SetFleetId(v string) *ModifyFleetInput {
	s.FleetId = &v
	return s
}

// SetTargetCapacitySpecification sets the TargetCapacitySpecification field's value.
func (s *ModifyFleetInput) SetTargetCapacitySpecification(v *TargetCapacitySpecificationRequest) *ModifyFleetInput {
	s.TargetCapacitySpecification = v
	return s
}

type ModifyFleetOutput struct {
	_ struct{} `type:"structure"`

	// Is true if the request succeeds, and an error otherwise.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyFleetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyFleetOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyFleetOutput) SetReturn(v bool) *ModifyFleetOutput {
	s.Return = &v
	return s
}

type ModifyFpgaImageAttributeInput struct {
	_ struct{} `type:"structure"`

	// The name of the attribute.
	Attribute *string `type:"string" enum:"FpgaImageAttributeName"`

	// A description for the AFI.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the AFI.
	//
	// FpgaImageId is a required field
	FpgaImageId *string `type:"string" required:"true"`

	// The load permission for the AFI.
	LoadPermission *LoadPermissionModifications `type:"structure"`

	// A name for the AFI.
	Name *string `type:"string"`

	// The operation type.
	OperationType *string `type:"string" enum:"OperationType"`

	// One or more product codes. After you add a product code to an AFI, it can't
	// be removed. This parameter is valid only when modifying the productCodes
	// attribute.
	ProductCodes []*string `locationName:"ProductCode" locationNameList:"ProductCode" type:"list"`

	// One or more user groups. This parameter is valid only when modifying the
	// loadPermission attribute.
	UserGroups []*string `locationName:"UserGroup" locationNameList:"UserGroup" type:"list"`

	// One or more AWS account IDs. This parameter is valid only when modifying
	// the loadPermission attribute.
	UserIds []*string `locationName:"UserId" locationNameList:"UserId" type:"list"`
}

// String returns the string representation
func (s ModifyFpgaImageAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyFpgaImageAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyFpgaImageAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyFpgaImageAttributeInput"}
	if s.FpgaImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("FpgaImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ModifyFpgaImageAttributeInput) SetAttribute(v string) *ModifyFpgaImageAttributeInput {
	s.Attribute = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ModifyFpgaImageAttributeInput) SetDescription(v string) *ModifyFpgaImageAttributeInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyFpgaImageAttributeInput) SetDryRun(v bool) *ModifyFpgaImageAttributeInput {
	s.DryRun = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *ModifyFpgaImageAttributeInput) SetFpgaImageId(v string) *ModifyFpgaImageAttributeInput {
	s.FpgaImageId = &v
	return s
}

// SetLoadPermission sets the LoadPermission field's value.
func (s *ModifyFpgaImageAttributeInput) SetLoadPermission(v *LoadPermissionModifications) *ModifyFpgaImageAttributeInput {
	s.LoadPermission = v
	return s
}

// SetName sets the Name field's value.
func (s *ModifyFpgaImageAttributeInput) SetName(v string) *ModifyFpgaImageAttributeInput {
	s.Name = &v
	return s
}

// SetOperationType sets the OperationType field's value.
func (s *ModifyFpgaImageAttributeInput) SetOperationType(v string) *ModifyFpgaImageAttributeInput {
	s.OperationType = &v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *ModifyFpgaImageAttributeInput) SetProductCodes(v []*string) *ModifyFpgaImageAttributeInput {
	s.ProductCodes = v
	return s
}

// SetUserGroups sets the UserGroups field's value.
func (s *ModifyFpgaImageAttributeInput) SetUserGroups(v []*string) *ModifyFpgaImageAttributeInput {
	s.UserGroups = v
	return s
}

// SetUserIds sets the UserIds field's value.
func (s *ModifyFpgaImageAttributeInput) SetUserIds(v []*string) *ModifyFpgaImageAttributeInput {
	s.UserIds = v
	return s
}

type ModifyFpgaImageAttributeOutput struct {
	_ struct{} `type:"structure"`

	// Information about the attribute.
	FpgaImageAttribute *FpgaImageAttribute `locationName:"fpgaImageAttribute" type:"structure"`
}

// String returns the string representation
func (s ModifyFpgaImageAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyFpgaImageAttributeOutput) GoString() string {
	return s.String()
}

// SetFpgaImageAttribute sets the FpgaImageAttribute field's value.
func (s *ModifyFpgaImageAttributeOutput) SetFpgaImageAttribute(v *FpgaImageAttribute) *ModifyFpgaImageAttributeOutput {
	s.FpgaImageAttribute = v
	return s
}

type ModifyHostsInput struct {
	_ struct{} `type:"structure"`

	// Specify whether to enable or disable auto-placement.
	//
	// AutoPlacement is a required field
	AutoPlacement *string `locationName:"autoPlacement" type:"string" required:"true" enum:"AutoPlacement"`

	// The IDs of the Dedicated Hosts to modify.
	//
	// HostIds is a required field
	HostIds []*string `locationName:"hostId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s ModifyHostsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyHostsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyHostsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyHostsInput"}
	if s.AutoPlacement == nil {
		invalidParams.Add(request.NewErrParamRequired("AutoPlacement"))
	}
	if s.HostIds == nil {
		invalidParams.Add(request.NewErrParamRequired("HostIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAutoPlacement sets the AutoPlacement field's value.
func (s *ModifyHostsInput) SetAutoPlacement(v string) *ModifyHostsInput {
	s.AutoPlacement = &v
	return s
}

// SetHostIds sets the HostIds field's value.
func (s *ModifyHostsInput) SetHostIds(v []*string) *ModifyHostsInput {
	s.HostIds = v
	return s
}

type ModifyHostsOutput struct {
	_ struct{} `type:"structure"`

	// The IDs of the Dedicated Hosts that were successfully modified.
	Successful []*string `locationName:"successful" locationNameList:"item" type:"list"`

	// The IDs of the Dedicated Hosts that could not be modified. Check whether
	// the setting you requested can be used.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ModifyHostsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyHostsOutput) GoString() string {
	return s.String()
}

// SetSuccessful sets the Successful field's value.
func (s *ModifyHostsOutput) SetSuccessful(v []*string) *ModifyHostsOutput {
	s.Successful = v
	return s
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *ModifyHostsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *ModifyHostsOutput {
	s.Unsuccessful = v
	return s
}

type ModifyIdFormatInput struct {
	_ struct{} `type:"structure"`

	// The type of resource: bundle | conversion-task | customer-gateway | dhcp-options
	// | elastic-ip-allocation | elastic-ip-association | export-task | flow-log
	// | image | import-task | internet-gateway | network-acl | network-acl-association
	// | network-interface | network-interface-attachment | prefix-list | route-table
	// | route-table-association | security-group | subnet | subnet-cidr-block-association
	// | vpc | vpc-cidr-block-association | vpc-endpoint | vpc-peering-connection
	// | vpn-connection | vpn-gateway.
	//
	// Alternatively, use the all-current option to include all resource types that
	// are currently within their opt-in period for longer IDs.
	//
	// Resource is a required field
	Resource *string `type:"string" required:"true"`

	// Indicate whether the resource should use longer IDs (17-character IDs).
	//
	// UseLongIds is a required field
	UseLongIds *bool `type:"boolean" required:"true"`
}

// String returns the string representation
func (s ModifyIdFormatInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyIdFormatInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyIdFormatInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyIdFormatInput"}
	if s.Resource == nil {
		invalidParams.Add(request.NewErrParamRequired("Resource"))
	}
	if s.UseLongIds == nil {
		invalidParams.Add(request.NewErrParamRequired("UseLongIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetResource sets the Resource field's value.
func (s *ModifyIdFormatInput) SetResource(v string) *ModifyIdFormatInput {
	s.Resource = &v
	return s
}

// SetUseLongIds sets the UseLongIds field's value.
func (s *ModifyIdFormatInput) SetUseLongIds(v bool) *ModifyIdFormatInput {
	s.UseLongIds = &v
	return s
}

type ModifyIdFormatOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyIdFormatOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyIdFormatOutput) GoString() string {
	return s.String()
}

type ModifyIdentityIdFormatInput struct {
	_ struct{} `type:"structure"`

	// The ARN of the principal, which can be an IAM user, IAM role, or the root
	// user. Specify all to modify the ID format for all IAM users, IAM roles, and
	// the root user of the account.
	//
	// PrincipalArn is a required field
	PrincipalArn *string `locationName:"principalArn" type:"string" required:"true"`

	// The type of resource: bundle | conversion-task | customer-gateway | dhcp-options
	// | elastic-ip-allocation | elastic-ip-association | export-task | flow-log
	// | image | import-task | internet-gateway | network-acl | network-acl-association
	// | network-interface | network-interface-attachment | prefix-list | route-table
	// | route-table-association | security-group | subnet | subnet-cidr-block-association
	// | vpc | vpc-cidr-block-association | vpc-endpoint | vpc-peering-connection
	// | vpn-connection | vpn-gateway.
	//
	// Alternatively, use the all-current option to include all resource types that
	// are currently within their opt-in period for longer IDs.
	//
	// Resource is a required field
	Resource *string `locationName:"resource" type:"string" required:"true"`

	// Indicates whether the resource should use longer IDs (17-character IDs)
	//
	// UseLongIds is a required field
	UseLongIds *bool `locationName:"useLongIds" type:"boolean" required:"true"`
}

// String returns the string representation
func (s ModifyIdentityIdFormatInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyIdentityIdFormatInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyIdentityIdFormatInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyIdentityIdFormatInput"}
	if s.PrincipalArn == nil {
		invalidParams.Add(request.NewErrParamRequired("PrincipalArn"))
	}
	if s.Resource == nil {
		invalidParams.Add(request.NewErrParamRequired("Resource"))
	}
	if s.UseLongIds == nil {
		invalidParams.Add(request.NewErrParamRequired("UseLongIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetPrincipalArn sets the PrincipalArn field's value.
func (s *ModifyIdentityIdFormatInput) SetPrincipalArn(v string) *ModifyIdentityIdFormatInput {
	s.PrincipalArn = &v
	return s
}

// SetResource sets the Resource field's value.
func (s *ModifyIdentityIdFormatInput) SetResource(v string) *ModifyIdentityIdFormatInput {
	s.Resource = &v
	return s
}

// SetUseLongIds sets the UseLongIds field's value.
func (s *ModifyIdentityIdFormatInput) SetUseLongIds(v bool) *ModifyIdentityIdFormatInput {
	s.UseLongIds = &v
	return s
}

type ModifyIdentityIdFormatOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyIdentityIdFormatOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyIdentityIdFormatOutput) GoString() string {
	return s.String()
}

// Contains the parameters for ModifyImageAttribute.
type ModifyImageAttributeInput struct {
	_ struct{} `type:"structure"`

	// The name of the attribute to modify. The valid values are description, launchPermission,
	// and productCodes.
	Attribute *string `type:"string"`

	// A new description for the AMI.
	Description *AttributeValue `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the AMI.
	//
	// ImageId is a required field
	ImageId *string `type:"string" required:"true"`

	// A new launch permission for the AMI.
	LaunchPermission *LaunchPermissionModifications `type:"structure"`

	// The operation type. This parameter can be used only when the Attribute parameter
	// is launchPermission.
	OperationType *string `type:"string" enum:"OperationType"`

	// One or more DevPay product codes. After you add a product code to an AMI,
	// it can't be removed.
	ProductCodes []*string `locationName:"ProductCode" locationNameList:"ProductCode" type:"list"`

	// One or more user groups. This parameter can be used only when the Attribute
	// parameter is launchPermission.
	UserGroups []*string `locationName:"UserGroup" locationNameList:"UserGroup" type:"list"`

	// One or more AWS account IDs. This parameter can be used only when the Attribute
	// parameter is launchPermission.
	UserIds []*string `locationName:"UserId" locationNameList:"UserId" type:"list"`

	// The value of the attribute being modified. This parameter can be used only
	// when the Attribute parameter is description or productCodes.
	Value *string `type:"string"`
}

// String returns the string representation
func (s ModifyImageAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyImageAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyImageAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyImageAttributeInput"}
	if s.ImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("ImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ModifyImageAttributeInput) SetAttribute(v string) *ModifyImageAttributeInput {
	s.Attribute = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ModifyImageAttributeInput) SetDescription(v *AttributeValue) *ModifyImageAttributeInput {
	s.Description = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyImageAttributeInput) SetDryRun(v bool) *ModifyImageAttributeInput {
	s.DryRun = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *ModifyImageAttributeInput) SetImageId(v string) *ModifyImageAttributeInput {
	s.ImageId = &v
	return s
}

// SetLaunchPermission sets the LaunchPermission field's value.
func (s *ModifyImageAttributeInput) SetLaunchPermission(v *LaunchPermissionModifications) *ModifyImageAttributeInput {
	s.LaunchPermission = v
	return s
}

// SetOperationType sets the OperationType field's value.
func (s *ModifyImageAttributeInput) SetOperationType(v string) *ModifyImageAttributeInput {
	s.OperationType = &v
	return s
}

// SetProductCodes sets the ProductCodes field's value.
func (s *ModifyImageAttributeInput) SetProductCodes(v []*string) *ModifyImageAttributeInput {
	s.ProductCodes = v
	return s
}

// SetUserGroups sets the UserGroups field's value.
func (s *ModifyImageAttributeInput) SetUserGroups(v []*string) *ModifyImageAttributeInput {
	s.UserGroups = v
	return s
}

// SetUserIds sets the UserIds field's value.
func (s *ModifyImageAttributeInput) SetUserIds(v []*string) *ModifyImageAttributeInput {
	s.UserIds = v
	return s
}

// SetValue sets the Value field's value.
func (s *ModifyImageAttributeInput) SetValue(v string) *ModifyImageAttributeInput {
	s.Value = &v
	return s
}

type ModifyImageAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyImageAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyImageAttributeOutput) GoString() string {
	return s.String()
}

type ModifyInstanceAttributeInput struct {
	_ struct{} `type:"structure"`

	// The name of the attribute.
	Attribute *string `locationName:"attribute" type:"string" enum:"InstanceAttributeName"`

	// Modifies the DeleteOnTermination attribute for volumes that are currently
	// attached. The volume must be owned by the caller. If no value is specified
	// for DeleteOnTermination, the default is true and the volume is deleted when
	// the instance is terminated.
	//
	// To add instance store volumes to an Amazon EBS-backed instance, you must
	// add them when you launch the instance. For more information, see Updating
	// the Block Device Mapping when Launching an Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html#Using_OverridingAMIBDM)
	// in the Amazon Elastic Compute Cloud User Guide.
	BlockDeviceMappings []*InstanceBlockDeviceMappingSpecification `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// If the value is true, you can't terminate the instance using the Amazon EC2
	// console, CLI, or API; otherwise, you can. You cannot use this parameter for
	// Spot Instances.
	DisableApiTermination *AttributeBooleanValue `locationName:"disableApiTermination" type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Specifies whether the instance is optimized for Amazon EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal EBS I/O performance. This optimization isn't available
	// with all instance types. Additional usage charges apply when using an EBS
	// Optimized instance.
	EbsOptimized *AttributeBooleanValue `locationName:"ebsOptimized" type:"structure"`

	// Set to true to enable enhanced networking with ENA for the instance.
	//
	// This option is supported only for HVM instances. Specifying this option with
	// a PV instance can make it unreachable.
	EnaSupport *AttributeBooleanValue `locationName:"enaSupport" type:"structure"`

	// [EC2-VPC] Changes the security groups of the instance. You must specify at
	// least one security group, even if it's just the default security group for
	// the VPC. You must specify the security group ID, not the security group name.
	Groups []*string `locationName:"GroupId" locationNameList:"groupId" type:"list"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// Specifies whether an instance stops or terminates when you initiate shutdown
	// from the instance (using the operating system command for system shutdown).
	InstanceInitiatedShutdownBehavior *AttributeValue `locationName:"instanceInitiatedShutdownBehavior" type:"structure"`

	// Changes the instance type to the specified value. For more information, see
	// Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html).
	// If the instance type is not valid, the error returned is InvalidInstanceAttributeValue.
	InstanceType *AttributeValue `locationName:"instanceType" type:"structure"`

	// Changes the instance's kernel to the specified value. We recommend that you
	// use PV-GRUB instead of kernels and RAM disks. For more information, see PV-GRUB
	// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html).
	Kernel *AttributeValue `locationName:"kernel" type:"structure"`

	// Changes the instance's RAM disk to the specified value. We recommend that
	// you use PV-GRUB instead of kernels and RAM disks. For more information, see
	// PV-GRUB (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html).
	Ramdisk *AttributeValue `locationName:"ramdisk" type:"structure"`

	// Specifies whether source/destination checking is enabled. A value of true
	// means that checking is enabled, and false means that checking is disabled.
	// This value must be false for a NAT instance to perform NAT.
	SourceDestCheck *AttributeBooleanValue `type:"structure"`

	// Set to simple to enable enhanced networking with the Intel 82599 Virtual
	// Function interface for the instance.
	//
	// There is no way to disable enhanced networking with the Intel 82599 Virtual
	// Function interface at this time.
	//
	// This option is supported only for HVM instances. Specifying this option with
	// a PV instance can make it unreachable.
	SriovNetSupport *AttributeValue `locationName:"sriovNetSupport" type:"structure"`

	// Changes the instance's user data to the specified value. If you are using
	// an AWS SDK or command line tool, base64-encoding is performed for you, and
	// you can load the text from a file. Otherwise, you must provide base64-encoded
	// text.
	UserData *BlobAttributeValue `locationName:"userData" type:"structure"`

	// A new value for the attribute. Use only with the kernel, ramdisk, userData,
	// disableApiTermination, or instanceInitiatedShutdownBehavior attribute.
	Value *string `locationName:"value" type:"string"`
}

// String returns the string representation
func (s ModifyInstanceAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstanceAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyInstanceAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyInstanceAttributeInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ModifyInstanceAttributeInput) SetAttribute(v string) *ModifyInstanceAttributeInput {
	s.Attribute = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *ModifyInstanceAttributeInput) SetBlockDeviceMappings(v []*InstanceBlockDeviceMappingSpecification) *ModifyInstanceAttributeInput {
	s.BlockDeviceMappings = v
	return s
}

// SetDisableApiTermination sets the DisableApiTermination field's value.
func (s *ModifyInstanceAttributeInput) SetDisableApiTermination(v *AttributeBooleanValue) *ModifyInstanceAttributeInput {
	s.DisableApiTermination = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyInstanceAttributeInput) SetDryRun(v bool) *ModifyInstanceAttributeInput {
	s.DryRun = &v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *ModifyInstanceAttributeInput) SetEbsOptimized(v *AttributeBooleanValue) *ModifyInstanceAttributeInput {
	s.EbsOptimized = v
	return s
}

// SetEnaSupport sets the EnaSupport field's value.
func (s *ModifyInstanceAttributeInput) SetEnaSupport(v *AttributeBooleanValue) *ModifyInstanceAttributeInput {
	s.EnaSupport = v
	return s
}

// SetGroups sets the Groups field's value.
func (s *ModifyInstanceAttributeInput) SetGroups(v []*string) *ModifyInstanceAttributeInput {
	s.Groups = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ModifyInstanceAttributeInput) SetInstanceId(v string) *ModifyInstanceAttributeInput {
	s.InstanceId = &v
	return s
}

// SetInstanceInitiatedShutdownBehavior sets the InstanceInitiatedShutdownBehavior field's value.
func (s *ModifyInstanceAttributeInput) SetInstanceInitiatedShutdownBehavior(v *AttributeValue) *ModifyInstanceAttributeInput {
	s.InstanceInitiatedShutdownBehavior = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ModifyInstanceAttributeInput) SetInstanceType(v *AttributeValue) *ModifyInstanceAttributeInput {
	s.InstanceType = v
	return s
}

// SetKernel sets the Kernel field's value.
func (s *ModifyInstanceAttributeInput) SetKernel(v *AttributeValue) *ModifyInstanceAttributeInput {
	s.Kernel = v
	return s
}

// SetRamdisk sets the Ramdisk field's value.
func (s *ModifyInstanceAttributeInput) SetRamdisk(v *AttributeValue) *ModifyInstanceAttributeInput {
	s.Ramdisk = v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *ModifyInstanceAttributeInput) SetSourceDestCheck(v *AttributeBooleanValue) *ModifyInstanceAttributeInput {
	s.SourceDestCheck = v
	return s
}

// SetSriovNetSupport sets the SriovNetSupport field's value.
func (s *ModifyInstanceAttributeInput) SetSriovNetSupport(v *AttributeValue) *ModifyInstanceAttributeInput {
	s.SriovNetSupport = v
	return s
}

// SetUserData sets the UserData field's value.
func (s *ModifyInstanceAttributeInput) SetUserData(v *BlobAttributeValue) *ModifyInstanceAttributeInput {
	s.UserData = v
	return s
}

// SetValue sets the Value field's value.
func (s *ModifyInstanceAttributeInput) SetValue(v string) *ModifyInstanceAttributeInput {
	s.Value = &v
	return s
}

type ModifyInstanceAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyInstanceAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstanceAttributeOutput) GoString() string {
	return s.String()
}

type ModifyInstanceCapacityReservationAttributesInput struct {
	_ struct{} `type:"structure"`

	// Information about the Capacity Reservation targeting option.
	//
	// CapacityReservationSpecification is a required field
	CapacityReservationSpecification *CapacityReservationSpecification `type:"structure" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the instance to be modified.
	//
	// InstanceId is a required field
	InstanceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyInstanceCapacityReservationAttributesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstanceCapacityReservationAttributesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyInstanceCapacityReservationAttributesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyInstanceCapacityReservationAttributesInput"}
	if s.CapacityReservationSpecification == nil {
		invalidParams.Add(request.NewErrParamRequired("CapacityReservationSpecification"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCapacityReservationSpecification sets the CapacityReservationSpecification field's value.
func (s *ModifyInstanceCapacityReservationAttributesInput) SetCapacityReservationSpecification(v *CapacityReservationSpecification) *ModifyInstanceCapacityReservationAttributesInput {
	s.CapacityReservationSpecification = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyInstanceCapacityReservationAttributesInput) SetDryRun(v bool) *ModifyInstanceCapacityReservationAttributesInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ModifyInstanceCapacityReservationAttributesInput) SetInstanceId(v string) *ModifyInstanceCapacityReservationAttributesInput {
	s.InstanceId = &v
	return s
}

type ModifyInstanceCapacityReservationAttributesOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyInstanceCapacityReservationAttributesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstanceCapacityReservationAttributesOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyInstanceCapacityReservationAttributesOutput) SetReturn(v bool) *ModifyInstanceCapacityReservationAttributesOutput {
	s.Return = &v
	return s
}

type ModifyInstanceCreditSpecificationInput struct {
	_ struct{} `type:"structure"`

	// A unique, case-sensitive token that you provide to ensure idempotency of
	// your modification request. For more information, see Ensuring Idempotency
	// (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Information about the credit option for CPU usage.
	//
	// InstanceCreditSpecifications is a required field
	InstanceCreditSpecifications []*InstanceCreditSpecificationRequest `locationName:"InstanceCreditSpecification" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s ModifyInstanceCreditSpecificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstanceCreditSpecificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyInstanceCreditSpecificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyInstanceCreditSpecificationInput"}
	if s.InstanceCreditSpecifications == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceCreditSpecifications"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *ModifyInstanceCreditSpecificationInput) SetClientToken(v string) *ModifyInstanceCreditSpecificationInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyInstanceCreditSpecificationInput) SetDryRun(v bool) *ModifyInstanceCreditSpecificationInput {
	s.DryRun = &v
	return s
}

// SetInstanceCreditSpecifications sets the InstanceCreditSpecifications field's value.
func (s *ModifyInstanceCreditSpecificationInput) SetInstanceCreditSpecifications(v []*InstanceCreditSpecificationRequest) *ModifyInstanceCreditSpecificationInput {
	s.InstanceCreditSpecifications = v
	return s
}

type ModifyInstanceCreditSpecificationOutput struct {
	_ struct{} `type:"structure"`

	// Information about the instances whose credit option for CPU usage was successfully
	// modified.
	SuccessfulInstanceCreditSpecifications []*SuccessfulInstanceCreditSpecificationItem `locationName:"successfulInstanceCreditSpecificationSet" locationNameList:"item" type:"list"`

	// Information about the instances whose credit option for CPU usage was not
	// modified.
	UnsuccessfulInstanceCreditSpecifications []*UnsuccessfulInstanceCreditSpecificationItem `locationName:"unsuccessfulInstanceCreditSpecificationSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ModifyInstanceCreditSpecificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstanceCreditSpecificationOutput) GoString() string {
	return s.String()
}

// SetSuccessfulInstanceCreditSpecifications sets the SuccessfulInstanceCreditSpecifications field's value.
func (s *ModifyInstanceCreditSpecificationOutput) SetSuccessfulInstanceCreditSpecifications(v []*SuccessfulInstanceCreditSpecificationItem) *ModifyInstanceCreditSpecificationOutput {
	s.SuccessfulInstanceCreditSpecifications = v
	return s
}

// SetUnsuccessfulInstanceCreditSpecifications sets the UnsuccessfulInstanceCreditSpecifications field's value.
func (s *ModifyInstanceCreditSpecificationOutput) SetUnsuccessfulInstanceCreditSpecifications(v []*UnsuccessfulInstanceCreditSpecificationItem) *ModifyInstanceCreditSpecificationOutput {
	s.UnsuccessfulInstanceCreditSpecifications = v
	return s
}

type ModifyInstancePlacementInput struct {
	_ struct{} `type:"structure"`

	// The affinity setting for the instance.
	Affinity *string `locationName:"affinity" type:"string" enum:"Affinity"`

	// The name of the placement group in which to place the instance. For spread
	// placement groups, the instance must have a tenancy of default. For cluster
	// and partition placement groups, the instance must have a tenancy of default
	// or dedicated.
	//
	// To remove an instance from a placement group, specify an empty string ("").
	GroupName *string `type:"string"`

	// The ID of the Dedicated Host with which to associate the instance.
	HostId *string `locationName:"hostId" type:"string"`

	// The ID of the instance that you are modifying.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`

	// Reserved for future use.
	PartitionNumber *int64 `type:"integer"`

	// The tenancy for the instance.
	Tenancy *string `locationName:"tenancy" type:"string" enum:"HostTenancy"`
}

// String returns the string representation
func (s ModifyInstancePlacementInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstancePlacementInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyInstancePlacementInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyInstancePlacementInput"}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAffinity sets the Affinity field's value.
func (s *ModifyInstancePlacementInput) SetAffinity(v string) *ModifyInstancePlacementInput {
	s.Affinity = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *ModifyInstancePlacementInput) SetGroupName(v string) *ModifyInstancePlacementInput {
	s.GroupName = &v
	return s
}

// SetHostId sets the HostId field's value.
func (s *ModifyInstancePlacementInput) SetHostId(v string) *ModifyInstancePlacementInput {
	s.HostId = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ModifyInstancePlacementInput) SetInstanceId(v string) *ModifyInstancePlacementInput {
	s.InstanceId = &v
	return s
}

// SetPartitionNumber sets the PartitionNumber field's value.
func (s *ModifyInstancePlacementInput) SetPartitionNumber(v int64) *ModifyInstancePlacementInput {
	s.PartitionNumber = &v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *ModifyInstancePlacementInput) SetTenancy(v string) *ModifyInstancePlacementInput {
	s.Tenancy = &v
	return s
}

type ModifyInstancePlacementOutput struct {
	_ struct{} `type:"structure"`

	// Is true if the request succeeds, and an error otherwise.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyInstancePlacementOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyInstancePlacementOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyInstancePlacementOutput) SetReturn(v bool) *ModifyInstancePlacementOutput {
	s.Return = &v
	return s
}

type ModifyLaunchTemplateInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string"`

	// The version number of the launch template to set as the default version.
	DefaultVersion *string `locationName:"SetDefaultVersion" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateId *string `type:"string"`

	// The name of the launch template. You must specify either the launch template
	// ID or launch template name in the request.
	LaunchTemplateName *string `min:"3" type:"string"`
}

// String returns the string representation
func (s ModifyLaunchTemplateInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyLaunchTemplateInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyLaunchTemplateInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyLaunchTemplateInput"}
	if s.LaunchTemplateName != nil && len(*s.LaunchTemplateName) < 3 {
		invalidParams.Add(request.NewErrParamMinLen("LaunchTemplateName", 3))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *ModifyLaunchTemplateInput) SetClientToken(v string) *ModifyLaunchTemplateInput {
	s.ClientToken = &v
	return s
}

// SetDefaultVersion sets the DefaultVersion field's value.
func (s *ModifyLaunchTemplateInput) SetDefaultVersion(v string) *ModifyLaunchTemplateInput {
	s.DefaultVersion = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyLaunchTemplateInput) SetDryRun(v bool) *ModifyLaunchTemplateInput {
	s.DryRun = &v
	return s
}

// SetLaunchTemplateId sets the LaunchTemplateId field's value.
func (s *ModifyLaunchTemplateInput) SetLaunchTemplateId(v string) *ModifyLaunchTemplateInput {
	s.LaunchTemplateId = &v
	return s
}

// SetLaunchTemplateName sets the LaunchTemplateName field's value.
func (s *ModifyLaunchTemplateInput) SetLaunchTemplateName(v string) *ModifyLaunchTemplateInput {
	s.LaunchTemplateName = &v
	return s
}

type ModifyLaunchTemplateOutput struct {
	_ struct{} `type:"structure"`

	// Information about the launch template.
	LaunchTemplate *LaunchTemplate `locationName:"launchTemplate" type:"structure"`
}

// String returns the string representation
func (s ModifyLaunchTemplateOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyLaunchTemplateOutput) GoString() string {
	return s.String()
}

// SetLaunchTemplate sets the LaunchTemplate field's value.
func (s *ModifyLaunchTemplateOutput) SetLaunchTemplate(v *LaunchTemplate) *ModifyLaunchTemplateOutput {
	s.LaunchTemplate = v
	return s
}

// Contains the parameters for ModifyNetworkInterfaceAttribute.
type ModifyNetworkInterfaceAttributeInput struct {
	_ struct{} `type:"structure"`

	// Information about the interface attachment. If modifying the 'delete on termination'
	// attribute, you must specify the ID of the interface attachment.
	Attachment *NetworkInterfaceAttachmentChanges `locationName:"attachment" type:"structure"`

	// A description for the network interface.
	Description *AttributeValue `locationName:"description" type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Changes the security groups for the network interface. The new set of groups
	// you specify replaces the current set. You must specify at least one group,
	// even if it's just the default security group in the VPC. You must specify
	// the ID of the security group, not the name.
	Groups []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`

	// Indicates whether source/destination checking is enabled. A value of true
	// means checking is enabled, and false means checking is disabled. This value
	// must be false for a NAT instance to perform NAT. For more information, see
	// NAT Instances (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html)
	// in the Amazon Virtual Private Cloud User Guide.
	SourceDestCheck *AttributeBooleanValue `locationName:"sourceDestCheck" type:"structure"`
}

// String returns the string representation
func (s ModifyNetworkInterfaceAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyNetworkInterfaceAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyNetworkInterfaceAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyNetworkInterfaceAttributeInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttachment sets the Attachment field's value.
func (s *ModifyNetworkInterfaceAttributeInput) SetAttachment(v *NetworkInterfaceAttachmentChanges) *ModifyNetworkInterfaceAttributeInput {
	s.Attachment = v
	return s
}

// SetDescription sets the Description field's value.
func (s *ModifyNetworkInterfaceAttributeInput) SetDescription(v *AttributeValue) *ModifyNetworkInterfaceAttributeInput {
	s.Description = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyNetworkInterfaceAttributeInput) SetDryRun(v bool) *ModifyNetworkInterfaceAttributeInput {
	s.DryRun = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *ModifyNetworkInterfaceAttributeInput) SetGroups(v []*string) *ModifyNetworkInterfaceAttributeInput {
	s.Groups = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *ModifyNetworkInterfaceAttributeInput) SetNetworkInterfaceId(v string) *ModifyNetworkInterfaceAttributeInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *ModifyNetworkInterfaceAttributeInput) SetSourceDestCheck(v *AttributeBooleanValue) *ModifyNetworkInterfaceAttributeInput {
	s.SourceDestCheck = v
	return s
}

type ModifyNetworkInterfaceAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyNetworkInterfaceAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyNetworkInterfaceAttributeOutput) GoString() string {
	return s.String()
}

// Contains the parameters for ModifyReservedInstances.
type ModifyReservedInstancesInput struct {
	_ struct{} `type:"structure"`

	// A unique, case-sensitive token you provide to ensure idempotency of your
	// modification request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The IDs of the Reserved Instances to modify.
	//
	// ReservedInstancesIds is a required field
	ReservedInstancesIds []*string `locationName:"ReservedInstancesId" locationNameList:"ReservedInstancesId" type:"list" required:"true"`

	// The configuration settings for the Reserved Instances to modify.
	//
	// TargetConfigurations is a required field
	TargetConfigurations []*ReservedInstancesConfiguration `locationName:"ReservedInstancesConfigurationSetItemType" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s ModifyReservedInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyReservedInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyReservedInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyReservedInstancesInput"}
	if s.ReservedInstancesIds == nil {
		invalidParams.Add(request.NewErrParamRequired("ReservedInstancesIds"))
	}
	if s.TargetConfigurations == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetConfigurations"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *ModifyReservedInstancesInput) SetClientToken(v string) *ModifyReservedInstancesInput {
	s.ClientToken = &v
	return s
}

// SetReservedInstancesIds sets the ReservedInstancesIds field's value.
func (s *ModifyReservedInstancesInput) SetReservedInstancesIds(v []*string) *ModifyReservedInstancesInput {
	s.ReservedInstancesIds = v
	return s
}

// SetTargetConfigurations sets the TargetConfigurations field's value.
func (s *ModifyReservedInstancesInput) SetTargetConfigurations(v []*ReservedInstancesConfiguration) *ModifyReservedInstancesInput {
	s.TargetConfigurations = v
	return s
}

// Contains the output of ModifyReservedInstances.
type ModifyReservedInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The ID for the modification.
	ReservedInstancesModificationId *string `locationName:"reservedInstancesModificationId" type:"string"`
}

// String returns the string representation
func (s ModifyReservedInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyReservedInstancesOutput) GoString() string {
	return s.String()
}

// SetReservedInstancesModificationId sets the ReservedInstancesModificationId field's value.
func (s *ModifyReservedInstancesOutput) SetReservedInstancesModificationId(v string) *ModifyReservedInstancesOutput {
	s.ReservedInstancesModificationId = &v
	return s
}

// Contains the parameters for ModifySnapshotAttribute.
type ModifySnapshotAttributeInput struct {
	_ struct{} `type:"structure"`

	// The snapshot attribute to modify. Only volume creation permissions can be
	// modified.
	Attribute *string `type:"string" enum:"SnapshotAttributeName"`

	// A JSON representation of the snapshot attribute modification.
	CreateVolumePermission *CreateVolumePermissionModifications `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The group to modify for the snapshot.
	GroupNames []*string `locationName:"UserGroup" locationNameList:"GroupName" type:"list"`

	// The type of operation to perform to the attribute.
	OperationType *string `type:"string" enum:"OperationType"`

	// The ID of the snapshot.
	//
	// SnapshotId is a required field
	SnapshotId *string `type:"string" required:"true"`

	// The account ID to modify for the snapshot.
	UserIds []*string `locationName:"UserId" locationNameList:"UserId" type:"list"`
}

// String returns the string representation
func (s ModifySnapshotAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifySnapshotAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifySnapshotAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifySnapshotAttributeInput"}
	if s.SnapshotId == nil {
		invalidParams.Add(request.NewErrParamRequired("SnapshotId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ModifySnapshotAttributeInput) SetAttribute(v string) *ModifySnapshotAttributeInput {
	s.Attribute = &v
	return s
}

// SetCreateVolumePermission sets the CreateVolumePermission field's value.
func (s *ModifySnapshotAttributeInput) SetCreateVolumePermission(v *CreateVolumePermissionModifications) *ModifySnapshotAttributeInput {
	s.CreateVolumePermission = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifySnapshotAttributeInput) SetDryRun(v bool) *ModifySnapshotAttributeInput {
	s.DryRun = &v
	return s
}

// SetGroupNames sets the GroupNames field's value.
func (s *ModifySnapshotAttributeInput) SetGroupNames(v []*string) *ModifySnapshotAttributeInput {
	s.GroupNames = v
	return s
}

// SetOperationType sets the OperationType field's value.
func (s *ModifySnapshotAttributeInput) SetOperationType(v string) *ModifySnapshotAttributeInput {
	s.OperationType = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *ModifySnapshotAttributeInput) SetSnapshotId(v string) *ModifySnapshotAttributeInput {
	s.SnapshotId = &v
	return s
}

// SetUserIds sets the UserIds field's value.
func (s *ModifySnapshotAttributeInput) SetUserIds(v []*string) *ModifySnapshotAttributeInput {
	s.UserIds = v
	return s
}

type ModifySnapshotAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifySnapshotAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifySnapshotAttributeOutput) GoString() string {
	return s.String()
}

// Contains the parameters for ModifySpotFleetRequest.
type ModifySpotFleetRequestInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether running Spot Instances should be terminated if the target
	// capacity of the Spot Fleet request is decreased below the current size of
	// the Spot Fleet.
	ExcessCapacityTerminationPolicy *string `locationName:"excessCapacityTerminationPolicy" type:"string" enum:"ExcessCapacityTerminationPolicy"`

	// The ID of the Spot Fleet request.
	//
	// SpotFleetRequestId is a required field
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string" required:"true"`

	// The size of the fleet.
	TargetCapacity *int64 `locationName:"targetCapacity" type:"integer"`
}

// String returns the string representation
func (s ModifySpotFleetRequestInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifySpotFleetRequestInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifySpotFleetRequestInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifySpotFleetRequestInput"}
	if s.SpotFleetRequestId == nil {
		invalidParams.Add(request.NewErrParamRequired("SpotFleetRequestId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetExcessCapacityTerminationPolicy sets the ExcessCapacityTerminationPolicy field's value.
func (s *ModifySpotFleetRequestInput) SetExcessCapacityTerminationPolicy(v string) *ModifySpotFleetRequestInput {
	s.ExcessCapacityTerminationPolicy = &v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *ModifySpotFleetRequestInput) SetSpotFleetRequestId(v string) *ModifySpotFleetRequestInput {
	s.SpotFleetRequestId = &v
	return s
}

// SetTargetCapacity sets the TargetCapacity field's value.
func (s *ModifySpotFleetRequestInput) SetTargetCapacity(v int64) *ModifySpotFleetRequestInput {
	s.TargetCapacity = &v
	return s
}

// Contains the output of ModifySpotFleetRequest.
type ModifySpotFleetRequestOutput struct {
	_ struct{} `type:"structure"`

	// Is true if the request succeeds, and an error otherwise.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifySpotFleetRequestOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifySpotFleetRequestOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifySpotFleetRequestOutput) SetReturn(v bool) *ModifySpotFleetRequestOutput {
	s.Return = &v
	return s
}

type ModifySubnetAttributeInput struct {
	_ struct{} `type:"structure"`

	// Specify true to indicate that network interfaces created in the specified
	// subnet should be assigned an IPv6 address. This includes a network interface
	// that's created when launching an instance into the subnet (the instance therefore
	// receives an IPv6 address).
	//
	// If you enable the IPv6 addressing feature for your subnet, your network interface
	// or instance only receives an IPv6 address if it's created using version 2016-11-15
	// or later of the Amazon EC2 API.
	AssignIpv6AddressOnCreation *AttributeBooleanValue `type:"structure"`

	// Specify true to indicate that network interfaces created in the specified
	// subnet should be assigned a public IPv4 address. This includes a network
	// interface that's created when launching an instance into the subnet (the
	// instance therefore receives a public IPv4 address).
	MapPublicIpOnLaunch *AttributeBooleanValue `type:"structure"`

	// The ID of the subnet.
	//
	// SubnetId is a required field
	SubnetId *string `locationName:"subnetId" type:"string" required:"true"`
}

// String returns the string representation
func (s ModifySubnetAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifySubnetAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifySubnetAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifySubnetAttributeInput"}
	if s.SubnetId == nil {
		invalidParams.Add(request.NewErrParamRequired("SubnetId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssignIpv6AddressOnCreation sets the AssignIpv6AddressOnCreation field's value.
func (s *ModifySubnetAttributeInput) SetAssignIpv6AddressOnCreation(v *AttributeBooleanValue) *ModifySubnetAttributeInput {
	s.AssignIpv6AddressOnCreation = v
	return s
}

// SetMapPublicIpOnLaunch sets the MapPublicIpOnLaunch field's value.
func (s *ModifySubnetAttributeInput) SetMapPublicIpOnLaunch(v *AttributeBooleanValue) *ModifySubnetAttributeInput {
	s.MapPublicIpOnLaunch = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *ModifySubnetAttributeInput) SetSubnetId(v string) *ModifySubnetAttributeInput {
	s.SubnetId = &v
	return s
}

type ModifySubnetAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifySubnetAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifySubnetAttributeOutput) GoString() string {
	return s.String()
}

type ModifyTransitGatewayVpcAttachmentInput struct {
	_ struct{} `type:"structure"`

	// The IDs of one or more subnets to add. You can specify at most one subnet
	// per Availability Zone.
	AddSubnetIds []*string `locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The new VPC attachment options.
	Options *ModifyTransitGatewayVpcAttachmentRequestOptions `type:"structure"`

	// The IDs of one or more subnets to remove.
	RemoveSubnetIds []*string `locationNameList:"item" type:"list"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyTransitGatewayVpcAttachmentInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyTransitGatewayVpcAttachmentInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyTransitGatewayVpcAttachmentInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyTransitGatewayVpcAttachmentInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAddSubnetIds sets the AddSubnetIds field's value.
func (s *ModifyTransitGatewayVpcAttachmentInput) SetAddSubnetIds(v []*string) *ModifyTransitGatewayVpcAttachmentInput {
	s.AddSubnetIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyTransitGatewayVpcAttachmentInput) SetDryRun(v bool) *ModifyTransitGatewayVpcAttachmentInput {
	s.DryRun = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *ModifyTransitGatewayVpcAttachmentInput) SetOptions(v *ModifyTransitGatewayVpcAttachmentRequestOptions) *ModifyTransitGatewayVpcAttachmentInput {
	s.Options = v
	return s
}

// SetRemoveSubnetIds sets the RemoveSubnetIds field's value.
func (s *ModifyTransitGatewayVpcAttachmentInput) SetRemoveSubnetIds(v []*string) *ModifyTransitGatewayVpcAttachmentInput {
	s.RemoveSubnetIds = v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *ModifyTransitGatewayVpcAttachmentInput) SetTransitGatewayAttachmentId(v string) *ModifyTransitGatewayVpcAttachmentInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

type ModifyTransitGatewayVpcAttachmentOutput struct {
	_ struct{} `type:"structure"`

	// Information about the modified attachment.
	TransitGatewayVpcAttachment *TransitGatewayVpcAttachment `locationName:"transitGatewayVpcAttachment" type:"structure"`
}

// String returns the string representation
func (s ModifyTransitGatewayVpcAttachmentOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyTransitGatewayVpcAttachmentOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayVpcAttachment sets the TransitGatewayVpcAttachment field's value.
func (s *ModifyTransitGatewayVpcAttachmentOutput) SetTransitGatewayVpcAttachment(v *TransitGatewayVpcAttachment) *ModifyTransitGatewayVpcAttachmentOutput {
	s.TransitGatewayVpcAttachment = v
	return s
}

// Describes the options for a VPC attachment.
type ModifyTransitGatewayVpcAttachmentRequestOptions struct {
	_ struct{} `type:"structure"`

	// Enable or disable DNS support. The default is enable.
	DnsSupport *string `type:"string" enum:"DnsSupportValue"`

	// Enable or disable IPv6 support. The default is enable.
	Ipv6Support *string `type:"string" enum:"Ipv6SupportValue"`
}

// String returns the string representation
func (s ModifyTransitGatewayVpcAttachmentRequestOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyTransitGatewayVpcAttachmentRequestOptions) GoString() string {
	return s.String()
}

// SetDnsSupport sets the DnsSupport field's value.
func (s *ModifyTransitGatewayVpcAttachmentRequestOptions) SetDnsSupport(v string) *ModifyTransitGatewayVpcAttachmentRequestOptions {
	s.DnsSupport = &v
	return s
}

// SetIpv6Support sets the Ipv6Support field's value.
func (s *ModifyTransitGatewayVpcAttachmentRequestOptions) SetIpv6Support(v string) *ModifyTransitGatewayVpcAttachmentRequestOptions {
	s.Ipv6Support = &v
	return s
}

// Contains the parameters for ModifyVolumeAttribute.
type ModifyVolumeAttributeInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether the volume should be auto-enabled for I/O operations.
	AutoEnableIO *AttributeBooleanValue `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the volume.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVolumeAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVolumeAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVolumeAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVolumeAttributeInput"}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAutoEnableIO sets the AutoEnableIO field's value.
func (s *ModifyVolumeAttributeInput) SetAutoEnableIO(v *AttributeBooleanValue) *ModifyVolumeAttributeInput {
	s.AutoEnableIO = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVolumeAttributeInput) SetDryRun(v bool) *ModifyVolumeAttributeInput {
	s.DryRun = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *ModifyVolumeAttributeInput) SetVolumeId(v string) *ModifyVolumeAttributeInput {
	s.VolumeId = &v
	return s
}

type ModifyVolumeAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyVolumeAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVolumeAttributeOutput) GoString() string {
	return s.String()
}

type ModifyVolumeInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The target IOPS rate of the volume.
	//
	// This is only valid for Provisioned IOPS SSD (io1) volumes. For more information,
	// see Provisioned IOPS SSD (io1) Volumes (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html#EBSVolumeTypes_piops).
	//
	// Default: If no IOPS value is specified, the existing value is retained.
	Iops *int64 `type:"integer"`

	// The target size of the volume, in GiB. The target volume size must be greater
	// than or equal to than the existing size of the volume. For information about
	// available EBS volume sizes, see Amazon EBS Volume Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html).
	//
	// Default: If no size is specified, the existing size is retained.
	Size *int64 `type:"integer"`

	// The ID of the volume.
	//
	// VolumeId is a required field
	VolumeId *string `type:"string" required:"true"`

	// The target EBS volume type of the volume.
	//
	// Default: If no type is specified, the existing type is retained.
	VolumeType *string `type:"string" enum:"VolumeType"`
}

// String returns the string representation
func (s ModifyVolumeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVolumeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVolumeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVolumeInput"}
	if s.VolumeId == nil {
		invalidParams.Add(request.NewErrParamRequired("VolumeId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVolumeInput) SetDryRun(v bool) *ModifyVolumeInput {
	s.DryRun = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *ModifyVolumeInput) SetIops(v int64) *ModifyVolumeInput {
	s.Iops = &v
	return s
}

// SetSize sets the Size field's value.
func (s *ModifyVolumeInput) SetSize(v int64) *ModifyVolumeInput {
	s.Size = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *ModifyVolumeInput) SetVolumeId(v string) *ModifyVolumeInput {
	s.VolumeId = &v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *ModifyVolumeInput) SetVolumeType(v string) *ModifyVolumeInput {
	s.VolumeType = &v
	return s
}

type ModifyVolumeOutput struct {
	_ struct{} `type:"structure"`

	// Information about the volume modification.
	VolumeModification *VolumeModification `locationName:"volumeModification" type:"structure"`
}

// String returns the string representation
func (s ModifyVolumeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVolumeOutput) GoString() string {
	return s.String()
}

// SetVolumeModification sets the VolumeModification field's value.
func (s *ModifyVolumeOutput) SetVolumeModification(v *VolumeModification) *ModifyVolumeOutput {
	s.VolumeModification = v
	return s
}

type ModifyVpcAttributeInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether the instances launched in the VPC get DNS hostnames. If
	// enabled, instances in the VPC get DNS hostnames; otherwise, they do not.
	//
	// You cannot modify the DNS resolution and DNS hostnames attributes in the
	// same request. Use separate requests for each attribute. You can only enable
	// DNS hostnames if you've enabled DNS support.
	EnableDnsHostnames *AttributeBooleanValue `type:"structure"`

	// Indicates whether the DNS resolution is supported for the VPC. If enabled,
	// queries to the Amazon provided DNS server at the 169.254.169.253 IP address,
	// or the reserved IP address at the base of the VPC network range "plus two"
	// succeed. If disabled, the Amazon provided DNS service in the VPC that resolves
	// public DNS hostnames to IP addresses is not enabled.
	//
	// You cannot modify the DNS resolution and DNS hostnames attributes in the
	// same request. Use separate requests for each attribute.
	EnableDnsSupport *AttributeBooleanValue `type:"structure"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `locationName:"vpcId" type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVpcAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcAttributeInput"}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetEnableDnsHostnames sets the EnableDnsHostnames field's value.
func (s *ModifyVpcAttributeInput) SetEnableDnsHostnames(v *AttributeBooleanValue) *ModifyVpcAttributeInput {
	s.EnableDnsHostnames = v
	return s
}

// SetEnableDnsSupport sets the EnableDnsSupport field's value.
func (s *ModifyVpcAttributeInput) SetEnableDnsSupport(v *AttributeBooleanValue) *ModifyVpcAttributeInput {
	s.EnableDnsSupport = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *ModifyVpcAttributeInput) SetVpcId(v string) *ModifyVpcAttributeInput {
	s.VpcId = &v
	return s
}

type ModifyVpcAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ModifyVpcAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcAttributeOutput) GoString() string {
	return s.String()
}

type ModifyVpcEndpointConnectionNotificationInput struct {
	_ struct{} `type:"structure"`

	// One or more events for the endpoint. Valid values are Accept, Connect, Delete,
	// and Reject.
	ConnectionEvents []*string `locationNameList:"item" type:"list"`

	// The ARN for the SNS topic for the notification.
	ConnectionNotificationArn *string `type:"string"`

	// The ID of the notification.
	//
	// ConnectionNotificationId is a required field
	ConnectionNotificationId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s ModifyVpcEndpointConnectionNotificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointConnectionNotificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcEndpointConnectionNotificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcEndpointConnectionNotificationInput"}
	if s.ConnectionNotificationId == nil {
		invalidParams.Add(request.NewErrParamRequired("ConnectionNotificationId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetConnectionEvents sets the ConnectionEvents field's value.
func (s *ModifyVpcEndpointConnectionNotificationInput) SetConnectionEvents(v []*string) *ModifyVpcEndpointConnectionNotificationInput {
	s.ConnectionEvents = v
	return s
}

// SetConnectionNotificationArn sets the ConnectionNotificationArn field's value.
func (s *ModifyVpcEndpointConnectionNotificationInput) SetConnectionNotificationArn(v string) *ModifyVpcEndpointConnectionNotificationInput {
	s.ConnectionNotificationArn = &v
	return s
}

// SetConnectionNotificationId sets the ConnectionNotificationId field's value.
func (s *ModifyVpcEndpointConnectionNotificationInput) SetConnectionNotificationId(v string) *ModifyVpcEndpointConnectionNotificationInput {
	s.ConnectionNotificationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVpcEndpointConnectionNotificationInput) SetDryRun(v bool) *ModifyVpcEndpointConnectionNotificationInput {
	s.DryRun = &v
	return s
}

type ModifyVpcEndpointConnectionNotificationOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	ReturnValue *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyVpcEndpointConnectionNotificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointConnectionNotificationOutput) GoString() string {
	return s.String()
}

// SetReturnValue sets the ReturnValue field's value.
func (s *ModifyVpcEndpointConnectionNotificationOutput) SetReturnValue(v bool) *ModifyVpcEndpointConnectionNotificationOutput {
	s.ReturnValue = &v
	return s
}

// Contains the parameters for ModifyVpcEndpoint.
type ModifyVpcEndpointInput struct {
	_ struct{} `type:"structure"`

	// (Gateway endpoint) One or more route tables IDs to associate with the endpoint.
	AddRouteTableIds []*string `locationName:"AddRouteTableId" locationNameList:"item" type:"list"`

	// (Interface endpoint) One or more security group IDs to associate with the
	// network interface.
	AddSecurityGroupIds []*string `locationName:"AddSecurityGroupId" locationNameList:"item" type:"list"`

	// (Interface endpoint) One or more subnet IDs in which to serve the endpoint.
	AddSubnetIds []*string `locationName:"AddSubnetId" locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// (Gateway endpoint) A policy document to attach to the endpoint. The policy
	// must be in valid JSON format.
	PolicyDocument *string `type:"string"`

	// (Interface endpoint) Indicate whether a private hosted zone is associated
	// with the VPC.
	PrivateDnsEnabled *bool `type:"boolean"`

	// (Gateway endpoint) One or more route table IDs to disassociate from the endpoint.
	RemoveRouteTableIds []*string `locationName:"RemoveRouteTableId" locationNameList:"item" type:"list"`

	// (Interface endpoint) One or more security group IDs to disassociate from
	// the network interface.
	RemoveSecurityGroupIds []*string `locationName:"RemoveSecurityGroupId" locationNameList:"item" type:"list"`

	// (Interface endpoint) One or more subnets IDs in which to remove the endpoint.
	RemoveSubnetIds []*string `locationName:"RemoveSubnetId" locationNameList:"item" type:"list"`

	// (Gateway endpoint) Specify true to reset the policy document to the default
	// policy. The default policy allows full access to the service.
	ResetPolicy *bool `type:"boolean"`

	// The ID of the endpoint.
	//
	// VpcEndpointId is a required field
	VpcEndpointId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVpcEndpointInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcEndpointInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcEndpointInput"}
	if s.VpcEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAddRouteTableIds sets the AddRouteTableIds field's value.
func (s *ModifyVpcEndpointInput) SetAddRouteTableIds(v []*string) *ModifyVpcEndpointInput {
	s.AddRouteTableIds = v
	return s
}

// SetAddSecurityGroupIds sets the AddSecurityGroupIds field's value.
func (s *ModifyVpcEndpointInput) SetAddSecurityGroupIds(v []*string) *ModifyVpcEndpointInput {
	s.AddSecurityGroupIds = v
	return s
}

// SetAddSubnetIds sets the AddSubnetIds field's value.
func (s *ModifyVpcEndpointInput) SetAddSubnetIds(v []*string) *ModifyVpcEndpointInput {
	s.AddSubnetIds = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVpcEndpointInput) SetDryRun(v bool) *ModifyVpcEndpointInput {
	s.DryRun = &v
	return s
}

// SetPolicyDocument sets the PolicyDocument field's value.
func (s *ModifyVpcEndpointInput) SetPolicyDocument(v string) *ModifyVpcEndpointInput {
	s.PolicyDocument = &v
	return s
}

// SetPrivateDnsEnabled sets the PrivateDnsEnabled field's value.
func (s *ModifyVpcEndpointInput) SetPrivateDnsEnabled(v bool) *ModifyVpcEndpointInput {
	s.PrivateDnsEnabled = &v
	return s
}

// SetRemoveRouteTableIds sets the RemoveRouteTableIds field's value.
func (s *ModifyVpcEndpointInput) SetRemoveRouteTableIds(v []*string) *ModifyVpcEndpointInput {
	s.RemoveRouteTableIds = v
	return s
}

// SetRemoveSecurityGroupIds sets the RemoveSecurityGroupIds field's value.
func (s *ModifyVpcEndpointInput) SetRemoveSecurityGroupIds(v []*string) *ModifyVpcEndpointInput {
	s.RemoveSecurityGroupIds = v
	return s
}

// SetRemoveSubnetIds sets the RemoveSubnetIds field's value.
func (s *ModifyVpcEndpointInput) SetRemoveSubnetIds(v []*string) *ModifyVpcEndpointInput {
	s.RemoveSubnetIds = v
	return s
}

// SetResetPolicy sets the ResetPolicy field's value.
func (s *ModifyVpcEndpointInput) SetResetPolicy(v bool) *ModifyVpcEndpointInput {
	s.ResetPolicy = &v
	return s
}

// SetVpcEndpointId sets the VpcEndpointId field's value.
func (s *ModifyVpcEndpointInput) SetVpcEndpointId(v string) *ModifyVpcEndpointInput {
	s.VpcEndpointId = &v
	return s
}

type ModifyVpcEndpointOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyVpcEndpointOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyVpcEndpointOutput) SetReturn(v bool) *ModifyVpcEndpointOutput {
	s.Return = &v
	return s
}

type ModifyVpcEndpointServiceConfigurationInput struct {
	_ struct{} `type:"structure"`

	// Indicate whether requests to create an endpoint to your service must be accepted.
	AcceptanceRequired *bool `type:"boolean"`

	// The Amazon Resource Names (ARNs) of Network Load Balancers to add to your
	// service configuration.
	AddNetworkLoadBalancerArns []*string `locationName:"AddNetworkLoadBalancerArn" locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The Amazon Resource Names (ARNs) of Network Load Balancers to remove from
	// your service configuration.
	RemoveNetworkLoadBalancerArns []*string `locationName:"RemoveNetworkLoadBalancerArn" locationNameList:"item" type:"list"`

	// The ID of the service.
	//
	// ServiceId is a required field
	ServiceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVpcEndpointServiceConfigurationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointServiceConfigurationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcEndpointServiceConfigurationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcEndpointServiceConfigurationInput"}
	if s.ServiceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAcceptanceRequired sets the AcceptanceRequired field's value.
func (s *ModifyVpcEndpointServiceConfigurationInput) SetAcceptanceRequired(v bool) *ModifyVpcEndpointServiceConfigurationInput {
	s.AcceptanceRequired = &v
	return s
}

// SetAddNetworkLoadBalancerArns sets the AddNetworkLoadBalancerArns field's value.
func (s *ModifyVpcEndpointServiceConfigurationInput) SetAddNetworkLoadBalancerArns(v []*string) *ModifyVpcEndpointServiceConfigurationInput {
	s.AddNetworkLoadBalancerArns = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVpcEndpointServiceConfigurationInput) SetDryRun(v bool) *ModifyVpcEndpointServiceConfigurationInput {
	s.DryRun = &v
	return s
}

// SetRemoveNetworkLoadBalancerArns sets the RemoveNetworkLoadBalancerArns field's value.
func (s *ModifyVpcEndpointServiceConfigurationInput) SetRemoveNetworkLoadBalancerArns(v []*string) *ModifyVpcEndpointServiceConfigurationInput {
	s.RemoveNetworkLoadBalancerArns = v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *ModifyVpcEndpointServiceConfigurationInput) SetServiceId(v string) *ModifyVpcEndpointServiceConfigurationInput {
	s.ServiceId = &v
	return s
}

type ModifyVpcEndpointServiceConfigurationOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyVpcEndpointServiceConfigurationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointServiceConfigurationOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ModifyVpcEndpointServiceConfigurationOutput) SetReturn(v bool) *ModifyVpcEndpointServiceConfigurationOutput {
	s.Return = &v
	return s
}

type ModifyVpcEndpointServicePermissionsInput struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Names (ARN) of one or more principals. Permissions are
	// granted to the principals in this list. To grant permissions to all principals,
	// specify an asterisk (*).
	AddAllowedPrincipals []*string `locationNameList:"item" type:"list"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The Amazon Resource Names (ARN) of one or more principals. Permissions are
	// revoked for principals in this list.
	RemoveAllowedPrincipals []*string `locationNameList:"item" type:"list"`

	// The ID of the service.
	//
	// ServiceId is a required field
	ServiceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVpcEndpointServicePermissionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointServicePermissionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcEndpointServicePermissionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcEndpointServicePermissionsInput"}
	if s.ServiceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAddAllowedPrincipals sets the AddAllowedPrincipals field's value.
func (s *ModifyVpcEndpointServicePermissionsInput) SetAddAllowedPrincipals(v []*string) *ModifyVpcEndpointServicePermissionsInput {
	s.AddAllowedPrincipals = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVpcEndpointServicePermissionsInput) SetDryRun(v bool) *ModifyVpcEndpointServicePermissionsInput {
	s.DryRun = &v
	return s
}

// SetRemoveAllowedPrincipals sets the RemoveAllowedPrincipals field's value.
func (s *ModifyVpcEndpointServicePermissionsInput) SetRemoveAllowedPrincipals(v []*string) *ModifyVpcEndpointServicePermissionsInput {
	s.RemoveAllowedPrincipals = v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *ModifyVpcEndpointServicePermissionsInput) SetServiceId(v string) *ModifyVpcEndpointServicePermissionsInput {
	s.ServiceId = &v
	return s
}

type ModifyVpcEndpointServicePermissionsOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	ReturnValue *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyVpcEndpointServicePermissionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcEndpointServicePermissionsOutput) GoString() string {
	return s.String()
}

// SetReturnValue sets the ReturnValue field's value.
func (s *ModifyVpcEndpointServicePermissionsOutput) SetReturnValue(v bool) *ModifyVpcEndpointServicePermissionsOutput {
	s.ReturnValue = &v
	return s
}

type ModifyVpcPeeringConnectionOptionsInput struct {
	_ struct{} `type:"structure"`

	// The VPC peering connection options for the accepter VPC.
	AccepterPeeringConnectionOptions *PeeringConnectionOptionsRequest `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The VPC peering connection options for the requester VPC.
	RequesterPeeringConnectionOptions *PeeringConnectionOptionsRequest `type:"structure"`

	// The ID of the VPC peering connection.
	//
	// VpcPeeringConnectionId is a required field
	VpcPeeringConnectionId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVpcPeeringConnectionOptionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcPeeringConnectionOptionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcPeeringConnectionOptionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcPeeringConnectionOptionsInput"}
	if s.VpcPeeringConnectionId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcPeeringConnectionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAccepterPeeringConnectionOptions sets the AccepterPeeringConnectionOptions field's value.
func (s *ModifyVpcPeeringConnectionOptionsInput) SetAccepterPeeringConnectionOptions(v *PeeringConnectionOptionsRequest) *ModifyVpcPeeringConnectionOptionsInput {
	s.AccepterPeeringConnectionOptions = v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVpcPeeringConnectionOptionsInput) SetDryRun(v bool) *ModifyVpcPeeringConnectionOptionsInput {
	s.DryRun = &v
	return s
}

// SetRequesterPeeringConnectionOptions sets the RequesterPeeringConnectionOptions field's value.
func (s *ModifyVpcPeeringConnectionOptionsInput) SetRequesterPeeringConnectionOptions(v *PeeringConnectionOptionsRequest) *ModifyVpcPeeringConnectionOptionsInput {
	s.RequesterPeeringConnectionOptions = v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *ModifyVpcPeeringConnectionOptionsInput) SetVpcPeeringConnectionId(v string) *ModifyVpcPeeringConnectionOptionsInput {
	s.VpcPeeringConnectionId = &v
	return s
}

type ModifyVpcPeeringConnectionOptionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the VPC peering connection options for the accepter VPC.
	AccepterPeeringConnectionOptions *PeeringConnectionOptions `locationName:"accepterPeeringConnectionOptions" type:"structure"`

	// Information about the VPC peering connection options for the requester VPC.
	RequesterPeeringConnectionOptions *PeeringConnectionOptions `locationName:"requesterPeeringConnectionOptions" type:"structure"`
}

// String returns the string representation
func (s ModifyVpcPeeringConnectionOptionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcPeeringConnectionOptionsOutput) GoString() string {
	return s.String()
}

// SetAccepterPeeringConnectionOptions sets the AccepterPeeringConnectionOptions field's value.
func (s *ModifyVpcPeeringConnectionOptionsOutput) SetAccepterPeeringConnectionOptions(v *PeeringConnectionOptions) *ModifyVpcPeeringConnectionOptionsOutput {
	s.AccepterPeeringConnectionOptions = v
	return s
}

// SetRequesterPeeringConnectionOptions sets the RequesterPeeringConnectionOptions field's value.
func (s *ModifyVpcPeeringConnectionOptionsOutput) SetRequesterPeeringConnectionOptions(v *PeeringConnectionOptions) *ModifyVpcPeeringConnectionOptionsOutput {
	s.RequesterPeeringConnectionOptions = v
	return s
}

type ModifyVpcTenancyInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The instance tenancy attribute for the VPC.
	//
	// InstanceTenancy is a required field
	InstanceTenancy *string `type:"string" required:"true" enum:"VpcTenancy"`

	// The ID of the VPC.
	//
	// VpcId is a required field
	VpcId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ModifyVpcTenancyInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcTenancyInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ModifyVpcTenancyInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ModifyVpcTenancyInput"}
	if s.InstanceTenancy == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceTenancy"))
	}
	if s.VpcId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ModifyVpcTenancyInput) SetDryRun(v bool) *ModifyVpcTenancyInput {
	s.DryRun = &v
	return s
}

// SetInstanceTenancy sets the InstanceTenancy field's value.
func (s *ModifyVpcTenancyInput) SetInstanceTenancy(v string) *ModifyVpcTenancyInput {
	s.InstanceTenancy = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *ModifyVpcTenancyInput) SetVpcId(v string) *ModifyVpcTenancyInput {
	s.VpcId = &v
	return s
}

type ModifyVpcTenancyOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, returns an error.
	ReturnValue *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ModifyVpcTenancyOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ModifyVpcTenancyOutput) GoString() string {
	return s.String()
}

// SetReturnValue sets the ReturnValue field's value.
func (s *ModifyVpcTenancyOutput) SetReturnValue(v bool) *ModifyVpcTenancyOutput {
	s.ReturnValue = &v
	return s
}

type MonitorInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more instance IDs.
	//
	// InstanceIds is a required field
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list" required:"true"`
}

// String returns the string representation
func (s MonitorInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MonitorInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *MonitorInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "MonitorInstancesInput"}
	if s.InstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *MonitorInstancesInput) SetDryRun(v bool) *MonitorInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *MonitorInstancesInput) SetInstanceIds(v []*string) *MonitorInstancesInput {
	s.InstanceIds = v
	return s
}

type MonitorInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The monitoring information.
	InstanceMonitorings []*InstanceMonitoring `locationName:"instancesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s MonitorInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MonitorInstancesOutput) GoString() string {
	return s.String()
}

// SetInstanceMonitorings sets the InstanceMonitorings field's value.
func (s *MonitorInstancesOutput) SetInstanceMonitorings(v []*InstanceMonitoring) *MonitorInstancesOutput {
	s.InstanceMonitorings = v
	return s
}

// Describes the monitoring of an instance.
type Monitoring struct {
	_ struct{} `type:"structure"`

	// Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring
	// is enabled.
	State *string `locationName:"state" type:"string" enum:"MonitoringState"`
}

// String returns the string representation
func (s Monitoring) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Monitoring) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *Monitoring) SetState(v string) *Monitoring {
	s.State = &v
	return s
}

type MoveAddressToVpcInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The Elastic IP address.
	//
	// PublicIp is a required field
	PublicIp *string `locationName:"publicIp" type:"string" required:"true"`
}

// String returns the string representation
func (s MoveAddressToVpcInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MoveAddressToVpcInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *MoveAddressToVpcInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "MoveAddressToVpcInput"}
	if s.PublicIp == nil {
		invalidParams.Add(request.NewErrParamRequired("PublicIp"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *MoveAddressToVpcInput) SetDryRun(v bool) *MoveAddressToVpcInput {
	s.DryRun = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *MoveAddressToVpcInput) SetPublicIp(v string) *MoveAddressToVpcInput {
	s.PublicIp = &v
	return s
}

type MoveAddressToVpcOutput struct {
	_ struct{} `type:"structure"`

	// The allocation ID for the Elastic IP address.
	AllocationId *string `locationName:"allocationId" type:"string"`

	// The status of the move of the IP address.
	Status *string `locationName:"status" type:"string" enum:"Status"`
}

// String returns the string representation
func (s MoveAddressToVpcOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MoveAddressToVpcOutput) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *MoveAddressToVpcOutput) SetAllocationId(v string) *MoveAddressToVpcOutput {
	s.AllocationId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *MoveAddressToVpcOutput) SetStatus(v string) *MoveAddressToVpcOutput {
	s.Status = &v
	return s
}

// Describes the status of a moving Elastic IP address.
type MovingAddressStatus struct {
	_ struct{} `type:"structure"`

	// The status of the Elastic IP address that's being moved to the EC2-VPC platform,
	// or restored to the EC2-Classic platform.
	MoveStatus *string `locationName:"moveStatus" type:"string" enum:"MoveStatus"`

	// The Elastic IP address.
	PublicIp *string `locationName:"publicIp" type:"string"`
}

// String returns the string representation
func (s MovingAddressStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MovingAddressStatus) GoString() string {
	return s.String()
}

// SetMoveStatus sets the MoveStatus field's value.
func (s *MovingAddressStatus) SetMoveStatus(v string) *MovingAddressStatus {
	s.MoveStatus = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *MovingAddressStatus) SetPublicIp(v string) *MovingAddressStatus {
	s.PublicIp = &v
	return s
}

// Describes a NAT gateway.
type NatGateway struct {
	_ struct{} `type:"structure"`

	// The date and time the NAT gateway was created.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// The date and time the NAT gateway was deleted, if applicable.
	DeleteTime *time.Time `locationName:"deleteTime" type:"timestamp"`

	// If the NAT gateway could not be created, specifies the error code for the
	// failure. (InsufficientFreeAddressesInSubnet | Gateway.NotAttached | InvalidAllocationID.NotFound
	// | Resource.AlreadyAssociated | InternalError | InvalidSubnetID.NotFound)
	FailureCode *string `locationName:"failureCode" type:"string"`

	// If the NAT gateway could not be created, specifies the error message for
	// the failure, that corresponds to the error code.
	//
	//    * For InsufficientFreeAddressesInSubnet: "Subnet has insufficient free
	//    addresses to create this NAT gateway"
	//
	//    * For Gateway.NotAttached: "Network vpc-xxxxxxxx has no Internet gateway
	//    attached"
	//
	//    * For InvalidAllocationID.NotFound: "Elastic IP address eipalloc-xxxxxxxx
	//    could not be associated with this NAT gateway"
	//
	//    * For Resource.AlreadyAssociated: "Elastic IP address eipalloc-xxxxxxxx
	//    is already associated"
	//
	//    * For InternalError: "Network interface eni-xxxxxxxx, created and used
	//    internally by this NAT gateway is in an invalid state. Please try again."
	//
	//    * For InvalidSubnetID.NotFound: "The specified subnet subnet-xxxxxxxx
	//    does not exist or could not be found."
	FailureMessage *string `locationName:"failureMessage" type:"string"`

	// Information about the IP addresses and network interface associated with
	// the NAT gateway.
	NatGatewayAddresses []*NatGatewayAddress `locationName:"natGatewayAddressSet" locationNameList:"item" type:"list"`

	// The ID of the NAT gateway.
	NatGatewayId *string `locationName:"natGatewayId" type:"string"`

	// Reserved. If you need to sustain traffic greater than the documented limits
	// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
	// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
	ProvisionedBandwidth *ProvisionedBandwidth `locationName:"provisionedBandwidth" type:"structure"`

	// The state of the NAT gateway.
	//
	//    * pending: The NAT gateway is being created and is not ready to process
	//    traffic.
	//
	//    * failed: The NAT gateway could not be created. Check the failureCode
	//    and failureMessage fields for the reason.
	//
	//    * available: The NAT gateway is able to process traffic. This status remains
	//    until you delete the NAT gateway, and does not indicate the health of
	//    the NAT gateway.
	//
	//    * deleting: The NAT gateway is in the process of being terminated and
	//    may still be processing traffic.
	//
	//    * deleted: The NAT gateway has been terminated and is no longer processing
	//    traffic.
	State *string `locationName:"state" type:"string" enum:"NatGatewayState"`

	// The ID of the subnet in which the NAT gateway is located.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The tags for the NAT gateway.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC in which the NAT gateway is located.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s NatGateway) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NatGateway) GoString() string {
	return s.String()
}

// SetCreateTime sets the CreateTime field's value.
func (s *NatGateway) SetCreateTime(v time.Time) *NatGateway {
	s.CreateTime = &v
	return s
}

// SetDeleteTime sets the DeleteTime field's value.
func (s *NatGateway) SetDeleteTime(v time.Time) *NatGateway {
	s.DeleteTime = &v
	return s
}

// SetFailureCode sets the FailureCode field's value.
func (s *NatGateway) SetFailureCode(v string) *NatGateway {
	s.FailureCode = &v
	return s
}

// SetFailureMessage sets the FailureMessage field's value.
func (s *NatGateway) SetFailureMessage(v string) *NatGateway {
	s.FailureMessage = &v
	return s
}

// SetNatGatewayAddresses sets the NatGatewayAddresses field's value.
func (s *NatGateway) SetNatGatewayAddresses(v []*NatGatewayAddress) *NatGateway {
	s.NatGatewayAddresses = v
	return s
}

// SetNatGatewayId sets the NatGatewayId field's value.
func (s *NatGateway) SetNatGatewayId(v string) *NatGateway {
	s.NatGatewayId = &v
	return s
}

// SetProvisionedBandwidth sets the ProvisionedBandwidth field's value.
func (s *NatGateway) SetProvisionedBandwidth(v *ProvisionedBandwidth) *NatGateway {
	s.ProvisionedBandwidth = v
	return s
}

// SetState sets the State field's value.
func (s *NatGateway) SetState(v string) *NatGateway {
	s.State = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *NatGateway) SetSubnetId(v string) *NatGateway {
	s.SubnetId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *NatGateway) SetTags(v []*Tag) *NatGateway {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *NatGateway) SetVpcId(v string) *NatGateway {
	s.VpcId = &v
	return s
}

// Describes the IP addresses and network interface associated with a NAT gateway.
type NatGatewayAddress struct {
	_ struct{} `type:"structure"`

	// The allocation ID of the Elastic IP address that's associated with the NAT
	// gateway.
	AllocationId *string `locationName:"allocationId" type:"string"`

	// The ID of the network interface associated with the NAT gateway.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The private IP address associated with the Elastic IP address.
	PrivateIp *string `locationName:"privateIp" type:"string"`

	// The Elastic IP address associated with the NAT gateway.
	PublicIp *string `locationName:"publicIp" type:"string"`
}

// String returns the string representation
func (s NatGatewayAddress) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NatGatewayAddress) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *NatGatewayAddress) SetAllocationId(v string) *NatGatewayAddress {
	s.AllocationId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *NatGatewayAddress) SetNetworkInterfaceId(v string) *NatGatewayAddress {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIp sets the PrivateIp field's value.
func (s *NatGatewayAddress) SetPrivateIp(v string) *NatGatewayAddress {
	s.PrivateIp = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *NatGatewayAddress) SetPublicIp(v string) *NatGatewayAddress {
	s.PublicIp = &v
	return s
}

// Describes a network ACL.
type NetworkAcl struct {
	_ struct{} `type:"structure"`

	// Any associations between the network ACL and one or more subnets
	Associations []*NetworkAclAssociation `locationName:"associationSet" locationNameList:"item" type:"list"`

	// One or more entries (rules) in the network ACL.
	Entries []*NetworkAclEntry `locationName:"entrySet" locationNameList:"item" type:"list"`

	// Indicates whether this is the default network ACL for the VPC.
	IsDefault *bool `locationName:"default" type:"boolean"`

	// The ID of the network ACL.
	NetworkAclId *string `locationName:"networkAclId" type:"string"`

	// The ID of the AWS account that owns the network ACL.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Any tags assigned to the network ACL.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC for the network ACL.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s NetworkAcl) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkAcl) GoString() string {
	return s.String()
}

// SetAssociations sets the Associations field's value.
func (s *NetworkAcl) SetAssociations(v []*NetworkAclAssociation) *NetworkAcl {
	s.Associations = v
	return s
}

// SetEntries sets the Entries field's value.
func (s *NetworkAcl) SetEntries(v []*NetworkAclEntry) *NetworkAcl {
	s.Entries = v
	return s
}

// SetIsDefault sets the IsDefault field's value.
func (s *NetworkAcl) SetIsDefault(v bool) *NetworkAcl {
	s.IsDefault = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *NetworkAcl) SetNetworkAclId(v string) *NetworkAcl {
	s.NetworkAclId = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *NetworkAcl) SetOwnerId(v string) *NetworkAcl {
	s.OwnerId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *NetworkAcl) SetTags(v []*Tag) *NetworkAcl {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *NetworkAcl) SetVpcId(v string) *NetworkAcl {
	s.VpcId = &v
	return s
}

// Describes an association between a network ACL and a subnet.
type NetworkAclAssociation struct {
	_ struct{} `type:"structure"`

	// The ID of the association between a network ACL and a subnet.
	NetworkAclAssociationId *string `locationName:"networkAclAssociationId" type:"string"`

	// The ID of the network ACL.
	NetworkAclId *string `locationName:"networkAclId" type:"string"`

	// The ID of the subnet.
	SubnetId *string `locationName:"subnetId" type:"string"`
}

// String returns the string representation
func (s NetworkAclAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkAclAssociation) GoString() string {
	return s.String()
}

// SetNetworkAclAssociationId sets the NetworkAclAssociationId field's value.
func (s *NetworkAclAssociation) SetNetworkAclAssociationId(v string) *NetworkAclAssociation {
	s.NetworkAclAssociationId = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *NetworkAclAssociation) SetNetworkAclId(v string) *NetworkAclAssociation {
	s.NetworkAclId = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *NetworkAclAssociation) SetSubnetId(v string) *NetworkAclAssociation {
	s.SubnetId = &v
	return s
}

// Describes an entry in a network ACL.
type NetworkAclEntry struct {
	_ struct{} `type:"structure"`

	// The IPv4 network range to allow or deny, in CIDR notation.
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Indicates whether the rule is an egress rule (applied to traffic leaving
	// the subnet).
	Egress *bool `locationName:"egress" type:"boolean"`

	// ICMP protocol: The ICMP type and code.
	IcmpTypeCode *IcmpTypeCode `locationName:"icmpTypeCode" type:"structure"`

	// The IPv6 network range to allow or deny, in CIDR notation.
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string"`

	// TCP or UDP protocols: The range of ports the rule applies to.
	PortRange *PortRange `locationName:"portRange" type:"structure"`

	// The protocol number. A value of "-1" means all protocols.
	Protocol *string `locationName:"protocol" type:"string"`

	// Indicates whether to allow or deny the traffic that matches the rule.
	RuleAction *string `locationName:"ruleAction" type:"string" enum:"RuleAction"`

	// The rule number for the entry. ACL entries are processed in ascending order
	// by rule number.
	RuleNumber *int64 `locationName:"ruleNumber" type:"integer"`
}

// String returns the string representation
func (s NetworkAclEntry) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkAclEntry) GoString() string {
	return s.String()
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *NetworkAclEntry) SetCidrBlock(v string) *NetworkAclEntry {
	s.CidrBlock = &v
	return s
}

// SetEgress sets the Egress field's value.
func (s *NetworkAclEntry) SetEgress(v bool) *NetworkAclEntry {
	s.Egress = &v
	return s
}

// SetIcmpTypeCode sets the IcmpTypeCode field's value.
func (s *NetworkAclEntry) SetIcmpTypeCode(v *IcmpTypeCode) *NetworkAclEntry {
	s.IcmpTypeCode = v
	return s
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *NetworkAclEntry) SetIpv6CidrBlock(v string) *NetworkAclEntry {
	s.Ipv6CidrBlock = &v
	return s
}

// SetPortRange sets the PortRange field's value.
func (s *NetworkAclEntry) SetPortRange(v *PortRange) *NetworkAclEntry {
	s.PortRange = v
	return s
}

// SetProtocol sets the Protocol field's value.
func (s *NetworkAclEntry) SetProtocol(v string) *NetworkAclEntry {
	s.Protocol = &v
	return s
}

// SetRuleAction sets the RuleAction field's value.
func (s *NetworkAclEntry) SetRuleAction(v string) *NetworkAclEntry {
	s.RuleAction = &v
	return s
}

// SetRuleNumber sets the RuleNumber field's value.
func (s *NetworkAclEntry) SetRuleNumber(v int64) *NetworkAclEntry {
	s.RuleNumber = &v
	return s
}

// Describes a network interface.
type NetworkInterface struct {
	_ struct{} `type:"structure"`

	// The association information for an Elastic IP address (IPv4) associated with
	// the network interface.
	Association *NetworkInterfaceAssociation `locationName:"association" type:"structure"`

	// The network interface attachment.
	Attachment *NetworkInterfaceAttachment `locationName:"attachment" type:"structure"`

	// The Availability Zone.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// A description.
	Description *string `locationName:"description" type:"string"`

	// Any security groups for the network interface.
	Groups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// The type of interface.
	InterfaceType *string `locationName:"interfaceType" type:"string" enum:"NetworkInterfaceType"`

	// The IPv6 addresses associated with the network interface.
	Ipv6Addresses []*NetworkInterfaceIpv6Address `locationName:"ipv6AddressesSet" locationNameList:"item" type:"list"`

	// The MAC address.
	MacAddress *string `locationName:"macAddress" type:"string"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The AWS account ID of the owner of the network interface.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The private DNS name.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The IPv4 address of the network interface within the subnet.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// The private IPv4 addresses associated with the network interface.
	PrivateIpAddresses []*NetworkInterfacePrivateIpAddress `locationName:"privateIpAddressesSet" locationNameList:"item" type:"list"`

	// The ID of the entity that launched the instance on your behalf (for example,
	// AWS Management Console or Auto Scaling).
	RequesterId *string `locationName:"requesterId" type:"string"`

	// Indicates whether the network interface is being managed by AWS.
	RequesterManaged *bool `locationName:"requesterManaged" type:"boolean"`

	// Indicates whether traffic to or from the instance is validated.
	SourceDestCheck *bool `locationName:"sourceDestCheck" type:"boolean"`

	// The status of the network interface.
	Status *string `locationName:"status" type:"string" enum:"NetworkInterfaceStatus"`

	// The ID of the subnet.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// Any tags assigned to the network interface.
	TagSet []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s NetworkInterface) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterface) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *NetworkInterface) SetAssociation(v *NetworkInterfaceAssociation) *NetworkInterface {
	s.Association = v
	return s
}

// SetAttachment sets the Attachment field's value.
func (s *NetworkInterface) SetAttachment(v *NetworkInterfaceAttachment) *NetworkInterface {
	s.Attachment = v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *NetworkInterface) SetAvailabilityZone(v string) *NetworkInterface {
	s.AvailabilityZone = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *NetworkInterface) SetDescription(v string) *NetworkInterface {
	s.Description = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *NetworkInterface) SetGroups(v []*GroupIdentifier) *NetworkInterface {
	s.Groups = v
	return s
}

// SetInterfaceType sets the InterfaceType field's value.
func (s *NetworkInterface) SetInterfaceType(v string) *NetworkInterface {
	s.InterfaceType = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *NetworkInterface) SetIpv6Addresses(v []*NetworkInterfaceIpv6Address) *NetworkInterface {
	s.Ipv6Addresses = v
	return s
}

// SetMacAddress sets the MacAddress field's value.
func (s *NetworkInterface) SetMacAddress(v string) *NetworkInterface {
	s.MacAddress = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *NetworkInterface) SetNetworkInterfaceId(v string) *NetworkInterface {
	s.NetworkInterfaceId = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *NetworkInterface) SetOwnerId(v string) *NetworkInterface {
	s.OwnerId = &v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *NetworkInterface) SetPrivateDnsName(v string) *NetworkInterface {
	s.PrivateDnsName = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *NetworkInterface) SetPrivateIpAddress(v string) *NetworkInterface {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *NetworkInterface) SetPrivateIpAddresses(v []*NetworkInterfacePrivateIpAddress) *NetworkInterface {
	s.PrivateIpAddresses = v
	return s
}

// SetRequesterId sets the RequesterId field's value.
func (s *NetworkInterface) SetRequesterId(v string) *NetworkInterface {
	s.RequesterId = &v
	return s
}

// SetRequesterManaged sets the RequesterManaged field's value.
func (s *NetworkInterface) SetRequesterManaged(v bool) *NetworkInterface {
	s.RequesterManaged = &v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *NetworkInterface) SetSourceDestCheck(v bool) *NetworkInterface {
	s.SourceDestCheck = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *NetworkInterface) SetStatus(v string) *NetworkInterface {
	s.Status = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *NetworkInterface) SetSubnetId(v string) *NetworkInterface {
	s.SubnetId = &v
	return s
}

// SetTagSet sets the TagSet field's value.
func (s *NetworkInterface) SetTagSet(v []*Tag) *NetworkInterface {
	s.TagSet = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *NetworkInterface) SetVpcId(v string) *NetworkInterface {
	s.VpcId = &v
	return s
}

// Describes association information for an Elastic IP address (IPv4 only).
type NetworkInterfaceAssociation struct {
	_ struct{} `type:"structure"`

	// The allocation ID.
	AllocationId *string `locationName:"allocationId" type:"string"`

	// The association ID.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The ID of the Elastic IP address owner.
	IpOwnerId *string `locationName:"ipOwnerId" type:"string"`

	// The public DNS name.
	PublicDnsName *string `locationName:"publicDnsName" type:"string"`

	// The address of the Elastic IP address bound to the network interface.
	PublicIp *string `locationName:"publicIp" type:"string"`
}

// String returns the string representation
func (s NetworkInterfaceAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfaceAssociation) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *NetworkInterfaceAssociation) SetAllocationId(v string) *NetworkInterfaceAssociation {
	s.AllocationId = &v
	return s
}

// SetAssociationId sets the AssociationId field's value.
func (s *NetworkInterfaceAssociation) SetAssociationId(v string) *NetworkInterfaceAssociation {
	s.AssociationId = &v
	return s
}

// SetIpOwnerId sets the IpOwnerId field's value.
func (s *NetworkInterfaceAssociation) SetIpOwnerId(v string) *NetworkInterfaceAssociation {
	s.IpOwnerId = &v
	return s
}

// SetPublicDnsName sets the PublicDnsName field's value.
func (s *NetworkInterfaceAssociation) SetPublicDnsName(v string) *NetworkInterfaceAssociation {
	s.PublicDnsName = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *NetworkInterfaceAssociation) SetPublicIp(v string) *NetworkInterfaceAssociation {
	s.PublicIp = &v
	return s
}

// Describes a network interface attachment.
type NetworkInterfaceAttachment struct {
	_ struct{} `type:"structure"`

	// The timestamp indicating when the attachment initiated.
	AttachTime *time.Time `locationName:"attachTime" type:"timestamp"`

	// The ID of the network interface attachment.
	AttachmentId *string `locationName:"attachmentId" type:"string"`

	// Indicates whether the network interface is deleted when the instance is terminated.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// The device index of the network interface attachment on the instance.
	DeviceIndex *int64 `locationName:"deviceIndex" type:"integer"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The AWS account ID of the owner of the instance.
	InstanceOwnerId *string `locationName:"instanceOwnerId" type:"string"`

	// The attachment state.
	Status *string `locationName:"status" type:"string" enum:"AttachmentStatus"`
}

// String returns the string representation
func (s NetworkInterfaceAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfaceAttachment) GoString() string {
	return s.String()
}

// SetAttachTime sets the AttachTime field's value.
func (s *NetworkInterfaceAttachment) SetAttachTime(v time.Time) *NetworkInterfaceAttachment {
	s.AttachTime = &v
	return s
}

// SetAttachmentId sets the AttachmentId field's value.
func (s *NetworkInterfaceAttachment) SetAttachmentId(v string) *NetworkInterfaceAttachment {
	s.AttachmentId = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *NetworkInterfaceAttachment) SetDeleteOnTermination(v bool) *NetworkInterfaceAttachment {
	s.DeleteOnTermination = &v
	return s
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *NetworkInterfaceAttachment) SetDeviceIndex(v int64) *NetworkInterfaceAttachment {
	s.DeviceIndex = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *NetworkInterfaceAttachment) SetInstanceId(v string) *NetworkInterfaceAttachment {
	s.InstanceId = &v
	return s
}

// SetInstanceOwnerId sets the InstanceOwnerId field's value.
func (s *NetworkInterfaceAttachment) SetInstanceOwnerId(v string) *NetworkInterfaceAttachment {
	s.InstanceOwnerId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *NetworkInterfaceAttachment) SetStatus(v string) *NetworkInterfaceAttachment {
	s.Status = &v
	return s
}

// Describes an attachment change.
type NetworkInterfaceAttachmentChanges struct {
	_ struct{} `type:"structure"`

	// The ID of the network interface attachment.
	AttachmentId *string `locationName:"attachmentId" type:"string"`

	// Indicates whether the network interface is deleted when the instance is terminated.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`
}

// String returns the string representation
func (s NetworkInterfaceAttachmentChanges) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfaceAttachmentChanges) GoString() string {
	return s.String()
}

// SetAttachmentId sets the AttachmentId field's value.
func (s *NetworkInterfaceAttachmentChanges) SetAttachmentId(v string) *NetworkInterfaceAttachmentChanges {
	s.AttachmentId = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *NetworkInterfaceAttachmentChanges) SetDeleteOnTermination(v bool) *NetworkInterfaceAttachmentChanges {
	s.DeleteOnTermination = &v
	return s
}

// Describes an IPv6 address associated with a network interface.
type NetworkInterfaceIpv6Address struct {
	_ struct{} `type:"structure"`

	// The IPv6 address.
	Ipv6Address *string `locationName:"ipv6Address" type:"string"`
}

// String returns the string representation
func (s NetworkInterfaceIpv6Address) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfaceIpv6Address) GoString() string {
	return s.String()
}

// SetIpv6Address sets the Ipv6Address field's value.
func (s *NetworkInterfaceIpv6Address) SetIpv6Address(v string) *NetworkInterfaceIpv6Address {
	s.Ipv6Address = &v
	return s
}

// Describes a permission for a network interface.
type NetworkInterfacePermission struct {
	_ struct{} `type:"structure"`

	// The AWS account ID.
	AwsAccountId *string `locationName:"awsAccountId" type:"string"`

	// The AWS service.
	AwsService *string `locationName:"awsService" type:"string"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The ID of the network interface permission.
	NetworkInterfacePermissionId *string `locationName:"networkInterfacePermissionId" type:"string"`

	// The type of permission.
	Permission *string `locationName:"permission" type:"string" enum:"InterfacePermissionType"`

	// Information about the state of the permission.
	PermissionState *NetworkInterfacePermissionState `locationName:"permissionState" type:"structure"`
}

// String returns the string representation
func (s NetworkInterfacePermission) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfacePermission) GoString() string {
	return s.String()
}

// SetAwsAccountId sets the AwsAccountId field's value.
func (s *NetworkInterfacePermission) SetAwsAccountId(v string) *NetworkInterfacePermission {
	s.AwsAccountId = &v
	return s
}

// SetAwsService sets the AwsService field's value.
func (s *NetworkInterfacePermission) SetAwsService(v string) *NetworkInterfacePermission {
	s.AwsService = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *NetworkInterfacePermission) SetNetworkInterfaceId(v string) *NetworkInterfacePermission {
	s.NetworkInterfaceId = &v
	return s
}

// SetNetworkInterfacePermissionId sets the NetworkInterfacePermissionId field's value.
func (s *NetworkInterfacePermission) SetNetworkInterfacePermissionId(v string) *NetworkInterfacePermission {
	s.NetworkInterfacePermissionId = &v
	return s
}

// SetPermission sets the Permission field's value.
func (s *NetworkInterfacePermission) SetPermission(v string) *NetworkInterfacePermission {
	s.Permission = &v
	return s
}

// SetPermissionState sets the PermissionState field's value.
func (s *NetworkInterfacePermission) SetPermissionState(v *NetworkInterfacePermissionState) *NetworkInterfacePermission {
	s.PermissionState = v
	return s
}

// Describes the state of a network interface permission.
type NetworkInterfacePermissionState struct {
	_ struct{} `type:"structure"`

	// The state of the permission.
	State *string `locationName:"state" type:"string" enum:"NetworkInterfacePermissionStateCode"`

	// A status message, if applicable.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s NetworkInterfacePermissionState) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfacePermissionState) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *NetworkInterfacePermissionState) SetState(v string) *NetworkInterfacePermissionState {
	s.State = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *NetworkInterfacePermissionState) SetStatusMessage(v string) *NetworkInterfacePermissionState {
	s.StatusMessage = &v
	return s
}

// Describes the private IPv4 address of a network interface.
type NetworkInterfacePrivateIpAddress struct {
	_ struct{} `type:"structure"`

	// The association information for an Elastic IP address (IPv4) associated with
	// the network interface.
	Association *NetworkInterfaceAssociation `locationName:"association" type:"structure"`

	// Indicates whether this IPv4 address is the primary private IPv4 address of
	// the network interface.
	Primary *bool `locationName:"primary" type:"boolean"`

	// The private DNS name.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The private IPv4 address.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`
}

// String returns the string representation
func (s NetworkInterfacePrivateIpAddress) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NetworkInterfacePrivateIpAddress) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *NetworkInterfacePrivateIpAddress) SetAssociation(v *NetworkInterfaceAssociation) *NetworkInterfacePrivateIpAddress {
	s.Association = v
	return s
}

// SetPrimary sets the Primary field's value.
func (s *NetworkInterfacePrivateIpAddress) SetPrimary(v bool) *NetworkInterfacePrivateIpAddress {
	s.Primary = &v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *NetworkInterfacePrivateIpAddress) SetPrivateDnsName(v string) *NetworkInterfacePrivateIpAddress {
	s.PrivateDnsName = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *NetworkInterfacePrivateIpAddress) SetPrivateIpAddress(v string) *NetworkInterfacePrivateIpAddress {
	s.PrivateIpAddress = &v
	return s
}

type NewDhcpConfiguration struct {
	_ struct{} `type:"structure"`

	Key *string `locationName:"key" type:"string"`

	Values []*string `locationName:"Value" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s NewDhcpConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NewDhcpConfiguration) GoString() string {
	return s.String()
}

// SetKey sets the Key field's value.
func (s *NewDhcpConfiguration) SetKey(v string) *NewDhcpConfiguration {
	s.Key = &v
	return s
}

// SetValues sets the Values field's value.
func (s *NewDhcpConfiguration) SetValues(v []*string) *NewDhcpConfiguration {
	s.Values = v
	return s
}

// The allocation strategy of On-Demand Instances in an EC2 Fleet.
type OnDemandOptions struct {
	_ struct{} `type:"structure"`

	// The order of the launch template overrides to use in fulfilling On-Demand
	// capacity. If you specify lowest-price, EC2 Fleet uses price to determine
	// the order, launching the lowest price first. If you specify prioritized,
	// EC2 Fleet uses the priority that you assigned to each launch template override,
	// launching the highest priority first. If you do not specify a value, EC2
	// Fleet defaults to lowest-price.
	AllocationStrategy *string `locationName:"allocationStrategy" type:"string" enum:"FleetOnDemandAllocationStrategy"`

	// The minimum target capacity for On-Demand Instances in the fleet. If the
	// minimum target capacity is not reached, the fleet launches no instances.
	MinTargetCapacity *int64 `locationName:"minTargetCapacity" type:"integer"`

	// Indicates that the fleet launches all On-Demand Instances into a single Availability
	// Zone.
	SingleAvailabilityZone *bool `locationName:"singleAvailabilityZone" type:"boolean"`

	// Indicates that the fleet uses a single instance type to launch all On-Demand
	// Instances in the fleet.
	SingleInstanceType *bool `locationName:"singleInstanceType" type:"boolean"`
}

// String returns the string representation
func (s OnDemandOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s OnDemandOptions) GoString() string {
	return s.String()
}

// SetAllocationStrategy sets the AllocationStrategy field's value.
func (s *OnDemandOptions) SetAllocationStrategy(v string) *OnDemandOptions {
	s.AllocationStrategy = &v
	return s
}

// SetMinTargetCapacity sets the MinTargetCapacity field's value.
func (s *OnDemandOptions) SetMinTargetCapacity(v int64) *OnDemandOptions {
	s.MinTargetCapacity = &v
	return s
}

// SetSingleAvailabilityZone sets the SingleAvailabilityZone field's value.
func (s *OnDemandOptions) SetSingleAvailabilityZone(v bool) *OnDemandOptions {
	s.SingleAvailabilityZone = &v
	return s
}

// SetSingleInstanceType sets the SingleInstanceType field's value.
func (s *OnDemandOptions) SetSingleInstanceType(v bool) *OnDemandOptions {
	s.SingleInstanceType = &v
	return s
}

// The allocation strategy of On-Demand Instances in an EC2 Fleet.
type OnDemandOptionsRequest struct {
	_ struct{} `type:"structure"`

	// The order of the launch template overrides to use in fulfilling On-Demand
	// capacity. If you specify lowest-price, EC2 Fleet uses price to determine
	// the order, launching the lowest price first. If you specify prioritized,
	// EC2 Fleet uses the priority that you assigned to each launch template override,
	// launching the highest priority first. If you do not specify a value, EC2
	// Fleet defaults to lowest-price.
	AllocationStrategy *string `type:"string" enum:"FleetOnDemandAllocationStrategy"`

	// The minimum target capacity for On-Demand Instances in the fleet. If the
	// minimum target capacity is not reached, the fleet launches no instances.
	MinTargetCapacity *int64 `type:"integer"`

	// Indicates that the fleet launches all On-Demand Instances into a single Availability
	// Zone.
	SingleAvailabilityZone *bool `type:"boolean"`

	// Indicates that the fleet uses a single instance type to launch all On-Demand
	// Instances in the fleet.
	SingleInstanceType *bool `type:"boolean"`
}

// String returns the string representation
func (s OnDemandOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s OnDemandOptionsRequest) GoString() string {
	return s.String()
}

// SetAllocationStrategy sets the AllocationStrategy field's value.
func (s *OnDemandOptionsRequest) SetAllocationStrategy(v string) *OnDemandOptionsRequest {
	s.AllocationStrategy = &v
	return s
}

// SetMinTargetCapacity sets the MinTargetCapacity field's value.
func (s *OnDemandOptionsRequest) SetMinTargetCapacity(v int64) *OnDemandOptionsRequest {
	s.MinTargetCapacity = &v
	return s
}

// SetSingleAvailabilityZone sets the SingleAvailabilityZone field's value.
func (s *OnDemandOptionsRequest) SetSingleAvailabilityZone(v bool) *OnDemandOptionsRequest {
	s.SingleAvailabilityZone = &v
	return s
}

// SetSingleInstanceType sets the SingleInstanceType field's value.
func (s *OnDemandOptionsRequest) SetSingleInstanceType(v bool) *OnDemandOptionsRequest {
	s.SingleInstanceType = &v
	return s
}

// Describes the data that identifies an Amazon FPGA image (AFI) on the PCI
// bus.
type PciId struct {
	_ struct{} `type:"structure"`

	// The ID of the device.
	DeviceId *string `type:"string"`

	// The ID of the subsystem.
	SubsystemId *string `type:"string"`

	// The ID of the vendor for the subsystem.
	SubsystemVendorId *string `type:"string"`

	// The ID of the vendor.
	VendorId *string `type:"string"`
}

// String returns the string representation
func (s PciId) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PciId) GoString() string {
	return s.String()
}

// SetDeviceId sets the DeviceId field's value.
func (s *PciId) SetDeviceId(v string) *PciId {
	s.DeviceId = &v
	return s
}

// SetSubsystemId sets the SubsystemId field's value.
func (s *PciId) SetSubsystemId(v string) *PciId {
	s.SubsystemId = &v
	return s
}

// SetSubsystemVendorId sets the SubsystemVendorId field's value.
func (s *PciId) SetSubsystemVendorId(v string) *PciId {
	s.SubsystemVendorId = &v
	return s
}

// SetVendorId sets the VendorId field's value.
func (s *PciId) SetVendorId(v string) *PciId {
	s.VendorId = &v
	return s
}

// Describes the VPC peering connection options.
type PeeringConnectionOptions struct {
	_ struct{} `type:"structure"`

	// If true, the public DNS hostnames of instances in the specified VPC resolve
	// to private IP addresses when queried from instances in the peer VPC.
	AllowDnsResolutionFromRemoteVpc *bool `locationName:"allowDnsResolutionFromRemoteVpc" type:"boolean"`

	// If true, enables outbound communication from an EC2-Classic instance that's
	// linked to a local VPC using ClassicLink to instances in a peer VPC.
	AllowEgressFromLocalClassicLinkToRemoteVpc *bool `locationName:"allowEgressFromLocalClassicLinkToRemoteVpc" type:"boolean"`

	// If true, enables outbound communication from instances in a local VPC to
	// an EC2-Classic instance that's linked to a peer VPC using ClassicLink.
	AllowEgressFromLocalVpcToRemoteClassicLink *bool `locationName:"allowEgressFromLocalVpcToRemoteClassicLink" type:"boolean"`
}

// String returns the string representation
func (s PeeringConnectionOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PeeringConnectionOptions) GoString() string {
	return s.String()
}

// SetAllowDnsResolutionFromRemoteVpc sets the AllowDnsResolutionFromRemoteVpc field's value.
func (s *PeeringConnectionOptions) SetAllowDnsResolutionFromRemoteVpc(v bool) *PeeringConnectionOptions {
	s.AllowDnsResolutionFromRemoteVpc = &v
	return s
}

// SetAllowEgressFromLocalClassicLinkToRemoteVpc sets the AllowEgressFromLocalClassicLinkToRemoteVpc field's value.
func (s *PeeringConnectionOptions) SetAllowEgressFromLocalClassicLinkToRemoteVpc(v bool) *PeeringConnectionOptions {
	s.AllowEgressFromLocalClassicLinkToRemoteVpc = &v
	return s
}

// SetAllowEgressFromLocalVpcToRemoteClassicLink sets the AllowEgressFromLocalVpcToRemoteClassicLink field's value.
func (s *PeeringConnectionOptions) SetAllowEgressFromLocalVpcToRemoteClassicLink(v bool) *PeeringConnectionOptions {
	s.AllowEgressFromLocalVpcToRemoteClassicLink = &v
	return s
}

// The VPC peering connection options.
type PeeringConnectionOptionsRequest struct {
	_ struct{} `type:"structure"`

	// If true, enables a local VPC to resolve public DNS hostnames to private IP
	// addresses when queried from instances in the peer VPC.
	AllowDnsResolutionFromRemoteVpc *bool `type:"boolean"`

	// If true, enables outbound communication from an EC2-Classic instance that's
	// linked to a local VPC using ClassicLink to instances in a peer VPC.
	AllowEgressFromLocalClassicLinkToRemoteVpc *bool `type:"boolean"`

	// If true, enables outbound communication from instances in a local VPC to
	// an EC2-Classic instance that's linked to a peer VPC using ClassicLink.
	AllowEgressFromLocalVpcToRemoteClassicLink *bool `type:"boolean"`
}

// String returns the string representation
func (s PeeringConnectionOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PeeringConnectionOptionsRequest) GoString() string {
	return s.String()
}

// SetAllowDnsResolutionFromRemoteVpc sets the AllowDnsResolutionFromRemoteVpc field's value.
func (s *PeeringConnectionOptionsRequest) SetAllowDnsResolutionFromRemoteVpc(v bool) *PeeringConnectionOptionsRequest {
	s.AllowDnsResolutionFromRemoteVpc = &v
	return s
}

// SetAllowEgressFromLocalClassicLinkToRemoteVpc sets the AllowEgressFromLocalClassicLinkToRemoteVpc field's value.
func (s *PeeringConnectionOptionsRequest) SetAllowEgressFromLocalClassicLinkToRemoteVpc(v bool) *PeeringConnectionOptionsRequest {
	s.AllowEgressFromLocalClassicLinkToRemoteVpc = &v
	return s
}

// SetAllowEgressFromLocalVpcToRemoteClassicLink sets the AllowEgressFromLocalVpcToRemoteClassicLink field's value.
func (s *PeeringConnectionOptionsRequest) SetAllowEgressFromLocalVpcToRemoteClassicLink(v bool) *PeeringConnectionOptionsRequest {
	s.AllowEgressFromLocalVpcToRemoteClassicLink = &v
	return s
}

// Describes the placement of an instance.
type Placement struct {
	_ struct{} `type:"structure"`

	// The affinity setting for the instance on the Dedicated Host. This parameter
	// is not supported for the ImportInstance command.
	Affinity *string `locationName:"affinity" type:"string"`

	// The Availability Zone of the instance.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The name of the placement group the instance is in.
	GroupName *string `locationName:"groupName" type:"string"`

	// The ID of the Dedicated Host on which the instance resides. This parameter
	// is not supported for the ImportInstance command.
	HostId *string `locationName:"hostId" type:"string"`

	// The number of the partition the instance is in. Valid only if the placement
	// group strategy is set to partition.
	PartitionNumber *int64 `locationName:"partitionNumber" type:"integer"`

	// Reserved for future use.
	SpreadDomain *string `locationName:"spreadDomain" type:"string"`

	// The tenancy of the instance (if the instance is running in a VPC). An instance
	// with a tenancy of dedicated runs on single-tenant hardware. The host tenancy
	// is not supported for the ImportInstance command.
	Tenancy *string `locationName:"tenancy" type:"string" enum:"Tenancy"`
}

// String returns the string representation
func (s Placement) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Placement) GoString() string {
	return s.String()
}

// SetAffinity sets the Affinity field's value.
func (s *Placement) SetAffinity(v string) *Placement {
	s.Affinity = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *Placement) SetAvailabilityZone(v string) *Placement {
	s.AvailabilityZone = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *Placement) SetGroupName(v string) *Placement {
	s.GroupName = &v
	return s
}

// SetHostId sets the HostId field's value.
func (s *Placement) SetHostId(v string) *Placement {
	s.HostId = &v
	return s
}

// SetPartitionNumber sets the PartitionNumber field's value.
func (s *Placement) SetPartitionNumber(v int64) *Placement {
	s.PartitionNumber = &v
	return s
}

// SetSpreadDomain sets the SpreadDomain field's value.
func (s *Placement) SetSpreadDomain(v string) *Placement {
	s.SpreadDomain = &v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *Placement) SetTenancy(v string) *Placement {
	s.Tenancy = &v
	return s
}

// Describes a placement group.
type PlacementGroup struct {
	_ struct{} `type:"structure"`

	// The name of the placement group.
	GroupName *string `locationName:"groupName" type:"string"`

	// The number of partitions. Valid only if strategy is set to partition.
	PartitionCount *int64 `locationName:"partitionCount" type:"integer"`

	// The state of the placement group.
	State *string `locationName:"state" type:"string" enum:"PlacementGroupState"`

	// The placement strategy.
	Strategy *string `locationName:"strategy" type:"string" enum:"PlacementStrategy"`
}

// String returns the string representation
func (s PlacementGroup) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PlacementGroup) GoString() string {
	return s.String()
}

// SetGroupName sets the GroupName field's value.
func (s *PlacementGroup) SetGroupName(v string) *PlacementGroup {
	s.GroupName = &v
	return s
}

// SetPartitionCount sets the PartitionCount field's value.
func (s *PlacementGroup) SetPartitionCount(v int64) *PlacementGroup {
	s.PartitionCount = &v
	return s
}

// SetState sets the State field's value.
func (s *PlacementGroup) SetState(v string) *PlacementGroup {
	s.State = &v
	return s
}

// SetStrategy sets the Strategy field's value.
func (s *PlacementGroup) SetStrategy(v string) *PlacementGroup {
	s.Strategy = &v
	return s
}

// Describes the placement of an instance.
type PlacementResponse struct {
	_ struct{} `type:"structure"`

	// The name of the placement group the instance is in.
	GroupName *string `locationName:"groupName" type:"string"`
}

// String returns the string representation
func (s PlacementResponse) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PlacementResponse) GoString() string {
	return s.String()
}

// SetGroupName sets the GroupName field's value.
func (s *PlacementResponse) SetGroupName(v string) *PlacementResponse {
	s.GroupName = &v
	return s
}

// Describes a range of ports.
type PortRange struct {
	_ struct{} `type:"structure"`

	// The first port in the range.
	From *int64 `locationName:"from" type:"integer"`

	// The last port in the range.
	To *int64 `locationName:"to" type:"integer"`
}

// String returns the string representation
func (s PortRange) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PortRange) GoString() string {
	return s.String()
}

// SetFrom sets the From field's value.
func (s *PortRange) SetFrom(v int64) *PortRange {
	s.From = &v
	return s
}

// SetTo sets the To field's value.
func (s *PortRange) SetTo(v int64) *PortRange {
	s.To = &v
	return s
}

// Describes prefixes for AWS services.
type PrefixList struct {
	_ struct{} `type:"structure"`

	// The IP address range of the AWS service.
	Cidrs []*string `locationName:"cidrSet" locationNameList:"item" type:"list"`

	// The ID of the prefix.
	PrefixListId *string `locationName:"prefixListId" type:"string"`

	// The name of the prefix.
	PrefixListName *string `locationName:"prefixListName" type:"string"`
}

// String returns the string representation
func (s PrefixList) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PrefixList) GoString() string {
	return s.String()
}

// SetCidrs sets the Cidrs field's value.
func (s *PrefixList) SetCidrs(v []*string) *PrefixList {
	s.Cidrs = v
	return s
}

// SetPrefixListId sets the PrefixListId field's value.
func (s *PrefixList) SetPrefixListId(v string) *PrefixList {
	s.PrefixListId = &v
	return s
}

// SetPrefixListName sets the PrefixListName field's value.
func (s *PrefixList) SetPrefixListName(v string) *PrefixList {
	s.PrefixListName = &v
	return s
}

// Describes a prefix list ID.
type PrefixListId struct {
	_ struct{} `type:"structure"`

	// A description for the security group rule that references this prefix list
	// ID.
	//
	// Constraints: Up to 255 characters in length. Allowed characters are a-z,
	// A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*
	Description *string `locationName:"description" type:"string"`

	// The ID of the prefix.
	PrefixListId *string `locationName:"prefixListId" type:"string"`
}

// String returns the string representation
func (s PrefixListId) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PrefixListId) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *PrefixListId) SetDescription(v string) *PrefixListId {
	s.Description = &v
	return s
}

// SetPrefixListId sets the PrefixListId field's value.
func (s *PrefixListId) SetPrefixListId(v string) *PrefixListId {
	s.PrefixListId = &v
	return s
}

// Describes the price for a Reserved Instance.
type PriceSchedule struct {
	_ struct{} `type:"structure"`

	// The current price schedule, as determined by the term remaining for the Reserved
	// Instance in the listing.
	//
	// A specific price schedule is always in effect, but only one price schedule
	// can be active at any time. Take, for example, a Reserved Instance listing
	// that has five months remaining in its term. When you specify price schedules
	// for five months and two months, this means that schedule 1, covering the
	// first three months of the remaining term, will be active during months 5,
	// 4, and 3. Then schedule 2, covering the last two months of the term, will
	// be active for months 2 and 1.
	Active *bool `locationName:"active" type:"boolean"`

	// The currency for transacting the Reserved Instance resale. At this time,
	// the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The fixed price for the term.
	Price *float64 `locationName:"price" type:"double"`

	// The number of months remaining in the reservation. For example, 2 is the
	// second to the last month before the capacity reservation expires.
	Term *int64 `locationName:"term" type:"long"`
}

// String returns the string representation
func (s PriceSchedule) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PriceSchedule) GoString() string {
	return s.String()
}

// SetActive sets the Active field's value.
func (s *PriceSchedule) SetActive(v bool) *PriceSchedule {
	s.Active = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *PriceSchedule) SetCurrencyCode(v string) *PriceSchedule {
	s.CurrencyCode = &v
	return s
}

// SetPrice sets the Price field's value.
func (s *PriceSchedule) SetPrice(v float64) *PriceSchedule {
	s.Price = &v
	return s
}

// SetTerm sets the Term field's value.
func (s *PriceSchedule) SetTerm(v int64) *PriceSchedule {
	s.Term = &v
	return s
}

// Describes the price for a Reserved Instance.
type PriceScheduleSpecification struct {
	_ struct{} `type:"structure"`

	// The currency for transacting the Reserved Instance resale. At this time,
	// the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The fixed price for the term.
	Price *float64 `locationName:"price" type:"double"`

	// The number of months remaining in the reservation. For example, 2 is the
	// second to the last month before the capacity reservation expires.
	Term *int64 `locationName:"term" type:"long"`
}

// String returns the string representation
func (s PriceScheduleSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PriceScheduleSpecification) GoString() string {
	return s.String()
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *PriceScheduleSpecification) SetCurrencyCode(v string) *PriceScheduleSpecification {
	s.CurrencyCode = &v
	return s
}

// SetPrice sets the Price field's value.
func (s *PriceScheduleSpecification) SetPrice(v float64) *PriceScheduleSpecification {
	s.Price = &v
	return s
}

// SetTerm sets the Term field's value.
func (s *PriceScheduleSpecification) SetTerm(v int64) *PriceScheduleSpecification {
	s.Term = &v
	return s
}

// Describes a Reserved Instance offering.
type PricingDetail struct {
	_ struct{} `type:"structure"`

	// The number of reservations available for the price.
	Count *int64 `locationName:"count" type:"integer"`

	// The price per instance.
	Price *float64 `locationName:"price" type:"double"`
}

// String returns the string representation
func (s PricingDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PricingDetail) GoString() string {
	return s.String()
}

// SetCount sets the Count field's value.
func (s *PricingDetail) SetCount(v int64) *PricingDetail {
	s.Count = &v
	return s
}

// SetPrice sets the Price field's value.
func (s *PricingDetail) SetPrice(v float64) *PricingDetail {
	s.Price = &v
	return s
}

// PrincipalIdFormat description
type PrincipalIdFormat struct {
	_ struct{} `type:"structure"`

	// PrincipalIdFormatARN description
	Arn *string `locationName:"arn" type:"string"`

	// PrincipalIdFormatStatuses description
	Statuses []*IdFormat `locationName:"statusSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s PrincipalIdFormat) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PrincipalIdFormat) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *PrincipalIdFormat) SetArn(v string) *PrincipalIdFormat {
	s.Arn = &v
	return s
}

// SetStatuses sets the Statuses field's value.
func (s *PrincipalIdFormat) SetStatuses(v []*IdFormat) *PrincipalIdFormat {
	s.Statuses = v
	return s
}

// Describes a secondary private IPv4 address for a network interface.
type PrivateIpAddressSpecification struct {
	_ struct{} `type:"structure"`

	// Indicates whether the private IPv4 address is the primary private IPv4 address.
	// Only one IPv4 address can be designated as primary.
	Primary *bool `locationName:"primary" type:"boolean"`

	// The private IPv4 addresses.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`
}

// String returns the string representation
func (s PrivateIpAddressSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PrivateIpAddressSpecification) GoString() string {
	return s.String()
}

// SetPrimary sets the Primary field's value.
func (s *PrivateIpAddressSpecification) SetPrimary(v bool) *PrivateIpAddressSpecification {
	s.Primary = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *PrivateIpAddressSpecification) SetPrivateIpAddress(v string) *PrivateIpAddressSpecification {
	s.PrivateIpAddress = &v
	return s
}

// Describes a product code.
type ProductCode struct {
	_ struct{} `type:"structure"`

	// The product code.
	ProductCodeId *string `locationName:"productCode" type:"string"`

	// The type of product code.
	ProductCodeType *string `locationName:"type" type:"string" enum:"ProductCodeValues"`
}

// String returns the string representation
func (s ProductCode) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ProductCode) GoString() string {
	return s.String()
}

// SetProductCodeId sets the ProductCodeId field's value.
func (s *ProductCode) SetProductCodeId(v string) *ProductCode {
	s.ProductCodeId = &v
	return s
}

// SetProductCodeType sets the ProductCodeType field's value.
func (s *ProductCode) SetProductCodeType(v string) *ProductCode {
	s.ProductCodeType = &v
	return s
}

// Describes a virtual private gateway propagating route.
type PropagatingVgw struct {
	_ struct{} `type:"structure"`

	// The ID of the virtual private gateway.
	GatewayId *string `locationName:"gatewayId" type:"string"`
}

// String returns the string representation
func (s PropagatingVgw) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PropagatingVgw) GoString() string {
	return s.String()
}

// SetGatewayId sets the GatewayId field's value.
func (s *PropagatingVgw) SetGatewayId(v string) *PropagatingVgw {
	s.GatewayId = &v
	return s
}

type ProvisionByoipCidrInput struct {
	_ struct{} `type:"structure"`

	// The public IPv4 address range, in CIDR notation. The most specific prefix
	// that you can specify is /24. The address range cannot overlap with another
	// address range that you've brought to this or another region.
	//
	// Cidr is a required field
	Cidr *string `type:"string" required:"true"`

	// A signed document that proves that you are authorized to bring the specified
	// IP address range to Amazon using BYOIP.
	CidrAuthorizationContext *CidrAuthorizationContext `type:"structure"`

	// A description for the address range and the address pool.
	Description *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s ProvisionByoipCidrInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ProvisionByoipCidrInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ProvisionByoipCidrInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ProvisionByoipCidrInput"}
	if s.Cidr == nil {
		invalidParams.Add(request.NewErrParamRequired("Cidr"))
	}
	if s.CidrAuthorizationContext != nil {
		if err := s.CidrAuthorizationContext.Validate(); err != nil {
			invalidParams.AddNested("CidrAuthorizationContext", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidr sets the Cidr field's value.
func (s *ProvisionByoipCidrInput) SetCidr(v string) *ProvisionByoipCidrInput {
	s.Cidr = &v
	return s
}

// SetCidrAuthorizationContext sets the CidrAuthorizationContext field's value.
func (s *ProvisionByoipCidrInput) SetCidrAuthorizationContext(v *CidrAuthorizationContext) *ProvisionByoipCidrInput {
	s.CidrAuthorizationContext = v
	return s
}

// SetDescription sets the Description field's value.
func (s *ProvisionByoipCidrInput) SetDescription(v string) *ProvisionByoipCidrInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ProvisionByoipCidrInput) SetDryRun(v bool) *ProvisionByoipCidrInput {
	s.DryRun = &v
	return s
}

type ProvisionByoipCidrOutput struct {
	_ struct{} `type:"structure"`

	// Information about the address pool.
	ByoipCidr *ByoipCidr `locationName:"byoipCidr" type:"structure"`
}

// String returns the string representation
func (s ProvisionByoipCidrOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ProvisionByoipCidrOutput) GoString() string {
	return s.String()
}

// SetByoipCidr sets the ByoipCidr field's value.
func (s *ProvisionByoipCidrOutput) SetByoipCidr(v *ByoipCidr) *ProvisionByoipCidrOutput {
	s.ByoipCidr = v
	return s
}

// Reserved. If you need to sustain traffic greater than the documented limits
// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
type ProvisionedBandwidth struct {
	_ struct{} `type:"structure"`

	// Reserved. If you need to sustain traffic greater than the documented limits
	// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
	// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
	ProvisionTime *time.Time `locationName:"provisionTime" type:"timestamp"`

	// Reserved. If you need to sustain traffic greater than the documented limits
	// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
	// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
	Provisioned *string `locationName:"provisioned" type:"string"`

	// Reserved. If you need to sustain traffic greater than the documented limits
	// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
	// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
	RequestTime *time.Time `locationName:"requestTime" type:"timestamp"`

	// Reserved. If you need to sustain traffic greater than the documented limits
	// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
	// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
	Requested *string `locationName:"requested" type:"string"`

	// Reserved. If you need to sustain traffic greater than the documented limits
	// (https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-nat-gateway.html),
	// contact us through the Support Center (https://console.aws.amazon.com/support/home?).
	Status *string `locationName:"status" type:"string"`
}

// String returns the string representation
func (s ProvisionedBandwidth) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ProvisionedBandwidth) GoString() string {
	return s.String()
}

// SetProvisionTime sets the ProvisionTime field's value.
func (s *ProvisionedBandwidth) SetProvisionTime(v time.Time) *ProvisionedBandwidth {
	s.ProvisionTime = &v
	return s
}

// SetProvisioned sets the Provisioned field's value.
func (s *ProvisionedBandwidth) SetProvisioned(v string) *ProvisionedBandwidth {
	s.Provisioned = &v
	return s
}

// SetRequestTime sets the RequestTime field's value.
func (s *ProvisionedBandwidth) SetRequestTime(v time.Time) *ProvisionedBandwidth {
	s.RequestTime = &v
	return s
}

// SetRequested sets the Requested field's value.
func (s *ProvisionedBandwidth) SetRequested(v string) *ProvisionedBandwidth {
	s.Requested = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ProvisionedBandwidth) SetStatus(v string) *ProvisionedBandwidth {
	s.Status = &v
	return s
}

// Describes an address pool.
type PublicIpv4Pool struct {
	_ struct{} `type:"structure"`

	// A description of the address pool.
	Description *string `locationName:"description" type:"string"`

	// The address ranges.
	PoolAddressRanges []*PublicIpv4PoolRange `locationName:"poolAddressRangeSet" locationNameList:"item" type:"list"`

	// The ID of the IPv4 address pool.
	PoolId *string `locationName:"poolId" type:"string"`

	// The total number of addresses.
	TotalAddressCount *int64 `locationName:"totalAddressCount" type:"integer"`

	// The total number of available addresses.
	TotalAvailableAddressCount *int64 `locationName:"totalAvailableAddressCount" type:"integer"`
}

// String returns the string representation
func (s PublicIpv4Pool) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PublicIpv4Pool) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *PublicIpv4Pool) SetDescription(v string) *PublicIpv4Pool {
	s.Description = &v
	return s
}

// SetPoolAddressRanges sets the PoolAddressRanges field's value.
func (s *PublicIpv4Pool) SetPoolAddressRanges(v []*PublicIpv4PoolRange) *PublicIpv4Pool {
	s.PoolAddressRanges = v
	return s
}

// SetPoolId sets the PoolId field's value.
func (s *PublicIpv4Pool) SetPoolId(v string) *PublicIpv4Pool {
	s.PoolId = &v
	return s
}

// SetTotalAddressCount sets the TotalAddressCount field's value.
func (s *PublicIpv4Pool) SetTotalAddressCount(v int64) *PublicIpv4Pool {
	s.TotalAddressCount = &v
	return s
}

// SetTotalAvailableAddressCount sets the TotalAvailableAddressCount field's value.
func (s *PublicIpv4Pool) SetTotalAvailableAddressCount(v int64) *PublicIpv4Pool {
	s.TotalAvailableAddressCount = &v
	return s
}

// Describes an address range of an IPv4 address pool.
type PublicIpv4PoolRange struct {
	_ struct{} `type:"structure"`

	// The number of addresses in the range.
	AddressCount *int64 `locationName:"addressCount" type:"integer"`

	// The number of available addresses in the range.
	AvailableAddressCount *int64 `locationName:"availableAddressCount" type:"integer"`

	// The first IP address in the range.
	FirstAddress *string `locationName:"firstAddress" type:"string"`

	// The last IP address in the range.
	LastAddress *string `locationName:"lastAddress" type:"string"`
}

// String returns the string representation
func (s PublicIpv4PoolRange) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PublicIpv4PoolRange) GoString() string {
	return s.String()
}

// SetAddressCount sets the AddressCount field's value.
func (s *PublicIpv4PoolRange) SetAddressCount(v int64) *PublicIpv4PoolRange {
	s.AddressCount = &v
	return s
}

// SetAvailableAddressCount sets the AvailableAddressCount field's value.
func (s *PublicIpv4PoolRange) SetAvailableAddressCount(v int64) *PublicIpv4PoolRange {
	s.AvailableAddressCount = &v
	return s
}

// SetFirstAddress sets the FirstAddress field's value.
func (s *PublicIpv4PoolRange) SetFirstAddress(v string) *PublicIpv4PoolRange {
	s.FirstAddress = &v
	return s
}

// SetLastAddress sets the LastAddress field's value.
func (s *PublicIpv4PoolRange) SetLastAddress(v string) *PublicIpv4PoolRange {
	s.LastAddress = &v
	return s
}

// Describes the result of the purchase.
type Purchase struct {
	_ struct{} `type:"structure"`

	// The currency in which the UpfrontPrice and HourlyPrice amounts are specified.
	// At this time, the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The duration of the reservation's term in seconds.
	Duration *int64 `locationName:"duration" type:"integer"`

	// The IDs of the Dedicated Hosts associated with the reservation.
	HostIdSet []*string `locationName:"hostIdSet" locationNameList:"item" type:"list"`

	// The ID of the reservation.
	HostReservationId *string `locationName:"hostReservationId" type:"string"`

	// The hourly price of the reservation per hour.
	HourlyPrice *string `locationName:"hourlyPrice" type:"string"`

	// The instance family on the Dedicated Host that the reservation can be associated
	// with.
	InstanceFamily *string `locationName:"instanceFamily" type:"string"`

	// The payment option for the reservation.
	PaymentOption *string `locationName:"paymentOption" type:"string" enum:"PaymentOption"`

	// The upfront price of the reservation.
	UpfrontPrice *string `locationName:"upfrontPrice" type:"string"`
}

// String returns the string representation
func (s Purchase) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Purchase) GoString() string {
	return s.String()
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *Purchase) SetCurrencyCode(v string) *Purchase {
	s.CurrencyCode = &v
	return s
}

// SetDuration sets the Duration field's value.
func (s *Purchase) SetDuration(v int64) *Purchase {
	s.Duration = &v
	return s
}

// SetHostIdSet sets the HostIdSet field's value.
func (s *Purchase) SetHostIdSet(v []*string) *Purchase {
	s.HostIdSet = v
	return s
}

// SetHostReservationId sets the HostReservationId field's value.
func (s *Purchase) SetHostReservationId(v string) *Purchase {
	s.HostReservationId = &v
	return s
}

// SetHourlyPrice sets the HourlyPrice field's value.
func (s *Purchase) SetHourlyPrice(v string) *Purchase {
	s.HourlyPrice = &v
	return s
}

// SetInstanceFamily sets the InstanceFamily field's value.
func (s *Purchase) SetInstanceFamily(v string) *Purchase {
	s.InstanceFamily = &v
	return s
}

// SetPaymentOption sets the PaymentOption field's value.
func (s *Purchase) SetPaymentOption(v string) *Purchase {
	s.PaymentOption = &v
	return s
}

// SetUpfrontPrice sets the UpfrontPrice field's value.
func (s *Purchase) SetUpfrontPrice(v string) *Purchase {
	s.UpfrontPrice = &v
	return s
}

type PurchaseHostReservationInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure idempotency of the
	// request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	ClientToken *string `type:"string"`

	// The currency in which the totalUpfrontPrice, LimitPrice, and totalHourlyPrice
	// amounts are specified. At this time, the only supported currency is USD.
	CurrencyCode *string `type:"string" enum:"CurrencyCodeValues"`

	// The IDs of the Dedicated Hosts with which the reservation will be associated.
	//
	// HostIdSet is a required field
	HostIdSet []*string `locationNameList:"item" type:"list" required:"true"`

	// The specified limit is checked against the total upfront cost of the reservation
	// (calculated as the offering's upfront cost multiplied by the host count).
	// If the total upfront cost is greater than the specified price limit, the
	// request fails. This is used to ensure that the purchase does not exceed the
	// expected upfront cost of the purchase. At this time, the only supported currency
	// is USD. For example, to indicate a limit price of USD 100, specify 100.00.
	LimitPrice *string `type:"string"`

	// The ID of the offering.
	//
	// OfferingId is a required field
	OfferingId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s PurchaseHostReservationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseHostReservationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *PurchaseHostReservationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "PurchaseHostReservationInput"}
	if s.HostIdSet == nil {
		invalidParams.Add(request.NewErrParamRequired("HostIdSet"))
	}
	if s.OfferingId == nil {
		invalidParams.Add(request.NewErrParamRequired("OfferingId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *PurchaseHostReservationInput) SetClientToken(v string) *PurchaseHostReservationInput {
	s.ClientToken = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *PurchaseHostReservationInput) SetCurrencyCode(v string) *PurchaseHostReservationInput {
	s.CurrencyCode = &v
	return s
}

// SetHostIdSet sets the HostIdSet field's value.
func (s *PurchaseHostReservationInput) SetHostIdSet(v []*string) *PurchaseHostReservationInput {
	s.HostIdSet = v
	return s
}

// SetLimitPrice sets the LimitPrice field's value.
func (s *PurchaseHostReservationInput) SetLimitPrice(v string) *PurchaseHostReservationInput {
	s.LimitPrice = &v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *PurchaseHostReservationInput) SetOfferingId(v string) *PurchaseHostReservationInput {
	s.OfferingId = &v
	return s
}

type PurchaseHostReservationOutput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure idempotency of the
	// request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The currency in which the totalUpfrontPrice and totalHourlyPrice amounts
	// are specified. At this time, the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// Describes the details of the purchase.
	Purchase []*Purchase `locationName:"purchase" locationNameList:"item" type:"list"`

	// The total hourly price of the reservation calculated per hour.
	TotalHourlyPrice *string `locationName:"totalHourlyPrice" type:"string"`

	// The total amount charged to your account when you purchase the reservation.
	TotalUpfrontPrice *string `locationName:"totalUpfrontPrice" type:"string"`
}

// String returns the string representation
func (s PurchaseHostReservationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseHostReservationOutput) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *PurchaseHostReservationOutput) SetClientToken(v string) *PurchaseHostReservationOutput {
	s.ClientToken = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *PurchaseHostReservationOutput) SetCurrencyCode(v string) *PurchaseHostReservationOutput {
	s.CurrencyCode = &v
	return s
}

// SetPurchase sets the Purchase field's value.
func (s *PurchaseHostReservationOutput) SetPurchase(v []*Purchase) *PurchaseHostReservationOutput {
	s.Purchase = v
	return s
}

// SetTotalHourlyPrice sets the TotalHourlyPrice field's value.
func (s *PurchaseHostReservationOutput) SetTotalHourlyPrice(v string) *PurchaseHostReservationOutput {
	s.TotalHourlyPrice = &v
	return s
}

// SetTotalUpfrontPrice sets the TotalUpfrontPrice field's value.
func (s *PurchaseHostReservationOutput) SetTotalUpfrontPrice(v string) *PurchaseHostReservationOutput {
	s.TotalUpfrontPrice = &v
	return s
}

// Describes a request to purchase Scheduled Instances.
type PurchaseRequest struct {
	_ struct{} `type:"structure"`

	// The number of instances.
	//
	// InstanceCount is a required field
	InstanceCount *int64 `type:"integer" required:"true"`

	// The purchase token.
	//
	// PurchaseToken is a required field
	PurchaseToken *string `type:"string" required:"true"`
}

// String returns the string representation
func (s PurchaseRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *PurchaseRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "PurchaseRequest"}
	if s.InstanceCount == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceCount"))
	}
	if s.PurchaseToken == nil {
		invalidParams.Add(request.NewErrParamRequired("PurchaseToken"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *PurchaseRequest) SetInstanceCount(v int64) *PurchaseRequest {
	s.InstanceCount = &v
	return s
}

// SetPurchaseToken sets the PurchaseToken field's value.
func (s *PurchaseRequest) SetPurchaseToken(v string) *PurchaseRequest {
	s.PurchaseToken = &v
	return s
}

// Contains the parameters for PurchaseReservedInstancesOffering.
type PurchaseReservedInstancesOfferingInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The number of Reserved Instances to purchase.
	//
	// InstanceCount is a required field
	InstanceCount *int64 `type:"integer" required:"true"`

	// Specified for Reserved Instance Marketplace offerings to limit the total
	// order and ensure that the Reserved Instances are not purchased at unexpected
	// prices.
	LimitPrice *ReservedInstanceLimitPrice `locationName:"limitPrice" type:"structure"`

	// The ID of the Reserved Instance offering to purchase.
	//
	// ReservedInstancesOfferingId is a required field
	ReservedInstancesOfferingId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s PurchaseReservedInstancesOfferingInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseReservedInstancesOfferingInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *PurchaseReservedInstancesOfferingInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "PurchaseReservedInstancesOfferingInput"}
	if s.InstanceCount == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceCount"))
	}
	if s.ReservedInstancesOfferingId == nil {
		invalidParams.Add(request.NewErrParamRequired("ReservedInstancesOfferingId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *PurchaseReservedInstancesOfferingInput) SetDryRun(v bool) *PurchaseReservedInstancesOfferingInput {
	s.DryRun = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *PurchaseReservedInstancesOfferingInput) SetInstanceCount(v int64) *PurchaseReservedInstancesOfferingInput {
	s.InstanceCount = &v
	return s
}

// SetLimitPrice sets the LimitPrice field's value.
func (s *PurchaseReservedInstancesOfferingInput) SetLimitPrice(v *ReservedInstanceLimitPrice) *PurchaseReservedInstancesOfferingInput {
	s.LimitPrice = v
	return s
}

// SetReservedInstancesOfferingId sets the ReservedInstancesOfferingId field's value.
func (s *PurchaseReservedInstancesOfferingInput) SetReservedInstancesOfferingId(v string) *PurchaseReservedInstancesOfferingInput {
	s.ReservedInstancesOfferingId = &v
	return s
}

// Contains the output of PurchaseReservedInstancesOffering.
type PurchaseReservedInstancesOfferingOutput struct {
	_ struct{} `type:"structure"`

	// The IDs of the purchased Reserved Instances.
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string"`
}

// String returns the string representation
func (s PurchaseReservedInstancesOfferingOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseReservedInstancesOfferingOutput) GoString() string {
	return s.String()
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *PurchaseReservedInstancesOfferingOutput) SetReservedInstancesId(v string) *PurchaseReservedInstancesOfferingOutput {
	s.ReservedInstancesId = &v
	return s
}

// Contains the parameters for PurchaseScheduledInstances.
type PurchaseScheduledInstancesInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that ensures the idempotency of the request.
	// For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string" idempotencyToken:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more purchase requests.
	//
	// PurchaseRequests is a required field
	PurchaseRequests []*PurchaseRequest `locationName:"PurchaseRequest" locationNameList:"PurchaseRequest" min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s PurchaseScheduledInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseScheduledInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *PurchaseScheduledInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "PurchaseScheduledInstancesInput"}
	if s.PurchaseRequests == nil {
		invalidParams.Add(request.NewErrParamRequired("PurchaseRequests"))
	}
	if s.PurchaseRequests != nil && len(s.PurchaseRequests) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("PurchaseRequests", 1))
	}
	if s.PurchaseRequests != nil {
		for i, v := range s.PurchaseRequests {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "PurchaseRequests", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *PurchaseScheduledInstancesInput) SetClientToken(v string) *PurchaseScheduledInstancesInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *PurchaseScheduledInstancesInput) SetDryRun(v bool) *PurchaseScheduledInstancesInput {
	s.DryRun = &v
	return s
}

// SetPurchaseRequests sets the PurchaseRequests field's value.
func (s *PurchaseScheduledInstancesInput) SetPurchaseRequests(v []*PurchaseRequest) *PurchaseScheduledInstancesInput {
	s.PurchaseRequests = v
	return s
}

// Contains the output of PurchaseScheduledInstances.
type PurchaseScheduledInstancesOutput struct {
	_ struct{} `type:"structure"`

	// Information about the Scheduled Instances.
	ScheduledInstanceSet []*ScheduledInstance `locationName:"scheduledInstanceSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s PurchaseScheduledInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PurchaseScheduledInstancesOutput) GoString() string {
	return s.String()
}

// SetScheduledInstanceSet sets the ScheduledInstanceSet field's value.
func (s *PurchaseScheduledInstancesOutput) SetScheduledInstanceSet(v []*ScheduledInstance) *PurchaseScheduledInstancesOutput {
	s.ScheduledInstanceSet = v
	return s
}

type RebootInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more instance IDs.
	//
	// InstanceIds is a required field
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list" required:"true"`
}

// String returns the string representation
func (s RebootInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RebootInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RebootInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RebootInstancesInput"}
	if s.InstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *RebootInstancesInput) SetDryRun(v bool) *RebootInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *RebootInstancesInput) SetInstanceIds(v []*string) *RebootInstancesInput {
	s.InstanceIds = v
	return s
}

type RebootInstancesOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s RebootInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RebootInstancesOutput) GoString() string {
	return s.String()
}

// Describes a recurring charge.
type RecurringCharge struct {
	_ struct{} `type:"structure"`

	// The amount of the recurring charge.
	Amount *float64 `locationName:"amount" type:"double"`

	// The frequency of the recurring charge.
	Frequency *string `locationName:"frequency" type:"string" enum:"RecurringChargeFrequency"`
}

// String returns the string representation
func (s RecurringCharge) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RecurringCharge) GoString() string {
	return s.String()
}

// SetAmount sets the Amount field's value.
func (s *RecurringCharge) SetAmount(v float64) *RecurringCharge {
	s.Amount = &v
	return s
}

// SetFrequency sets the Frequency field's value.
func (s *RecurringCharge) SetFrequency(v string) *RecurringCharge {
	s.Frequency = &v
	return s
}

// Describes a region.
type Region struct {
	_ struct{} `type:"structure"`

	// The region service endpoint.
	Endpoint *string `locationName:"regionEndpoint" type:"string"`

	// The name of the region.
	RegionName *string `locationName:"regionName" type:"string"`
}

// String returns the string representation
func (s Region) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Region) GoString() string {
	return s.String()
}

// SetEndpoint sets the Endpoint field's value.
func (s *Region) SetEndpoint(v string) *Region {
	s.Endpoint = &v
	return s
}

// SetRegionName sets the RegionName field's value.
func (s *Region) SetRegionName(v string) *Region {
	s.RegionName = &v
	return s
}

// Contains the parameters for RegisterImage.
type RegisterImageInput struct {
	_ struct{} `type:"structure"`

	// The architecture of the AMI.
	//
	// Default: For Amazon EBS-backed AMIs, i386. For instance store-backed AMIs,
	// the architecture specified in the manifest file.
	Architecture *string `locationName:"architecture" type:"string" enum:"ArchitectureValues"`

	// The billing product codes. Your account must be authorized to specify billing
	// product codes. Otherwise, you can use the AWS Marketplace to bill for the
	// use of an AMI.
	BillingProducts []*string `locationName:"BillingProduct" locationNameList:"item" type:"list"`

	// One or more block device mapping entries.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"BlockDeviceMapping" locationNameList:"BlockDeviceMapping" type:"list"`

	// A description for your AMI.
	Description *string `locationName:"description" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Set to true to enable enhanced networking with ENA for the AMI and any instances
	// that you launch from the AMI.
	//
	// This option is supported only for HVM AMIs. Specifying this option with a
	// PV AMI can make instances launched from the AMI unreachable.
	EnaSupport *bool `locationName:"enaSupport" type:"boolean"`

	// The full path to your AMI manifest in Amazon S3 storage.
	ImageLocation *string `type:"string"`

	// The ID of the kernel.
	KernelId *string `locationName:"kernelId" type:"string"`

	// A name for your AMI.
	//
	// Constraints: 3-128 alphanumeric characters, parentheses (()), square brackets
	// ([]), spaces ( ), periods (.), slashes (/), dashes (-), single quotes ('),
	// at-signs (@), or underscores(_)
	//
	// Name is a required field
	Name *string `locationName:"name" type:"string" required:"true"`

	// The ID of the RAM disk.
	RamdiskId *string `locationName:"ramdiskId" type:"string"`

	// The device name of the root device volume (for example, /dev/sda1).
	RootDeviceName *string `locationName:"rootDeviceName" type:"string"`

	// Set to simple to enable enhanced networking with the Intel 82599 Virtual
	// Function interface for the AMI and any instances that you launch from the
	// AMI.
	//
	// There is no way to disable sriovNetSupport at this time.
	//
	// This option is supported only for HVM AMIs. Specifying this option with a
	// PV AMI can make instances launched from the AMI unreachable.
	SriovNetSupport *string `locationName:"sriovNetSupport" type:"string"`

	// The type of virtualization (hvm | paravirtual).
	//
	// Default: paravirtual
	VirtualizationType *string `locationName:"virtualizationType" type:"string"`
}

// String returns the string representation
func (s RegisterImageInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RegisterImageInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RegisterImageInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RegisterImageInput"}
	if s.Name == nil {
		invalidParams.Add(request.NewErrParamRequired("Name"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetArchitecture sets the Architecture field's value.
func (s *RegisterImageInput) SetArchitecture(v string) *RegisterImageInput {
	s.Architecture = &v
	return s
}

// SetBillingProducts sets the BillingProducts field's value.
func (s *RegisterImageInput) SetBillingProducts(v []*string) *RegisterImageInput {
	s.BillingProducts = v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *RegisterImageInput) SetBlockDeviceMappings(v []*BlockDeviceMapping) *RegisterImageInput {
	s.BlockDeviceMappings = v
	return s
}

// SetDescription sets the Description field's value.
func (s *RegisterImageInput) SetDescription(v string) *RegisterImageInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RegisterImageInput) SetDryRun(v bool) *RegisterImageInput {
	s.DryRun = &v
	return s
}

// SetEnaSupport sets the EnaSupport field's value.
func (s *RegisterImageInput) SetEnaSupport(v bool) *RegisterImageInput {
	s.EnaSupport = &v
	return s
}

// SetImageLocation sets the ImageLocation field's value.
func (s *RegisterImageInput) SetImageLocation(v string) *RegisterImageInput {
	s.ImageLocation = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *RegisterImageInput) SetKernelId(v string) *RegisterImageInput {
	s.KernelId = &v
	return s
}

// SetName sets the Name field's value.
func (s *RegisterImageInput) SetName(v string) *RegisterImageInput {
	s.Name = &v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *RegisterImageInput) SetRamdiskId(v string) *RegisterImageInput {
	s.RamdiskId = &v
	return s
}

// SetRootDeviceName sets the RootDeviceName field's value.
func (s *RegisterImageInput) SetRootDeviceName(v string) *RegisterImageInput {
	s.RootDeviceName = &v
	return s
}

// SetSriovNetSupport sets the SriovNetSupport field's value.
func (s *RegisterImageInput) SetSriovNetSupport(v string) *RegisterImageInput {
	s.SriovNetSupport = &v
	return s
}

// SetVirtualizationType sets the VirtualizationType field's value.
func (s *RegisterImageInput) SetVirtualizationType(v string) *RegisterImageInput {
	s.VirtualizationType = &v
	return s
}

// Contains the output of RegisterImage.
type RegisterImageOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the newly registered AMI.
	ImageId *string `locationName:"imageId" type:"string"`
}

// String returns the string representation
func (s RegisterImageOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RegisterImageOutput) GoString() string {
	return s.String()
}

// SetImageId sets the ImageId field's value.
func (s *RegisterImageOutput) SetImageId(v string) *RegisterImageOutput {
	s.ImageId = &v
	return s
}

type RejectTransitGatewayVpcAttachmentInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	//
	// TransitGatewayAttachmentId is a required field
	TransitGatewayAttachmentId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s RejectTransitGatewayVpcAttachmentInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RejectTransitGatewayVpcAttachmentInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RejectTransitGatewayVpcAttachmentInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RejectTransitGatewayVpcAttachmentInput"}
	if s.TransitGatewayAttachmentId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayAttachmentId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *RejectTransitGatewayVpcAttachmentInput) SetDryRun(v bool) *RejectTransitGatewayVpcAttachmentInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *RejectTransitGatewayVpcAttachmentInput) SetTransitGatewayAttachmentId(v string) *RejectTransitGatewayVpcAttachmentInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

type RejectTransitGatewayVpcAttachmentOutput struct {
	_ struct{} `type:"structure"`

	// Information about the attachment.
	TransitGatewayVpcAttachment *TransitGatewayVpcAttachment `locationName:"transitGatewayVpcAttachment" type:"structure"`
}

// String returns the string representation
func (s RejectTransitGatewayVpcAttachmentOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RejectTransitGatewayVpcAttachmentOutput) GoString() string {
	return s.String()
}

// SetTransitGatewayVpcAttachment sets the TransitGatewayVpcAttachment field's value.
func (s *RejectTransitGatewayVpcAttachmentOutput) SetTransitGatewayVpcAttachment(v *TransitGatewayVpcAttachment) *RejectTransitGatewayVpcAttachmentOutput {
	s.TransitGatewayVpcAttachment = v
	return s
}

type RejectVpcEndpointConnectionsInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the service.
	//
	// ServiceId is a required field
	ServiceId *string `type:"string" required:"true"`

	// The IDs of one or more VPC endpoints.
	//
	// VpcEndpointIds is a required field
	VpcEndpointIds []*string `locationName:"VpcEndpointId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s RejectVpcEndpointConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RejectVpcEndpointConnectionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RejectVpcEndpointConnectionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RejectVpcEndpointConnectionsInput"}
	if s.ServiceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceId"))
	}
	if s.VpcEndpointIds == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcEndpointIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *RejectVpcEndpointConnectionsInput) SetDryRun(v bool) *RejectVpcEndpointConnectionsInput {
	s.DryRun = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *RejectVpcEndpointConnectionsInput) SetServiceId(v string) *RejectVpcEndpointConnectionsInput {
	s.ServiceId = &v
	return s
}

// SetVpcEndpointIds sets the VpcEndpointIds field's value.
func (s *RejectVpcEndpointConnectionsInput) SetVpcEndpointIds(v []*string) *RejectVpcEndpointConnectionsInput {
	s.VpcEndpointIds = v
	return s
}

type RejectVpcEndpointConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// Information about the endpoints that were not rejected, if applicable.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s RejectVpcEndpointConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RejectVpcEndpointConnectionsOutput) GoString() string {
	return s.String()
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *RejectVpcEndpointConnectionsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *RejectVpcEndpointConnectionsOutput {
	s.Unsuccessful = v
	return s
}

type RejectVpcPeeringConnectionInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the VPC peering connection.
	//
	// VpcPeeringConnectionId is a required field
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string" required:"true"`
}

// String returns the string representation
func (s RejectVpcPeeringConnectionInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RejectVpcPeeringConnectionInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RejectVpcPeeringConnectionInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RejectVpcPeeringConnectionInput"}
	if s.VpcPeeringConnectionId == nil {
		invalidParams.Add(request.NewErrParamRequired("VpcPeeringConnectionId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *RejectVpcPeeringConnectionInput) SetDryRun(v bool) *RejectVpcPeeringConnectionInput {
	s.DryRun = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *RejectVpcPeeringConnectionInput) SetVpcPeeringConnectionId(v string) *RejectVpcPeeringConnectionInput {
	s.VpcPeeringConnectionId = &v
	return s
}

type RejectVpcPeeringConnectionOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, it returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s RejectVpcPeeringConnectionOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RejectVpcPeeringConnectionOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *RejectVpcPeeringConnectionOutput) SetReturn(v bool) *RejectVpcPeeringConnectionOutput {
	s.Return = &v
	return s
}

type ReleaseAddressInput struct {
	_ struct{} `type:"structure"`

	// [EC2-VPC] The allocation ID. Required for EC2-VPC.
	AllocationId *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// [EC2-Classic] The Elastic IP address. Required for EC2-Classic.
	PublicIp *string `type:"string"`
}

// String returns the string representation
func (s ReleaseAddressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReleaseAddressInput) GoString() string {
	return s.String()
}

// SetAllocationId sets the AllocationId field's value.
func (s *ReleaseAddressInput) SetAllocationId(v string) *ReleaseAddressInput {
	s.AllocationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReleaseAddressInput) SetDryRun(v bool) *ReleaseAddressInput {
	s.DryRun = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *ReleaseAddressInput) SetPublicIp(v string) *ReleaseAddressInput {
	s.PublicIp = &v
	return s
}

type ReleaseAddressOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ReleaseAddressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReleaseAddressOutput) GoString() string {
	return s.String()
}

type ReleaseHostsInput struct {
	_ struct{} `type:"structure"`

	// The IDs of the Dedicated Hosts to release.
	//
	// HostIds is a required field
	HostIds []*string `locationName:"hostId" locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s ReleaseHostsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReleaseHostsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReleaseHostsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReleaseHostsInput"}
	if s.HostIds == nil {
		invalidParams.Add(request.NewErrParamRequired("HostIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetHostIds sets the HostIds field's value.
func (s *ReleaseHostsInput) SetHostIds(v []*string) *ReleaseHostsInput {
	s.HostIds = v
	return s
}

type ReleaseHostsOutput struct {
	_ struct{} `type:"structure"`

	// The IDs of the Dedicated Hosts that were successfully released.
	Successful []*string `locationName:"successful" locationNameList:"item" type:"list"`

	// The IDs of the Dedicated Hosts that could not be released, including an error
	// message.
	Unsuccessful []*UnsuccessfulItem `locationName:"unsuccessful" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ReleaseHostsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReleaseHostsOutput) GoString() string {
	return s.String()
}

// SetSuccessful sets the Successful field's value.
func (s *ReleaseHostsOutput) SetSuccessful(v []*string) *ReleaseHostsOutput {
	s.Successful = v
	return s
}

// SetUnsuccessful sets the Unsuccessful field's value.
func (s *ReleaseHostsOutput) SetUnsuccessful(v []*UnsuccessfulItem) *ReleaseHostsOutput {
	s.Unsuccessful = v
	return s
}

type ReplaceIamInstanceProfileAssociationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the existing IAM instance profile association.
	//
	// AssociationId is a required field
	AssociationId *string `type:"string" required:"true"`

	// The IAM instance profile.
	//
	// IamInstanceProfile is a required field
	IamInstanceProfile *IamInstanceProfileSpecification `type:"structure" required:"true"`
}

// String returns the string representation
func (s ReplaceIamInstanceProfileAssociationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceIamInstanceProfileAssociationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReplaceIamInstanceProfileAssociationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReplaceIamInstanceProfileAssociationInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}
	if s.IamInstanceProfile == nil {
		invalidParams.Add(request.NewErrParamRequired("IamInstanceProfile"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *ReplaceIamInstanceProfileAssociationInput) SetAssociationId(v string) *ReplaceIamInstanceProfileAssociationInput {
	s.AssociationId = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *ReplaceIamInstanceProfileAssociationInput) SetIamInstanceProfile(v *IamInstanceProfileSpecification) *ReplaceIamInstanceProfileAssociationInput {
	s.IamInstanceProfile = v
	return s
}

type ReplaceIamInstanceProfileAssociationOutput struct {
	_ struct{} `type:"structure"`

	// Information about the IAM instance profile association.
	IamInstanceProfileAssociation *IamInstanceProfileAssociation `locationName:"iamInstanceProfileAssociation" type:"structure"`
}

// String returns the string representation
func (s ReplaceIamInstanceProfileAssociationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceIamInstanceProfileAssociationOutput) GoString() string {
	return s.String()
}

// SetIamInstanceProfileAssociation sets the IamInstanceProfileAssociation field's value.
func (s *ReplaceIamInstanceProfileAssociationOutput) SetIamInstanceProfileAssociation(v *IamInstanceProfileAssociation) *ReplaceIamInstanceProfileAssociationOutput {
	s.IamInstanceProfileAssociation = v
	return s
}

type ReplaceNetworkAclAssociationInput struct {
	_ struct{} `type:"structure"`

	// The ID of the current association between the original network ACL and the
	// subnet.
	//
	// AssociationId is a required field
	AssociationId *string `locationName:"associationId" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the new network ACL to associate with the subnet.
	//
	// NetworkAclId is a required field
	NetworkAclId *string `locationName:"networkAclId" type:"string" required:"true"`
}

// String returns the string representation
func (s ReplaceNetworkAclAssociationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceNetworkAclAssociationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReplaceNetworkAclAssociationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReplaceNetworkAclAssociationInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}
	if s.NetworkAclId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkAclId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *ReplaceNetworkAclAssociationInput) SetAssociationId(v string) *ReplaceNetworkAclAssociationInput {
	s.AssociationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReplaceNetworkAclAssociationInput) SetDryRun(v bool) *ReplaceNetworkAclAssociationInput {
	s.DryRun = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *ReplaceNetworkAclAssociationInput) SetNetworkAclId(v string) *ReplaceNetworkAclAssociationInput {
	s.NetworkAclId = &v
	return s
}

type ReplaceNetworkAclAssociationOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the new association.
	NewAssociationId *string `locationName:"newAssociationId" type:"string"`
}

// String returns the string representation
func (s ReplaceNetworkAclAssociationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceNetworkAclAssociationOutput) GoString() string {
	return s.String()
}

// SetNewAssociationId sets the NewAssociationId field's value.
func (s *ReplaceNetworkAclAssociationOutput) SetNewAssociationId(v string) *ReplaceNetworkAclAssociationOutput {
	s.NewAssociationId = &v
	return s
}

type ReplaceNetworkAclEntryInput struct {
	_ struct{} `type:"structure"`

	// The IPv4 network range to allow or deny, in CIDR notation (for example 172.16.0.0/24).
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Indicates whether to replace the egress rule.
	//
	// Default: If no value is specified, we replace the ingress rule.
	//
	// Egress is a required field
	Egress *bool `locationName:"egress" type:"boolean" required:"true"`

	// ICMP protocol: The ICMP or ICMPv6 type and code. Required if specifying protocol
	// 1 (ICMP) or protocol 58 (ICMPv6) with an IPv6 CIDR block.
	IcmpTypeCode *IcmpTypeCode `locationName:"Icmp" type:"structure"`

	// The IPv6 network range to allow or deny, in CIDR notation (for example 2001:bd8:1234:1a00::/64).
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string"`

	// The ID of the ACL.
	//
	// NetworkAclId is a required field
	NetworkAclId *string `locationName:"networkAclId" type:"string" required:"true"`

	// TCP or UDP protocols: The range of ports the rule applies to. Required if
	// specifying protocol 6 (TCP) or 17 (UDP).
	PortRange *PortRange `locationName:"portRange" type:"structure"`

	// The protocol number. A value of "-1" means all protocols. If you specify
	// "-1" or a protocol number other than "6" (TCP), "17" (UDP), or "1" (ICMP),
	// traffic on all ports is allowed, regardless of any ports or ICMP types or
	// codes that you specify. If you specify protocol "58" (ICMPv6) and specify
	// an IPv4 CIDR block, traffic for all ICMP types and codes allowed, regardless
	// of any that you specify. If you specify protocol "58" (ICMPv6) and specify
	// an IPv6 CIDR block, you must specify an ICMP type and code.
	//
	// Protocol is a required field
	Protocol *string `locationName:"protocol" type:"string" required:"true"`

	// Indicates whether to allow or deny the traffic that matches the rule.
	//
	// RuleAction is a required field
	RuleAction *string `locationName:"ruleAction" type:"string" required:"true" enum:"RuleAction"`

	// The rule number of the entry to replace.
	//
	// RuleNumber is a required field
	RuleNumber *int64 `locationName:"ruleNumber" type:"integer" required:"true"`
}

// String returns the string representation
func (s ReplaceNetworkAclEntryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceNetworkAclEntryInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReplaceNetworkAclEntryInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReplaceNetworkAclEntryInput"}
	if s.Egress == nil {
		invalidParams.Add(request.NewErrParamRequired("Egress"))
	}
	if s.NetworkAclId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkAclId"))
	}
	if s.Protocol == nil {
		invalidParams.Add(request.NewErrParamRequired("Protocol"))
	}
	if s.RuleAction == nil {
		invalidParams.Add(request.NewErrParamRequired("RuleAction"))
	}
	if s.RuleNumber == nil {
		invalidParams.Add(request.NewErrParamRequired("RuleNumber"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *ReplaceNetworkAclEntryInput) SetCidrBlock(v string) *ReplaceNetworkAclEntryInput {
	s.CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReplaceNetworkAclEntryInput) SetDryRun(v bool) *ReplaceNetworkAclEntryInput {
	s.DryRun = &v
	return s
}

// SetEgress sets the Egress field's value.
func (s *ReplaceNetworkAclEntryInput) SetEgress(v bool) *ReplaceNetworkAclEntryInput {
	s.Egress = &v
	return s
}

// SetIcmpTypeCode sets the IcmpTypeCode field's value.
func (s *ReplaceNetworkAclEntryInput) SetIcmpTypeCode(v *IcmpTypeCode) *ReplaceNetworkAclEntryInput {
	s.IcmpTypeCode = v
	return s
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *ReplaceNetworkAclEntryInput) SetIpv6CidrBlock(v string) *ReplaceNetworkAclEntryInput {
	s.Ipv6CidrBlock = &v
	return s
}

// SetNetworkAclId sets the NetworkAclId field's value.
func (s *ReplaceNetworkAclEntryInput) SetNetworkAclId(v string) *ReplaceNetworkAclEntryInput {
	s.NetworkAclId = &v
	return s
}

// SetPortRange sets the PortRange field's value.
func (s *ReplaceNetworkAclEntryInput) SetPortRange(v *PortRange) *ReplaceNetworkAclEntryInput {
	s.PortRange = v
	return s
}

// SetProtocol sets the Protocol field's value.
func (s *ReplaceNetworkAclEntryInput) SetProtocol(v string) *ReplaceNetworkAclEntryInput {
	s.Protocol = &v
	return s
}

// SetRuleAction sets the RuleAction field's value.
func (s *ReplaceNetworkAclEntryInput) SetRuleAction(v string) *ReplaceNetworkAclEntryInput {
	s.RuleAction = &v
	return s
}

// SetRuleNumber sets the RuleNumber field's value.
func (s *ReplaceNetworkAclEntryInput) SetRuleNumber(v int64) *ReplaceNetworkAclEntryInput {
	s.RuleNumber = &v
	return s
}

type ReplaceNetworkAclEntryOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ReplaceNetworkAclEntryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceNetworkAclEntryOutput) GoString() string {
	return s.String()
}

type ReplaceRouteInput struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR address block used for the destination match. The value that
	// you provide must match the CIDR of an existing route in the table.
	DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"`

	// The IPv6 CIDR address block used for the destination match. The value that
	// you provide must match the CIDR of an existing route in the table.
	DestinationIpv6CidrBlock *string `locationName:"destinationIpv6CidrBlock" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// [IPv6 traffic only] The ID of an egress-only internet gateway.
	EgressOnlyInternetGatewayId *string `locationName:"egressOnlyInternetGatewayId" type:"string"`

	// The ID of an internet gateway or virtual private gateway.
	GatewayId *string `locationName:"gatewayId" type:"string"`

	// The ID of a NAT instance in your VPC.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// [IPv4 traffic only] The ID of a NAT gateway.
	NatGatewayId *string `locationName:"natGatewayId" type:"string"`

	// The ID of a network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The ID of the route table.
	//
	// RouteTableId is a required field
	RouteTableId *string `locationName:"routeTableId" type:"string" required:"true"`

	// The ID of a transit gateway.
	TransitGatewayId *string `type:"string"`

	// The ID of a VPC peering connection.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s ReplaceRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReplaceRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReplaceRouteInput"}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *ReplaceRouteInput) SetDestinationCidrBlock(v string) *ReplaceRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDestinationIpv6CidrBlock sets the DestinationIpv6CidrBlock field's value.
func (s *ReplaceRouteInput) SetDestinationIpv6CidrBlock(v string) *ReplaceRouteInput {
	s.DestinationIpv6CidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReplaceRouteInput) SetDryRun(v bool) *ReplaceRouteInput {
	s.DryRun = &v
	return s
}

// SetEgressOnlyInternetGatewayId sets the EgressOnlyInternetGatewayId field's value.
func (s *ReplaceRouteInput) SetEgressOnlyInternetGatewayId(v string) *ReplaceRouteInput {
	s.EgressOnlyInternetGatewayId = &v
	return s
}

// SetGatewayId sets the GatewayId field's value.
func (s *ReplaceRouteInput) SetGatewayId(v string) *ReplaceRouteInput {
	s.GatewayId = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ReplaceRouteInput) SetInstanceId(v string) *ReplaceRouteInput {
	s.InstanceId = &v
	return s
}

// SetNatGatewayId sets the NatGatewayId field's value.
func (s *ReplaceRouteInput) SetNatGatewayId(v string) *ReplaceRouteInput {
	s.NatGatewayId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *ReplaceRouteInput) SetNetworkInterfaceId(v string) *ReplaceRouteInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *ReplaceRouteInput) SetRouteTableId(v string) *ReplaceRouteInput {
	s.RouteTableId = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *ReplaceRouteInput) SetTransitGatewayId(v string) *ReplaceRouteInput {
	s.TransitGatewayId = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *ReplaceRouteInput) SetVpcPeeringConnectionId(v string) *ReplaceRouteInput {
	s.VpcPeeringConnectionId = &v
	return s
}

type ReplaceRouteOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ReplaceRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceRouteOutput) GoString() string {
	return s.String()
}

type ReplaceRouteTableAssociationInput struct {
	_ struct{} `type:"structure"`

	// The association ID.
	//
	// AssociationId is a required field
	AssociationId *string `locationName:"associationId" type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the new route table to associate with the subnet.
	//
	// RouteTableId is a required field
	RouteTableId *string `locationName:"routeTableId" type:"string" required:"true"`
}

// String returns the string representation
func (s ReplaceRouteTableAssociationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceRouteTableAssociationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReplaceRouteTableAssociationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReplaceRouteTableAssociationInput"}
	if s.AssociationId == nil {
		invalidParams.Add(request.NewErrParamRequired("AssociationId"))
	}
	if s.RouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("RouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAssociationId sets the AssociationId field's value.
func (s *ReplaceRouteTableAssociationInput) SetAssociationId(v string) *ReplaceRouteTableAssociationInput {
	s.AssociationId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReplaceRouteTableAssociationInput) SetDryRun(v bool) *ReplaceRouteTableAssociationInput {
	s.DryRun = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *ReplaceRouteTableAssociationInput) SetRouteTableId(v string) *ReplaceRouteTableAssociationInput {
	s.RouteTableId = &v
	return s
}

type ReplaceRouteTableAssociationOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the new association.
	NewAssociationId *string `locationName:"newAssociationId" type:"string"`
}

// String returns the string representation
func (s ReplaceRouteTableAssociationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceRouteTableAssociationOutput) GoString() string {
	return s.String()
}

// SetNewAssociationId sets the NewAssociationId field's value.
func (s *ReplaceRouteTableAssociationOutput) SetNewAssociationId(v string) *ReplaceRouteTableAssociationOutput {
	s.NewAssociationId = &v
	return s
}

type ReplaceTransitGatewayRouteInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether traffic matching this route is to be dropped.
	Blackhole *bool `type:"boolean"`

	// The CIDR range used for the destination match. Routing decisions are based
	// on the most specific match.
	//
	// DestinationCidrBlock is a required field
	DestinationCidrBlock *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `type:"string"`

	// The ID of the route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ReplaceTransitGatewayRouteInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceTransitGatewayRouteInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReplaceTransitGatewayRouteInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReplaceTransitGatewayRouteInput"}
	if s.DestinationCidrBlock == nil {
		invalidParams.Add(request.NewErrParamRequired("DestinationCidrBlock"))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBlackhole sets the Blackhole field's value.
func (s *ReplaceTransitGatewayRouteInput) SetBlackhole(v bool) *ReplaceTransitGatewayRouteInput {
	s.Blackhole = &v
	return s
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *ReplaceTransitGatewayRouteInput) SetDestinationCidrBlock(v string) *ReplaceTransitGatewayRouteInput {
	s.DestinationCidrBlock = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReplaceTransitGatewayRouteInput) SetDryRun(v bool) *ReplaceTransitGatewayRouteInput {
	s.DryRun = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *ReplaceTransitGatewayRouteInput) SetTransitGatewayAttachmentId(v string) *ReplaceTransitGatewayRouteInput {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *ReplaceTransitGatewayRouteInput) SetTransitGatewayRouteTableId(v string) *ReplaceTransitGatewayRouteInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type ReplaceTransitGatewayRouteOutput struct {
	_ struct{} `type:"structure"`

	// Information about the modified route.
	Route *TransitGatewayRoute `locationName:"route" type:"structure"`
}

// String returns the string representation
func (s ReplaceTransitGatewayRouteOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReplaceTransitGatewayRouteOutput) GoString() string {
	return s.String()
}

// SetRoute sets the Route field's value.
func (s *ReplaceTransitGatewayRouteOutput) SetRoute(v *TransitGatewayRoute) *ReplaceTransitGatewayRouteOutput {
	s.Route = v
	return s
}

type ReportInstanceStatusInput struct {
	_ struct{} `type:"structure"`

	// Descriptive text about the health state of your instance.
	Description *string `locationName:"description" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The time at which the reported instance health state ended.
	EndTime *time.Time `locationName:"endTime" type:"timestamp"`

	// One or more instances.
	//
	// Instances is a required field
	Instances []*string `locationName:"instanceId" locationNameList:"InstanceId" type:"list" required:"true"`

	// One or more reason codes that describe the health state of your instance.
	//
	//    * instance-stuck-in-state: My instance is stuck in a state.
	//
	//    * unresponsive: My instance is unresponsive.
	//
	//    * not-accepting-credentials: My instance is not accepting my credentials.
	//
	//    * password-not-available: A password is not available for my instance.
	//
	//    * performance-network: My instance is experiencing performance problems
	//    that I believe are network related.
	//
	//    * performance-instance-store: My instance is experiencing performance
	//    problems that I believe are related to the instance stores.
	//
	//    * performance-ebs-volume: My instance is experiencing performance problems
	//    that I believe are related to an EBS volume.
	//
	//    * performance-other: My instance is experiencing performance problems.
	//
	//    * other: [explain using the description parameter]
	//
	// ReasonCodes is a required field
	ReasonCodes []*string `locationName:"reasonCode" locationNameList:"item" type:"list" required:"true"`

	// The time at which the reported instance health state began.
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`

	// The status of all instances listed.
	//
	// Status is a required field
	Status *string `locationName:"status" type:"string" required:"true" enum:"ReportStatusType"`
}

// String returns the string representation
func (s ReportInstanceStatusInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReportInstanceStatusInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ReportInstanceStatusInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ReportInstanceStatusInput"}
	if s.Instances == nil {
		invalidParams.Add(request.NewErrParamRequired("Instances"))
	}
	if s.ReasonCodes == nil {
		invalidParams.Add(request.NewErrParamRequired("ReasonCodes"))
	}
	if s.Status == nil {
		invalidParams.Add(request.NewErrParamRequired("Status"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDescription sets the Description field's value.
func (s *ReportInstanceStatusInput) SetDescription(v string) *ReportInstanceStatusInput {
	s.Description = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ReportInstanceStatusInput) SetDryRun(v bool) *ReportInstanceStatusInput {
	s.DryRun = &v
	return s
}

// SetEndTime sets the EndTime field's value.
func (s *ReportInstanceStatusInput) SetEndTime(v time.Time) *ReportInstanceStatusInput {
	s.EndTime = &v
	return s
}

// SetInstances sets the Instances field's value.
func (s *ReportInstanceStatusInput) SetInstances(v []*string) *ReportInstanceStatusInput {
	s.Instances = v
	return s
}

// SetReasonCodes sets the ReasonCodes field's value.
func (s *ReportInstanceStatusInput) SetReasonCodes(v []*string) *ReportInstanceStatusInput {
	s.ReasonCodes = v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *ReportInstanceStatusInput) SetStartTime(v time.Time) *ReportInstanceStatusInput {
	s.StartTime = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ReportInstanceStatusInput) SetStatus(v string) *ReportInstanceStatusInput {
	s.Status = &v
	return s
}

type ReportInstanceStatusOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ReportInstanceStatusOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReportInstanceStatusOutput) GoString() string {
	return s.String()
}

// The information to include in the launch template.
type RequestLaunchTemplateData struct {
	_ struct{} `type:"structure"`

	// The block device mapping.
	//
	// Supplying both a snapshot ID and an encryption value as arguments for block-device
	// mapping results in an error. This is because only blank volumes can be encrypted
	// on start, and these are not created from a snapshot. If a snapshot is the
	// basis for the volume, it contains data by definition and its encryption status
	// cannot be changed using this action.
	BlockDeviceMappings []*LaunchTemplateBlockDeviceMappingRequest `locationName:"BlockDeviceMapping" locationNameList:"BlockDeviceMapping" type:"list"`

	// The Capacity Reservation targeting option. If you do not specify this parameter,
	// the instance's Capacity Reservation preference defaults to open, which enables
	// it to run in any open Capacity Reservation that has matching attributes (instance
	// type, platform, Availability Zone).
	CapacityReservationSpecification *LaunchTemplateCapacityReservationSpecificationRequest `type:"structure"`

	// The CPU options for the instance. For more information, see Optimizing CPU
	// Options (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	CpuOptions *LaunchTemplateCpuOptionsRequest `type:"structure"`

	// The credit option for CPU usage of the instance. Valid for T2 or T3 instances
	// only.
	CreditSpecification *CreditSpecificationRequest `type:"structure"`

	// If set to true, you can't terminate the instance using the Amazon EC2 console,
	// CLI, or API. To change this attribute to false after launch, use ModifyInstanceAttribute.
	DisableApiTermination *bool `type:"boolean"`

	// Indicates whether the instance is optimized for Amazon EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal Amazon EBS I/O performance. This optimization isn't
	// available with all instance types. Additional usage charges apply when using
	// an EBS-optimized instance.
	EbsOptimized *bool `type:"boolean"`

	// An elastic GPU to associate with the instance.
	ElasticGpuSpecifications []*ElasticGpuSpecification `locationName:"ElasticGpuSpecification" locationNameList:"ElasticGpuSpecification" type:"list"`

	// The elastic inference accelerator for the instance.
	ElasticInferenceAccelerators []*LaunchTemplateElasticInferenceAccelerator `locationName:"ElasticInferenceAccelerator" locationNameList:"item" type:"list"`

	// Indicates whether an instance is enabled for hibernation. This parameter
	// is valid only if the instance meets the hibernation prerequisites (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html#hibernating-prerequisites).
	// Hibernation is currently supported only for Amazon Linux. For more information,
	// see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	HibernationOptions *LaunchTemplateHibernationOptionsRequest `type:"structure"`

	// The IAM instance profile.
	IamInstanceProfile *LaunchTemplateIamInstanceProfileSpecificationRequest `type:"structure"`

	// The ID of the AMI, which you can get by using DescribeImages.
	ImageId *string `type:"string"`

	// Indicates whether an instance stops or terminates when you initiate shutdown
	// from the instance (using the operating system command for system shutdown).
	//
	// Default: stop
	InstanceInitiatedShutdownBehavior *string `type:"string" enum:"ShutdownBehavior"`

	// The market (purchasing) option for the instances.
	InstanceMarketOptions *LaunchTemplateInstanceMarketOptionsRequest `type:"structure"`

	// The instance type. For more information, see Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	InstanceType *string `type:"string" enum:"InstanceType"`

	// The ID of the kernel.
	//
	// We recommend that you use PV-GRUB instead of kernels and RAM disks. For more
	// information, see User Provided Kernels (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	KernelId *string `type:"string"`

	// The name of the key pair. You can create a key pair using CreateKeyPair or
	// ImportKeyPair.
	//
	// If you do not specify a key pair, you can't connect to the instance unless
	// you choose an AMI that is configured to allow users another way to log in.
	KeyName *string `type:"string"`

	// The license configurations.
	LicenseSpecifications []*LaunchTemplateLicenseConfigurationRequest `locationName:"LicenseSpecification" locationNameList:"item" type:"list"`

	// The monitoring for the instance.
	Monitoring *LaunchTemplatesMonitoringRequest `type:"structure"`

	// One or more network interfaces.
	NetworkInterfaces []*LaunchTemplateInstanceNetworkInterfaceSpecificationRequest `locationName:"NetworkInterface" locationNameList:"InstanceNetworkInterfaceSpecification" type:"list"`

	// The placement for the instance.
	Placement *LaunchTemplatePlacementRequest `type:"structure"`

	// The ID of the RAM disk.
	//
	// We recommend that you use PV-GRUB instead of kernels and RAM disks. For more
	// information, see User Provided Kernels (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	RamDiskId *string `type:"string"`

	// One or more security group IDs. You can create a security group using CreateSecurityGroup.
	// You cannot specify both a security group ID and security name in the same
	// request.
	SecurityGroupIds []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// [EC2-Classic, default VPC] One or more security group names. For a nondefault
	// VPC, you must use security group IDs instead. You cannot specify both a security
	// group ID and security name in the same request.
	SecurityGroups []*string `locationName:"SecurityGroup" locationNameList:"SecurityGroup" type:"list"`

	// The tags to apply to the resources during launch. You can only tag instances
	// and volumes on launch. The specified tags are applied to all instances or
	// volumes that are created during launch. To tag a resource after it has been
	// created, see CreateTags.
	TagSpecifications []*LaunchTemplateTagSpecificationRequest `locationName:"TagSpecification" locationNameList:"LaunchTemplateTagSpecificationRequest" type:"list"`

	// The Base64-encoded user data to make available to the instance. For more
	// information, see Running Commands on Your Linux Instance at Launch (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)
	// (Linux) and Adding User Data (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html#instancedata-add-user-data)
	// (Windows).
	UserData *string `type:"string"`
}

// String returns the string representation
func (s RequestLaunchTemplateData) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RequestLaunchTemplateData) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RequestLaunchTemplateData) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RequestLaunchTemplateData"}
	if s.CreditSpecification != nil {
		if err := s.CreditSpecification.Validate(); err != nil {
			invalidParams.AddNested("CreditSpecification", err.(request.ErrInvalidParams))
		}
	}
	if s.ElasticGpuSpecifications != nil {
		for i, v := range s.ElasticGpuSpecifications {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ElasticGpuSpecifications", i), err.(request.ErrInvalidParams))
			}
		}
	}
	if s.ElasticInferenceAccelerators != nil {
		for i, v := range s.ElasticInferenceAccelerators {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ElasticInferenceAccelerators", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *RequestLaunchTemplateData) SetBlockDeviceMappings(v []*LaunchTemplateBlockDeviceMappingRequest) *RequestLaunchTemplateData {
	s.BlockDeviceMappings = v
	return s
}

// SetCapacityReservationSpecification sets the CapacityReservationSpecification field's value.
func (s *RequestLaunchTemplateData) SetCapacityReservationSpecification(v *LaunchTemplateCapacityReservationSpecificationRequest) *RequestLaunchTemplateData {
	s.CapacityReservationSpecification = v
	return s
}

// SetCpuOptions sets the CpuOptions field's value.
func (s *RequestLaunchTemplateData) SetCpuOptions(v *LaunchTemplateCpuOptionsRequest) *RequestLaunchTemplateData {
	s.CpuOptions = v
	return s
}

// SetCreditSpecification sets the CreditSpecification field's value.
func (s *RequestLaunchTemplateData) SetCreditSpecification(v *CreditSpecificationRequest) *RequestLaunchTemplateData {
	s.CreditSpecification = v
	return s
}

// SetDisableApiTermination sets the DisableApiTermination field's value.
func (s *RequestLaunchTemplateData) SetDisableApiTermination(v bool) *RequestLaunchTemplateData {
	s.DisableApiTermination = &v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *RequestLaunchTemplateData) SetEbsOptimized(v bool) *RequestLaunchTemplateData {
	s.EbsOptimized = &v
	return s
}

// SetElasticGpuSpecifications sets the ElasticGpuSpecifications field's value.
func (s *RequestLaunchTemplateData) SetElasticGpuSpecifications(v []*ElasticGpuSpecification) *RequestLaunchTemplateData {
	s.ElasticGpuSpecifications = v
	return s
}

// SetElasticInferenceAccelerators sets the ElasticInferenceAccelerators field's value.
func (s *RequestLaunchTemplateData) SetElasticInferenceAccelerators(v []*LaunchTemplateElasticInferenceAccelerator) *RequestLaunchTemplateData {
	s.ElasticInferenceAccelerators = v
	return s
}

// SetHibernationOptions sets the HibernationOptions field's value.
func (s *RequestLaunchTemplateData) SetHibernationOptions(v *LaunchTemplateHibernationOptionsRequest) *RequestLaunchTemplateData {
	s.HibernationOptions = v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *RequestLaunchTemplateData) SetIamInstanceProfile(v *LaunchTemplateIamInstanceProfileSpecificationRequest) *RequestLaunchTemplateData {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *RequestLaunchTemplateData) SetImageId(v string) *RequestLaunchTemplateData {
	s.ImageId = &v
	return s
}

// SetInstanceInitiatedShutdownBehavior sets the InstanceInitiatedShutdownBehavior field's value.
func (s *RequestLaunchTemplateData) SetInstanceInitiatedShutdownBehavior(v string) *RequestLaunchTemplateData {
	s.InstanceInitiatedShutdownBehavior = &v
	return s
}

// SetInstanceMarketOptions sets the InstanceMarketOptions field's value.
func (s *RequestLaunchTemplateData) SetInstanceMarketOptions(v *LaunchTemplateInstanceMarketOptionsRequest) *RequestLaunchTemplateData {
	s.InstanceMarketOptions = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *RequestLaunchTemplateData) SetInstanceType(v string) *RequestLaunchTemplateData {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *RequestLaunchTemplateData) SetKernelId(v string) *RequestLaunchTemplateData {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *RequestLaunchTemplateData) SetKeyName(v string) *RequestLaunchTemplateData {
	s.KeyName = &v
	return s
}

// SetLicenseSpecifications sets the LicenseSpecifications field's value.
func (s *RequestLaunchTemplateData) SetLicenseSpecifications(v []*LaunchTemplateLicenseConfigurationRequest) *RequestLaunchTemplateData {
	s.LicenseSpecifications = v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *RequestLaunchTemplateData) SetMonitoring(v *LaunchTemplatesMonitoringRequest) *RequestLaunchTemplateData {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *RequestLaunchTemplateData) SetNetworkInterfaces(v []*LaunchTemplateInstanceNetworkInterfaceSpecificationRequest) *RequestLaunchTemplateData {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *RequestLaunchTemplateData) SetPlacement(v *LaunchTemplatePlacementRequest) *RequestLaunchTemplateData {
	s.Placement = v
	return s
}

// SetRamDiskId sets the RamDiskId field's value.
func (s *RequestLaunchTemplateData) SetRamDiskId(v string) *RequestLaunchTemplateData {
	s.RamDiskId = &v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *RequestLaunchTemplateData) SetSecurityGroupIds(v []*string) *RequestLaunchTemplateData {
	s.SecurityGroupIds = v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *RequestLaunchTemplateData) SetSecurityGroups(v []*string) *RequestLaunchTemplateData {
	s.SecurityGroups = v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *RequestLaunchTemplateData) SetTagSpecifications(v []*LaunchTemplateTagSpecificationRequest) *RequestLaunchTemplateData {
	s.TagSpecifications = v
	return s
}

// SetUserData sets the UserData field's value.
func (s *RequestLaunchTemplateData) SetUserData(v string) *RequestLaunchTemplateData {
	s.UserData = &v
	return s
}

// Contains the parameters for RequestSpotFleet.
type RequestSpotFleetInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The configuration for the Spot Fleet request.
	//
	// SpotFleetRequestConfig is a required field
	SpotFleetRequestConfig *SpotFleetRequestConfigData `locationName:"spotFleetRequestConfig" type:"structure" required:"true"`
}

// String returns the string representation
func (s RequestSpotFleetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RequestSpotFleetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RequestSpotFleetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RequestSpotFleetInput"}
	if s.SpotFleetRequestConfig == nil {
		invalidParams.Add(request.NewErrParamRequired("SpotFleetRequestConfig"))
	}
	if s.SpotFleetRequestConfig != nil {
		if err := s.SpotFleetRequestConfig.Validate(); err != nil {
			invalidParams.AddNested("SpotFleetRequestConfig", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *RequestSpotFleetInput) SetDryRun(v bool) *RequestSpotFleetInput {
	s.DryRun = &v
	return s
}

// SetSpotFleetRequestConfig sets the SpotFleetRequestConfig field's value.
func (s *RequestSpotFleetInput) SetSpotFleetRequestConfig(v *SpotFleetRequestConfigData) *RequestSpotFleetInput {
	s.SpotFleetRequestConfig = v
	return s
}

// Contains the output of RequestSpotFleet.
type RequestSpotFleetOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the Spot Fleet request.
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string"`
}

// String returns the string representation
func (s RequestSpotFleetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RequestSpotFleetOutput) GoString() string {
	return s.String()
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *RequestSpotFleetOutput) SetSpotFleetRequestId(v string) *RequestSpotFleetOutput {
	s.SpotFleetRequestId = &v
	return s
}

// Contains the parameters for RequestSpotInstances.
type RequestSpotInstancesInput struct {
	_ struct{} `type:"structure"`

	// The user-specified name for a logical grouping of requests.
	//
	// When you specify an Availability Zone group in a Spot Instance request, all
	// Spot Instances in the request are launched in the same Availability Zone.
	// Instance proximity is maintained with this parameter, but the choice of Availability
	// Zone is not. The group applies only to requests for Spot Instances of the
	// same instance type. Any additional Spot Instance requests that are specified
	// with the same Availability Zone group name are launched in that same Availability
	// Zone, as long as at least one instance from the group is still active.
	//
	// If there is no active instance running in the Availability Zone group that
	// you specify for a new Spot Instance request (all instances are terminated,
	// the request is expired, or the maximum price you specified falls below current
	// Spot price), then Amazon EC2 launches the instance in any Availability Zone
	// where the constraint can be met. Consequently, the subsequent set of Spot
	// Instances could be placed in a different zone from the original request,
	// even if you specified the same Availability Zone group.
	//
	// Default: Instances are launched in any available Availability Zone.
	AvailabilityZoneGroup *string `locationName:"availabilityZoneGroup" type:"string"`

	// The required duration for the Spot Instances (also known as Spot blocks),
	// in minutes. This value must be a multiple of 60 (60, 120, 180, 240, 300,
	// or 360).
	//
	// The duration period starts as soon as your Spot Instance receives its instance
	// ID. At the end of the duration period, Amazon EC2 marks the Spot Instance
	// for termination and provides a Spot Instance termination notice, which gives
	// the instance a two-minute warning before it terminates.
	//
	// You can't specify an Availability Zone group or a launch group if you specify
	// a duration.
	BlockDurationMinutes *int64 `locationName:"blockDurationMinutes" type:"integer"`

	// Unique, case-sensitive identifier that you provide to ensure the idempotency
	// of the request. For more information, see How to Ensure Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html)
	// in the Amazon EC2 User Guide for Linux Instances.
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The maximum number of Spot Instances to launch.
	//
	// Default: 1
	InstanceCount *int64 `locationName:"instanceCount" type:"integer"`

	// The behavior when a Spot Instance is interrupted. The default is terminate.
	InstanceInterruptionBehavior *string `type:"string" enum:"InstanceInterruptionBehavior"`

	// The instance launch group. Launch groups are Spot Instances that launch together
	// and terminate together.
	//
	// Default: Instances are launched and terminated individually
	LaunchGroup *string `locationName:"launchGroup" type:"string"`

	// The launch specification.
	LaunchSpecification *RequestSpotLaunchSpecification `type:"structure"`

	// The maximum price per hour that you are willing to pay for a Spot Instance.
	// The default is the On-Demand price.
	SpotPrice *string `locationName:"spotPrice" type:"string"`

	// The Spot Instance request type.
	//
	// Default: one-time
	Type *string `locationName:"type" type:"string" enum:"SpotInstanceType"`

	// The start date of the request. If this is a one-time request, the request
	// becomes active at this date and time and remains active until all instances
	// launch, the request expires, or the request is canceled. If the request is
	// persistent, the request becomes active at this date and time and remains
	// active until it expires or is canceled.
	ValidFrom *time.Time `locationName:"validFrom" type:"timestamp"`

	// The end date of the request. If this is a one-time request, the request remains
	// active until all instances launch, the request is canceled, or this date
	// is reached. If the request is persistent, it remains active until it is canceled
	// or this date is reached. The default end date is 7 days from the current
	// date.
	ValidUntil *time.Time `locationName:"validUntil" type:"timestamp"`
}

// String returns the string representation
func (s RequestSpotInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RequestSpotInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RequestSpotInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RequestSpotInstancesInput"}
	if s.LaunchSpecification != nil {
		if err := s.LaunchSpecification.Validate(); err != nil {
			invalidParams.AddNested("LaunchSpecification", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAvailabilityZoneGroup sets the AvailabilityZoneGroup field's value.
func (s *RequestSpotInstancesInput) SetAvailabilityZoneGroup(v string) *RequestSpotInstancesInput {
	s.AvailabilityZoneGroup = &v
	return s
}

// SetBlockDurationMinutes sets the BlockDurationMinutes field's value.
func (s *RequestSpotInstancesInput) SetBlockDurationMinutes(v int64) *RequestSpotInstancesInput {
	s.BlockDurationMinutes = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *RequestSpotInstancesInput) SetClientToken(v string) *RequestSpotInstancesInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RequestSpotInstancesInput) SetDryRun(v bool) *RequestSpotInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *RequestSpotInstancesInput) SetInstanceCount(v int64) *RequestSpotInstancesInput {
	s.InstanceCount = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *RequestSpotInstancesInput) SetInstanceInterruptionBehavior(v string) *RequestSpotInstancesInput {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetLaunchGroup sets the LaunchGroup field's value.
func (s *RequestSpotInstancesInput) SetLaunchGroup(v string) *RequestSpotInstancesInput {
	s.LaunchGroup = &v
	return s
}

// SetLaunchSpecification sets the LaunchSpecification field's value.
func (s *RequestSpotInstancesInput) SetLaunchSpecification(v *RequestSpotLaunchSpecification) *RequestSpotInstancesInput {
	s.LaunchSpecification = v
	return s
}

// SetSpotPrice sets the SpotPrice field's value.
func (s *RequestSpotInstancesInput) SetSpotPrice(v string) *RequestSpotInstancesInput {
	s.SpotPrice = &v
	return s
}

// SetType sets the Type field's value.
func (s *RequestSpotInstancesInput) SetType(v string) *RequestSpotInstancesInput {
	s.Type = &v
	return s
}

// SetValidFrom sets the ValidFrom field's value.
func (s *RequestSpotInstancesInput) SetValidFrom(v time.Time) *RequestSpotInstancesInput {
	s.ValidFrom = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *RequestSpotInstancesInput) SetValidUntil(v time.Time) *RequestSpotInstancesInput {
	s.ValidUntil = &v
	return s
}

// Contains the output of RequestSpotInstances.
type RequestSpotInstancesOutput struct {
	_ struct{} `type:"structure"`

	// One or more Spot Instance requests.
	SpotInstanceRequests []*SpotInstanceRequest `locationName:"spotInstanceRequestSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s RequestSpotInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RequestSpotInstancesOutput) GoString() string {
	return s.String()
}

// SetSpotInstanceRequests sets the SpotInstanceRequests field's value.
func (s *RequestSpotInstancesOutput) SetSpotInstanceRequests(v []*SpotInstanceRequest) *RequestSpotInstancesOutput {
	s.SpotInstanceRequests = v
	return s
}

// Describes the launch specification for an instance.
type RequestSpotLaunchSpecification struct {
	_ struct{} `type:"structure"`

	// Deprecated.
	AddressingType *string `locationName:"addressingType" type:"string"`

	// One or more block device mapping entries. You can't specify both a snapshot
	// ID and an encryption value. This is because only blank volumes can be encrypted
	// on creation. If a snapshot is the basis for a volume, it is not blank and
	// its encryption status is used for the volume encryption status.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// Indicates whether the instance is optimized for EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal EBS I/O performance. This optimization isn't available
	// with all instance types. Additional usage charges apply when using an EBS
	// Optimized instance.
	//
	// Default: false
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// The IAM instance profile.
	IamInstanceProfile *IamInstanceProfileSpecification `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the AMI.
	ImageId *string `locationName:"imageId" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The ID of the kernel.
	KernelId *string `locationName:"kernelId" type:"string"`

	// The name of the key pair.
	KeyName *string `locationName:"keyName" type:"string"`

	// Indicates whether basic or detailed monitoring is enabled for the instance.
	//
	// Default: Disabled
	Monitoring *RunInstancesMonitoringEnabled `locationName:"monitoring" type:"structure"`

	// One or more network interfaces. If you specify a network interface, you must
	// specify subnet IDs and security group IDs using the network interface.
	NetworkInterfaces []*InstanceNetworkInterfaceSpecification `locationName:"NetworkInterface" locationNameList:"item" type:"list"`

	// The placement information for the instance.
	Placement *SpotPlacement `locationName:"placement" type:"structure"`

	// The ID of the RAM disk.
	RamdiskId *string `locationName:"ramdiskId" type:"string"`

	// One or more security group IDs.
	SecurityGroupIds []*string `locationName:"SecurityGroupId" locationNameList:"item" type:"list"`

	// One or more security groups. When requesting instances in a VPC, you must
	// specify the IDs of the security groups. When requesting instances in EC2-Classic,
	// you can specify the names or the IDs of the security groups.
	SecurityGroups []*string `locationName:"SecurityGroup" locationNameList:"item" type:"list"`

	// The ID of the subnet in which to launch the instance.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The Base64-encoded user data for the instance.
	UserData *string `locationName:"userData" type:"string"`
}

// String returns the string representation
func (s RequestSpotLaunchSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RequestSpotLaunchSpecification) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RequestSpotLaunchSpecification) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RequestSpotLaunchSpecification"}
	if s.Monitoring != nil {
		if err := s.Monitoring.Validate(); err != nil {
			invalidParams.AddNested("Monitoring", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAddressingType sets the AddressingType field's value.
func (s *RequestSpotLaunchSpecification) SetAddressingType(v string) *RequestSpotLaunchSpecification {
	s.AddressingType = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *RequestSpotLaunchSpecification) SetBlockDeviceMappings(v []*BlockDeviceMapping) *RequestSpotLaunchSpecification {
	s.BlockDeviceMappings = v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *RequestSpotLaunchSpecification) SetEbsOptimized(v bool) *RequestSpotLaunchSpecification {
	s.EbsOptimized = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *RequestSpotLaunchSpecification) SetIamInstanceProfile(v *IamInstanceProfileSpecification) *RequestSpotLaunchSpecification {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *RequestSpotLaunchSpecification) SetImageId(v string) *RequestSpotLaunchSpecification {
	s.ImageId = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *RequestSpotLaunchSpecification) SetInstanceType(v string) *RequestSpotLaunchSpecification {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *RequestSpotLaunchSpecification) SetKernelId(v string) *RequestSpotLaunchSpecification {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *RequestSpotLaunchSpecification) SetKeyName(v string) *RequestSpotLaunchSpecification {
	s.KeyName = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *RequestSpotLaunchSpecification) SetMonitoring(v *RunInstancesMonitoringEnabled) *RequestSpotLaunchSpecification {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *RequestSpotLaunchSpecification) SetNetworkInterfaces(v []*InstanceNetworkInterfaceSpecification) *RequestSpotLaunchSpecification {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *RequestSpotLaunchSpecification) SetPlacement(v *SpotPlacement) *RequestSpotLaunchSpecification {
	s.Placement = v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *RequestSpotLaunchSpecification) SetRamdiskId(v string) *RequestSpotLaunchSpecification {
	s.RamdiskId = &v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *RequestSpotLaunchSpecification) SetSecurityGroupIds(v []*string) *RequestSpotLaunchSpecification {
	s.SecurityGroupIds = v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *RequestSpotLaunchSpecification) SetSecurityGroups(v []*string) *RequestSpotLaunchSpecification {
	s.SecurityGroups = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *RequestSpotLaunchSpecification) SetSubnetId(v string) *RequestSpotLaunchSpecification {
	s.SubnetId = &v
	return s
}

// SetUserData sets the UserData field's value.
func (s *RequestSpotLaunchSpecification) SetUserData(v string) *RequestSpotLaunchSpecification {
	s.UserData = &v
	return s
}

// Describes a reservation.
type Reservation struct {
	_ struct{} `type:"structure"`

	// [EC2-Classic only] One or more security groups.
	Groups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// One or more instances.
	Instances []*Instance `locationName:"instancesSet" locationNameList:"item" type:"list"`

	// The ID of the AWS account that owns the reservation.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The ID of the requester that launched the instances on your behalf (for example,
	// AWS Management Console or Auto Scaling).
	RequesterId *string `locationName:"requesterId" type:"string"`

	// The ID of the reservation.
	ReservationId *string `locationName:"reservationId" type:"string"`
}

// String returns the string representation
func (s Reservation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Reservation) GoString() string {
	return s.String()
}

// SetGroups sets the Groups field's value.
func (s *Reservation) SetGroups(v []*GroupIdentifier) *Reservation {
	s.Groups = v
	return s
}

// SetInstances sets the Instances field's value.
func (s *Reservation) SetInstances(v []*Instance) *Reservation {
	s.Instances = v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *Reservation) SetOwnerId(v string) *Reservation {
	s.OwnerId = &v
	return s
}

// SetRequesterId sets the RequesterId field's value.
func (s *Reservation) SetRequesterId(v string) *Reservation {
	s.RequesterId = &v
	return s
}

// SetReservationId sets the ReservationId field's value.
func (s *Reservation) SetReservationId(v string) *Reservation {
	s.ReservationId = &v
	return s
}

// The cost associated with the Reserved Instance.
type ReservationValue struct {
	_ struct{} `type:"structure"`

	// The hourly rate of the reservation.
	HourlyPrice *string `locationName:"hourlyPrice" type:"string"`

	// The balance of the total value (the sum of remainingUpfrontValue + hourlyPrice
	// * number of hours remaining).
	RemainingTotalValue *string `locationName:"remainingTotalValue" type:"string"`

	// The remaining upfront cost of the reservation.
	RemainingUpfrontValue *string `locationName:"remainingUpfrontValue" type:"string"`
}

// String returns the string representation
func (s ReservationValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservationValue) GoString() string {
	return s.String()
}

// SetHourlyPrice sets the HourlyPrice field's value.
func (s *ReservationValue) SetHourlyPrice(v string) *ReservationValue {
	s.HourlyPrice = &v
	return s
}

// SetRemainingTotalValue sets the RemainingTotalValue field's value.
func (s *ReservationValue) SetRemainingTotalValue(v string) *ReservationValue {
	s.RemainingTotalValue = &v
	return s
}

// SetRemainingUpfrontValue sets the RemainingUpfrontValue field's value.
func (s *ReservationValue) SetRemainingUpfrontValue(v string) *ReservationValue {
	s.RemainingUpfrontValue = &v
	return s
}

// Describes the limit price of a Reserved Instance offering.
type ReservedInstanceLimitPrice struct {
	_ struct{} `type:"structure"`

	// Used for Reserved Instance Marketplace offerings. Specifies the limit price
	// on the total order (instanceCount * price).
	Amount *float64 `locationName:"amount" type:"double"`

	// The currency in which the limitPrice amount is specified. At this time, the
	// only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`
}

// String returns the string representation
func (s ReservedInstanceLimitPrice) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstanceLimitPrice) GoString() string {
	return s.String()
}

// SetAmount sets the Amount field's value.
func (s *ReservedInstanceLimitPrice) SetAmount(v float64) *ReservedInstanceLimitPrice {
	s.Amount = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *ReservedInstanceLimitPrice) SetCurrencyCode(v string) *ReservedInstanceLimitPrice {
	s.CurrencyCode = &v
	return s
}

// The total value of the Convertible Reserved Instance.
type ReservedInstanceReservationValue struct {
	_ struct{} `type:"structure"`

	// The total value of the Convertible Reserved Instance that you are exchanging.
	ReservationValue *ReservationValue `locationName:"reservationValue" type:"structure"`

	// The ID of the Convertible Reserved Instance that you are exchanging.
	ReservedInstanceId *string `locationName:"reservedInstanceId" type:"string"`
}

// String returns the string representation
func (s ReservedInstanceReservationValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstanceReservationValue) GoString() string {
	return s.String()
}

// SetReservationValue sets the ReservationValue field's value.
func (s *ReservedInstanceReservationValue) SetReservationValue(v *ReservationValue) *ReservedInstanceReservationValue {
	s.ReservationValue = v
	return s
}

// SetReservedInstanceId sets the ReservedInstanceId field's value.
func (s *ReservedInstanceReservationValue) SetReservedInstanceId(v string) *ReservedInstanceReservationValue {
	s.ReservedInstanceId = &v
	return s
}

// Describes a Reserved Instance.
type ReservedInstances struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which the Reserved Instance can be used.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The currency of the Reserved Instance. It's specified using ISO 4217 standard
	// currency codes. At this time, the only supported currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The duration of the Reserved Instance, in seconds.
	Duration *int64 `locationName:"duration" type:"long"`

	// The time when the Reserved Instance expires.
	End *time.Time `locationName:"end" type:"timestamp"`

	// The purchase price of the Reserved Instance.
	FixedPrice *float64 `locationName:"fixedPrice" type:"float"`

	// The number of reservations purchased.
	InstanceCount *int64 `locationName:"instanceCount" type:"integer"`

	// The tenancy of the instance.
	InstanceTenancy *string `locationName:"instanceTenancy" type:"string" enum:"Tenancy"`

	// The instance type on which the Reserved Instance can be used.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The offering class of the Reserved Instance.
	OfferingClass *string `locationName:"offeringClass" type:"string" enum:"OfferingClassType"`

	// The Reserved Instance offering type.
	OfferingType *string `locationName:"offeringType" type:"string" enum:"OfferingTypeValues"`

	// The Reserved Instance product platform description.
	ProductDescription *string `locationName:"productDescription" type:"string" enum:"RIProductDescription"`

	// The recurring charge tag assigned to the resource.
	RecurringCharges []*RecurringCharge `locationName:"recurringCharges" locationNameList:"item" type:"list"`

	// The ID of the Reserved Instance.
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string"`

	// The scope of the Reserved Instance.
	Scope *string `locationName:"scope" type:"string" enum:"scope"`

	// The date and time the Reserved Instance started.
	Start *time.Time `locationName:"start" type:"timestamp"`

	// The state of the Reserved Instance purchase.
	State *string `locationName:"state" type:"string" enum:"ReservedInstanceState"`

	// Any tags assigned to the resource.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The usage price of the Reserved Instance, per hour.
	UsagePrice *float64 `locationName:"usagePrice" type:"float"`
}

// String returns the string representation
func (s ReservedInstances) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstances) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ReservedInstances) SetAvailabilityZone(v string) *ReservedInstances {
	s.AvailabilityZone = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *ReservedInstances) SetCurrencyCode(v string) *ReservedInstances {
	s.CurrencyCode = &v
	return s
}

// SetDuration sets the Duration field's value.
func (s *ReservedInstances) SetDuration(v int64) *ReservedInstances {
	s.Duration = &v
	return s
}

// SetEnd sets the End field's value.
func (s *ReservedInstances) SetEnd(v time.Time) *ReservedInstances {
	s.End = &v
	return s
}

// SetFixedPrice sets the FixedPrice field's value.
func (s *ReservedInstances) SetFixedPrice(v float64) *ReservedInstances {
	s.FixedPrice = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *ReservedInstances) SetInstanceCount(v int64) *ReservedInstances {
	s.InstanceCount = &v
	return s
}

// SetInstanceTenancy sets the InstanceTenancy field's value.
func (s *ReservedInstances) SetInstanceTenancy(v string) *ReservedInstances {
	s.InstanceTenancy = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ReservedInstances) SetInstanceType(v string) *ReservedInstances {
	s.InstanceType = &v
	return s
}

// SetOfferingClass sets the OfferingClass field's value.
func (s *ReservedInstances) SetOfferingClass(v string) *ReservedInstances {
	s.OfferingClass = &v
	return s
}

// SetOfferingType sets the OfferingType field's value.
func (s *ReservedInstances) SetOfferingType(v string) *ReservedInstances {
	s.OfferingType = &v
	return s
}

// SetProductDescription sets the ProductDescription field's value.
func (s *ReservedInstances) SetProductDescription(v string) *ReservedInstances {
	s.ProductDescription = &v
	return s
}

// SetRecurringCharges sets the RecurringCharges field's value.
func (s *ReservedInstances) SetRecurringCharges(v []*RecurringCharge) *ReservedInstances {
	s.RecurringCharges = v
	return s
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *ReservedInstances) SetReservedInstancesId(v string) *ReservedInstances {
	s.ReservedInstancesId = &v
	return s
}

// SetScope sets the Scope field's value.
func (s *ReservedInstances) SetScope(v string) *ReservedInstances {
	s.Scope = &v
	return s
}

// SetStart sets the Start field's value.
func (s *ReservedInstances) SetStart(v time.Time) *ReservedInstances {
	s.Start = &v
	return s
}

// SetState sets the State field's value.
func (s *ReservedInstances) SetState(v string) *ReservedInstances {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *ReservedInstances) SetTags(v []*Tag) *ReservedInstances {
	s.Tags = v
	return s
}

// SetUsagePrice sets the UsagePrice field's value.
func (s *ReservedInstances) SetUsagePrice(v float64) *ReservedInstances {
	s.UsagePrice = &v
	return s
}

// Describes the configuration settings for the modified Reserved Instances.
type ReservedInstancesConfiguration struct {
	_ struct{} `type:"structure"`

	// The Availability Zone for the modified Reserved Instances.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The number of modified Reserved Instances.
	//
	// This is a required field for a request.
	InstanceCount *int64 `locationName:"instanceCount" type:"integer"`

	// The instance type for the modified Reserved Instances.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The network platform of the modified Reserved Instances, which is either
	// EC2-Classic or EC2-VPC.
	Platform *string `locationName:"platform" type:"string"`

	// Whether the Reserved Instance is applied to instances in a region or instances
	// in a specific Availability Zone.
	Scope *string `locationName:"scope" type:"string" enum:"scope"`
}

// String returns the string representation
func (s ReservedInstancesConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstancesConfiguration) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ReservedInstancesConfiguration) SetAvailabilityZone(v string) *ReservedInstancesConfiguration {
	s.AvailabilityZone = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *ReservedInstancesConfiguration) SetInstanceCount(v int64) *ReservedInstancesConfiguration {
	s.InstanceCount = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ReservedInstancesConfiguration) SetInstanceType(v string) *ReservedInstancesConfiguration {
	s.InstanceType = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ReservedInstancesConfiguration) SetPlatform(v string) *ReservedInstancesConfiguration {
	s.Platform = &v
	return s
}

// SetScope sets the Scope field's value.
func (s *ReservedInstancesConfiguration) SetScope(v string) *ReservedInstancesConfiguration {
	s.Scope = &v
	return s
}

// Describes the ID of a Reserved Instance.
type ReservedInstancesId struct {
	_ struct{} `type:"structure"`

	// The ID of the Reserved Instance.
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string"`
}

// String returns the string representation
func (s ReservedInstancesId) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstancesId) GoString() string {
	return s.String()
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *ReservedInstancesId) SetReservedInstancesId(v string) *ReservedInstancesId {
	s.ReservedInstancesId = &v
	return s
}

// Describes a Reserved Instance listing.
type ReservedInstancesListing struct {
	_ struct{} `type:"structure"`

	// A unique, case-sensitive key supplied by the client to ensure that the request
	// is idempotent. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The time the listing was created.
	CreateDate *time.Time `locationName:"createDate" type:"timestamp"`

	// The number of instances in this state.
	InstanceCounts []*InstanceCount `locationName:"instanceCounts" locationNameList:"item" type:"list"`

	// The price of the Reserved Instance listing.
	PriceSchedules []*PriceSchedule `locationName:"priceSchedules" locationNameList:"item" type:"list"`

	// The ID of the Reserved Instance.
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string"`

	// The ID of the Reserved Instance listing.
	ReservedInstancesListingId *string `locationName:"reservedInstancesListingId" type:"string"`

	// The status of the Reserved Instance listing.
	Status *string `locationName:"status" type:"string" enum:"ListingStatus"`

	// The reason for the current status of the Reserved Instance listing. The response
	// can be blank.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// Any tags assigned to the resource.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The last modified timestamp of the listing.
	UpdateDate *time.Time `locationName:"updateDate" type:"timestamp"`
}

// String returns the string representation
func (s ReservedInstancesListing) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstancesListing) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *ReservedInstancesListing) SetClientToken(v string) *ReservedInstancesListing {
	s.ClientToken = &v
	return s
}

// SetCreateDate sets the CreateDate field's value.
func (s *ReservedInstancesListing) SetCreateDate(v time.Time) *ReservedInstancesListing {
	s.CreateDate = &v
	return s
}

// SetInstanceCounts sets the InstanceCounts field's value.
func (s *ReservedInstancesListing) SetInstanceCounts(v []*InstanceCount) *ReservedInstancesListing {
	s.InstanceCounts = v
	return s
}

// SetPriceSchedules sets the PriceSchedules field's value.
func (s *ReservedInstancesListing) SetPriceSchedules(v []*PriceSchedule) *ReservedInstancesListing {
	s.PriceSchedules = v
	return s
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *ReservedInstancesListing) SetReservedInstancesId(v string) *ReservedInstancesListing {
	s.ReservedInstancesId = &v
	return s
}

// SetReservedInstancesListingId sets the ReservedInstancesListingId field's value.
func (s *ReservedInstancesListing) SetReservedInstancesListingId(v string) *ReservedInstancesListing {
	s.ReservedInstancesListingId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ReservedInstancesListing) SetStatus(v string) *ReservedInstancesListing {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ReservedInstancesListing) SetStatusMessage(v string) *ReservedInstancesListing {
	s.StatusMessage = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *ReservedInstancesListing) SetTags(v []*Tag) *ReservedInstancesListing {
	s.Tags = v
	return s
}

// SetUpdateDate sets the UpdateDate field's value.
func (s *ReservedInstancesListing) SetUpdateDate(v time.Time) *ReservedInstancesListing {
	s.UpdateDate = &v
	return s
}

// Describes a Reserved Instance modification.
type ReservedInstancesModification struct {
	_ struct{} `type:"structure"`

	// A unique, case-sensitive key supplied by the client to ensure that the request
	// is idempotent. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The time when the modification request was created.
	CreateDate *time.Time `locationName:"createDate" type:"timestamp"`

	// The time for the modification to become effective.
	EffectiveDate *time.Time `locationName:"effectiveDate" type:"timestamp"`

	// Contains target configurations along with their corresponding new Reserved
	// Instance IDs.
	ModificationResults []*ReservedInstancesModificationResult `locationName:"modificationResultSet" locationNameList:"item" type:"list"`

	// The IDs of one or more Reserved Instances.
	ReservedInstancesIds []*ReservedInstancesId `locationName:"reservedInstancesSet" locationNameList:"item" type:"list"`

	// A unique ID for the Reserved Instance modification.
	ReservedInstancesModificationId *string `locationName:"reservedInstancesModificationId" type:"string"`

	// The status of the Reserved Instances modification request.
	Status *string `locationName:"status" type:"string"`

	// The reason for the status.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// The time when the modification request was last updated.
	UpdateDate *time.Time `locationName:"updateDate" type:"timestamp"`
}

// String returns the string representation
func (s ReservedInstancesModification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstancesModification) GoString() string {
	return s.String()
}

// SetClientToken sets the ClientToken field's value.
func (s *ReservedInstancesModification) SetClientToken(v string) *ReservedInstancesModification {
	s.ClientToken = &v
	return s
}

// SetCreateDate sets the CreateDate field's value.
func (s *ReservedInstancesModification) SetCreateDate(v time.Time) *ReservedInstancesModification {
	s.CreateDate = &v
	return s
}

// SetEffectiveDate sets the EffectiveDate field's value.
func (s *ReservedInstancesModification) SetEffectiveDate(v time.Time) *ReservedInstancesModification {
	s.EffectiveDate = &v
	return s
}

// SetModificationResults sets the ModificationResults field's value.
func (s *ReservedInstancesModification) SetModificationResults(v []*ReservedInstancesModificationResult) *ReservedInstancesModification {
	s.ModificationResults = v
	return s
}

// SetReservedInstancesIds sets the ReservedInstancesIds field's value.
func (s *ReservedInstancesModification) SetReservedInstancesIds(v []*ReservedInstancesId) *ReservedInstancesModification {
	s.ReservedInstancesIds = v
	return s
}

// SetReservedInstancesModificationId sets the ReservedInstancesModificationId field's value.
func (s *ReservedInstancesModification) SetReservedInstancesModificationId(v string) *ReservedInstancesModification {
	s.ReservedInstancesModificationId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *ReservedInstancesModification) SetStatus(v string) *ReservedInstancesModification {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *ReservedInstancesModification) SetStatusMessage(v string) *ReservedInstancesModification {
	s.StatusMessage = &v
	return s
}

// SetUpdateDate sets the UpdateDate field's value.
func (s *ReservedInstancesModification) SetUpdateDate(v time.Time) *ReservedInstancesModification {
	s.UpdateDate = &v
	return s
}

// Describes the modification request/s.
type ReservedInstancesModificationResult struct {
	_ struct{} `type:"structure"`

	// The ID for the Reserved Instances that were created as part of the modification
	// request. This field is only available when the modification is fulfilled.
	ReservedInstancesId *string `locationName:"reservedInstancesId" type:"string"`

	// The target Reserved Instances configurations supplied as part of the modification
	// request.
	TargetConfiguration *ReservedInstancesConfiguration `locationName:"targetConfiguration" type:"structure"`
}

// String returns the string representation
func (s ReservedInstancesModificationResult) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstancesModificationResult) GoString() string {
	return s.String()
}

// SetReservedInstancesId sets the ReservedInstancesId field's value.
func (s *ReservedInstancesModificationResult) SetReservedInstancesId(v string) *ReservedInstancesModificationResult {
	s.ReservedInstancesId = &v
	return s
}

// SetTargetConfiguration sets the TargetConfiguration field's value.
func (s *ReservedInstancesModificationResult) SetTargetConfiguration(v *ReservedInstancesConfiguration) *ReservedInstancesModificationResult {
	s.TargetConfiguration = v
	return s
}

// Describes a Reserved Instance offering.
type ReservedInstancesOffering struct {
	_ struct{} `type:"structure"`

	// The Availability Zone in which the Reserved Instance can be used.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The currency of the Reserved Instance offering you are purchasing. It's specified
	// using ISO 4217 standard currency codes. At this time, the only supported
	// currency is USD.
	CurrencyCode *string `locationName:"currencyCode" type:"string" enum:"CurrencyCodeValues"`

	// The duration of the Reserved Instance, in seconds.
	Duration *int64 `locationName:"duration" type:"long"`

	// The purchase price of the Reserved Instance.
	FixedPrice *float64 `locationName:"fixedPrice" type:"float"`

	// The tenancy of the instance.
	InstanceTenancy *string `locationName:"instanceTenancy" type:"string" enum:"Tenancy"`

	// The instance type on which the Reserved Instance can be used.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// Indicates whether the offering is available through the Reserved Instance
	// Marketplace (resale) or AWS. If it's a Reserved Instance Marketplace offering,
	// this is true.
	Marketplace *bool `locationName:"marketplace" type:"boolean"`

	// If convertible it can be exchanged for Reserved Instances of the same or
	// higher monetary value, with different configurations. If standard, it is
	// not possible to perform an exchange.
	OfferingClass *string `locationName:"offeringClass" type:"string" enum:"OfferingClassType"`

	// The Reserved Instance offering type.
	OfferingType *string `locationName:"offeringType" type:"string" enum:"OfferingTypeValues"`

	// The pricing details of the Reserved Instance offering.
	PricingDetails []*PricingDetail `locationName:"pricingDetailsSet" locationNameList:"item" type:"list"`

	// The Reserved Instance product platform description.
	ProductDescription *string `locationName:"productDescription" type:"string" enum:"RIProductDescription"`

	// The recurring charge tag assigned to the resource.
	RecurringCharges []*RecurringCharge `locationName:"recurringCharges" locationNameList:"item" type:"list"`

	// The ID of the Reserved Instance offering. This is the offering ID used in
	// GetReservedInstancesExchangeQuote to confirm that an exchange can be made.
	ReservedInstancesOfferingId *string `locationName:"reservedInstancesOfferingId" type:"string"`

	// Whether the Reserved Instance is applied to instances in a region or an Availability
	// Zone.
	Scope *string `locationName:"scope" type:"string" enum:"scope"`

	// The usage price of the Reserved Instance, per hour.
	UsagePrice *float64 `locationName:"usagePrice" type:"float"`
}

// String returns the string representation
func (s ReservedInstancesOffering) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ReservedInstancesOffering) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ReservedInstancesOffering) SetAvailabilityZone(v string) *ReservedInstancesOffering {
	s.AvailabilityZone = &v
	return s
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *ReservedInstancesOffering) SetCurrencyCode(v string) *ReservedInstancesOffering {
	s.CurrencyCode = &v
	return s
}

// SetDuration sets the Duration field's value.
func (s *ReservedInstancesOffering) SetDuration(v int64) *ReservedInstancesOffering {
	s.Duration = &v
	return s
}

// SetFixedPrice sets the FixedPrice field's value.
func (s *ReservedInstancesOffering) SetFixedPrice(v float64) *ReservedInstancesOffering {
	s.FixedPrice = &v
	return s
}

// SetInstanceTenancy sets the InstanceTenancy field's value.
func (s *ReservedInstancesOffering) SetInstanceTenancy(v string) *ReservedInstancesOffering {
	s.InstanceTenancy = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ReservedInstancesOffering) SetInstanceType(v string) *ReservedInstancesOffering {
	s.InstanceType = &v
	return s
}

// SetMarketplace sets the Marketplace field's value.
func (s *ReservedInstancesOffering) SetMarketplace(v bool) *ReservedInstancesOffering {
	s.Marketplace = &v
	return s
}

// SetOfferingClass sets the OfferingClass field's value.
func (s *ReservedInstancesOffering) SetOfferingClass(v string) *ReservedInstancesOffering {
	s.OfferingClass = &v
	return s
}

// SetOfferingType sets the OfferingType field's value.
func (s *ReservedInstancesOffering) SetOfferingType(v string) *ReservedInstancesOffering {
	s.OfferingType = &v
	return s
}

// SetPricingDetails sets the PricingDetails field's value.
func (s *ReservedInstancesOffering) SetPricingDetails(v []*PricingDetail) *ReservedInstancesOffering {
	s.PricingDetails = v
	return s
}

// SetProductDescription sets the ProductDescription field's value.
func (s *ReservedInstancesOffering) SetProductDescription(v string) *ReservedInstancesOffering {
	s.ProductDescription = &v
	return s
}

// SetRecurringCharges sets the RecurringCharges field's value.
func (s *ReservedInstancesOffering) SetRecurringCharges(v []*RecurringCharge) *ReservedInstancesOffering {
	s.RecurringCharges = v
	return s
}

// SetReservedInstancesOfferingId sets the ReservedInstancesOfferingId field's value.
func (s *ReservedInstancesOffering) SetReservedInstancesOfferingId(v string) *ReservedInstancesOffering {
	s.ReservedInstancesOfferingId = &v
	return s
}

// SetScope sets the Scope field's value.
func (s *ReservedInstancesOffering) SetScope(v string) *ReservedInstancesOffering {
	s.Scope = &v
	return s
}

// SetUsagePrice sets the UsagePrice field's value.
func (s *ReservedInstancesOffering) SetUsagePrice(v float64) *ReservedInstancesOffering {
	s.UsagePrice = &v
	return s
}

type ResetFpgaImageAttributeInput struct {
	_ struct{} `type:"structure"`

	// The attribute.
	Attribute *string `type:"string" enum:"ResetFpgaImageAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the AFI.
	//
	// FpgaImageId is a required field
	FpgaImageId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ResetFpgaImageAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetFpgaImageAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ResetFpgaImageAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ResetFpgaImageAttributeInput"}
	if s.FpgaImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("FpgaImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ResetFpgaImageAttributeInput) SetAttribute(v string) *ResetFpgaImageAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ResetFpgaImageAttributeInput) SetDryRun(v bool) *ResetFpgaImageAttributeInput {
	s.DryRun = &v
	return s
}

// SetFpgaImageId sets the FpgaImageId field's value.
func (s *ResetFpgaImageAttributeInput) SetFpgaImageId(v string) *ResetFpgaImageAttributeInput {
	s.FpgaImageId = &v
	return s
}

type ResetFpgaImageAttributeOutput struct {
	_ struct{} `type:"structure"`

	// Is true if the request succeeds, and an error otherwise.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s ResetFpgaImageAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetFpgaImageAttributeOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *ResetFpgaImageAttributeOutput) SetReturn(v bool) *ResetFpgaImageAttributeOutput {
	s.Return = &v
	return s
}

// Contains the parameters for ResetImageAttribute.
type ResetImageAttributeInput struct {
	_ struct{} `type:"structure"`

	// The attribute to reset (currently you can only reset the launch permission
	// attribute).
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"ResetImageAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the AMI.
	//
	// ImageId is a required field
	ImageId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ResetImageAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetImageAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ResetImageAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ResetImageAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.ImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("ImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ResetImageAttributeInput) SetAttribute(v string) *ResetImageAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ResetImageAttributeInput) SetDryRun(v bool) *ResetImageAttributeInput {
	s.DryRun = &v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *ResetImageAttributeInput) SetImageId(v string) *ResetImageAttributeInput {
	s.ImageId = &v
	return s
}

type ResetImageAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ResetImageAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetImageAttributeOutput) GoString() string {
	return s.String()
}

type ResetInstanceAttributeInput struct {
	_ struct{} `type:"structure"`

	// The attribute to reset.
	//
	// You can only reset the following attributes: kernel | ramdisk | sourceDestCheck.
	// To change an instance attribute, use ModifyInstanceAttribute.
	//
	// Attribute is a required field
	Attribute *string `locationName:"attribute" type:"string" required:"true" enum:"InstanceAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the instance.
	//
	// InstanceId is a required field
	InstanceId *string `locationName:"instanceId" type:"string" required:"true"`
}

// String returns the string representation
func (s ResetInstanceAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetInstanceAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ResetInstanceAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ResetInstanceAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.InstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ResetInstanceAttributeInput) SetAttribute(v string) *ResetInstanceAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ResetInstanceAttributeInput) SetDryRun(v bool) *ResetInstanceAttributeInput {
	s.DryRun = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *ResetInstanceAttributeInput) SetInstanceId(v string) *ResetInstanceAttributeInput {
	s.InstanceId = &v
	return s
}

type ResetInstanceAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ResetInstanceAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetInstanceAttributeOutput) GoString() string {
	return s.String()
}

// Contains the parameters for ResetNetworkInterfaceAttribute.
type ResetNetworkInterfaceAttributeInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`

	// The source/destination checking attribute. Resets the value to true.
	SourceDestCheck *string `locationName:"sourceDestCheck" type:"string"`
}

// String returns the string representation
func (s ResetNetworkInterfaceAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetNetworkInterfaceAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ResetNetworkInterfaceAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ResetNetworkInterfaceAttributeInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *ResetNetworkInterfaceAttributeInput) SetDryRun(v bool) *ResetNetworkInterfaceAttributeInput {
	s.DryRun = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *ResetNetworkInterfaceAttributeInput) SetNetworkInterfaceId(v string) *ResetNetworkInterfaceAttributeInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetSourceDestCheck sets the SourceDestCheck field's value.
func (s *ResetNetworkInterfaceAttributeInput) SetSourceDestCheck(v string) *ResetNetworkInterfaceAttributeInput {
	s.SourceDestCheck = &v
	return s
}

type ResetNetworkInterfaceAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ResetNetworkInterfaceAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetNetworkInterfaceAttributeOutput) GoString() string {
	return s.String()
}

// Contains the parameters for ResetSnapshotAttribute.
type ResetSnapshotAttributeInput struct {
	_ struct{} `type:"structure"`

	// The attribute to reset. Currently, only the attribute for permission to create
	// volumes can be reset.
	//
	// Attribute is a required field
	Attribute *string `type:"string" required:"true" enum:"SnapshotAttributeName"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The ID of the snapshot.
	//
	// SnapshotId is a required field
	SnapshotId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s ResetSnapshotAttributeInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetSnapshotAttributeInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ResetSnapshotAttributeInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ResetSnapshotAttributeInput"}
	if s.Attribute == nil {
		invalidParams.Add(request.NewErrParamRequired("Attribute"))
	}
	if s.SnapshotId == nil {
		invalidParams.Add(request.NewErrParamRequired("SnapshotId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttribute sets the Attribute field's value.
func (s *ResetSnapshotAttributeInput) SetAttribute(v string) *ResetSnapshotAttributeInput {
	s.Attribute = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *ResetSnapshotAttributeInput) SetDryRun(v bool) *ResetSnapshotAttributeInput {
	s.DryRun = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *ResetSnapshotAttributeInput) SetSnapshotId(v string) *ResetSnapshotAttributeInput {
	s.SnapshotId = &v
	return s
}

type ResetSnapshotAttributeOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s ResetSnapshotAttributeOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResetSnapshotAttributeOutput) GoString() string {
	return s.String()
}

// Describes the error that's returned when you cannot delete a launch template
// version.
type ResponseError struct {
	_ struct{} `type:"structure"`

	// The error code.
	Code *string `locationName:"code" type:"string" enum:"LaunchTemplateErrorCode"`

	// The error message, if applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s ResponseError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResponseError) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *ResponseError) SetCode(v string) *ResponseError {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *ResponseError) SetMessage(v string) *ResponseError {
	s.Message = &v
	return s
}

// The information for a launch template.
type ResponseLaunchTemplateData struct {
	_ struct{} `type:"structure"`

	// The block device mappings.
	BlockDeviceMappings []*LaunchTemplateBlockDeviceMapping `locationName:"blockDeviceMappingSet" locationNameList:"item" type:"list"`

	// Information about the Capacity Reservation targeting option.
	CapacityReservationSpecification *LaunchTemplateCapacityReservationSpecificationResponse `locationName:"capacityReservationSpecification" type:"structure"`

	// The CPU options for the instance. For more information, see Optimizing CPU
	// Options (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	CpuOptions *LaunchTemplateCpuOptions `locationName:"cpuOptions" type:"structure"`

	// The credit option for CPU usage of the instance.
	CreditSpecification *CreditSpecification `locationName:"creditSpecification" type:"structure"`

	// If set to true, indicates that the instance cannot be terminated using the
	// Amazon EC2 console, command line tool, or API.
	DisableApiTermination *bool `locationName:"disableApiTermination" type:"boolean"`

	// Indicates whether the instance is optimized for Amazon EBS I/O.
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// The elastic GPU specification.
	ElasticGpuSpecifications []*ElasticGpuSpecificationResponse `locationName:"elasticGpuSpecificationSet" locationNameList:"item" type:"list"`

	// The elastic inference accelerator for the instance.
	ElasticInferenceAccelerators []*LaunchTemplateElasticInferenceAcceleratorResponse `locationName:"elasticInferenceAcceleratorSet" locationNameList:"item" type:"list"`

	// Indicates whether an instance is configured for hibernation. For more information,
	// see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	HibernationOptions *LaunchTemplateHibernationOptions `locationName:"hibernationOptions" type:"structure"`

	// The IAM instance profile.
	IamInstanceProfile *LaunchTemplateIamInstanceProfileSpecification `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the AMI that was used to launch the instance.
	ImageId *string `locationName:"imageId" type:"string"`

	// Indicates whether an instance stops or terminates when you initiate shutdown
	// from the instance (using the operating system command for system shutdown).
	InstanceInitiatedShutdownBehavior *string `locationName:"instanceInitiatedShutdownBehavior" type:"string" enum:"ShutdownBehavior"`

	// The market (purchasing) option for the instances.
	InstanceMarketOptions *LaunchTemplateInstanceMarketOptions `locationName:"instanceMarketOptions" type:"structure"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The ID of the kernel, if applicable.
	KernelId *string `locationName:"kernelId" type:"string"`

	// The name of the key pair.
	KeyName *string `locationName:"keyName" type:"string"`

	// The license configurations.
	LicenseSpecifications []*LaunchTemplateLicenseConfiguration `locationName:"licenseSet" locationNameList:"item" type:"list"`

	// The monitoring for the instance.
	Monitoring *LaunchTemplatesMonitoring `locationName:"monitoring" type:"structure"`

	// The network interfaces.
	NetworkInterfaces []*LaunchTemplateInstanceNetworkInterfaceSpecification `locationName:"networkInterfaceSet" locationNameList:"item" type:"list"`

	// The placement of the instance.
	Placement *LaunchTemplatePlacement `locationName:"placement" type:"structure"`

	// The ID of the RAM disk, if applicable.
	RamDiskId *string `locationName:"ramDiskId" type:"string"`

	// The security group IDs.
	SecurityGroupIds []*string `locationName:"securityGroupIdSet" locationNameList:"item" type:"list"`

	// The security group names.
	SecurityGroups []*string `locationName:"securityGroupSet" locationNameList:"item" type:"list"`

	// The tags.
	TagSpecifications []*LaunchTemplateTagSpecification `locationName:"tagSpecificationSet" locationNameList:"item" type:"list"`

	// The user data for the instance.
	UserData *string `locationName:"userData" type:"string"`
}

// String returns the string representation
func (s ResponseLaunchTemplateData) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ResponseLaunchTemplateData) GoString() string {
	return s.String()
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *ResponseLaunchTemplateData) SetBlockDeviceMappings(v []*LaunchTemplateBlockDeviceMapping) *ResponseLaunchTemplateData {
	s.BlockDeviceMappings = v
	return s
}

// SetCapacityReservationSpecification sets the CapacityReservationSpecification field's value.
func (s *ResponseLaunchTemplateData) SetCapacityReservationSpecification(v *LaunchTemplateCapacityReservationSpecificationResponse) *ResponseLaunchTemplateData {
	s.CapacityReservationSpecification = v
	return s
}

// SetCpuOptions sets the CpuOptions field's value.
func (s *ResponseLaunchTemplateData) SetCpuOptions(v *LaunchTemplateCpuOptions) *ResponseLaunchTemplateData {
	s.CpuOptions = v
	return s
}

// SetCreditSpecification sets the CreditSpecification field's value.
func (s *ResponseLaunchTemplateData) SetCreditSpecification(v *CreditSpecification) *ResponseLaunchTemplateData {
	s.CreditSpecification = v
	return s
}

// SetDisableApiTermination sets the DisableApiTermination field's value.
func (s *ResponseLaunchTemplateData) SetDisableApiTermination(v bool) *ResponseLaunchTemplateData {
	s.DisableApiTermination = &v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *ResponseLaunchTemplateData) SetEbsOptimized(v bool) *ResponseLaunchTemplateData {
	s.EbsOptimized = &v
	return s
}

// SetElasticGpuSpecifications sets the ElasticGpuSpecifications field's value.
func (s *ResponseLaunchTemplateData) SetElasticGpuSpecifications(v []*ElasticGpuSpecificationResponse) *ResponseLaunchTemplateData {
	s.ElasticGpuSpecifications = v
	return s
}

// SetElasticInferenceAccelerators sets the ElasticInferenceAccelerators field's value.
func (s *ResponseLaunchTemplateData) SetElasticInferenceAccelerators(v []*LaunchTemplateElasticInferenceAcceleratorResponse) *ResponseLaunchTemplateData {
	s.ElasticInferenceAccelerators = v
	return s
}

// SetHibernationOptions sets the HibernationOptions field's value.
func (s *ResponseLaunchTemplateData) SetHibernationOptions(v *LaunchTemplateHibernationOptions) *ResponseLaunchTemplateData {
	s.HibernationOptions = v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *ResponseLaunchTemplateData) SetIamInstanceProfile(v *LaunchTemplateIamInstanceProfileSpecification) *ResponseLaunchTemplateData {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *ResponseLaunchTemplateData) SetImageId(v string) *ResponseLaunchTemplateData {
	s.ImageId = &v
	return s
}

// SetInstanceInitiatedShutdownBehavior sets the InstanceInitiatedShutdownBehavior field's value.
func (s *ResponseLaunchTemplateData) SetInstanceInitiatedShutdownBehavior(v string) *ResponseLaunchTemplateData {
	s.InstanceInitiatedShutdownBehavior = &v
	return s
}

// SetInstanceMarketOptions sets the InstanceMarketOptions field's value.
func (s *ResponseLaunchTemplateData) SetInstanceMarketOptions(v *LaunchTemplateInstanceMarketOptions) *ResponseLaunchTemplateData {
	s.InstanceMarketOptions = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ResponseLaunchTemplateData) SetInstanceType(v string) *ResponseLaunchTemplateData {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *ResponseLaunchTemplateData) SetKernelId(v string) *ResponseLaunchTemplateData {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *ResponseLaunchTemplateData) SetKeyName(v string) *ResponseLaunchTemplateData {
	s.KeyName = &v
	return s
}

// SetLicenseSpecifications sets the LicenseSpecifications field's value.
func (s *ResponseLaunchTemplateData) SetLicenseSpecifications(v []*LaunchTemplateLicenseConfiguration) *ResponseLaunchTemplateData {
	s.LicenseSpecifications = v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *ResponseLaunchTemplateData) SetMonitoring(v *LaunchTemplatesMonitoring) *ResponseLaunchTemplateData {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *ResponseLaunchTemplateData) SetNetworkInterfaces(v []*LaunchTemplateInstanceNetworkInterfaceSpecification) *ResponseLaunchTemplateData {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *ResponseLaunchTemplateData) SetPlacement(v *LaunchTemplatePlacement) *ResponseLaunchTemplateData {
	s.Placement = v
	return s
}

// SetRamDiskId sets the RamDiskId field's value.
func (s *ResponseLaunchTemplateData) SetRamDiskId(v string) *ResponseLaunchTemplateData {
	s.RamDiskId = &v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *ResponseLaunchTemplateData) SetSecurityGroupIds(v []*string) *ResponseLaunchTemplateData {
	s.SecurityGroupIds = v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *ResponseLaunchTemplateData) SetSecurityGroups(v []*string) *ResponseLaunchTemplateData {
	s.SecurityGroups = v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *ResponseLaunchTemplateData) SetTagSpecifications(v []*LaunchTemplateTagSpecification) *ResponseLaunchTemplateData {
	s.TagSpecifications = v
	return s
}

// SetUserData sets the UserData field's value.
func (s *ResponseLaunchTemplateData) SetUserData(v string) *ResponseLaunchTemplateData {
	s.UserData = &v
	return s
}

type RestoreAddressToClassicInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The Elastic IP address.
	//
	// PublicIp is a required field
	PublicIp *string `locationName:"publicIp" type:"string" required:"true"`
}

// String returns the string representation
func (s RestoreAddressToClassicInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RestoreAddressToClassicInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RestoreAddressToClassicInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RestoreAddressToClassicInput"}
	if s.PublicIp == nil {
		invalidParams.Add(request.NewErrParamRequired("PublicIp"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *RestoreAddressToClassicInput) SetDryRun(v bool) *RestoreAddressToClassicInput {
	s.DryRun = &v
	return s
}

// SetPublicIp sets the PublicIp field's value.
func (s *RestoreAddressToClassicInput) SetPublicIp(v string) *RestoreAddressToClassicInput {
	s.PublicIp = &v
	return s
}

type RestoreAddressToClassicOutput struct {
	_ struct{} `type:"structure"`

	// The Elastic IP address.
	PublicIp *string `locationName:"publicIp" type:"string"`

	// The move status for the IP address.
	Status *string `locationName:"status" type:"string" enum:"Status"`
}

// String returns the string representation
func (s RestoreAddressToClassicOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RestoreAddressToClassicOutput) GoString() string {
	return s.String()
}

// SetPublicIp sets the PublicIp field's value.
func (s *RestoreAddressToClassicOutput) SetPublicIp(v string) *RestoreAddressToClassicOutput {
	s.PublicIp = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *RestoreAddressToClassicOutput) SetStatus(v string) *RestoreAddressToClassicOutput {
	s.Status = &v
	return s
}

type RevokeClientVpnIngressInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Active Directory group for which to revoke access.
	AccessGroupId *string `type:"string"`

	// The ID of the Client VPN endpoint with which the authorization rule is associated.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// Indicates whether access should be revoked for all clients.
	RevokeAllGroups *bool `type:"boolean"`

	// The IPv4 address range, in CIDR notation, of the network for which access
	// is being removed.
	//
	// TargetNetworkCidr is a required field
	TargetNetworkCidr *string `type:"string" required:"true"`
}

// String returns the string representation
func (s RevokeClientVpnIngressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RevokeClientVpnIngressInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RevokeClientVpnIngressInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RevokeClientVpnIngressInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}
	if s.TargetNetworkCidr == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetNetworkCidr"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAccessGroupId sets the AccessGroupId field's value.
func (s *RevokeClientVpnIngressInput) SetAccessGroupId(v string) *RevokeClientVpnIngressInput {
	s.AccessGroupId = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *RevokeClientVpnIngressInput) SetClientVpnEndpointId(v string) *RevokeClientVpnIngressInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RevokeClientVpnIngressInput) SetDryRun(v bool) *RevokeClientVpnIngressInput {
	s.DryRun = &v
	return s
}

// SetRevokeAllGroups sets the RevokeAllGroups field's value.
func (s *RevokeClientVpnIngressInput) SetRevokeAllGroups(v bool) *RevokeClientVpnIngressInput {
	s.RevokeAllGroups = &v
	return s
}

// SetTargetNetworkCidr sets the TargetNetworkCidr field's value.
func (s *RevokeClientVpnIngressInput) SetTargetNetworkCidr(v string) *RevokeClientVpnIngressInput {
	s.TargetNetworkCidr = &v
	return s
}

type RevokeClientVpnIngressOutput struct {
	_ struct{} `type:"structure"`

	// The current state of the authorization rule.
	Status *ClientVpnAuthorizationRuleStatus `locationName:"status" type:"structure"`
}

// String returns the string representation
func (s RevokeClientVpnIngressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RevokeClientVpnIngressOutput) GoString() string {
	return s.String()
}

// SetStatus sets the Status field's value.
func (s *RevokeClientVpnIngressOutput) SetStatus(v *ClientVpnAuthorizationRuleStatus) *RevokeClientVpnIngressOutput {
	s.Status = v
	return s
}

type RevokeSecurityGroupEgressInput struct {
	_ struct{} `type:"structure"`

	// Not supported. Use a set of IP permissions to specify the CIDR.
	CidrIp *string `locationName:"cidrIp" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Not supported. Use a set of IP permissions to specify the port.
	FromPort *int64 `locationName:"fromPort" type:"integer"`

	// The ID of the security group.
	//
	// GroupId is a required field
	GroupId *string `locationName:"groupId" type:"string" required:"true"`

	// One or more sets of IP permissions. You can't specify a destination security
	// group and a CIDR IP address range in the same set of permissions.
	IpPermissions []*IpPermission `locationName:"ipPermissions" locationNameList:"item" type:"list"`

	// Not supported. Use a set of IP permissions to specify the protocol name or
	// number.
	IpProtocol *string `locationName:"ipProtocol" type:"string"`

	// Not supported. Use a set of IP permissions to specify a destination security
	// group.
	SourceSecurityGroupName *string `locationName:"sourceSecurityGroupName" type:"string"`

	// Not supported. Use a set of IP permissions to specify a destination security
	// group.
	SourceSecurityGroupOwnerId *string `locationName:"sourceSecurityGroupOwnerId" type:"string"`

	// Not supported. Use a set of IP permissions to specify the port.
	ToPort *int64 `locationName:"toPort" type:"integer"`
}

// String returns the string representation
func (s RevokeSecurityGroupEgressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RevokeSecurityGroupEgressInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RevokeSecurityGroupEgressInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RevokeSecurityGroupEgressInput"}
	if s.GroupId == nil {
		invalidParams.Add(request.NewErrParamRequired("GroupId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidrIp sets the CidrIp field's value.
func (s *RevokeSecurityGroupEgressInput) SetCidrIp(v string) *RevokeSecurityGroupEgressInput {
	s.CidrIp = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RevokeSecurityGroupEgressInput) SetDryRun(v bool) *RevokeSecurityGroupEgressInput {
	s.DryRun = &v
	return s
}

// SetFromPort sets the FromPort field's value.
func (s *RevokeSecurityGroupEgressInput) SetFromPort(v int64) *RevokeSecurityGroupEgressInput {
	s.FromPort = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *RevokeSecurityGroupEgressInput) SetGroupId(v string) *RevokeSecurityGroupEgressInput {
	s.GroupId = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *RevokeSecurityGroupEgressInput) SetIpPermissions(v []*IpPermission) *RevokeSecurityGroupEgressInput {
	s.IpPermissions = v
	return s
}

// SetIpProtocol sets the IpProtocol field's value.
func (s *RevokeSecurityGroupEgressInput) SetIpProtocol(v string) *RevokeSecurityGroupEgressInput {
	s.IpProtocol = &v
	return s
}

// SetSourceSecurityGroupName sets the SourceSecurityGroupName field's value.
func (s *RevokeSecurityGroupEgressInput) SetSourceSecurityGroupName(v string) *RevokeSecurityGroupEgressInput {
	s.SourceSecurityGroupName = &v
	return s
}

// SetSourceSecurityGroupOwnerId sets the SourceSecurityGroupOwnerId field's value.
func (s *RevokeSecurityGroupEgressInput) SetSourceSecurityGroupOwnerId(v string) *RevokeSecurityGroupEgressInput {
	s.SourceSecurityGroupOwnerId = &v
	return s
}

// SetToPort sets the ToPort field's value.
func (s *RevokeSecurityGroupEgressInput) SetToPort(v int64) *RevokeSecurityGroupEgressInput {
	s.ToPort = &v
	return s
}

type RevokeSecurityGroupEgressOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s RevokeSecurityGroupEgressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RevokeSecurityGroupEgressOutput) GoString() string {
	return s.String()
}

type RevokeSecurityGroupIngressInput struct {
	_ struct{} `type:"structure"`

	// The CIDR IP address range. You can't specify this parameter when specifying
	// a source security group.
	CidrIp *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// The start of port range for the TCP and UDP protocols, or an ICMP type number.
	// For the ICMP type number, use -1 to specify all ICMP types.
	FromPort *int64 `type:"integer"`

	// The ID of the security group. You must specify either the security group
	// ID or the security group name in the request. For security groups in a nondefault
	// VPC, you must specify the security group ID.
	GroupId *string `type:"string"`

	// [EC2-Classic, default VPC] The name of the security group. You must specify
	// either the security group ID or the security group name in the request.
	GroupName *string `type:"string"`

	// One or more sets of IP permissions. You can't specify a source security group
	// and a CIDR IP address range in the same set of permissions.
	IpPermissions []*IpPermission `locationNameList:"item" type:"list"`

	// The IP protocol name (tcp, udp, icmp) or number (see Protocol Numbers (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)).
	// Use -1 to specify all.
	IpProtocol *string `type:"string"`

	// [EC2-Classic, default VPC] The name of the source security group. You can't
	// specify this parameter in combination with the following parameters: the
	// CIDR IP address range, the start of the port range, the IP protocol, and
	// the end of the port range. For EC2-VPC, the source security group must be
	// in the same VPC. To revoke a specific rule for an IP protocol and port range,
	// use a set of IP permissions instead.
	SourceSecurityGroupName *string `type:"string"`

	// [EC2-Classic] The AWS account ID of the source security group, if the source
	// security group is in a different account. You can't specify this parameter
	// in combination with the following parameters: the CIDR IP address range,
	// the IP protocol, the start of the port range, and the end of the port range.
	// To revoke a specific rule for an IP protocol and port range, use a set of
	// IP permissions instead.
	SourceSecurityGroupOwnerId *string `type:"string"`

	// The end of port range for the TCP and UDP protocols, or an ICMP code number.
	// For the ICMP code number, use -1 to specify all ICMP codes for the ICMP type.
	ToPort *int64 `type:"integer"`
}

// String returns the string representation
func (s RevokeSecurityGroupIngressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RevokeSecurityGroupIngressInput) GoString() string {
	return s.String()
}

// SetCidrIp sets the CidrIp field's value.
func (s *RevokeSecurityGroupIngressInput) SetCidrIp(v string) *RevokeSecurityGroupIngressInput {
	s.CidrIp = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RevokeSecurityGroupIngressInput) SetDryRun(v bool) *RevokeSecurityGroupIngressInput {
	s.DryRun = &v
	return s
}

// SetFromPort sets the FromPort field's value.
func (s *RevokeSecurityGroupIngressInput) SetFromPort(v int64) *RevokeSecurityGroupIngressInput {
	s.FromPort = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *RevokeSecurityGroupIngressInput) SetGroupId(v string) *RevokeSecurityGroupIngressInput {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *RevokeSecurityGroupIngressInput) SetGroupName(v string) *RevokeSecurityGroupIngressInput {
	s.GroupName = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *RevokeSecurityGroupIngressInput) SetIpPermissions(v []*IpPermission) *RevokeSecurityGroupIngressInput {
	s.IpPermissions = v
	return s
}

// SetIpProtocol sets the IpProtocol field's value.
func (s *RevokeSecurityGroupIngressInput) SetIpProtocol(v string) *RevokeSecurityGroupIngressInput {
	s.IpProtocol = &v
	return s
}

// SetSourceSecurityGroupName sets the SourceSecurityGroupName field's value.
func (s *RevokeSecurityGroupIngressInput) SetSourceSecurityGroupName(v string) *RevokeSecurityGroupIngressInput {
	s.SourceSecurityGroupName = &v
	return s
}

// SetSourceSecurityGroupOwnerId sets the SourceSecurityGroupOwnerId field's value.
func (s *RevokeSecurityGroupIngressInput) SetSourceSecurityGroupOwnerId(v string) *RevokeSecurityGroupIngressInput {
	s.SourceSecurityGroupOwnerId = &v
	return s
}

// SetToPort sets the ToPort field's value.
func (s *RevokeSecurityGroupIngressInput) SetToPort(v int64) *RevokeSecurityGroupIngressInput {
	s.ToPort = &v
	return s
}

type RevokeSecurityGroupIngressOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s RevokeSecurityGroupIngressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RevokeSecurityGroupIngressOutput) GoString() string {
	return s.String()
}

// Describes a route in a route table.
type Route struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR block used for the destination match.
	DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"`

	// The IPv6 CIDR block used for the destination match.
	DestinationIpv6CidrBlock *string `locationName:"destinationIpv6CidrBlock" type:"string"`

	// The prefix of the AWS service.
	DestinationPrefixListId *string `locationName:"destinationPrefixListId" type:"string"`

	// The ID of the egress-only internet gateway.
	EgressOnlyInternetGatewayId *string `locationName:"egressOnlyInternetGatewayId" type:"string"`

	// The ID of a gateway attached to your VPC.
	GatewayId *string `locationName:"gatewayId" type:"string"`

	// The ID of a NAT instance in your VPC.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The AWS account ID of the owner of the instance.
	InstanceOwnerId *string `locationName:"instanceOwnerId" type:"string"`

	// The ID of a NAT gateway.
	NatGatewayId *string `locationName:"natGatewayId" type:"string"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// Describes how the route was created.
	//
	//    * CreateRouteTable - The route was automatically created when the route
	//    table was created.
	//
	//    * CreateRoute - The route was manually added to the route table.
	//
	//    * EnableVgwRoutePropagation - The route was propagated by route propagation.
	Origin *string `locationName:"origin" type:"string" enum:"RouteOrigin"`

	// The state of the route. The blackhole state indicates that the route's target
	// isn't available (for example, the specified gateway isn't attached to the
	// VPC, or the specified NAT instance has been terminated).
	State *string `locationName:"state" type:"string" enum:"RouteState"`

	// The ID of a transit gateway.
	TransitGatewayId *string `locationName:"transitGatewayId" type:"string"`

	// The ID of a VPC peering connection.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s Route) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Route) GoString() string {
	return s.String()
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *Route) SetDestinationCidrBlock(v string) *Route {
	s.DestinationCidrBlock = &v
	return s
}

// SetDestinationIpv6CidrBlock sets the DestinationIpv6CidrBlock field's value.
func (s *Route) SetDestinationIpv6CidrBlock(v string) *Route {
	s.DestinationIpv6CidrBlock = &v
	return s
}

// SetDestinationPrefixListId sets the DestinationPrefixListId field's value.
func (s *Route) SetDestinationPrefixListId(v string) *Route {
	s.DestinationPrefixListId = &v
	return s
}

// SetEgressOnlyInternetGatewayId sets the EgressOnlyInternetGatewayId field's value.
func (s *Route) SetEgressOnlyInternetGatewayId(v string) *Route {
	s.EgressOnlyInternetGatewayId = &v
	return s
}

// SetGatewayId sets the GatewayId field's value.
func (s *Route) SetGatewayId(v string) *Route {
	s.GatewayId = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *Route) SetInstanceId(v string) *Route {
	s.InstanceId = &v
	return s
}

// SetInstanceOwnerId sets the InstanceOwnerId field's value.
func (s *Route) SetInstanceOwnerId(v string) *Route {
	s.InstanceOwnerId = &v
	return s
}

// SetNatGatewayId sets the NatGatewayId field's value.
func (s *Route) SetNatGatewayId(v string) *Route {
	s.NatGatewayId = &v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *Route) SetNetworkInterfaceId(v string) *Route {
	s.NetworkInterfaceId = &v
	return s
}

// SetOrigin sets the Origin field's value.
func (s *Route) SetOrigin(v string) *Route {
	s.Origin = &v
	return s
}

// SetState sets the State field's value.
func (s *Route) SetState(v string) *Route {
	s.State = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *Route) SetTransitGatewayId(v string) *Route {
	s.TransitGatewayId = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *Route) SetVpcPeeringConnectionId(v string) *Route {
	s.VpcPeeringConnectionId = &v
	return s
}

// Describes a route table.
type RouteTable struct {
	_ struct{} `type:"structure"`

	// The associations between the route table and one or more subnets.
	Associations []*RouteTableAssociation `locationName:"associationSet" locationNameList:"item" type:"list"`

	// The ID of the AWS account that owns the route table.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Any virtual private gateway (VGW) propagating routes.
	PropagatingVgws []*PropagatingVgw `locationName:"propagatingVgwSet" locationNameList:"item" type:"list"`

	// The ID of the route table.
	RouteTableId *string `locationName:"routeTableId" type:"string"`

	// The routes in the route table.
	Routes []*Route `locationName:"routeSet" locationNameList:"item" type:"list"`

	// Any tags assigned to the route table.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s RouteTable) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RouteTable) GoString() string {
	return s.String()
}

// SetAssociations sets the Associations field's value.
func (s *RouteTable) SetAssociations(v []*RouteTableAssociation) *RouteTable {
	s.Associations = v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *RouteTable) SetOwnerId(v string) *RouteTable {
	s.OwnerId = &v
	return s
}

// SetPropagatingVgws sets the PropagatingVgws field's value.
func (s *RouteTable) SetPropagatingVgws(v []*PropagatingVgw) *RouteTable {
	s.PropagatingVgws = v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *RouteTable) SetRouteTableId(v string) *RouteTable {
	s.RouteTableId = &v
	return s
}

// SetRoutes sets the Routes field's value.
func (s *RouteTable) SetRoutes(v []*Route) *RouteTable {
	s.Routes = v
	return s
}

// SetTags sets the Tags field's value.
func (s *RouteTable) SetTags(v []*Tag) *RouteTable {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *RouteTable) SetVpcId(v string) *RouteTable {
	s.VpcId = &v
	return s
}

// Describes an association between a route table and a subnet.
type RouteTableAssociation struct {
	_ struct{} `type:"structure"`

	// Indicates whether this is the main route table.
	Main *bool `locationName:"main" type:"boolean"`

	// The ID of the association between a route table and a subnet.
	RouteTableAssociationId *string `locationName:"routeTableAssociationId" type:"string"`

	// The ID of the route table.
	RouteTableId *string `locationName:"routeTableId" type:"string"`

	// The ID of the subnet. A subnet ID is not returned for an implicit association.
	SubnetId *string `locationName:"subnetId" type:"string"`
}

// String returns the string representation
func (s RouteTableAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RouteTableAssociation) GoString() string {
	return s.String()
}

// SetMain sets the Main field's value.
func (s *RouteTableAssociation) SetMain(v bool) *RouteTableAssociation {
	s.Main = &v
	return s
}

// SetRouteTableAssociationId sets the RouteTableAssociationId field's value.
func (s *RouteTableAssociation) SetRouteTableAssociationId(v string) *RouteTableAssociation {
	s.RouteTableAssociationId = &v
	return s
}

// SetRouteTableId sets the RouteTableId field's value.
func (s *RouteTableAssociation) SetRouteTableId(v string) *RouteTableAssociation {
	s.RouteTableId = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *RouteTableAssociation) SetSubnetId(v string) *RouteTableAssociation {
	s.SubnetId = &v
	return s
}

type RunInstancesInput struct {
	_ struct{} `type:"structure"`

	// Reserved.
	AdditionalInfo *string `locationName:"additionalInfo" type:"string"`

	// One or more block device mapping entries. You can't specify both a snapshot
	// ID and an encryption value. This is because only blank volumes can be encrypted
	// on creation. If a snapshot is the basis for a volume, it is not blank and
	// its encryption status is used for the volume encryption status.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"BlockDeviceMapping" locationNameList:"BlockDeviceMapping" type:"list"`

	// Information about the Capacity Reservation targeting option. If you do not
	// specify this parameter, the instance's Capacity Reservation preference defaults
	// to open, which enables it to run in any open Capacity Reservation that has
	// matching attributes (instance type, platform, Availability Zone).
	CapacityReservationSpecification *CapacityReservationSpecification `type:"structure"`

	// Unique, case-sensitive identifier you provide to ensure the idempotency of
	// the request. For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	//
	// Constraints: Maximum 64 ASCII characters
	ClientToken *string `locationName:"clientToken" type:"string"`

	// The CPU options for the instance. For more information, see Optimizing CPU
	// Options (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	CpuOptions *CpuOptionsRequest `type:"structure"`

	// The credit option for CPU usage of the instance. Valid values are standard
	// and unlimited. To change this attribute after launch, use ModifyInstanceCreditSpecification.
	// For more information, see Burstable Performance Instances (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Default: standard (T2 instances) or unlimited (T3 instances)
	CreditSpecification *CreditSpecificationRequest `type:"structure"`

	// If you set this parameter to true, you can't terminate the instance using
	// the Amazon EC2 console, CLI, or API; otherwise, you can. To change this attribute
	// to false after launch, use ModifyInstanceAttribute. Alternatively, if you
	// set InstanceInitiatedShutdownBehavior to terminate, you can terminate the
	// instance by running the shutdown command from the instance.
	//
	// Default: false
	DisableApiTermination *bool `locationName:"disableApiTermination" type:"boolean"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Indicates whether the instance is optimized for Amazon EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal Amazon EBS I/O performance. This optimization isn't
	// available with all instance types. Additional usage charges apply when using
	// an EBS-optimized instance.
	//
	// Default: false
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// An elastic GPU to associate with the instance.
	ElasticGpuSpecification []*ElasticGpuSpecification `locationNameList:"item" type:"list"`

	// An elastic inference accelerator.
	ElasticInferenceAccelerators []*ElasticInferenceAccelerator `locationName:"ElasticInferenceAccelerator" locationNameList:"item" type:"list"`

	// Indicates whether an instance is enabled for hibernation. For more information,
	// see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	HibernationOptions *HibernationOptionsRequest `type:"structure"`

	// The IAM instance profile.
	IamInstanceProfile *IamInstanceProfileSpecification `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the AMI, which you can get by calling DescribeImages. An AMI is
	// required to launch an instance and must be specified here or in a launch
	// template.
	ImageId *string `type:"string"`

	// Indicates whether an instance stops or terminates when you initiate shutdown
	// from the instance (using the operating system command for system shutdown).
	//
	// Default: stop
	InstanceInitiatedShutdownBehavior *string `locationName:"instanceInitiatedShutdownBehavior" type:"string" enum:"ShutdownBehavior"`

	// The market (purchasing) option for the instances.
	//
	// For RunInstances, persistent Spot Instance requests are only supported when
	// InstanceInterruptionBehavior is set to either hibernate or stop.
	InstanceMarketOptions *InstanceMarketOptionsRequest `type:"structure"`

	// The instance type. For more information, see Instance Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Default: m1.small
	InstanceType *string `type:"string" enum:"InstanceType"`

	// [EC2-VPC] A number of IPv6 addresses to associate with the primary network
	// interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet.
	// You cannot specify this option and the option to assign specific IPv6 addresses
	// in the same request. You can specify this option if you've specified a minimum
	// number of instances to launch.
	Ipv6AddressCount *int64 `type:"integer"`

	// [EC2-VPC] Specify one or more IPv6 addresses from the range of the subnet
	// to associate with the primary network interface. You cannot specify this
	// option and the option to assign a number of IPv6 addresses in the same request.
	// You cannot specify this option if you've specified a minimum number of instances
	// to launch.
	Ipv6Addresses []*InstanceIpv6Address `locationName:"Ipv6Address" locationNameList:"item" type:"list"`

	// The ID of the kernel.
	//
	// We recommend that you use PV-GRUB instead of kernels and RAM disks. For more
	// information, see  PV-GRUB (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	KernelId *string `type:"string"`

	// The name of the key pair. You can create a key pair using CreateKeyPair or
	// ImportKeyPair.
	//
	// If you do not specify a key pair, you can't connect to the instance unless
	// you choose an AMI that is configured to allow users another way to log in.
	KeyName *string `type:"string"`

	// The launch template to use to launch the instances. Any parameters that you
	// specify in RunInstances override the same parameters in the launch template.
	// You can specify either the name or ID of a launch template, but not both.
	LaunchTemplate *LaunchTemplateSpecification `type:"structure"`

	// The license configurations.
	LicenseSpecifications []*LicenseConfigurationRequest `locationName:"LicenseSpecification" locationNameList:"item" type:"list"`

	// The maximum number of instances to launch. If you specify more instances
	// than Amazon EC2 can launch in the target Availability Zone, Amazon EC2 launches
	// the largest possible number of instances above MinCount.
	//
	// Constraints: Between 1 and the maximum number you're allowed for the specified
	// instance type. For more information about the default limits, and how to
	// request an increase, see How many instances can I run in Amazon EC2 (http://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2)
	// in the Amazon EC2 FAQ.
	//
	// MaxCount is a required field
	MaxCount *int64 `type:"integer" required:"true"`

	// The minimum number of instances to launch. If you specify a minimum that
	// is more instances than Amazon EC2 can launch in the target Availability Zone,
	// Amazon EC2 launches no instances.
	//
	// Constraints: Between 1 and the maximum number you're allowed for the specified
	// instance type. For more information about the default limits, and how to
	// request an increase, see How many instances can I run in Amazon EC2 (http://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2)
	// in the Amazon EC2 General FAQ.
	//
	// MinCount is a required field
	MinCount *int64 `type:"integer" required:"true"`

	// The monitoring for the instance.
	Monitoring *RunInstancesMonitoringEnabled `type:"structure"`

	// One or more network interfaces.
	NetworkInterfaces []*InstanceNetworkInterfaceSpecification `locationName:"networkInterface" locationNameList:"item" type:"list"`

	// The placement for the instance.
	Placement *Placement `type:"structure"`

	// [EC2-VPC] The primary IPv4 address. You must specify a value from the IPv4
	// address range of the subnet.
	//
	// Only one private IP address can be designated as primary. You can't specify
	// this option if you've specified the option to designate a private IP address
	// as the primary IP address in a network interface specification. You cannot
	// specify this option if you're launching more than one instance in the request.
	PrivateIpAddress *string `locationName:"privateIpAddress" type:"string"`

	// The ID of the RAM disk.
	//
	// We recommend that you use PV-GRUB instead of kernels and RAM disks. For more
	// information, see  PV-GRUB (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	RamdiskId *string `type:"string"`

	// One or more security group IDs. You can create a security group using CreateSecurityGroup.
	//
	// Default: Amazon EC2 uses the default security group.
	SecurityGroupIds []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// [EC2-Classic, default VPC] One or more security group names. For a nondefault
	// VPC, you must use security group IDs instead.
	//
	// Default: Amazon EC2 uses the default security group.
	SecurityGroups []*string `locationName:"SecurityGroup" locationNameList:"SecurityGroup" type:"list"`

	// [EC2-VPC] The ID of the subnet to launch the instance into.
	SubnetId *string `type:"string"`

	// The tags to apply to the resources during launch. You can only tag instances
	// and volumes on launch. The specified tags are applied to all instances or
	// volumes that are created during launch. To tag a resource after it has been
	// created, see CreateTags.
	TagSpecifications []*TagSpecification `locationName:"TagSpecification" locationNameList:"item" type:"list"`

	// The user data to make available to the instance. For more information, see
	// Running Commands on Your Linux Instance at Launch (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)
	// (Linux) and Adding User Data (https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html#instancedata-add-user-data)
	// (Windows). If you are using a command line tool, base64-encoding is performed
	// for you, and you can load the text from a file. Otherwise, you must provide
	// base64-encoded text.
	UserData *string `type:"string"`
}

// String returns the string representation
func (s RunInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RunInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RunInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RunInstancesInput"}
	if s.MaxCount == nil {
		invalidParams.Add(request.NewErrParamRequired("MaxCount"))
	}
	if s.MinCount == nil {
		invalidParams.Add(request.NewErrParamRequired("MinCount"))
	}
	if s.CreditSpecification != nil {
		if err := s.CreditSpecification.Validate(); err != nil {
			invalidParams.AddNested("CreditSpecification", err.(request.ErrInvalidParams))
		}
	}
	if s.ElasticGpuSpecification != nil {
		for i, v := range s.ElasticGpuSpecification {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ElasticGpuSpecification", i), err.(request.ErrInvalidParams))
			}
		}
	}
	if s.ElasticInferenceAccelerators != nil {
		for i, v := range s.ElasticInferenceAccelerators {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "ElasticInferenceAccelerators", i), err.(request.ErrInvalidParams))
			}
		}
	}
	if s.Monitoring != nil {
		if err := s.Monitoring.Validate(); err != nil {
			invalidParams.AddNested("Monitoring", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAdditionalInfo sets the AdditionalInfo field's value.
func (s *RunInstancesInput) SetAdditionalInfo(v string) *RunInstancesInput {
	s.AdditionalInfo = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *RunInstancesInput) SetBlockDeviceMappings(v []*BlockDeviceMapping) *RunInstancesInput {
	s.BlockDeviceMappings = v
	return s
}

// SetCapacityReservationSpecification sets the CapacityReservationSpecification field's value.
func (s *RunInstancesInput) SetCapacityReservationSpecification(v *CapacityReservationSpecification) *RunInstancesInput {
	s.CapacityReservationSpecification = v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *RunInstancesInput) SetClientToken(v string) *RunInstancesInput {
	s.ClientToken = &v
	return s
}

// SetCpuOptions sets the CpuOptions field's value.
func (s *RunInstancesInput) SetCpuOptions(v *CpuOptionsRequest) *RunInstancesInput {
	s.CpuOptions = v
	return s
}

// SetCreditSpecification sets the CreditSpecification field's value.
func (s *RunInstancesInput) SetCreditSpecification(v *CreditSpecificationRequest) *RunInstancesInput {
	s.CreditSpecification = v
	return s
}

// SetDisableApiTermination sets the DisableApiTermination field's value.
func (s *RunInstancesInput) SetDisableApiTermination(v bool) *RunInstancesInput {
	s.DisableApiTermination = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RunInstancesInput) SetDryRun(v bool) *RunInstancesInput {
	s.DryRun = &v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *RunInstancesInput) SetEbsOptimized(v bool) *RunInstancesInput {
	s.EbsOptimized = &v
	return s
}

// SetElasticGpuSpecification sets the ElasticGpuSpecification field's value.
func (s *RunInstancesInput) SetElasticGpuSpecification(v []*ElasticGpuSpecification) *RunInstancesInput {
	s.ElasticGpuSpecification = v
	return s
}

// SetElasticInferenceAccelerators sets the ElasticInferenceAccelerators field's value.
func (s *RunInstancesInput) SetElasticInferenceAccelerators(v []*ElasticInferenceAccelerator) *RunInstancesInput {
	s.ElasticInferenceAccelerators = v
	return s
}

// SetHibernationOptions sets the HibernationOptions field's value.
func (s *RunInstancesInput) SetHibernationOptions(v *HibernationOptionsRequest) *RunInstancesInput {
	s.HibernationOptions = v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *RunInstancesInput) SetIamInstanceProfile(v *IamInstanceProfileSpecification) *RunInstancesInput {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *RunInstancesInput) SetImageId(v string) *RunInstancesInput {
	s.ImageId = &v
	return s
}

// SetInstanceInitiatedShutdownBehavior sets the InstanceInitiatedShutdownBehavior field's value.
func (s *RunInstancesInput) SetInstanceInitiatedShutdownBehavior(v string) *RunInstancesInput {
	s.InstanceInitiatedShutdownBehavior = &v
	return s
}

// SetInstanceMarketOptions sets the InstanceMarketOptions field's value.
func (s *RunInstancesInput) SetInstanceMarketOptions(v *InstanceMarketOptionsRequest) *RunInstancesInput {
	s.InstanceMarketOptions = v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *RunInstancesInput) SetInstanceType(v string) *RunInstancesInput {
	s.InstanceType = &v
	return s
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *RunInstancesInput) SetIpv6AddressCount(v int64) *RunInstancesInput {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *RunInstancesInput) SetIpv6Addresses(v []*InstanceIpv6Address) *RunInstancesInput {
	s.Ipv6Addresses = v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *RunInstancesInput) SetKernelId(v string) *RunInstancesInput {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *RunInstancesInput) SetKeyName(v string) *RunInstancesInput {
	s.KeyName = &v
	return s
}

// SetLaunchTemplate sets the LaunchTemplate field's value.
func (s *RunInstancesInput) SetLaunchTemplate(v *LaunchTemplateSpecification) *RunInstancesInput {
	s.LaunchTemplate = v
	return s
}

// SetLicenseSpecifications sets the LicenseSpecifications field's value.
func (s *RunInstancesInput) SetLicenseSpecifications(v []*LicenseConfigurationRequest) *RunInstancesInput {
	s.LicenseSpecifications = v
	return s
}

// SetMaxCount sets the MaxCount field's value.
func (s *RunInstancesInput) SetMaxCount(v int64) *RunInstancesInput {
	s.MaxCount = &v
	return s
}

// SetMinCount sets the MinCount field's value.
func (s *RunInstancesInput) SetMinCount(v int64) *RunInstancesInput {
	s.MinCount = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *RunInstancesInput) SetMonitoring(v *RunInstancesMonitoringEnabled) *RunInstancesInput {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *RunInstancesInput) SetNetworkInterfaces(v []*InstanceNetworkInterfaceSpecification) *RunInstancesInput {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *RunInstancesInput) SetPlacement(v *Placement) *RunInstancesInput {
	s.Placement = v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *RunInstancesInput) SetPrivateIpAddress(v string) *RunInstancesInput {
	s.PrivateIpAddress = &v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *RunInstancesInput) SetRamdiskId(v string) *RunInstancesInput {
	s.RamdiskId = &v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *RunInstancesInput) SetSecurityGroupIds(v []*string) *RunInstancesInput {
	s.SecurityGroupIds = v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *RunInstancesInput) SetSecurityGroups(v []*string) *RunInstancesInput {
	s.SecurityGroups = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *RunInstancesInput) SetSubnetId(v string) *RunInstancesInput {
	s.SubnetId = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *RunInstancesInput) SetTagSpecifications(v []*TagSpecification) *RunInstancesInput {
	s.TagSpecifications = v
	return s
}

// SetUserData sets the UserData field's value.
func (s *RunInstancesInput) SetUserData(v string) *RunInstancesInput {
	s.UserData = &v
	return s
}

// Describes the monitoring of an instance.
type RunInstancesMonitoringEnabled struct {
	_ struct{} `type:"structure"`

	// Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring
	// is enabled.
	//
	// Enabled is a required field
	Enabled *bool `locationName:"enabled" type:"boolean" required:"true"`
}

// String returns the string representation
func (s RunInstancesMonitoringEnabled) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RunInstancesMonitoringEnabled) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RunInstancesMonitoringEnabled) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RunInstancesMonitoringEnabled"}
	if s.Enabled == nil {
		invalidParams.Add(request.NewErrParamRequired("Enabled"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetEnabled sets the Enabled field's value.
func (s *RunInstancesMonitoringEnabled) SetEnabled(v bool) *RunInstancesMonitoringEnabled {
	s.Enabled = &v
	return s
}

// Contains the parameters for RunScheduledInstances.
type RunScheduledInstancesInput struct {
	_ struct{} `type:"structure"`

	// Unique, case-sensitive identifier that ensures the idempotency of the request.
	// For more information, see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `type:"string" idempotencyToken:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The number of instances.
	//
	// Default: 1
	InstanceCount *int64 `type:"integer"`

	// The launch specification. You must match the instance type, Availability
	// Zone, network, and platform of the schedule that you purchased.
	//
	// LaunchSpecification is a required field
	LaunchSpecification *ScheduledInstancesLaunchSpecification `type:"structure" required:"true"`

	// The Scheduled Instance ID.
	//
	// ScheduledInstanceId is a required field
	ScheduledInstanceId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s RunScheduledInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RunScheduledInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *RunScheduledInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "RunScheduledInstancesInput"}
	if s.LaunchSpecification == nil {
		invalidParams.Add(request.NewErrParamRequired("LaunchSpecification"))
	}
	if s.ScheduledInstanceId == nil {
		invalidParams.Add(request.NewErrParamRequired("ScheduledInstanceId"))
	}
	if s.LaunchSpecification != nil {
		if err := s.LaunchSpecification.Validate(); err != nil {
			invalidParams.AddNested("LaunchSpecification", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientToken sets the ClientToken field's value.
func (s *RunScheduledInstancesInput) SetClientToken(v string) *RunScheduledInstancesInput {
	s.ClientToken = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *RunScheduledInstancesInput) SetDryRun(v bool) *RunScheduledInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *RunScheduledInstancesInput) SetInstanceCount(v int64) *RunScheduledInstancesInput {
	s.InstanceCount = &v
	return s
}

// SetLaunchSpecification sets the LaunchSpecification field's value.
func (s *RunScheduledInstancesInput) SetLaunchSpecification(v *ScheduledInstancesLaunchSpecification) *RunScheduledInstancesInput {
	s.LaunchSpecification = v
	return s
}

// SetScheduledInstanceId sets the ScheduledInstanceId field's value.
func (s *RunScheduledInstancesInput) SetScheduledInstanceId(v string) *RunScheduledInstancesInput {
	s.ScheduledInstanceId = &v
	return s
}

// Contains the output of RunScheduledInstances.
type RunScheduledInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The IDs of the newly launched instances.
	InstanceIdSet []*string `locationName:"instanceIdSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s RunScheduledInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s RunScheduledInstancesOutput) GoString() string {
	return s.String()
}

// SetInstanceIdSet sets the InstanceIdSet field's value.
func (s *RunScheduledInstancesOutput) SetInstanceIdSet(v []*string) *RunScheduledInstancesOutput {
	s.InstanceIdSet = v
	return s
}

// Describes the storage parameters for S3 and S3 buckets for an instance store-backed
// AMI.
type S3Storage struct {
	_ struct{} `type:"structure"`

	// The access key ID of the owner of the bucket. Before you specify a value
	// for your access key ID, review and follow the guidance in Best Practices
	// for Managing AWS Access Keys (https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html).
	AWSAccessKeyId *string `type:"string"`

	// The bucket in which to store the AMI. You can specify a bucket that you already
	// own or a new bucket that Amazon EC2 creates on your behalf. If you specify
	// a bucket that belongs to someone else, Amazon EC2 returns an error.
	Bucket *string `locationName:"bucket" type:"string"`

	// The beginning of the file name of the AMI.
	Prefix *string `locationName:"prefix" type:"string"`

	// An Amazon S3 upload policy that gives Amazon EC2 permission to upload items
	// into Amazon S3 on your behalf.
	//
	// UploadPolicy is automatically base64 encoded/decoded by the SDK.
	UploadPolicy []byte `locationName:"uploadPolicy" type:"blob"`

	// The signature of the JSON document.
	UploadPolicySignature *string `locationName:"uploadPolicySignature" type:"string"`
}

// String returns the string representation
func (s S3Storage) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s S3Storage) GoString() string {
	return s.String()
}

// SetAWSAccessKeyId sets the AWSAccessKeyId field's value.
func (s *S3Storage) SetAWSAccessKeyId(v string) *S3Storage {
	s.AWSAccessKeyId = &v
	return s
}

// SetBucket sets the Bucket field's value.
func (s *S3Storage) SetBucket(v string) *S3Storage {
	s.Bucket = &v
	return s
}

// SetPrefix sets the Prefix field's value.
func (s *S3Storage) SetPrefix(v string) *S3Storage {
	s.Prefix = &v
	return s
}

// SetUploadPolicy sets the UploadPolicy field's value.
func (s *S3Storage) SetUploadPolicy(v []byte) *S3Storage {
	s.UploadPolicy = v
	return s
}

// SetUploadPolicySignature sets the UploadPolicySignature field's value.
func (s *S3Storage) SetUploadPolicySignature(v string) *S3Storage {
	s.UploadPolicySignature = &v
	return s
}

// Describes a Scheduled Instance.
type ScheduledInstance struct {
	_ struct{} `type:"structure"`

	// The Availability Zone.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The date when the Scheduled Instance was purchased.
	CreateDate *time.Time `locationName:"createDate" type:"timestamp"`

	// The hourly price for a single instance.
	HourlyPrice *string `locationName:"hourlyPrice" type:"string"`

	// The number of instances.
	InstanceCount *int64 `locationName:"instanceCount" type:"integer"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string"`

	// The network platform (EC2-Classic or EC2-VPC).
	NetworkPlatform *string `locationName:"networkPlatform" type:"string"`

	// The time for the next schedule to start.
	NextSlotStartTime *time.Time `locationName:"nextSlotStartTime" type:"timestamp"`

	// The platform (Linux/UNIX or Windows).
	Platform *string `locationName:"platform" type:"string"`

	// The time that the previous schedule ended or will end.
	PreviousSlotEndTime *time.Time `locationName:"previousSlotEndTime" type:"timestamp"`

	// The schedule recurrence.
	Recurrence *ScheduledInstanceRecurrence `locationName:"recurrence" type:"structure"`

	// The Scheduled Instance ID.
	ScheduledInstanceId *string `locationName:"scheduledInstanceId" type:"string"`

	// The number of hours in the schedule.
	SlotDurationInHours *int64 `locationName:"slotDurationInHours" type:"integer"`

	// The end date for the Scheduled Instance.
	TermEndDate *time.Time `locationName:"termEndDate" type:"timestamp"`

	// The start date for the Scheduled Instance.
	TermStartDate *time.Time `locationName:"termStartDate" type:"timestamp"`

	// The total number of hours for a single instance for the entire term.
	TotalScheduledInstanceHours *int64 `locationName:"totalScheduledInstanceHours" type:"integer"`
}

// String returns the string representation
func (s ScheduledInstance) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstance) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ScheduledInstance) SetAvailabilityZone(v string) *ScheduledInstance {
	s.AvailabilityZone = &v
	return s
}

// SetCreateDate sets the CreateDate field's value.
func (s *ScheduledInstance) SetCreateDate(v time.Time) *ScheduledInstance {
	s.CreateDate = &v
	return s
}

// SetHourlyPrice sets the HourlyPrice field's value.
func (s *ScheduledInstance) SetHourlyPrice(v string) *ScheduledInstance {
	s.HourlyPrice = &v
	return s
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *ScheduledInstance) SetInstanceCount(v int64) *ScheduledInstance {
	s.InstanceCount = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ScheduledInstance) SetInstanceType(v string) *ScheduledInstance {
	s.InstanceType = &v
	return s
}

// SetNetworkPlatform sets the NetworkPlatform field's value.
func (s *ScheduledInstance) SetNetworkPlatform(v string) *ScheduledInstance {
	s.NetworkPlatform = &v
	return s
}

// SetNextSlotStartTime sets the NextSlotStartTime field's value.
func (s *ScheduledInstance) SetNextSlotStartTime(v time.Time) *ScheduledInstance {
	s.NextSlotStartTime = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ScheduledInstance) SetPlatform(v string) *ScheduledInstance {
	s.Platform = &v
	return s
}

// SetPreviousSlotEndTime sets the PreviousSlotEndTime field's value.
func (s *ScheduledInstance) SetPreviousSlotEndTime(v time.Time) *ScheduledInstance {
	s.PreviousSlotEndTime = &v
	return s
}

// SetRecurrence sets the Recurrence field's value.
func (s *ScheduledInstance) SetRecurrence(v *ScheduledInstanceRecurrence) *ScheduledInstance {
	s.Recurrence = v
	return s
}

// SetScheduledInstanceId sets the ScheduledInstanceId field's value.
func (s *ScheduledInstance) SetScheduledInstanceId(v string) *ScheduledInstance {
	s.ScheduledInstanceId = &v
	return s
}

// SetSlotDurationInHours sets the SlotDurationInHours field's value.
func (s *ScheduledInstance) SetSlotDurationInHours(v int64) *ScheduledInstance {
	s.SlotDurationInHours = &v
	return s
}

// SetTermEndDate sets the TermEndDate field's value.
func (s *ScheduledInstance) SetTermEndDate(v time.Time) *ScheduledInstance {
	s.TermEndDate = &v
	return s
}

// SetTermStartDate sets the TermStartDate field's value.
func (s *ScheduledInstance) SetTermStartDate(v time.Time) *ScheduledInstance {
	s.TermStartDate = &v
	return s
}

// SetTotalScheduledInstanceHours sets the TotalScheduledInstanceHours field's value.
func (s *ScheduledInstance) SetTotalScheduledInstanceHours(v int64) *ScheduledInstance {
	s.TotalScheduledInstanceHours = &v
	return s
}

// Describes a schedule that is available for your Scheduled Instances.
type ScheduledInstanceAvailability struct {
	_ struct{} `type:"structure"`

	// The Availability Zone.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The number of available instances.
	AvailableInstanceCount *int64 `locationName:"availableInstanceCount" type:"integer"`

	// The time period for the first schedule to start.
	FirstSlotStartTime *time.Time `locationName:"firstSlotStartTime" type:"timestamp"`

	// The hourly price for a single instance.
	HourlyPrice *string `locationName:"hourlyPrice" type:"string"`

	// The instance type. You can specify one of the C3, C4, M4, or R3 instance
	// types.
	InstanceType *string `locationName:"instanceType" type:"string"`

	// The maximum term. The only possible value is 365 days.
	MaxTermDurationInDays *int64 `locationName:"maxTermDurationInDays" type:"integer"`

	// The minimum term. The only possible value is 365 days.
	MinTermDurationInDays *int64 `locationName:"minTermDurationInDays" type:"integer"`

	// The network platform (EC2-Classic or EC2-VPC).
	NetworkPlatform *string `locationName:"networkPlatform" type:"string"`

	// The platform (Linux/UNIX or Windows).
	Platform *string `locationName:"platform" type:"string"`

	// The purchase token. This token expires in two hours.
	PurchaseToken *string `locationName:"purchaseToken" type:"string"`

	// The schedule recurrence.
	Recurrence *ScheduledInstanceRecurrence `locationName:"recurrence" type:"structure"`

	// The number of hours in the schedule.
	SlotDurationInHours *int64 `locationName:"slotDurationInHours" type:"integer"`

	// The total number of hours for a single instance for the entire term.
	TotalScheduledInstanceHours *int64 `locationName:"totalScheduledInstanceHours" type:"integer"`
}

// String returns the string representation
func (s ScheduledInstanceAvailability) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstanceAvailability) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ScheduledInstanceAvailability) SetAvailabilityZone(v string) *ScheduledInstanceAvailability {
	s.AvailabilityZone = &v
	return s
}

// SetAvailableInstanceCount sets the AvailableInstanceCount field's value.
func (s *ScheduledInstanceAvailability) SetAvailableInstanceCount(v int64) *ScheduledInstanceAvailability {
	s.AvailableInstanceCount = &v
	return s
}

// SetFirstSlotStartTime sets the FirstSlotStartTime field's value.
func (s *ScheduledInstanceAvailability) SetFirstSlotStartTime(v time.Time) *ScheduledInstanceAvailability {
	s.FirstSlotStartTime = &v
	return s
}

// SetHourlyPrice sets the HourlyPrice field's value.
func (s *ScheduledInstanceAvailability) SetHourlyPrice(v string) *ScheduledInstanceAvailability {
	s.HourlyPrice = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ScheduledInstanceAvailability) SetInstanceType(v string) *ScheduledInstanceAvailability {
	s.InstanceType = &v
	return s
}

// SetMaxTermDurationInDays sets the MaxTermDurationInDays field's value.
func (s *ScheduledInstanceAvailability) SetMaxTermDurationInDays(v int64) *ScheduledInstanceAvailability {
	s.MaxTermDurationInDays = &v
	return s
}

// SetMinTermDurationInDays sets the MinTermDurationInDays field's value.
func (s *ScheduledInstanceAvailability) SetMinTermDurationInDays(v int64) *ScheduledInstanceAvailability {
	s.MinTermDurationInDays = &v
	return s
}

// SetNetworkPlatform sets the NetworkPlatform field's value.
func (s *ScheduledInstanceAvailability) SetNetworkPlatform(v string) *ScheduledInstanceAvailability {
	s.NetworkPlatform = &v
	return s
}

// SetPlatform sets the Platform field's value.
func (s *ScheduledInstanceAvailability) SetPlatform(v string) *ScheduledInstanceAvailability {
	s.Platform = &v
	return s
}

// SetPurchaseToken sets the PurchaseToken field's value.
func (s *ScheduledInstanceAvailability) SetPurchaseToken(v string) *ScheduledInstanceAvailability {
	s.PurchaseToken = &v
	return s
}

// SetRecurrence sets the Recurrence field's value.
func (s *ScheduledInstanceAvailability) SetRecurrence(v *ScheduledInstanceRecurrence) *ScheduledInstanceAvailability {
	s.Recurrence = v
	return s
}

// SetSlotDurationInHours sets the SlotDurationInHours field's value.
func (s *ScheduledInstanceAvailability) SetSlotDurationInHours(v int64) *ScheduledInstanceAvailability {
	s.SlotDurationInHours = &v
	return s
}

// SetTotalScheduledInstanceHours sets the TotalScheduledInstanceHours field's value.
func (s *ScheduledInstanceAvailability) SetTotalScheduledInstanceHours(v int64) *ScheduledInstanceAvailability {
	s.TotalScheduledInstanceHours = &v
	return s
}

// Describes the recurring schedule for a Scheduled Instance.
type ScheduledInstanceRecurrence struct {
	_ struct{} `type:"structure"`

	// The frequency (Daily, Weekly, or Monthly).
	Frequency *string `locationName:"frequency" type:"string"`

	// The interval quantity. The interval unit depends on the value of frequency.
	// For example, every 2 weeks or every 2 months.
	Interval *int64 `locationName:"interval" type:"integer"`

	// The days. For a monthly schedule, this is one or more days of the month (1-31).
	// For a weekly schedule, this is one or more days of the week (1-7, where 1
	// is Sunday).
	OccurrenceDaySet []*int64 `locationName:"occurrenceDaySet" locationNameList:"item" type:"list"`

	// Indicates whether the occurrence is relative to the end of the specified
	// week or month.
	OccurrenceRelativeToEnd *bool `locationName:"occurrenceRelativeToEnd" type:"boolean"`

	// The unit for occurrenceDaySet (DayOfWeek or DayOfMonth).
	OccurrenceUnit *string `locationName:"occurrenceUnit" type:"string"`
}

// String returns the string representation
func (s ScheduledInstanceRecurrence) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstanceRecurrence) GoString() string {
	return s.String()
}

// SetFrequency sets the Frequency field's value.
func (s *ScheduledInstanceRecurrence) SetFrequency(v string) *ScheduledInstanceRecurrence {
	s.Frequency = &v
	return s
}

// SetInterval sets the Interval field's value.
func (s *ScheduledInstanceRecurrence) SetInterval(v int64) *ScheduledInstanceRecurrence {
	s.Interval = &v
	return s
}

// SetOccurrenceDaySet sets the OccurrenceDaySet field's value.
func (s *ScheduledInstanceRecurrence) SetOccurrenceDaySet(v []*int64) *ScheduledInstanceRecurrence {
	s.OccurrenceDaySet = v
	return s
}

// SetOccurrenceRelativeToEnd sets the OccurrenceRelativeToEnd field's value.
func (s *ScheduledInstanceRecurrence) SetOccurrenceRelativeToEnd(v bool) *ScheduledInstanceRecurrence {
	s.OccurrenceRelativeToEnd = &v
	return s
}

// SetOccurrenceUnit sets the OccurrenceUnit field's value.
func (s *ScheduledInstanceRecurrence) SetOccurrenceUnit(v string) *ScheduledInstanceRecurrence {
	s.OccurrenceUnit = &v
	return s
}

// Describes the recurring schedule for a Scheduled Instance.
type ScheduledInstanceRecurrenceRequest struct {
	_ struct{} `type:"structure"`

	// The frequency (Daily, Weekly, or Monthly).
	Frequency *string `type:"string"`

	// The interval quantity. The interval unit depends on the value of Frequency.
	// For example, every 2 weeks or every 2 months.
	Interval *int64 `type:"integer"`

	// The days. For a monthly schedule, this is one or more days of the month (1-31).
	// For a weekly schedule, this is one or more days of the week (1-7, where 1
	// is Sunday). You can't specify this value with a daily schedule. If the occurrence
	// is relative to the end of the month, you can specify only a single day.
	OccurrenceDays []*int64 `locationName:"OccurrenceDay" locationNameList:"OccurenceDay" type:"list"`

	// Indicates whether the occurrence is relative to the end of the specified
	// week or month. You can't specify this value with a daily schedule.
	OccurrenceRelativeToEnd *bool `type:"boolean"`

	// The unit for OccurrenceDays (DayOfWeek or DayOfMonth). This value is required
	// for a monthly schedule. You can't specify DayOfWeek with a weekly schedule.
	// You can't specify this value with a daily schedule.
	OccurrenceUnit *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstanceRecurrenceRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstanceRecurrenceRequest) GoString() string {
	return s.String()
}

// SetFrequency sets the Frequency field's value.
func (s *ScheduledInstanceRecurrenceRequest) SetFrequency(v string) *ScheduledInstanceRecurrenceRequest {
	s.Frequency = &v
	return s
}

// SetInterval sets the Interval field's value.
func (s *ScheduledInstanceRecurrenceRequest) SetInterval(v int64) *ScheduledInstanceRecurrenceRequest {
	s.Interval = &v
	return s
}

// SetOccurrenceDays sets the OccurrenceDays field's value.
func (s *ScheduledInstanceRecurrenceRequest) SetOccurrenceDays(v []*int64) *ScheduledInstanceRecurrenceRequest {
	s.OccurrenceDays = v
	return s
}

// SetOccurrenceRelativeToEnd sets the OccurrenceRelativeToEnd field's value.
func (s *ScheduledInstanceRecurrenceRequest) SetOccurrenceRelativeToEnd(v bool) *ScheduledInstanceRecurrenceRequest {
	s.OccurrenceRelativeToEnd = &v
	return s
}

// SetOccurrenceUnit sets the OccurrenceUnit field's value.
func (s *ScheduledInstanceRecurrenceRequest) SetOccurrenceUnit(v string) *ScheduledInstanceRecurrenceRequest {
	s.OccurrenceUnit = &v
	return s
}

// Describes a block device mapping for a Scheduled Instance.
type ScheduledInstancesBlockDeviceMapping struct {
	_ struct{} `type:"structure"`

	// The device name (for example, /dev/sdh or xvdh).
	DeviceName *string `type:"string"`

	// Parameters used to set up EBS volumes automatically when the instance is
	// launched.
	Ebs *ScheduledInstancesEbs `type:"structure"`

	// Suppresses the specified device included in the block device mapping of the
	// AMI.
	NoDevice *string `type:"string"`

	// The virtual device name (ephemeralN). Instance store volumes are numbered
	// starting from 0. An instance type with two available instance store volumes
	// can specify mappings for ephemeral0 and ephemeral1. The number of available
	// instance store volumes depends on the instance type. After you connect to
	// the instance, you must mount the volume.
	//
	// Constraints: For M3 instances, you must specify instance store volumes in
	// the block device mapping for the instance. When you launch an M3 instance,
	// we ignore any instance store volumes specified in the block device mapping
	// for the AMI.
	VirtualName *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesBlockDeviceMapping) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesBlockDeviceMapping) GoString() string {
	return s.String()
}

// SetDeviceName sets the DeviceName field's value.
func (s *ScheduledInstancesBlockDeviceMapping) SetDeviceName(v string) *ScheduledInstancesBlockDeviceMapping {
	s.DeviceName = &v
	return s
}

// SetEbs sets the Ebs field's value.
func (s *ScheduledInstancesBlockDeviceMapping) SetEbs(v *ScheduledInstancesEbs) *ScheduledInstancesBlockDeviceMapping {
	s.Ebs = v
	return s
}

// SetNoDevice sets the NoDevice field's value.
func (s *ScheduledInstancesBlockDeviceMapping) SetNoDevice(v string) *ScheduledInstancesBlockDeviceMapping {
	s.NoDevice = &v
	return s
}

// SetVirtualName sets the VirtualName field's value.
func (s *ScheduledInstancesBlockDeviceMapping) SetVirtualName(v string) *ScheduledInstancesBlockDeviceMapping {
	s.VirtualName = &v
	return s
}

// Describes an EBS volume for a Scheduled Instance.
type ScheduledInstancesEbs struct {
	_ struct{} `type:"structure"`

	// Indicates whether the volume is deleted on instance termination.
	DeleteOnTermination *bool `type:"boolean"`

	// Indicates whether the volume is encrypted. You can attached encrypted volumes
	// only to instances that support them.
	Encrypted *bool `type:"boolean"`

	// The number of I/O operations per second (IOPS) that the volume supports.
	// For io1 volumes, this represents the number of IOPS that are provisioned
	// for the volume. For gp2 volumes, this represents the baseline performance
	// of the volume and the rate at which the volume accumulates I/O credits for
	// bursting. For more information about gp2 baseline performance, I/O credits,
	// and bursting, see Amazon EBS Volume Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Constraint: Range is 100-20000 IOPS for io1 volumes and 100-10000 IOPS for
	// gp2 volumes.
	//
	// Condition: This parameter is required for requests to create io1volumes;
	// it is not used in requests to create gp2, st1, sc1, or standard volumes.
	Iops *int64 `type:"integer"`

	// The ID of the snapshot.
	SnapshotId *string `type:"string"`

	// The size of the volume, in GiB.
	//
	// Default: If you're creating the volume from a snapshot and don't specify
	// a volume size, the default is the snapshot size.
	VolumeSize *int64 `type:"integer"`

	// The volume type. gp2 for General Purpose SSD, io1 for Provisioned IOPS SSD,
	// Throughput Optimized HDD for st1, Cold HDD for sc1, or standard for Magnetic.
	//
	// Default: standard
	VolumeType *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesEbs) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesEbs) GoString() string {
	return s.String()
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *ScheduledInstancesEbs) SetDeleteOnTermination(v bool) *ScheduledInstancesEbs {
	s.DeleteOnTermination = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *ScheduledInstancesEbs) SetEncrypted(v bool) *ScheduledInstancesEbs {
	s.Encrypted = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *ScheduledInstancesEbs) SetIops(v int64) *ScheduledInstancesEbs {
	s.Iops = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *ScheduledInstancesEbs) SetSnapshotId(v string) *ScheduledInstancesEbs {
	s.SnapshotId = &v
	return s
}

// SetVolumeSize sets the VolumeSize field's value.
func (s *ScheduledInstancesEbs) SetVolumeSize(v int64) *ScheduledInstancesEbs {
	s.VolumeSize = &v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *ScheduledInstancesEbs) SetVolumeType(v string) *ScheduledInstancesEbs {
	s.VolumeType = &v
	return s
}

// Describes an IAM instance profile for a Scheduled Instance.
type ScheduledInstancesIamInstanceProfile struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN).
	Arn *string `type:"string"`

	// The name.
	Name *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesIamInstanceProfile) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesIamInstanceProfile) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *ScheduledInstancesIamInstanceProfile) SetArn(v string) *ScheduledInstancesIamInstanceProfile {
	s.Arn = &v
	return s
}

// SetName sets the Name field's value.
func (s *ScheduledInstancesIamInstanceProfile) SetName(v string) *ScheduledInstancesIamInstanceProfile {
	s.Name = &v
	return s
}

// Describes an IPv6 address.
type ScheduledInstancesIpv6Address struct {
	_ struct{} `type:"structure"`

	// The IPv6 address.
	Ipv6Address *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesIpv6Address) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesIpv6Address) GoString() string {
	return s.String()
}

// SetIpv6Address sets the Ipv6Address field's value.
func (s *ScheduledInstancesIpv6Address) SetIpv6Address(v string) *ScheduledInstancesIpv6Address {
	s.Ipv6Address = &v
	return s
}

// Describes the launch specification for a Scheduled Instance.
//
// If you are launching the Scheduled Instance in EC2-VPC, you must specify
// the ID of the subnet. You can specify the subnet using either SubnetId or
// NetworkInterface.
type ScheduledInstancesLaunchSpecification struct {
	_ struct{} `type:"structure"`

	// One or more block device mapping entries.
	BlockDeviceMappings []*ScheduledInstancesBlockDeviceMapping `locationName:"BlockDeviceMapping" locationNameList:"BlockDeviceMapping" type:"list"`

	// Indicates whether the instances are optimized for EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal EBS I/O performance. This optimization isn't available
	// with all instance types. Additional usage charges apply when using an EBS-optimized
	// instance.
	//
	// Default: false
	EbsOptimized *bool `type:"boolean"`

	// The IAM instance profile.
	IamInstanceProfile *ScheduledInstancesIamInstanceProfile `type:"structure"`

	// The ID of the Amazon Machine Image (AMI).
	//
	// ImageId is a required field
	ImageId *string `type:"string" required:"true"`

	// The instance type.
	InstanceType *string `type:"string"`

	// The ID of the kernel.
	KernelId *string `type:"string"`

	// The name of the key pair.
	KeyName *string `type:"string"`

	// Enable or disable monitoring for the instances.
	Monitoring *ScheduledInstancesMonitoring `type:"structure"`

	// One or more network interfaces.
	NetworkInterfaces []*ScheduledInstancesNetworkInterface `locationName:"NetworkInterface" locationNameList:"NetworkInterface" type:"list"`

	// The placement information.
	Placement *ScheduledInstancesPlacement `type:"structure"`

	// The ID of the RAM disk.
	RamdiskId *string `type:"string"`

	// The IDs of one or more security groups.
	SecurityGroupIds []*string `locationName:"SecurityGroupId" locationNameList:"SecurityGroupId" type:"list"`

	// The ID of the subnet in which to launch the instances.
	SubnetId *string `type:"string"`

	// The base64-encoded MIME user data.
	UserData *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesLaunchSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesLaunchSpecification) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ScheduledInstancesLaunchSpecification) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ScheduledInstancesLaunchSpecification"}
	if s.ImageId == nil {
		invalidParams.Add(request.NewErrParamRequired("ImageId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *ScheduledInstancesLaunchSpecification) SetBlockDeviceMappings(v []*ScheduledInstancesBlockDeviceMapping) *ScheduledInstancesLaunchSpecification {
	s.BlockDeviceMappings = v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *ScheduledInstancesLaunchSpecification) SetEbsOptimized(v bool) *ScheduledInstancesLaunchSpecification {
	s.EbsOptimized = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *ScheduledInstancesLaunchSpecification) SetIamInstanceProfile(v *ScheduledInstancesIamInstanceProfile) *ScheduledInstancesLaunchSpecification {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *ScheduledInstancesLaunchSpecification) SetImageId(v string) *ScheduledInstancesLaunchSpecification {
	s.ImageId = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *ScheduledInstancesLaunchSpecification) SetInstanceType(v string) *ScheduledInstancesLaunchSpecification {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *ScheduledInstancesLaunchSpecification) SetKernelId(v string) *ScheduledInstancesLaunchSpecification {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *ScheduledInstancesLaunchSpecification) SetKeyName(v string) *ScheduledInstancesLaunchSpecification {
	s.KeyName = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *ScheduledInstancesLaunchSpecification) SetMonitoring(v *ScheduledInstancesMonitoring) *ScheduledInstancesLaunchSpecification {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *ScheduledInstancesLaunchSpecification) SetNetworkInterfaces(v []*ScheduledInstancesNetworkInterface) *ScheduledInstancesLaunchSpecification {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *ScheduledInstancesLaunchSpecification) SetPlacement(v *ScheduledInstancesPlacement) *ScheduledInstancesLaunchSpecification {
	s.Placement = v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *ScheduledInstancesLaunchSpecification) SetRamdiskId(v string) *ScheduledInstancesLaunchSpecification {
	s.RamdiskId = &v
	return s
}

// SetSecurityGroupIds sets the SecurityGroupIds field's value.
func (s *ScheduledInstancesLaunchSpecification) SetSecurityGroupIds(v []*string) *ScheduledInstancesLaunchSpecification {
	s.SecurityGroupIds = v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *ScheduledInstancesLaunchSpecification) SetSubnetId(v string) *ScheduledInstancesLaunchSpecification {
	s.SubnetId = &v
	return s
}

// SetUserData sets the UserData field's value.
func (s *ScheduledInstancesLaunchSpecification) SetUserData(v string) *ScheduledInstancesLaunchSpecification {
	s.UserData = &v
	return s
}

// Describes whether monitoring is enabled for a Scheduled Instance.
type ScheduledInstancesMonitoring struct {
	_ struct{} `type:"structure"`

	// Indicates whether monitoring is enabled.
	Enabled *bool `type:"boolean"`
}

// String returns the string representation
func (s ScheduledInstancesMonitoring) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesMonitoring) GoString() string {
	return s.String()
}

// SetEnabled sets the Enabled field's value.
func (s *ScheduledInstancesMonitoring) SetEnabled(v bool) *ScheduledInstancesMonitoring {
	s.Enabled = &v
	return s
}

// Describes a network interface for a Scheduled Instance.
type ScheduledInstancesNetworkInterface struct {
	_ struct{} `type:"structure"`

	// Indicates whether to assign a public IPv4 address to instances launched in
	// a VPC. The public IPv4 address can only be assigned to a network interface
	// for eth0, and can only be assigned to a new network interface, not an existing
	// one. You cannot specify more than one network interface in the request. If
	// launching into a default subnet, the default value is true.
	AssociatePublicIpAddress *bool `type:"boolean"`

	// Indicates whether to delete the interface when the instance is terminated.
	DeleteOnTermination *bool `type:"boolean"`

	// The description.
	Description *string `type:"string"`

	// The index of the device for the network interface attachment.
	DeviceIndex *int64 `type:"integer"`

	// The IDs of one or more security groups.
	Groups []*string `locationName:"Group" locationNameList:"SecurityGroupId" type:"list"`

	// The number of IPv6 addresses to assign to the network interface. The IPv6
	// addresses are automatically selected from the subnet range.
	Ipv6AddressCount *int64 `type:"integer"`

	// One or more specific IPv6 addresses from the subnet range.
	Ipv6Addresses []*ScheduledInstancesIpv6Address `locationName:"Ipv6Address" locationNameList:"Ipv6Address" type:"list"`

	// The ID of the network interface.
	NetworkInterfaceId *string `type:"string"`

	// The IPv4 address of the network interface within the subnet.
	PrivateIpAddress *string `type:"string"`

	// The private IPv4 addresses.
	PrivateIpAddressConfigs []*ScheduledInstancesPrivateIpAddressConfig `locationName:"PrivateIpAddressConfig" locationNameList:"PrivateIpAddressConfigSet" type:"list"`

	// The number of secondary private IPv4 addresses.
	SecondaryPrivateIpAddressCount *int64 `type:"integer"`

	// The ID of the subnet.
	SubnetId *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesNetworkInterface) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesNetworkInterface) GoString() string {
	return s.String()
}

// SetAssociatePublicIpAddress sets the AssociatePublicIpAddress field's value.
func (s *ScheduledInstancesNetworkInterface) SetAssociatePublicIpAddress(v bool) *ScheduledInstancesNetworkInterface {
	s.AssociatePublicIpAddress = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *ScheduledInstancesNetworkInterface) SetDeleteOnTermination(v bool) *ScheduledInstancesNetworkInterface {
	s.DeleteOnTermination = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *ScheduledInstancesNetworkInterface) SetDescription(v string) *ScheduledInstancesNetworkInterface {
	s.Description = &v
	return s
}

// SetDeviceIndex sets the DeviceIndex field's value.
func (s *ScheduledInstancesNetworkInterface) SetDeviceIndex(v int64) *ScheduledInstancesNetworkInterface {
	s.DeviceIndex = &v
	return s
}

// SetGroups sets the Groups field's value.
func (s *ScheduledInstancesNetworkInterface) SetGroups(v []*string) *ScheduledInstancesNetworkInterface {
	s.Groups = v
	return s
}

// SetIpv6AddressCount sets the Ipv6AddressCount field's value.
func (s *ScheduledInstancesNetworkInterface) SetIpv6AddressCount(v int64) *ScheduledInstancesNetworkInterface {
	s.Ipv6AddressCount = &v
	return s
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *ScheduledInstancesNetworkInterface) SetIpv6Addresses(v []*ScheduledInstancesIpv6Address) *ScheduledInstancesNetworkInterface {
	s.Ipv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *ScheduledInstancesNetworkInterface) SetNetworkInterfaceId(v string) *ScheduledInstancesNetworkInterface {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *ScheduledInstancesNetworkInterface) SetPrivateIpAddress(v string) *ScheduledInstancesNetworkInterface {
	s.PrivateIpAddress = &v
	return s
}

// SetPrivateIpAddressConfigs sets the PrivateIpAddressConfigs field's value.
func (s *ScheduledInstancesNetworkInterface) SetPrivateIpAddressConfigs(v []*ScheduledInstancesPrivateIpAddressConfig) *ScheduledInstancesNetworkInterface {
	s.PrivateIpAddressConfigs = v
	return s
}

// SetSecondaryPrivateIpAddressCount sets the SecondaryPrivateIpAddressCount field's value.
func (s *ScheduledInstancesNetworkInterface) SetSecondaryPrivateIpAddressCount(v int64) *ScheduledInstancesNetworkInterface {
	s.SecondaryPrivateIpAddressCount = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *ScheduledInstancesNetworkInterface) SetSubnetId(v string) *ScheduledInstancesNetworkInterface {
	s.SubnetId = &v
	return s
}

// Describes the placement for a Scheduled Instance.
type ScheduledInstancesPlacement struct {
	_ struct{} `type:"structure"`

	// The Availability Zone.
	AvailabilityZone *string `type:"string"`

	// The name of the placement group.
	GroupName *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesPlacement) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesPlacement) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *ScheduledInstancesPlacement) SetAvailabilityZone(v string) *ScheduledInstancesPlacement {
	s.AvailabilityZone = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *ScheduledInstancesPlacement) SetGroupName(v string) *ScheduledInstancesPlacement {
	s.GroupName = &v
	return s
}

// Describes a private IPv4 address for a Scheduled Instance.
type ScheduledInstancesPrivateIpAddressConfig struct {
	_ struct{} `type:"structure"`

	// Indicates whether this is a primary IPv4 address. Otherwise, this is a secondary
	// IPv4 address.
	Primary *bool `type:"boolean"`

	// The IPv4 address.
	PrivateIpAddress *string `type:"string"`
}

// String returns the string representation
func (s ScheduledInstancesPrivateIpAddressConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ScheduledInstancesPrivateIpAddressConfig) GoString() string {
	return s.String()
}

// SetPrimary sets the Primary field's value.
func (s *ScheduledInstancesPrivateIpAddressConfig) SetPrimary(v bool) *ScheduledInstancesPrivateIpAddressConfig {
	s.Primary = &v
	return s
}

// SetPrivateIpAddress sets the PrivateIpAddress field's value.
func (s *ScheduledInstancesPrivateIpAddressConfig) SetPrivateIpAddress(v string) *ScheduledInstancesPrivateIpAddressConfig {
	s.PrivateIpAddress = &v
	return s
}

type SearchTransitGatewayRoutesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// One or more filters. The possible values are:
	//
	//    * attachment.transit-gateway-attachment-id- The id of the transit gateway
	//    attachment.
	//
	//    * attachment.resource-id - The resource id of the transit gateway attachment.
	//
	//    * attachment.resource-type - The attachment resource type (vpc | vpn).
	//
	//    * route-search.exact-match - The exact match of the specified filter.
	//
	//    * route-search.longest-prefix-match - The longest prefix that matches
	//    the route.
	//
	//    * route-search.subnet-of-match - The routes with a subnet that match the
	//    specified CIDR filter.
	//
	//    * route-search.supernet-of-match - The routes with a CIDR that encompass
	//    the CIDR filter. For example, if you have 10.0.1.0/29 and 10.0.1.0/31
	//    routes in your route table and you specify supernet-of-match as 10.0.1.0/30,
	//    then the result returns 10.0.1.0/29.
	//
	//    * state - The state of the attachment (available | deleted | deleting
	//    | failed | modifying | pendingAcceptance | pending | rollingBack | rejected
	//    | rejecting).
	//
	//    * type - The type of roue (active | blackhole).
	//
	// Filters is a required field
	Filters []*Filter `locationName:"Filter" locationNameList:"Filter" type:"list" required:"true"`

	// The maximum number of routes to return.
	MaxResults *int64 `min:"5" type:"integer"`

	// The ID of the transit gateway route table.
	//
	// TransitGatewayRouteTableId is a required field
	TransitGatewayRouteTableId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s SearchTransitGatewayRoutesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SearchTransitGatewayRoutesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *SearchTransitGatewayRoutesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "SearchTransitGatewayRoutesInput"}
	if s.Filters == nil {
		invalidParams.Add(request.NewErrParamRequired("Filters"))
	}
	if s.MaxResults != nil && *s.MaxResults < 5 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 5))
	}
	if s.TransitGatewayRouteTableId == nil {
		invalidParams.Add(request.NewErrParamRequired("TransitGatewayRouteTableId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *SearchTransitGatewayRoutesInput) SetDryRun(v bool) *SearchTransitGatewayRoutesInput {
	s.DryRun = &v
	return s
}

// SetFilters sets the Filters field's value.
func (s *SearchTransitGatewayRoutesInput) SetFilters(v []*Filter) *SearchTransitGatewayRoutesInput {
	s.Filters = v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *SearchTransitGatewayRoutesInput) SetMaxResults(v int64) *SearchTransitGatewayRoutesInput {
	s.MaxResults = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *SearchTransitGatewayRoutesInput) SetTransitGatewayRouteTableId(v string) *SearchTransitGatewayRoutesInput {
	s.TransitGatewayRouteTableId = &v
	return s
}

type SearchTransitGatewayRoutesOutput struct {
	_ struct{} `type:"structure"`

	// Indicates whether there are additional routes available.
	AdditionalRoutesAvailable *bool `locationName:"additionalRoutesAvailable" type:"boolean"`

	// Information about the routes.
	Routes []*TransitGatewayRoute `locationName:"routeSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s SearchTransitGatewayRoutesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SearchTransitGatewayRoutesOutput) GoString() string {
	return s.String()
}

// SetAdditionalRoutesAvailable sets the AdditionalRoutesAvailable field's value.
func (s *SearchTransitGatewayRoutesOutput) SetAdditionalRoutesAvailable(v bool) *SearchTransitGatewayRoutesOutput {
	s.AdditionalRoutesAvailable = &v
	return s
}

// SetRoutes sets the Routes field's value.
func (s *SearchTransitGatewayRoutesOutput) SetRoutes(v []*TransitGatewayRoute) *SearchTransitGatewayRoutesOutput {
	s.Routes = v
	return s
}

// Describes a security group
type SecurityGroup struct {
	_ struct{} `type:"structure"`

	// A description of the security group.
	Description *string `locationName:"groupDescription" type:"string"`

	// The ID of the security group.
	GroupId *string `locationName:"groupId" type:"string"`

	// The name of the security group.
	GroupName *string `locationName:"groupName" type:"string"`

	// One or more inbound rules associated with the security group.
	IpPermissions []*IpPermission `locationName:"ipPermissions" locationNameList:"item" type:"list"`

	// [EC2-VPC] One or more outbound rules associated with the security group.
	IpPermissionsEgress []*IpPermission `locationName:"ipPermissionsEgress" locationNameList:"item" type:"list"`

	// The AWS account ID of the owner of the security group.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Any tags assigned to the security group.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// [EC2-VPC] The ID of the VPC for the security group.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s SecurityGroup) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SecurityGroup) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *SecurityGroup) SetDescription(v string) *SecurityGroup {
	s.Description = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *SecurityGroup) SetGroupId(v string) *SecurityGroup {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *SecurityGroup) SetGroupName(v string) *SecurityGroup {
	s.GroupName = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *SecurityGroup) SetIpPermissions(v []*IpPermission) *SecurityGroup {
	s.IpPermissions = v
	return s
}

// SetIpPermissionsEgress sets the IpPermissionsEgress field's value.
func (s *SecurityGroup) SetIpPermissionsEgress(v []*IpPermission) *SecurityGroup {
	s.IpPermissionsEgress = v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *SecurityGroup) SetOwnerId(v string) *SecurityGroup {
	s.OwnerId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *SecurityGroup) SetTags(v []*Tag) *SecurityGroup {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *SecurityGroup) SetVpcId(v string) *SecurityGroup {
	s.VpcId = &v
	return s
}

// Describes a security group.
type SecurityGroupIdentifier struct {
	_ struct{} `type:"structure"`

	// The ID of the security group.
	GroupId *string `locationName:"groupId" type:"string"`

	// The name of the security group.
	GroupName *string `locationName:"groupName" type:"string"`
}

// String returns the string representation
func (s SecurityGroupIdentifier) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SecurityGroupIdentifier) GoString() string {
	return s.String()
}

// SetGroupId sets the GroupId field's value.
func (s *SecurityGroupIdentifier) SetGroupId(v string) *SecurityGroupIdentifier {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *SecurityGroupIdentifier) SetGroupName(v string) *SecurityGroupIdentifier {
	s.GroupName = &v
	return s
}

// Describes a VPC with a security group that references your security group.
type SecurityGroupReference struct {
	_ struct{} `type:"structure"`

	// The ID of your security group.
	GroupId *string `locationName:"groupId" type:"string"`

	// The ID of the VPC with the referencing security group.
	ReferencingVpcId *string `locationName:"referencingVpcId" type:"string"`

	// The ID of the VPC peering connection.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s SecurityGroupReference) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SecurityGroupReference) GoString() string {
	return s.String()
}

// SetGroupId sets the GroupId field's value.
func (s *SecurityGroupReference) SetGroupId(v string) *SecurityGroupReference {
	s.GroupId = &v
	return s
}

// SetReferencingVpcId sets the ReferencingVpcId field's value.
func (s *SecurityGroupReference) SetReferencingVpcId(v string) *SecurityGroupReference {
	s.ReferencingVpcId = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *SecurityGroupReference) SetVpcPeeringConnectionId(v string) *SecurityGroupReference {
	s.VpcPeeringConnectionId = &v
	return s
}

// Describes a service configuration for a VPC endpoint service.
type ServiceConfiguration struct {
	_ struct{} `type:"structure"`

	// Indicates whether requests from other AWS accounts to create an endpoint
	// to the service must first be accepted.
	AcceptanceRequired *bool `locationName:"acceptanceRequired" type:"boolean"`

	// In the Availability Zones in which the service is available.
	AvailabilityZones []*string `locationName:"availabilityZoneSet" locationNameList:"item" type:"list"`

	// The DNS names for the service.
	BaseEndpointDnsNames []*string `locationName:"baseEndpointDnsNameSet" locationNameList:"item" type:"list"`

	// The Amazon Resource Names (ARNs) of the Network Load Balancers for the service.
	NetworkLoadBalancerArns []*string `locationName:"networkLoadBalancerArnSet" locationNameList:"item" type:"list"`

	// The private DNS name for the service.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The ID of the service.
	ServiceId *string `locationName:"serviceId" type:"string"`

	// The name of the service.
	ServiceName *string `locationName:"serviceName" type:"string"`

	// The service state.
	ServiceState *string `locationName:"serviceState" type:"string" enum:"ServiceState"`

	// The type of service.
	ServiceType []*ServiceTypeDetail `locationName:"serviceType" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s ServiceConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ServiceConfiguration) GoString() string {
	return s.String()
}

// SetAcceptanceRequired sets the AcceptanceRequired field's value.
func (s *ServiceConfiguration) SetAcceptanceRequired(v bool) *ServiceConfiguration {
	s.AcceptanceRequired = &v
	return s
}

// SetAvailabilityZones sets the AvailabilityZones field's value.
func (s *ServiceConfiguration) SetAvailabilityZones(v []*string) *ServiceConfiguration {
	s.AvailabilityZones = v
	return s
}

// SetBaseEndpointDnsNames sets the BaseEndpointDnsNames field's value.
func (s *ServiceConfiguration) SetBaseEndpointDnsNames(v []*string) *ServiceConfiguration {
	s.BaseEndpointDnsNames = v
	return s
}

// SetNetworkLoadBalancerArns sets the NetworkLoadBalancerArns field's value.
func (s *ServiceConfiguration) SetNetworkLoadBalancerArns(v []*string) *ServiceConfiguration {
	s.NetworkLoadBalancerArns = v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *ServiceConfiguration) SetPrivateDnsName(v string) *ServiceConfiguration {
	s.PrivateDnsName = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *ServiceConfiguration) SetServiceId(v string) *ServiceConfiguration {
	s.ServiceId = &v
	return s
}

// SetServiceName sets the ServiceName field's value.
func (s *ServiceConfiguration) SetServiceName(v string) *ServiceConfiguration {
	s.ServiceName = &v
	return s
}

// SetServiceState sets the ServiceState field's value.
func (s *ServiceConfiguration) SetServiceState(v string) *ServiceConfiguration {
	s.ServiceState = &v
	return s
}

// SetServiceType sets the ServiceType field's value.
func (s *ServiceConfiguration) SetServiceType(v []*ServiceTypeDetail) *ServiceConfiguration {
	s.ServiceType = v
	return s
}

// Describes a VPC endpoint service.
type ServiceDetail struct {
	_ struct{} `type:"structure"`

	// Indicates whether VPC endpoint connection requests to the service must be
	// accepted by the service owner.
	AcceptanceRequired *bool `locationName:"acceptanceRequired" type:"boolean"`

	// The Availability Zones in which the service is available.
	AvailabilityZones []*string `locationName:"availabilityZoneSet" locationNameList:"item" type:"list"`

	// The DNS names for the service.
	BaseEndpointDnsNames []*string `locationName:"baseEndpointDnsNameSet" locationNameList:"item" type:"list"`

	// The AWS account ID of the service owner.
	Owner *string `locationName:"owner" type:"string"`

	// The private DNS name for the service.
	PrivateDnsName *string `locationName:"privateDnsName" type:"string"`

	// The Amazon Resource Name (ARN) of the service.
	ServiceName *string `locationName:"serviceName" type:"string"`

	// The type of service.
	ServiceType []*ServiceTypeDetail `locationName:"serviceType" locationNameList:"item" type:"list"`

	// Indicates whether the service supports endpoint policies.
	VpcEndpointPolicySupported *bool `locationName:"vpcEndpointPolicySupported" type:"boolean"`
}

// String returns the string representation
func (s ServiceDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ServiceDetail) GoString() string {
	return s.String()
}

// SetAcceptanceRequired sets the AcceptanceRequired field's value.
func (s *ServiceDetail) SetAcceptanceRequired(v bool) *ServiceDetail {
	s.AcceptanceRequired = &v
	return s
}

// SetAvailabilityZones sets the AvailabilityZones field's value.
func (s *ServiceDetail) SetAvailabilityZones(v []*string) *ServiceDetail {
	s.AvailabilityZones = v
	return s
}

// SetBaseEndpointDnsNames sets the BaseEndpointDnsNames field's value.
func (s *ServiceDetail) SetBaseEndpointDnsNames(v []*string) *ServiceDetail {
	s.BaseEndpointDnsNames = v
	return s
}

// SetOwner sets the Owner field's value.
func (s *ServiceDetail) SetOwner(v string) *ServiceDetail {
	s.Owner = &v
	return s
}

// SetPrivateDnsName sets the PrivateDnsName field's value.
func (s *ServiceDetail) SetPrivateDnsName(v string) *ServiceDetail {
	s.PrivateDnsName = &v
	return s
}

// SetServiceName sets the ServiceName field's value.
func (s *ServiceDetail) SetServiceName(v string) *ServiceDetail {
	s.ServiceName = &v
	return s
}

// SetServiceType sets the ServiceType field's value.
func (s *ServiceDetail) SetServiceType(v []*ServiceTypeDetail) *ServiceDetail {
	s.ServiceType = v
	return s
}

// SetVpcEndpointPolicySupported sets the VpcEndpointPolicySupported field's value.
func (s *ServiceDetail) SetVpcEndpointPolicySupported(v bool) *ServiceDetail {
	s.VpcEndpointPolicySupported = &v
	return s
}

// Describes the type of service for a VPC endpoint.
type ServiceTypeDetail struct {
	_ struct{} `type:"structure"`

	// The type of service.
	ServiceType *string `locationName:"serviceType" type:"string" enum:"ServiceType"`
}

// String returns the string representation
func (s ServiceTypeDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ServiceTypeDetail) GoString() string {
	return s.String()
}

// SetServiceType sets the ServiceType field's value.
func (s *ServiceTypeDetail) SetServiceType(v string) *ServiceTypeDetail {
	s.ServiceType = &v
	return s
}

// Describes the time period for a Scheduled Instance to start its first schedule.
// The time period must span less than one day.
type SlotDateTimeRangeRequest struct {
	_ struct{} `type:"structure"`

	// The earliest date and time, in UTC, for the Scheduled Instance to start.
	//
	// EarliestTime is a required field
	EarliestTime *time.Time `type:"timestamp" required:"true"`

	// The latest date and time, in UTC, for the Scheduled Instance to start. This
	// value must be later than or equal to the earliest date and at most three
	// months in the future.
	//
	// LatestTime is a required field
	LatestTime *time.Time `type:"timestamp" required:"true"`
}

// String returns the string representation
func (s SlotDateTimeRangeRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SlotDateTimeRangeRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *SlotDateTimeRangeRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "SlotDateTimeRangeRequest"}
	if s.EarliestTime == nil {
		invalidParams.Add(request.NewErrParamRequired("EarliestTime"))
	}
	if s.LatestTime == nil {
		invalidParams.Add(request.NewErrParamRequired("LatestTime"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetEarliestTime sets the EarliestTime field's value.
func (s *SlotDateTimeRangeRequest) SetEarliestTime(v time.Time) *SlotDateTimeRangeRequest {
	s.EarliestTime = &v
	return s
}

// SetLatestTime sets the LatestTime field's value.
func (s *SlotDateTimeRangeRequest) SetLatestTime(v time.Time) *SlotDateTimeRangeRequest {
	s.LatestTime = &v
	return s
}

// Describes the time period for a Scheduled Instance to start its first schedule.
type SlotStartTimeRangeRequest struct {
	_ struct{} `type:"structure"`

	// The earliest date and time, in UTC, for the Scheduled Instance to start.
	EarliestTime *time.Time `type:"timestamp"`

	// The latest date and time, in UTC, for the Scheduled Instance to start.
	LatestTime *time.Time `type:"timestamp"`
}

// String returns the string representation
func (s SlotStartTimeRangeRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SlotStartTimeRangeRequest) GoString() string {
	return s.String()
}

// SetEarliestTime sets the EarliestTime field's value.
func (s *SlotStartTimeRangeRequest) SetEarliestTime(v time.Time) *SlotStartTimeRangeRequest {
	s.EarliestTime = &v
	return s
}

// SetLatestTime sets the LatestTime field's value.
func (s *SlotStartTimeRangeRequest) SetLatestTime(v time.Time) *SlotStartTimeRangeRequest {
	s.LatestTime = &v
	return s
}

// Describes a snapshot.
type Snapshot struct {
	_ struct{} `type:"structure"`

	// The data encryption key identifier for the snapshot. This value is a unique
	// identifier that corresponds to the data encryption key that was used to encrypt
	// the original volume or snapshot copy. Because data encryption keys are inherited
	// by volumes created from snapshots, and vice versa, if snapshots share the
	// same data encryption key identifier, then they belong to the same volume/snapshot
	// lineage. This parameter is only returned by the DescribeSnapshots API operation.
	DataEncryptionKeyId *string `locationName:"dataEncryptionKeyId" type:"string"`

	// The description for the snapshot.
	Description *string `locationName:"description" type:"string"`

	// Indicates whether the snapshot is encrypted.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The full ARN of the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) that was used to protect the volume encryption key for the parent
	// volume.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// Value from an Amazon-maintained list (amazon | aws-marketplace | microsoft)
	// of snapshot owners. Not to be confused with the user-configured AWS account
	// alias, which is set from the IAM console.
	OwnerAlias *string `locationName:"ownerAlias" type:"string"`

	// The AWS account ID of the EBS snapshot owner.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The progress of the snapshot, as a percentage.
	Progress *string `locationName:"progress" type:"string"`

	// The ID of the snapshot. Each snapshot receives a unique identifier when it
	// is created.
	SnapshotId *string `locationName:"snapshotId" type:"string"`

	// The time stamp when the snapshot was initiated.
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`

	// The snapshot state.
	State *string `locationName:"status" type:"string" enum:"SnapshotState"`

	// Encrypted Amazon EBS snapshots are copied asynchronously. If a snapshot copy
	// operation fails (for example, if the proper AWS Key Management Service (AWS
	// KMS) permissions are not obtained) this field displays error state details
	// to help you diagnose why the error occurred. This parameter is only returned
	// by the DescribeSnapshots API operation.
	StateMessage *string `locationName:"statusMessage" type:"string"`

	// Any tags assigned to the snapshot.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the volume that was used to create the snapshot. Snapshots created
	// by the CopySnapshot action have an arbitrary volume ID that should not be
	// used for any purpose.
	VolumeId *string `locationName:"volumeId" type:"string"`

	// The size of the volume, in GiB.
	VolumeSize *int64 `locationName:"volumeSize" type:"integer"`
}

// String returns the string representation
func (s Snapshot) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Snapshot) GoString() string {
	return s.String()
}

// SetDataEncryptionKeyId sets the DataEncryptionKeyId field's value.
func (s *Snapshot) SetDataEncryptionKeyId(v string) *Snapshot {
	s.DataEncryptionKeyId = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *Snapshot) SetDescription(v string) *Snapshot {
	s.Description = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *Snapshot) SetEncrypted(v bool) *Snapshot {
	s.Encrypted = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *Snapshot) SetKmsKeyId(v string) *Snapshot {
	s.KmsKeyId = &v
	return s
}

// SetOwnerAlias sets the OwnerAlias field's value.
func (s *Snapshot) SetOwnerAlias(v string) *Snapshot {
	s.OwnerAlias = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *Snapshot) SetOwnerId(v string) *Snapshot {
	s.OwnerId = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *Snapshot) SetProgress(v string) *Snapshot {
	s.Progress = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *Snapshot) SetSnapshotId(v string) *Snapshot {
	s.SnapshotId = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *Snapshot) SetStartTime(v time.Time) *Snapshot {
	s.StartTime = &v
	return s
}

// SetState sets the State field's value.
func (s *Snapshot) SetState(v string) *Snapshot {
	s.State = &v
	return s
}

// SetStateMessage sets the StateMessage field's value.
func (s *Snapshot) SetStateMessage(v string) *Snapshot {
	s.StateMessage = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Snapshot) SetTags(v []*Tag) *Snapshot {
	s.Tags = v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *Snapshot) SetVolumeId(v string) *Snapshot {
	s.VolumeId = &v
	return s
}

// SetVolumeSize sets the VolumeSize field's value.
func (s *Snapshot) SetVolumeSize(v int64) *Snapshot {
	s.VolumeSize = &v
	return s
}

// Describes the snapshot created from the imported disk.
type SnapshotDetail struct {
	_ struct{} `type:"structure"`

	// A description for the snapshot.
	Description *string `locationName:"description" type:"string"`

	// The block device mapping for the snapshot.
	DeviceName *string `locationName:"deviceName" type:"string"`

	// The size of the disk in the snapshot, in GiB.
	DiskImageSize *float64 `locationName:"diskImageSize" type:"double"`

	// The format of the disk image from which the snapshot is created.
	Format *string `locationName:"format" type:"string"`

	// The percentage of progress for the task.
	Progress *string `locationName:"progress" type:"string"`

	// The snapshot ID of the disk being imported.
	SnapshotId *string `locationName:"snapshotId" type:"string"`

	// A brief status of the snapshot creation.
	Status *string `locationName:"status" type:"string"`

	// A detailed status message for the snapshot creation.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// The URL used to access the disk image.
	Url *string `locationName:"url" type:"string"`

	// The S3 bucket for the disk image.
	UserBucket *UserBucketDetails `locationName:"userBucket" type:"structure"`
}

// String returns the string representation
func (s SnapshotDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SnapshotDetail) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *SnapshotDetail) SetDescription(v string) *SnapshotDetail {
	s.Description = &v
	return s
}

// SetDeviceName sets the DeviceName field's value.
func (s *SnapshotDetail) SetDeviceName(v string) *SnapshotDetail {
	s.DeviceName = &v
	return s
}

// SetDiskImageSize sets the DiskImageSize field's value.
func (s *SnapshotDetail) SetDiskImageSize(v float64) *SnapshotDetail {
	s.DiskImageSize = &v
	return s
}

// SetFormat sets the Format field's value.
func (s *SnapshotDetail) SetFormat(v string) *SnapshotDetail {
	s.Format = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *SnapshotDetail) SetProgress(v string) *SnapshotDetail {
	s.Progress = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *SnapshotDetail) SetSnapshotId(v string) *SnapshotDetail {
	s.SnapshotId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *SnapshotDetail) SetStatus(v string) *SnapshotDetail {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *SnapshotDetail) SetStatusMessage(v string) *SnapshotDetail {
	s.StatusMessage = &v
	return s
}

// SetUrl sets the Url field's value.
func (s *SnapshotDetail) SetUrl(v string) *SnapshotDetail {
	s.Url = &v
	return s
}

// SetUserBucket sets the UserBucket field's value.
func (s *SnapshotDetail) SetUserBucket(v *UserBucketDetails) *SnapshotDetail {
	s.UserBucket = v
	return s
}

// The disk container object for the import snapshot request.
type SnapshotDiskContainer struct {
	_ struct{} `type:"structure"`

	// The description of the disk image being imported.
	Description *string `type:"string"`

	// The format of the disk image being imported.
	//
	// Valid values: VHD | VMDK
	Format *string `type:"string"`

	// The URL to the Amazon S3-based disk image being imported. It can either be
	// a https URL (https://..) or an Amazon S3 URL (s3://..).
	Url *string `type:"string"`

	// The S3 bucket for the disk image.
	UserBucket *UserBucket `type:"structure"`
}

// String returns the string representation
func (s SnapshotDiskContainer) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SnapshotDiskContainer) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *SnapshotDiskContainer) SetDescription(v string) *SnapshotDiskContainer {
	s.Description = &v
	return s
}

// SetFormat sets the Format field's value.
func (s *SnapshotDiskContainer) SetFormat(v string) *SnapshotDiskContainer {
	s.Format = &v
	return s
}

// SetUrl sets the Url field's value.
func (s *SnapshotDiskContainer) SetUrl(v string) *SnapshotDiskContainer {
	s.Url = &v
	return s
}

// SetUserBucket sets the UserBucket field's value.
func (s *SnapshotDiskContainer) SetUserBucket(v *UserBucket) *SnapshotDiskContainer {
	s.UserBucket = v
	return s
}

// Details about the import snapshot task.
type SnapshotTaskDetail struct {
	_ struct{} `type:"structure"`

	// The description of the snapshot.
	Description *string `locationName:"description" type:"string"`

	// The size of the disk in the snapshot, in GiB.
	DiskImageSize *float64 `locationName:"diskImageSize" type:"double"`

	// Indicates whether the snapshot is encrypted.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The format of the disk image from which the snapshot is created.
	Format *string `locationName:"format" type:"string"`

	// The identifier for the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) that was used to create the encrypted snapshot.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// The percentage of completion for the import snapshot task.
	Progress *string `locationName:"progress" type:"string"`

	// The snapshot ID of the disk being imported.
	SnapshotId *string `locationName:"snapshotId" type:"string"`

	// A brief status for the import snapshot task.
	Status *string `locationName:"status" type:"string"`

	// A detailed status message for the import snapshot task.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// The URL of the disk image from which the snapshot is created.
	Url *string `locationName:"url" type:"string"`

	// The S3 bucket for the disk image.
	UserBucket *UserBucketDetails `locationName:"userBucket" type:"structure"`
}

// String returns the string representation
func (s SnapshotTaskDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SnapshotTaskDetail) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *SnapshotTaskDetail) SetDescription(v string) *SnapshotTaskDetail {
	s.Description = &v
	return s
}

// SetDiskImageSize sets the DiskImageSize field's value.
func (s *SnapshotTaskDetail) SetDiskImageSize(v float64) *SnapshotTaskDetail {
	s.DiskImageSize = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *SnapshotTaskDetail) SetEncrypted(v bool) *SnapshotTaskDetail {
	s.Encrypted = &v
	return s
}

// SetFormat sets the Format field's value.
func (s *SnapshotTaskDetail) SetFormat(v string) *SnapshotTaskDetail {
	s.Format = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *SnapshotTaskDetail) SetKmsKeyId(v string) *SnapshotTaskDetail {
	s.KmsKeyId = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *SnapshotTaskDetail) SetProgress(v string) *SnapshotTaskDetail {
	s.Progress = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *SnapshotTaskDetail) SetSnapshotId(v string) *SnapshotTaskDetail {
	s.SnapshotId = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *SnapshotTaskDetail) SetStatus(v string) *SnapshotTaskDetail {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *SnapshotTaskDetail) SetStatusMessage(v string) *SnapshotTaskDetail {
	s.StatusMessage = &v
	return s
}

// SetUrl sets the Url field's value.
func (s *SnapshotTaskDetail) SetUrl(v string) *SnapshotTaskDetail {
	s.Url = &v
	return s
}

// SetUserBucket sets the UserBucket field's value.
func (s *SnapshotTaskDetail) SetUserBucket(v *UserBucketDetails) *SnapshotTaskDetail {
	s.UserBucket = v
	return s
}

// Describes the data feed for a Spot Instance.
type SpotDatafeedSubscription struct {
	_ struct{} `type:"structure"`

	// The Amazon S3 bucket where the Spot Instance data feed is located.
	Bucket *string `locationName:"bucket" type:"string"`

	// The fault codes for the Spot Instance request, if any.
	Fault *SpotInstanceStateFault `locationName:"fault" type:"structure"`

	// The AWS account ID of the account.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The prefix that is prepended to data feed files.
	Prefix *string `locationName:"prefix" type:"string"`

	// The state of the Spot Instance data feed subscription.
	State *string `locationName:"state" type:"string" enum:"DatafeedSubscriptionState"`
}

// String returns the string representation
func (s SpotDatafeedSubscription) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotDatafeedSubscription) GoString() string {
	return s.String()
}

// SetBucket sets the Bucket field's value.
func (s *SpotDatafeedSubscription) SetBucket(v string) *SpotDatafeedSubscription {
	s.Bucket = &v
	return s
}

// SetFault sets the Fault field's value.
func (s *SpotDatafeedSubscription) SetFault(v *SpotInstanceStateFault) *SpotDatafeedSubscription {
	s.Fault = v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *SpotDatafeedSubscription) SetOwnerId(v string) *SpotDatafeedSubscription {
	s.OwnerId = &v
	return s
}

// SetPrefix sets the Prefix field's value.
func (s *SpotDatafeedSubscription) SetPrefix(v string) *SpotDatafeedSubscription {
	s.Prefix = &v
	return s
}

// SetState sets the State field's value.
func (s *SpotDatafeedSubscription) SetState(v string) *SpotDatafeedSubscription {
	s.State = &v
	return s
}

// Describes the launch specification for one or more Spot Instances.
type SpotFleetLaunchSpecification struct {
	_ struct{} `type:"structure"`

	// Deprecated.
	AddressingType *string `locationName:"addressingType" type:"string"`

	// One or more block device mapping entries. You can't specify both a snapshot
	// ID and an encryption value. This is because only blank volumes can be encrypted
	// on creation. If a snapshot is the basis for a volume, it is not blank and
	// its encryption status is used for the volume encryption status.
	BlockDeviceMappings []*BlockDeviceMapping `locationName:"blockDeviceMapping" locationNameList:"item" type:"list"`

	// Indicates whether the instances are optimized for EBS I/O. This optimization
	// provides dedicated throughput to Amazon EBS and an optimized configuration
	// stack to provide optimal EBS I/O performance. This optimization isn't available
	// with all instance types. Additional usage charges apply when using an EBS
	// Optimized instance.
	//
	// Default: false
	EbsOptimized *bool `locationName:"ebsOptimized" type:"boolean"`

	// The IAM instance profile.
	IamInstanceProfile *IamInstanceProfileSpecification `locationName:"iamInstanceProfile" type:"structure"`

	// The ID of the AMI.
	ImageId *string `locationName:"imageId" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// The ID of the kernel.
	KernelId *string `locationName:"kernelId" type:"string"`

	// The name of the key pair.
	KeyName *string `locationName:"keyName" type:"string"`

	// Enable or disable monitoring for the instances.
	Monitoring *SpotFleetMonitoring `locationName:"monitoring" type:"structure"`

	// One or more network interfaces. If you specify a network interface, you must
	// specify subnet IDs and security group IDs using the network interface.
	NetworkInterfaces []*InstanceNetworkInterfaceSpecification `locationName:"networkInterfaceSet" locationNameList:"item" type:"list"`

	// The placement information.
	Placement *SpotPlacement `locationName:"placement" type:"structure"`

	// The ID of the RAM disk.
	RamdiskId *string `locationName:"ramdiskId" type:"string"`

	// One or more security groups. When requesting instances in a VPC, you must
	// specify the IDs of the security groups. When requesting instances in EC2-Classic,
	// you can specify the names or the IDs of the security groups.
	SecurityGroups []*GroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// The maximum price per unit hour that you are willing to pay for a Spot Instance.
	// If this value is not specified, the default is the Spot price specified for
	// the fleet. To determine the Spot price per unit hour, divide the Spot price
	// by the value of WeightedCapacity.
	SpotPrice *string `locationName:"spotPrice" type:"string"`

	// The ID of the subnet in which to launch the instances. To specify multiple
	// subnets, separate them using commas; for example, "subnet-a61dafcf, subnet-65ea5f08".
	SubnetId *string `locationName:"subnetId" type:"string"`

	// The tags to apply during creation.
	TagSpecifications []*SpotFleetTagSpecification `locationName:"tagSpecificationSet" locationNameList:"item" type:"list"`

	// The Base64-encoded user data to make available to the instances.
	UserData *string `locationName:"userData" type:"string"`

	// The number of units provided by the specified instance type. These are the
	// same units that you chose to set the target capacity in terms (instances
	// or a performance characteristic such as vCPUs, memory, or I/O).
	//
	// If the target capacity divided by this value is not a whole number, we round
	// the number of instances to the next whole number. If this value is not specified,
	// the default is 1.
	WeightedCapacity *float64 `locationName:"weightedCapacity" type:"double"`
}

// String returns the string representation
func (s SpotFleetLaunchSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotFleetLaunchSpecification) GoString() string {
	return s.String()
}

// SetAddressingType sets the AddressingType field's value.
func (s *SpotFleetLaunchSpecification) SetAddressingType(v string) *SpotFleetLaunchSpecification {
	s.AddressingType = &v
	return s
}

// SetBlockDeviceMappings sets the BlockDeviceMappings field's value.
func (s *SpotFleetLaunchSpecification) SetBlockDeviceMappings(v []*BlockDeviceMapping) *SpotFleetLaunchSpecification {
	s.BlockDeviceMappings = v
	return s
}

// SetEbsOptimized sets the EbsOptimized field's value.
func (s *SpotFleetLaunchSpecification) SetEbsOptimized(v bool) *SpotFleetLaunchSpecification {
	s.EbsOptimized = &v
	return s
}

// SetIamInstanceProfile sets the IamInstanceProfile field's value.
func (s *SpotFleetLaunchSpecification) SetIamInstanceProfile(v *IamInstanceProfileSpecification) *SpotFleetLaunchSpecification {
	s.IamInstanceProfile = v
	return s
}

// SetImageId sets the ImageId field's value.
func (s *SpotFleetLaunchSpecification) SetImageId(v string) *SpotFleetLaunchSpecification {
	s.ImageId = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *SpotFleetLaunchSpecification) SetInstanceType(v string) *SpotFleetLaunchSpecification {
	s.InstanceType = &v
	return s
}

// SetKernelId sets the KernelId field's value.
func (s *SpotFleetLaunchSpecification) SetKernelId(v string) *SpotFleetLaunchSpecification {
	s.KernelId = &v
	return s
}

// SetKeyName sets the KeyName field's value.
func (s *SpotFleetLaunchSpecification) SetKeyName(v string) *SpotFleetLaunchSpecification {
	s.KeyName = &v
	return s
}

// SetMonitoring sets the Monitoring field's value.
func (s *SpotFleetLaunchSpecification) SetMonitoring(v *SpotFleetMonitoring) *SpotFleetLaunchSpecification {
	s.Monitoring = v
	return s
}

// SetNetworkInterfaces sets the NetworkInterfaces field's value.
func (s *SpotFleetLaunchSpecification) SetNetworkInterfaces(v []*InstanceNetworkInterfaceSpecification) *SpotFleetLaunchSpecification {
	s.NetworkInterfaces = v
	return s
}

// SetPlacement sets the Placement field's value.
func (s *SpotFleetLaunchSpecification) SetPlacement(v *SpotPlacement) *SpotFleetLaunchSpecification {
	s.Placement = v
	return s
}

// SetRamdiskId sets the RamdiskId field's value.
func (s *SpotFleetLaunchSpecification) SetRamdiskId(v string) *SpotFleetLaunchSpecification {
	s.RamdiskId = &v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *SpotFleetLaunchSpecification) SetSecurityGroups(v []*GroupIdentifier) *SpotFleetLaunchSpecification {
	s.SecurityGroups = v
	return s
}

// SetSpotPrice sets the SpotPrice field's value.
func (s *SpotFleetLaunchSpecification) SetSpotPrice(v string) *SpotFleetLaunchSpecification {
	s.SpotPrice = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *SpotFleetLaunchSpecification) SetSubnetId(v string) *SpotFleetLaunchSpecification {
	s.SubnetId = &v
	return s
}

// SetTagSpecifications sets the TagSpecifications field's value.
func (s *SpotFleetLaunchSpecification) SetTagSpecifications(v []*SpotFleetTagSpecification) *SpotFleetLaunchSpecification {
	s.TagSpecifications = v
	return s
}

// SetUserData sets the UserData field's value.
func (s *SpotFleetLaunchSpecification) SetUserData(v string) *SpotFleetLaunchSpecification {
	s.UserData = &v
	return s
}

// SetWeightedCapacity sets the WeightedCapacity field's value.
func (s *SpotFleetLaunchSpecification) SetWeightedCapacity(v float64) *SpotFleetLaunchSpecification {
	s.WeightedCapacity = &v
	return s
}

// Describes whether monitoring is enabled.
type SpotFleetMonitoring struct {
	_ struct{} `type:"structure"`

	// Enables monitoring for the instance.
	//
	// Default: false
	Enabled *bool `locationName:"enabled" type:"boolean"`
}

// String returns the string representation
func (s SpotFleetMonitoring) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotFleetMonitoring) GoString() string {
	return s.String()
}

// SetEnabled sets the Enabled field's value.
func (s *SpotFleetMonitoring) SetEnabled(v bool) *SpotFleetMonitoring {
	s.Enabled = &v
	return s
}

// Describes a Spot Fleet request.
type SpotFleetRequestConfig struct {
	_ struct{} `type:"structure"`

	// The progress of the Spot Fleet request. If there is an error, the status
	// is error. After all requests are placed, the status is pending_fulfillment.
	// If the size of the fleet is equal to or greater than its target capacity,
	// the status is fulfilled. If the size of the fleet is decreased, the status
	// is pending_termination while Spot Instances are terminating.
	ActivityStatus *string `locationName:"activityStatus" type:"string" enum:"ActivityStatus"`

	// The creation date and time of the request.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// The configuration of the Spot Fleet request.
	SpotFleetRequestConfig *SpotFleetRequestConfigData `locationName:"spotFleetRequestConfig" type:"structure"`

	// The ID of the Spot Fleet request.
	SpotFleetRequestId *string `locationName:"spotFleetRequestId" type:"string"`

	// The state of the Spot Fleet request.
	SpotFleetRequestState *string `locationName:"spotFleetRequestState" type:"string" enum:"BatchState"`
}

// String returns the string representation
func (s SpotFleetRequestConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotFleetRequestConfig) GoString() string {
	return s.String()
}

// SetActivityStatus sets the ActivityStatus field's value.
func (s *SpotFleetRequestConfig) SetActivityStatus(v string) *SpotFleetRequestConfig {
	s.ActivityStatus = &v
	return s
}

// SetCreateTime sets the CreateTime field's value.
func (s *SpotFleetRequestConfig) SetCreateTime(v time.Time) *SpotFleetRequestConfig {
	s.CreateTime = &v
	return s
}

// SetSpotFleetRequestConfig sets the SpotFleetRequestConfig field's value.
func (s *SpotFleetRequestConfig) SetSpotFleetRequestConfig(v *SpotFleetRequestConfigData) *SpotFleetRequestConfig {
	s.SpotFleetRequestConfig = v
	return s
}

// SetSpotFleetRequestId sets the SpotFleetRequestId field's value.
func (s *SpotFleetRequestConfig) SetSpotFleetRequestId(v string) *SpotFleetRequestConfig {
	s.SpotFleetRequestId = &v
	return s
}

// SetSpotFleetRequestState sets the SpotFleetRequestState field's value.
func (s *SpotFleetRequestConfig) SetSpotFleetRequestState(v string) *SpotFleetRequestConfig {
	s.SpotFleetRequestState = &v
	return s
}

// Describes the configuration of a Spot Fleet request.
type SpotFleetRequestConfigData struct {
	_ struct{} `type:"structure"`

	// Indicates how to allocate the target capacity across the Spot pools specified
	// by the Spot Fleet request. The default is lowestPrice.
	AllocationStrategy *string `locationName:"allocationStrategy" type:"string" enum:"AllocationStrategy"`

	// A unique, case-sensitive identifier that you provide to ensure the idempotency
	// of your listings. This helps to avoid duplicate listings. For more information,
	// see Ensuring Idempotency (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html).
	ClientToken *string `locationName:"clientToken" type:"string"`

	// Indicates whether running Spot Instances should be terminated if the target
	// capacity of the Spot Fleet request is decreased below the current size of
	// the Spot Fleet.
	ExcessCapacityTerminationPolicy *string `locationName:"excessCapacityTerminationPolicy" type:"string" enum:"ExcessCapacityTerminationPolicy"`

	// The number of units fulfilled by this request compared to the set target
	// capacity. You cannot set this value.
	FulfilledCapacity *float64 `locationName:"fulfilledCapacity" type:"double"`

	// Grants the Spot Fleet permission to terminate Spot Instances on your behalf
	// when you cancel its Spot Fleet request using CancelSpotFleetRequests or when
	// the Spot Fleet request expires, if you set terminateInstancesWithExpiration.
	//
	// IamFleetRole is a required field
	IamFleetRole *string `locationName:"iamFleetRole" type:"string" required:"true"`

	// The behavior when a Spot Instance is interrupted. The default is terminate.
	InstanceInterruptionBehavior *string `locationName:"instanceInterruptionBehavior" type:"string" enum:"InstanceInterruptionBehavior"`

	// The number of Spot pools across which to allocate your target Spot capacity.
	// Valid only when Spot AllocationStrategy is set to lowest-price. Spot Fleet
	// selects the cheapest Spot pools and evenly allocates your target Spot capacity
	// across the number of Spot pools that you specify.
	InstancePoolsToUseCount *int64 `locationName:"instancePoolsToUseCount" type:"integer"`

	// The launch specifications for the Spot Fleet request.
	LaunchSpecifications []*SpotFleetLaunchSpecification `locationName:"launchSpecifications" locationNameList:"item" type:"list"`

	// The launch template and overrides.
	LaunchTemplateConfigs []*LaunchTemplateConfig `locationName:"launchTemplateConfigs" locationNameList:"item" type:"list"`

	// One or more Classic Load Balancers and target groups to attach to the Spot
	// Fleet request. Spot Fleet registers the running Spot Instances with the specified
	// Classic Load Balancers and target groups.
	//
	// With Network Load Balancers, Spot Fleet cannot register instances that have
	// the following instance types: C1, CC1, CC2, CG1, CG2, CR1, CS1, G1, G2, HI1,
	// HS1, M1, M2, M3, and T1.
	LoadBalancersConfig *LoadBalancersConfig `locationName:"loadBalancersConfig" type:"structure"`

	// The order of the launch template overrides to use in fulfilling On-Demand
	// capacity. If you specify lowestPrice, Spot Fleet uses price to determine
	// the order, launching the lowest price first. If you specify prioritized,
	// Spot Fleet uses the priority that you assign to each Spot Fleet launch template
	// override, launching the highest priority first. If you do not specify a value,
	// Spot Fleet defaults to lowestPrice.
	OnDemandAllocationStrategy *string `locationName:"onDemandAllocationStrategy" type:"string" enum:"OnDemandAllocationStrategy"`

	// The number of On-Demand units fulfilled by this request compared to the set
	// target On-Demand capacity.
	OnDemandFulfilledCapacity *float64 `locationName:"onDemandFulfilledCapacity" type:"double"`

	// The number of On-Demand units to request. You can choose to set the target
	// capacity in terms of instances or a performance characteristic that is important
	// to your application workload, such as vCPUs, memory, or I/O. If the request
	// type is maintain, you can specify a target capacity of 0 and add capacity
	// later.
	OnDemandTargetCapacity *int64 `locationName:"onDemandTargetCapacity" type:"integer"`

	// Indicates whether Spot Fleet should replace unhealthy instances.
	ReplaceUnhealthyInstances *bool `locationName:"replaceUnhealthyInstances" type:"boolean"`

	// The maximum price per unit hour that you are willing to pay for a Spot Instance.
	// The default is the On-Demand price.
	SpotPrice *string `locationName:"spotPrice" type:"string"`

	// The number of units to request. You can choose to set the target capacity
	// in terms of instances or a performance characteristic that is important to
	// your application workload, such as vCPUs, memory, or I/O. If the request
	// type is maintain, you can specify a target capacity of 0 and add capacity
	// later.
	//
	// TargetCapacity is a required field
	TargetCapacity *int64 `locationName:"targetCapacity" type:"integer" required:"true"`

	// Indicates whether running Spot Instances should be terminated when the Spot
	// Fleet request expires.
	TerminateInstancesWithExpiration *bool `locationName:"terminateInstancesWithExpiration" type:"boolean"`

	// The type of request. Indicates whether the Spot Fleet only requests the target
	// capacity or also attempts to maintain it. When this value is request, the
	// Spot Fleet only places the required requests. It does not attempt to replenish
	// Spot Instances if capacity is diminished, nor does it submit requests in
	// alternative Spot pools if capacity is not available. When this value is maintain,
	// the Spot Fleet maintains the target capacity. The Spot Fleet places the required
	// requests to meet capacity and automatically replenishes any interrupted instances.
	// Default: maintain. instant is listed but is not used by Spot Fleet.
	Type *string `locationName:"type" type:"string" enum:"FleetType"`

	// The start date and time of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// The default is to start fulfilling the request immediately.
	ValidFrom *time.Time `locationName:"validFrom" type:"timestamp"`

	// The end date and time of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// At this point, no new Spot Instance requests are placed or able to fulfill
	// the request. The default end date is 7 days from the current date.
	ValidUntil *time.Time `locationName:"validUntil" type:"timestamp"`
}

// String returns the string representation
func (s SpotFleetRequestConfigData) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotFleetRequestConfigData) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *SpotFleetRequestConfigData) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "SpotFleetRequestConfigData"}
	if s.IamFleetRole == nil {
		invalidParams.Add(request.NewErrParamRequired("IamFleetRole"))
	}
	if s.TargetCapacity == nil {
		invalidParams.Add(request.NewErrParamRequired("TargetCapacity"))
	}
	if s.LaunchTemplateConfigs != nil {
		for i, v := range s.LaunchTemplateConfigs {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "LaunchTemplateConfigs", i), err.(request.ErrInvalidParams))
			}
		}
	}
	if s.LoadBalancersConfig != nil {
		if err := s.LoadBalancersConfig.Validate(); err != nil {
			invalidParams.AddNested("LoadBalancersConfig", err.(request.ErrInvalidParams))
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAllocationStrategy sets the AllocationStrategy field's value.
func (s *SpotFleetRequestConfigData) SetAllocationStrategy(v string) *SpotFleetRequestConfigData {
	s.AllocationStrategy = &v
	return s
}

// SetClientToken sets the ClientToken field's value.
func (s *SpotFleetRequestConfigData) SetClientToken(v string) *SpotFleetRequestConfigData {
	s.ClientToken = &v
	return s
}

// SetExcessCapacityTerminationPolicy sets the ExcessCapacityTerminationPolicy field's value.
func (s *SpotFleetRequestConfigData) SetExcessCapacityTerminationPolicy(v string) *SpotFleetRequestConfigData {
	s.ExcessCapacityTerminationPolicy = &v
	return s
}

// SetFulfilledCapacity sets the FulfilledCapacity field's value.
func (s *SpotFleetRequestConfigData) SetFulfilledCapacity(v float64) *SpotFleetRequestConfigData {
	s.FulfilledCapacity = &v
	return s
}

// SetIamFleetRole sets the IamFleetRole field's value.
func (s *SpotFleetRequestConfigData) SetIamFleetRole(v string) *SpotFleetRequestConfigData {
	s.IamFleetRole = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *SpotFleetRequestConfigData) SetInstanceInterruptionBehavior(v string) *SpotFleetRequestConfigData {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetInstancePoolsToUseCount sets the InstancePoolsToUseCount field's value.
func (s *SpotFleetRequestConfigData) SetInstancePoolsToUseCount(v int64) *SpotFleetRequestConfigData {
	s.InstancePoolsToUseCount = &v
	return s
}

// SetLaunchSpecifications sets the LaunchSpecifications field's value.
func (s *SpotFleetRequestConfigData) SetLaunchSpecifications(v []*SpotFleetLaunchSpecification) *SpotFleetRequestConfigData {
	s.LaunchSpecifications = v
	return s
}

// SetLaunchTemplateConfigs sets the LaunchTemplateConfigs field's value.
func (s *SpotFleetRequestConfigData) SetLaunchTemplateConfigs(v []*LaunchTemplateConfig) *SpotFleetRequestConfigData {
	s.LaunchTemplateConfigs = v
	return s
}

// SetLoadBalancersConfig sets the LoadBalancersConfig field's value.
func (s *SpotFleetRequestConfigData) SetLoadBalancersConfig(v *LoadBalancersConfig) *SpotFleetRequestConfigData {
	s.LoadBalancersConfig = v
	return s
}

// SetOnDemandAllocationStrategy sets the OnDemandAllocationStrategy field's value.
func (s *SpotFleetRequestConfigData) SetOnDemandAllocationStrategy(v string) *SpotFleetRequestConfigData {
	s.OnDemandAllocationStrategy = &v
	return s
}

// SetOnDemandFulfilledCapacity sets the OnDemandFulfilledCapacity field's value.
func (s *SpotFleetRequestConfigData) SetOnDemandFulfilledCapacity(v float64) *SpotFleetRequestConfigData {
	s.OnDemandFulfilledCapacity = &v
	return s
}

// SetOnDemandTargetCapacity sets the OnDemandTargetCapacity field's value.
func (s *SpotFleetRequestConfigData) SetOnDemandTargetCapacity(v int64) *SpotFleetRequestConfigData {
	s.OnDemandTargetCapacity = &v
	return s
}

// SetReplaceUnhealthyInstances sets the ReplaceUnhealthyInstances field's value.
func (s *SpotFleetRequestConfigData) SetReplaceUnhealthyInstances(v bool) *SpotFleetRequestConfigData {
	s.ReplaceUnhealthyInstances = &v
	return s
}

// SetSpotPrice sets the SpotPrice field's value.
func (s *SpotFleetRequestConfigData) SetSpotPrice(v string) *SpotFleetRequestConfigData {
	s.SpotPrice = &v
	return s
}

// SetTargetCapacity sets the TargetCapacity field's value.
func (s *SpotFleetRequestConfigData) SetTargetCapacity(v int64) *SpotFleetRequestConfigData {
	s.TargetCapacity = &v
	return s
}

// SetTerminateInstancesWithExpiration sets the TerminateInstancesWithExpiration field's value.
func (s *SpotFleetRequestConfigData) SetTerminateInstancesWithExpiration(v bool) *SpotFleetRequestConfigData {
	s.TerminateInstancesWithExpiration = &v
	return s
}

// SetType sets the Type field's value.
func (s *SpotFleetRequestConfigData) SetType(v string) *SpotFleetRequestConfigData {
	s.Type = &v
	return s
}

// SetValidFrom sets the ValidFrom field's value.
func (s *SpotFleetRequestConfigData) SetValidFrom(v time.Time) *SpotFleetRequestConfigData {
	s.ValidFrom = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *SpotFleetRequestConfigData) SetValidUntil(v time.Time) *SpotFleetRequestConfigData {
	s.ValidUntil = &v
	return s
}

// The tags for a Spot Fleet resource.
type SpotFleetTagSpecification struct {
	_ struct{} `type:"structure"`

	// The type of resource. Currently, the only resource type that is supported
	// is instance.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"ResourceType"`

	// The tags.
	Tags []*Tag `locationName:"tag" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s SpotFleetTagSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotFleetTagSpecification) GoString() string {
	return s.String()
}

// SetResourceType sets the ResourceType field's value.
func (s *SpotFleetTagSpecification) SetResourceType(v string) *SpotFleetTagSpecification {
	s.ResourceType = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *SpotFleetTagSpecification) SetTags(v []*Tag) *SpotFleetTagSpecification {
	s.Tags = v
	return s
}

// Describes a Spot Instance request.
type SpotInstanceRequest struct {
	_ struct{} `type:"structure"`

	// If you specified a duration and your Spot Instance request was fulfilled,
	// this is the fixed hourly price in effect for the Spot Instance while it runs.
	ActualBlockHourlyPrice *string `locationName:"actualBlockHourlyPrice" type:"string"`

	// The Availability Zone group. If you specify the same Availability Zone group
	// for all Spot Instance requests, all Spot Instances are launched in the same
	// Availability Zone.
	AvailabilityZoneGroup *string `locationName:"availabilityZoneGroup" type:"string"`

	// The duration for the Spot Instance, in minutes.
	BlockDurationMinutes *int64 `locationName:"blockDurationMinutes" type:"integer"`

	// The date and time when the Spot Instance request was created, in UTC format
	// (for example, YYYY-MM-DDTHH:MM:SSZ).
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// The fault codes for the Spot Instance request, if any.
	Fault *SpotInstanceStateFault `locationName:"fault" type:"structure"`

	// The instance ID, if an instance has been launched to fulfill the Spot Instance
	// request.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The behavior when a Spot Instance is interrupted.
	InstanceInterruptionBehavior *string `locationName:"instanceInterruptionBehavior" type:"string" enum:"InstanceInterruptionBehavior"`

	// The instance launch group. Launch groups are Spot Instances that launch together
	// and terminate together.
	LaunchGroup *string `locationName:"launchGroup" type:"string"`

	// Additional information for launching instances.
	LaunchSpecification *LaunchSpecification `locationName:"launchSpecification" type:"structure"`

	// The Availability Zone in which the request is launched.
	LaunchedAvailabilityZone *string `locationName:"launchedAvailabilityZone" type:"string"`

	// The product description associated with the Spot Instance.
	ProductDescription *string `locationName:"productDescription" type:"string" enum:"RIProductDescription"`

	// The ID of the Spot Instance request.
	SpotInstanceRequestId *string `locationName:"spotInstanceRequestId" type:"string"`

	// The maximum price per hour that you are willing to pay for a Spot Instance.
	SpotPrice *string `locationName:"spotPrice" type:"string"`

	// The state of the Spot Instance request. Spot status information helps track
	// your Spot Instance requests. For more information, see Spot Status (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-bid-status.html)
	// in the Amazon EC2 User Guide for Linux Instances.
	State *string `locationName:"state" type:"string" enum:"SpotInstanceState"`

	// The status code and status message describing the Spot Instance request.
	Status *SpotInstanceStatus `locationName:"status" type:"structure"`

	// Any tags assigned to the resource.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The Spot Instance request type.
	Type *string `locationName:"type" type:"string" enum:"SpotInstanceType"`

	// The start date of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// The request becomes active at this date and time.
	ValidFrom *time.Time `locationName:"validFrom" type:"timestamp"`

	// The end date of the request, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	// If this is a one-time request, it remains active until all instances launch,
	// the request is canceled, or this date is reached. If the request is persistent,
	// it remains active until it is canceled or this date is reached. The default
	// end date is 7 days from the current date.
	ValidUntil *time.Time `locationName:"validUntil" type:"timestamp"`
}

// String returns the string representation
func (s SpotInstanceRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotInstanceRequest) GoString() string {
	return s.String()
}

// SetActualBlockHourlyPrice sets the ActualBlockHourlyPrice field's value.
func (s *SpotInstanceRequest) SetActualBlockHourlyPrice(v string) *SpotInstanceRequest {
	s.ActualBlockHourlyPrice = &v
	return s
}

// SetAvailabilityZoneGroup sets the AvailabilityZoneGroup field's value.
func (s *SpotInstanceRequest) SetAvailabilityZoneGroup(v string) *SpotInstanceRequest {
	s.AvailabilityZoneGroup = &v
	return s
}

// SetBlockDurationMinutes sets the BlockDurationMinutes field's value.
func (s *SpotInstanceRequest) SetBlockDurationMinutes(v int64) *SpotInstanceRequest {
	s.BlockDurationMinutes = &v
	return s
}

// SetCreateTime sets the CreateTime field's value.
func (s *SpotInstanceRequest) SetCreateTime(v time.Time) *SpotInstanceRequest {
	s.CreateTime = &v
	return s
}

// SetFault sets the Fault field's value.
func (s *SpotInstanceRequest) SetFault(v *SpotInstanceStateFault) *SpotInstanceRequest {
	s.Fault = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *SpotInstanceRequest) SetInstanceId(v string) *SpotInstanceRequest {
	s.InstanceId = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *SpotInstanceRequest) SetInstanceInterruptionBehavior(v string) *SpotInstanceRequest {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetLaunchGroup sets the LaunchGroup field's value.
func (s *SpotInstanceRequest) SetLaunchGroup(v string) *SpotInstanceRequest {
	s.LaunchGroup = &v
	return s
}

// SetLaunchSpecification sets the LaunchSpecification field's value.
func (s *SpotInstanceRequest) SetLaunchSpecification(v *LaunchSpecification) *SpotInstanceRequest {
	s.LaunchSpecification = v
	return s
}

// SetLaunchedAvailabilityZone sets the LaunchedAvailabilityZone field's value.
func (s *SpotInstanceRequest) SetLaunchedAvailabilityZone(v string) *SpotInstanceRequest {
	s.LaunchedAvailabilityZone = &v
	return s
}

// SetProductDescription sets the ProductDescription field's value.
func (s *SpotInstanceRequest) SetProductDescription(v string) *SpotInstanceRequest {
	s.ProductDescription = &v
	return s
}

// SetSpotInstanceRequestId sets the SpotInstanceRequestId field's value.
func (s *SpotInstanceRequest) SetSpotInstanceRequestId(v string) *SpotInstanceRequest {
	s.SpotInstanceRequestId = &v
	return s
}

// SetSpotPrice sets the SpotPrice field's value.
func (s *SpotInstanceRequest) SetSpotPrice(v string) *SpotInstanceRequest {
	s.SpotPrice = &v
	return s
}

// SetState sets the State field's value.
func (s *SpotInstanceRequest) SetState(v string) *SpotInstanceRequest {
	s.State = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *SpotInstanceRequest) SetStatus(v *SpotInstanceStatus) *SpotInstanceRequest {
	s.Status = v
	return s
}

// SetTags sets the Tags field's value.
func (s *SpotInstanceRequest) SetTags(v []*Tag) *SpotInstanceRequest {
	s.Tags = v
	return s
}

// SetType sets the Type field's value.
func (s *SpotInstanceRequest) SetType(v string) *SpotInstanceRequest {
	s.Type = &v
	return s
}

// SetValidFrom sets the ValidFrom field's value.
func (s *SpotInstanceRequest) SetValidFrom(v time.Time) *SpotInstanceRequest {
	s.ValidFrom = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *SpotInstanceRequest) SetValidUntil(v time.Time) *SpotInstanceRequest {
	s.ValidUntil = &v
	return s
}

// Describes a Spot Instance state change.
type SpotInstanceStateFault struct {
	_ struct{} `type:"structure"`

	// The reason code for the Spot Instance state change.
	Code *string `locationName:"code" type:"string"`

	// The message for the Spot Instance state change.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s SpotInstanceStateFault) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotInstanceStateFault) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *SpotInstanceStateFault) SetCode(v string) *SpotInstanceStateFault {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *SpotInstanceStateFault) SetMessage(v string) *SpotInstanceStateFault {
	s.Message = &v
	return s
}

// Describes the status of a Spot Instance request.
type SpotInstanceStatus struct {
	_ struct{} `type:"structure"`

	// The status code. For a list of status codes, see Spot Status Codes (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-bid-status.html#spot-instance-bid-status-understand)
	// in the Amazon EC2 User Guide for Linux Instances.
	Code *string `locationName:"code" type:"string"`

	// The description for the status code.
	Message *string `locationName:"message" type:"string"`

	// The date and time of the most recent status update, in UTC format (for example,
	// YYYY-MM-DDTHH:MM:SSZ).
	UpdateTime *time.Time `locationName:"updateTime" type:"timestamp"`
}

// String returns the string representation
func (s SpotInstanceStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotInstanceStatus) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *SpotInstanceStatus) SetCode(v string) *SpotInstanceStatus {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *SpotInstanceStatus) SetMessage(v string) *SpotInstanceStatus {
	s.Message = &v
	return s
}

// SetUpdateTime sets the UpdateTime field's value.
func (s *SpotInstanceStatus) SetUpdateTime(v time.Time) *SpotInstanceStatus {
	s.UpdateTime = &v
	return s
}

// The options for Spot Instances.
type SpotMarketOptions struct {
	_ struct{} `type:"structure"`

	// The required duration for the Spot Instances (also known as Spot blocks),
	// in minutes. This value must be a multiple of 60 (60, 120, 180, 240, 300,
	// or 360).
	BlockDurationMinutes *int64 `type:"integer"`

	// The behavior when a Spot Instance is interrupted. The default is terminate.
	InstanceInterruptionBehavior *string `type:"string" enum:"InstanceInterruptionBehavior"`

	// The maximum hourly price you're willing to pay for the Spot Instances. The
	// default is the On-Demand price.
	MaxPrice *string `type:"string"`

	// The Spot Instance request type. For RunInstances, persistent Spot Instance
	// requests are only supported when InstanceInterruptionBehavior is set to either
	// hibernate or stop.
	SpotInstanceType *string `type:"string" enum:"SpotInstanceType"`

	// The end date of the request. For a one-time request, the request remains
	// active until all instances launch, the request is canceled, or this date
	// is reached. If the request is persistent, it remains active until it is canceled
	// or this date and time is reached. The default end date is 7 days from the
	// current date.
	ValidUntil *time.Time `type:"timestamp"`
}

// String returns the string representation
func (s SpotMarketOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotMarketOptions) GoString() string {
	return s.String()
}

// SetBlockDurationMinutes sets the BlockDurationMinutes field's value.
func (s *SpotMarketOptions) SetBlockDurationMinutes(v int64) *SpotMarketOptions {
	s.BlockDurationMinutes = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *SpotMarketOptions) SetInstanceInterruptionBehavior(v string) *SpotMarketOptions {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetMaxPrice sets the MaxPrice field's value.
func (s *SpotMarketOptions) SetMaxPrice(v string) *SpotMarketOptions {
	s.MaxPrice = &v
	return s
}

// SetSpotInstanceType sets the SpotInstanceType field's value.
func (s *SpotMarketOptions) SetSpotInstanceType(v string) *SpotMarketOptions {
	s.SpotInstanceType = &v
	return s
}

// SetValidUntil sets the ValidUntil field's value.
func (s *SpotMarketOptions) SetValidUntil(v time.Time) *SpotMarketOptions {
	s.ValidUntil = &v
	return s
}

// Describes the configuration of Spot Instances in an EC2 Fleet.
type SpotOptions struct {
	_ struct{} `type:"structure"`

	// Indicates how to allocate the target capacity across the Spot pools specified
	// by the Spot Fleet request. The default is lowest-price.
	AllocationStrategy *string `locationName:"allocationStrategy" type:"string" enum:"SpotAllocationStrategy"`

	// The behavior when a Spot Instance is interrupted. The default is terminate.
	InstanceInterruptionBehavior *string `locationName:"instanceInterruptionBehavior" type:"string" enum:"SpotInstanceInterruptionBehavior"`

	// The number of Spot pools across which to allocate your target Spot capacity.
	// Valid only when AllocationStrategy is set to lowestPrice. EC2 Fleet selects
	// the cheapest Spot pools and evenly allocates your target Spot capacity across
	// the number of Spot pools that you specify.
	InstancePoolsToUseCount *int64 `locationName:"instancePoolsToUseCount" type:"integer"`

	// The minimum target capacity for Spot Instances in the fleet. If the minimum
	// target capacity is not reached, the fleet launches no instances.
	MinTargetCapacity *int64 `locationName:"minTargetCapacity" type:"integer"`

	// Indicates that the fleet launches all Spot Instances into a single Availability
	// Zone.
	SingleAvailabilityZone *bool `locationName:"singleAvailabilityZone" type:"boolean"`

	// Indicates that the fleet uses a single instance type to launch all Spot Instances
	// in the fleet.
	SingleInstanceType *bool `locationName:"singleInstanceType" type:"boolean"`
}

// String returns the string representation
func (s SpotOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotOptions) GoString() string {
	return s.String()
}

// SetAllocationStrategy sets the AllocationStrategy field's value.
func (s *SpotOptions) SetAllocationStrategy(v string) *SpotOptions {
	s.AllocationStrategy = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *SpotOptions) SetInstanceInterruptionBehavior(v string) *SpotOptions {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetInstancePoolsToUseCount sets the InstancePoolsToUseCount field's value.
func (s *SpotOptions) SetInstancePoolsToUseCount(v int64) *SpotOptions {
	s.InstancePoolsToUseCount = &v
	return s
}

// SetMinTargetCapacity sets the MinTargetCapacity field's value.
func (s *SpotOptions) SetMinTargetCapacity(v int64) *SpotOptions {
	s.MinTargetCapacity = &v
	return s
}

// SetSingleAvailabilityZone sets the SingleAvailabilityZone field's value.
func (s *SpotOptions) SetSingleAvailabilityZone(v bool) *SpotOptions {
	s.SingleAvailabilityZone = &v
	return s
}

// SetSingleInstanceType sets the SingleInstanceType field's value.
func (s *SpotOptions) SetSingleInstanceType(v bool) *SpotOptions {
	s.SingleInstanceType = &v
	return s
}

// Describes the configuration of Spot Instances in an EC2 Fleet request.
type SpotOptionsRequest struct {
	_ struct{} `type:"structure"`

	// Indicates how to allocate the target capacity across the Spot pools specified
	// by the Spot Fleet request. The default is lowestPrice.
	AllocationStrategy *string `type:"string" enum:"SpotAllocationStrategy"`

	// The behavior when a Spot Instance is interrupted. The default is terminate.
	InstanceInterruptionBehavior *string `type:"string" enum:"SpotInstanceInterruptionBehavior"`

	// The number of Spot pools across which to allocate your target Spot capacity.
	// Valid only when Spot AllocationStrategy is set to lowest-price. EC2 Fleet
	// selects the cheapest Spot pools and evenly allocates your target Spot capacity
	// across the number of Spot pools that you specify.
	InstancePoolsToUseCount *int64 `type:"integer"`

	// The minimum target capacity for Spot Instances in the fleet. If the minimum
	// target capacity is not reached, the fleet launches no instances.
	MinTargetCapacity *int64 `type:"integer"`

	// Indicates that the fleet launches all Spot Instances into a single Availability
	// Zone.
	SingleAvailabilityZone *bool `type:"boolean"`

	// Indicates that the fleet uses a single instance type to launch all Spot Instances
	// in the fleet.
	SingleInstanceType *bool `type:"boolean"`
}

// String returns the string representation
func (s SpotOptionsRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotOptionsRequest) GoString() string {
	return s.String()
}

// SetAllocationStrategy sets the AllocationStrategy field's value.
func (s *SpotOptionsRequest) SetAllocationStrategy(v string) *SpotOptionsRequest {
	s.AllocationStrategy = &v
	return s
}

// SetInstanceInterruptionBehavior sets the InstanceInterruptionBehavior field's value.
func (s *SpotOptionsRequest) SetInstanceInterruptionBehavior(v string) *SpotOptionsRequest {
	s.InstanceInterruptionBehavior = &v
	return s
}

// SetInstancePoolsToUseCount sets the InstancePoolsToUseCount field's value.
func (s *SpotOptionsRequest) SetInstancePoolsToUseCount(v int64) *SpotOptionsRequest {
	s.InstancePoolsToUseCount = &v
	return s
}

// SetMinTargetCapacity sets the MinTargetCapacity field's value.
func (s *SpotOptionsRequest) SetMinTargetCapacity(v int64) *SpotOptionsRequest {
	s.MinTargetCapacity = &v
	return s
}

// SetSingleAvailabilityZone sets the SingleAvailabilityZone field's value.
func (s *SpotOptionsRequest) SetSingleAvailabilityZone(v bool) *SpotOptionsRequest {
	s.SingleAvailabilityZone = &v
	return s
}

// SetSingleInstanceType sets the SingleInstanceType field's value.
func (s *SpotOptionsRequest) SetSingleInstanceType(v bool) *SpotOptionsRequest {
	s.SingleInstanceType = &v
	return s
}

// Describes Spot Instance placement.
type SpotPlacement struct {
	_ struct{} `type:"structure"`

	// The Availability Zone.
	//
	// [Spot Fleet only] To specify multiple Availability Zones, separate them using
	// commas; for example, "us-west-2a, us-west-2b".
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The name of the placement group.
	GroupName *string `locationName:"groupName" type:"string"`

	// The tenancy of the instance (if the instance is running in a VPC). An instance
	// with a tenancy of dedicated runs on single-tenant hardware. The host tenancy
	// is not supported for Spot Instances.
	Tenancy *string `locationName:"tenancy" type:"string" enum:"Tenancy"`
}

// String returns the string representation
func (s SpotPlacement) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotPlacement) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *SpotPlacement) SetAvailabilityZone(v string) *SpotPlacement {
	s.AvailabilityZone = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *SpotPlacement) SetGroupName(v string) *SpotPlacement {
	s.GroupName = &v
	return s
}

// SetTenancy sets the Tenancy field's value.
func (s *SpotPlacement) SetTenancy(v string) *SpotPlacement {
	s.Tenancy = &v
	return s
}

// Describes the maximum price per hour that you are willing to pay for a Spot
// Instance.
type SpotPrice struct {
	_ struct{} `type:"structure"`

	// The Availability Zone.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The instance type.
	InstanceType *string `locationName:"instanceType" type:"string" enum:"InstanceType"`

	// A general description of the AMI.
	ProductDescription *string `locationName:"productDescription" type:"string" enum:"RIProductDescription"`

	// The maximum price per hour that you are willing to pay for a Spot Instance.
	SpotPrice *string `locationName:"spotPrice" type:"string"`

	// The date and time the request was created, in UTC format (for example, YYYY-MM-DDTHH:MM:SSZ).
	Timestamp *time.Time `locationName:"timestamp" type:"timestamp"`
}

// String returns the string representation
func (s SpotPrice) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SpotPrice) GoString() string {
	return s.String()
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *SpotPrice) SetAvailabilityZone(v string) *SpotPrice {
	s.AvailabilityZone = &v
	return s
}

// SetInstanceType sets the InstanceType field's value.
func (s *SpotPrice) SetInstanceType(v string) *SpotPrice {
	s.InstanceType = &v
	return s
}

// SetProductDescription sets the ProductDescription field's value.
func (s *SpotPrice) SetProductDescription(v string) *SpotPrice {
	s.ProductDescription = &v
	return s
}

// SetSpotPrice sets the SpotPrice field's value.
func (s *SpotPrice) SetSpotPrice(v string) *SpotPrice {
	s.SpotPrice = &v
	return s
}

// SetTimestamp sets the Timestamp field's value.
func (s *SpotPrice) SetTimestamp(v time.Time) *SpotPrice {
	s.Timestamp = &v
	return s
}

// Describes a stale rule in a security group.
type StaleIpPermission struct {
	_ struct{} `type:"structure"`

	// The start of the port range for the TCP and UDP protocols, or an ICMP type
	// number. A value of -1 indicates all ICMP types.
	FromPort *int64 `locationName:"fromPort" type:"integer"`

	// The IP protocol name (for tcp, udp, and icmp) or number (see Protocol Numbers)
	// (http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml).
	IpProtocol *string `locationName:"ipProtocol" type:"string"`

	// One or more IP ranges. Not applicable for stale security group rules.
	IpRanges []*string `locationName:"ipRanges" locationNameList:"item" type:"list"`

	// One or more prefix list IDs for an AWS service. Not applicable for stale
	// security group rules.
	PrefixListIds []*string `locationName:"prefixListIds" locationNameList:"item" type:"list"`

	// The end of the port range for the TCP and UDP protocols, or an ICMP type
	// number. A value of -1 indicates all ICMP types.
	ToPort *int64 `locationName:"toPort" type:"integer"`

	// One or more security group pairs. Returns the ID of the referenced security
	// group and VPC, and the ID and status of the VPC peering connection.
	UserIdGroupPairs []*UserIdGroupPair `locationName:"groups" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s StaleIpPermission) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StaleIpPermission) GoString() string {
	return s.String()
}

// SetFromPort sets the FromPort field's value.
func (s *StaleIpPermission) SetFromPort(v int64) *StaleIpPermission {
	s.FromPort = &v
	return s
}

// SetIpProtocol sets the IpProtocol field's value.
func (s *StaleIpPermission) SetIpProtocol(v string) *StaleIpPermission {
	s.IpProtocol = &v
	return s
}

// SetIpRanges sets the IpRanges field's value.
func (s *StaleIpPermission) SetIpRanges(v []*string) *StaleIpPermission {
	s.IpRanges = v
	return s
}

// SetPrefixListIds sets the PrefixListIds field's value.
func (s *StaleIpPermission) SetPrefixListIds(v []*string) *StaleIpPermission {
	s.PrefixListIds = v
	return s
}

// SetToPort sets the ToPort field's value.
func (s *StaleIpPermission) SetToPort(v int64) *StaleIpPermission {
	s.ToPort = &v
	return s
}

// SetUserIdGroupPairs sets the UserIdGroupPairs field's value.
func (s *StaleIpPermission) SetUserIdGroupPairs(v []*UserIdGroupPair) *StaleIpPermission {
	s.UserIdGroupPairs = v
	return s
}

// Describes a stale security group (a security group that contains stale rules).
type StaleSecurityGroup struct {
	_ struct{} `type:"structure"`

	// The description of the security group.
	Description *string `locationName:"description" type:"string"`

	// The ID of the security group.
	GroupId *string `locationName:"groupId" type:"string"`

	// The name of the security group.
	GroupName *string `locationName:"groupName" type:"string"`

	// Information about the stale inbound rules in the security group.
	StaleIpPermissions []*StaleIpPermission `locationName:"staleIpPermissions" locationNameList:"item" type:"list"`

	// Information about the stale outbound rules in the security group.
	StaleIpPermissionsEgress []*StaleIpPermission `locationName:"staleIpPermissionsEgress" locationNameList:"item" type:"list"`

	// The ID of the VPC for the security group.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s StaleSecurityGroup) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StaleSecurityGroup) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *StaleSecurityGroup) SetDescription(v string) *StaleSecurityGroup {
	s.Description = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *StaleSecurityGroup) SetGroupId(v string) *StaleSecurityGroup {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *StaleSecurityGroup) SetGroupName(v string) *StaleSecurityGroup {
	s.GroupName = &v
	return s
}

// SetStaleIpPermissions sets the StaleIpPermissions field's value.
func (s *StaleSecurityGroup) SetStaleIpPermissions(v []*StaleIpPermission) *StaleSecurityGroup {
	s.StaleIpPermissions = v
	return s
}

// SetStaleIpPermissionsEgress sets the StaleIpPermissionsEgress field's value.
func (s *StaleSecurityGroup) SetStaleIpPermissionsEgress(v []*StaleIpPermission) *StaleSecurityGroup {
	s.StaleIpPermissionsEgress = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *StaleSecurityGroup) SetVpcId(v string) *StaleSecurityGroup {
	s.VpcId = &v
	return s
}

type StartInstancesInput struct {
	_ struct{} `type:"structure"`

	// Reserved.
	AdditionalInfo *string `locationName:"additionalInfo" type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more instance IDs.
	//
	// InstanceIds is a required field
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list" required:"true"`
}

// String returns the string representation
func (s StartInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StartInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *StartInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "StartInstancesInput"}
	if s.InstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAdditionalInfo sets the AdditionalInfo field's value.
func (s *StartInstancesInput) SetAdditionalInfo(v string) *StartInstancesInput {
	s.AdditionalInfo = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *StartInstancesInput) SetDryRun(v bool) *StartInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *StartInstancesInput) SetInstanceIds(v []*string) *StartInstancesInput {
	s.InstanceIds = v
	return s
}

type StartInstancesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more started instances.
	StartingInstances []*InstanceStateChange `locationName:"instancesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s StartInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StartInstancesOutput) GoString() string {
	return s.String()
}

// SetStartingInstances sets the StartingInstances field's value.
func (s *StartInstancesOutput) SetStartingInstances(v []*InstanceStateChange) *StartInstancesOutput {
	s.StartingInstances = v
	return s
}

// Describes a state change.
type StateReason struct {
	_ struct{} `type:"structure"`

	// The reason code for the state change.
	Code *string `locationName:"code" type:"string"`

	// The message for the state change.
	//
	//    * Server.InsufficientInstanceCapacity: There was insufficient capacity
	//    available to satisfy the launch request.
	//
	//    * Server.InternalError: An internal error caused the instance to terminate
	//    during launch.
	//
	//    * Server.ScheduledStop: The instance was stopped due to a scheduled retirement.
	//
	//    * Server.SpotInstanceShutdown: The instance was stopped because the number
	//    of Spot requests with a maximum price equal to or higher than the Spot
	//    price exceeded available capacity or because of an increase in the Spot
	//    price.
	//
	//    * Server.SpotInstanceTermination: The instance was terminated because
	//    the number of Spot requests with a maximum price equal to or higher than
	//    the Spot price exceeded available capacity or because of an increase in
	//    the Spot price.
	//
	//    * Client.InstanceInitiatedShutdown: The instance was shut down using the
	//    shutdown -h command from the instance.
	//
	//    * Client.InstanceTerminated: The instance was terminated or rebooted during
	//    AMI creation.
	//
	//    * Client.InternalError: A client error caused the instance to terminate
	//    during launch.
	//
	//    * Client.InvalidSnapshot.NotFound: The specified snapshot was not found.
	//
	//    * Client.UserInitiatedHibernate: Hibernation was initiated on the instance.
	//
	//    * Client.UserInitiatedShutdown: The instance was shut down using the Amazon
	//    EC2 API.
	//
	//    * Client.VolumeLimitExceeded: The limit on the number of EBS volumes or
	//    total storage was exceeded. Decrease usage or request an increase in your
	//    account limits.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s StateReason) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StateReason) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *StateReason) SetCode(v string) *StateReason {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *StateReason) SetMessage(v string) *StateReason {
	s.Message = &v
	return s
}

type StopInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// Forces the instances to stop. The instances do not have an opportunity to
	// flush file system caches or file system metadata. If you use this option,
	// you must perform file system check and repair procedures. This option is
	// not recommended for Windows instances.
	//
	// Default: false
	Force *bool `locationName:"force" type:"boolean"`

	// Hibernates the instance if the instance was enabled for hibernation at launch.
	// If the instance cannot hibernate successfully, a normal shutdown occurs.
	// For more information, see Hibernate Your Instance (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Default: false
	Hibernate *bool `type:"boolean"`

	// One or more instance IDs.
	//
	// InstanceIds is a required field
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list" required:"true"`
}

// String returns the string representation
func (s StopInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StopInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *StopInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "StopInstancesInput"}
	if s.InstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *StopInstancesInput) SetDryRun(v bool) *StopInstancesInput {
	s.DryRun = &v
	return s
}

// SetForce sets the Force field's value.
func (s *StopInstancesInput) SetForce(v bool) *StopInstancesInput {
	s.Force = &v
	return s
}

// SetHibernate sets the Hibernate field's value.
func (s *StopInstancesInput) SetHibernate(v bool) *StopInstancesInput {
	s.Hibernate = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *StopInstancesInput) SetInstanceIds(v []*string) *StopInstancesInput {
	s.InstanceIds = v
	return s
}

type StopInstancesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more stopped instances.
	StoppingInstances []*InstanceStateChange `locationName:"instancesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s StopInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StopInstancesOutput) GoString() string {
	return s.String()
}

// SetStoppingInstances sets the StoppingInstances field's value.
func (s *StopInstancesOutput) SetStoppingInstances(v []*InstanceStateChange) *StopInstancesOutput {
	s.StoppingInstances = v
	return s
}

// Describes the storage location for an instance store-backed AMI.
type Storage struct {
	_ struct{} `type:"structure"`

	// An Amazon S3 storage location.
	S3 *S3Storage `type:"structure"`
}

// String returns the string representation
func (s Storage) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Storage) GoString() string {
	return s.String()
}

// SetS3 sets the S3 field's value.
func (s *Storage) SetS3(v *S3Storage) *Storage {
	s.S3 = v
	return s
}

// Describes a storage location in Amazon S3.
type StorageLocation struct {
	_ struct{} `type:"structure"`

	// The name of the S3 bucket.
	Bucket *string `type:"string"`

	// The key.
	Key *string `type:"string"`
}

// String returns the string representation
func (s StorageLocation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StorageLocation) GoString() string {
	return s.String()
}

// SetBucket sets the Bucket field's value.
func (s *StorageLocation) SetBucket(v string) *StorageLocation {
	s.Bucket = &v
	return s
}

// SetKey sets the Key field's value.
func (s *StorageLocation) SetKey(v string) *StorageLocation {
	s.Key = &v
	return s
}

// Describes a subnet.
type Subnet struct {
	_ struct{} `type:"structure"`

	// Indicates whether a network interface created in this subnet (including a
	// network interface created by RunInstances) receives an IPv6 address.
	AssignIpv6AddressOnCreation *bool `locationName:"assignIpv6AddressOnCreation" type:"boolean"`

	// The Availability Zone of the subnet.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The AZ ID of the subnet.
	AvailabilityZoneId *string `locationName:"availabilityZoneId" type:"string"`

	// The number of unused private IPv4 addresses in the subnet. The IPv4 addresses
	// for any stopped instances are considered unavailable.
	AvailableIpAddressCount *int64 `locationName:"availableIpAddressCount" type:"integer"`

	// The IPv4 CIDR block assigned to the subnet.
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Indicates whether this is the default subnet for the Availability Zone.
	DefaultForAz *bool `locationName:"defaultForAz" type:"boolean"`

	// Information about the IPv6 CIDR blocks associated with the subnet.
	Ipv6CidrBlockAssociationSet []*SubnetIpv6CidrBlockAssociation `locationName:"ipv6CidrBlockAssociationSet" locationNameList:"item" type:"list"`

	// Indicates whether instances launched in this subnet receive a public IPv4
	// address.
	MapPublicIpOnLaunch *bool `locationName:"mapPublicIpOnLaunch" type:"boolean"`

	// The ID of the AWS account that owns the subnet.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The current state of the subnet.
	State *string `locationName:"state" type:"string" enum:"SubnetState"`

	// The Amazon Resource Name (ARN) of the subnet.
	SubnetArn *string `locationName:"subnetArn" type:"string"`

	// The ID of the subnet.
	SubnetId *string `locationName:"subnetId" type:"string"`

	// Any tags assigned to the subnet.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC the subnet is in.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s Subnet) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Subnet) GoString() string {
	return s.String()
}

// SetAssignIpv6AddressOnCreation sets the AssignIpv6AddressOnCreation field's value.
func (s *Subnet) SetAssignIpv6AddressOnCreation(v bool) *Subnet {
	s.AssignIpv6AddressOnCreation = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *Subnet) SetAvailabilityZone(v string) *Subnet {
	s.AvailabilityZone = &v
	return s
}

// SetAvailabilityZoneId sets the AvailabilityZoneId field's value.
func (s *Subnet) SetAvailabilityZoneId(v string) *Subnet {
	s.AvailabilityZoneId = &v
	return s
}

// SetAvailableIpAddressCount sets the AvailableIpAddressCount field's value.
func (s *Subnet) SetAvailableIpAddressCount(v int64) *Subnet {
	s.AvailableIpAddressCount = &v
	return s
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *Subnet) SetCidrBlock(v string) *Subnet {
	s.CidrBlock = &v
	return s
}

// SetDefaultForAz sets the DefaultForAz field's value.
func (s *Subnet) SetDefaultForAz(v bool) *Subnet {
	s.DefaultForAz = &v
	return s
}

// SetIpv6CidrBlockAssociationSet sets the Ipv6CidrBlockAssociationSet field's value.
func (s *Subnet) SetIpv6CidrBlockAssociationSet(v []*SubnetIpv6CidrBlockAssociation) *Subnet {
	s.Ipv6CidrBlockAssociationSet = v
	return s
}

// SetMapPublicIpOnLaunch sets the MapPublicIpOnLaunch field's value.
func (s *Subnet) SetMapPublicIpOnLaunch(v bool) *Subnet {
	s.MapPublicIpOnLaunch = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *Subnet) SetOwnerId(v string) *Subnet {
	s.OwnerId = &v
	return s
}

// SetState sets the State field's value.
func (s *Subnet) SetState(v string) *Subnet {
	s.State = &v
	return s
}

// SetSubnetArn sets the SubnetArn field's value.
func (s *Subnet) SetSubnetArn(v string) *Subnet {
	s.SubnetArn = &v
	return s
}

// SetSubnetId sets the SubnetId field's value.
func (s *Subnet) SetSubnetId(v string) *Subnet {
	s.SubnetId = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Subnet) SetTags(v []*Tag) *Subnet {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *Subnet) SetVpcId(v string) *Subnet {
	s.VpcId = &v
	return s
}

// Describes the state of a CIDR block.
type SubnetCidrBlockState struct {
	_ struct{} `type:"structure"`

	// The state of a CIDR block.
	State *string `locationName:"state" type:"string" enum:"SubnetCidrBlockStateCode"`

	// A message about the status of the CIDR block, if applicable.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s SubnetCidrBlockState) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SubnetCidrBlockState) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *SubnetCidrBlockState) SetState(v string) *SubnetCidrBlockState {
	s.State = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *SubnetCidrBlockState) SetStatusMessage(v string) *SubnetCidrBlockState {
	s.StatusMessage = &v
	return s
}

// Describes an IPv6 CIDR block associated with a subnet.
type SubnetIpv6CidrBlockAssociation struct {
	_ struct{} `type:"structure"`

	// The association ID for the CIDR block.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The IPv6 CIDR block.
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string"`

	// Information about the state of the CIDR block.
	Ipv6CidrBlockState *SubnetCidrBlockState `locationName:"ipv6CidrBlockState" type:"structure"`
}

// String returns the string representation
func (s SubnetIpv6CidrBlockAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SubnetIpv6CidrBlockAssociation) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *SubnetIpv6CidrBlockAssociation) SetAssociationId(v string) *SubnetIpv6CidrBlockAssociation {
	s.AssociationId = &v
	return s
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *SubnetIpv6CidrBlockAssociation) SetIpv6CidrBlock(v string) *SubnetIpv6CidrBlockAssociation {
	s.Ipv6CidrBlock = &v
	return s
}

// SetIpv6CidrBlockState sets the Ipv6CidrBlockState field's value.
func (s *SubnetIpv6CidrBlockAssociation) SetIpv6CidrBlockState(v *SubnetCidrBlockState) *SubnetIpv6CidrBlockAssociation {
	s.Ipv6CidrBlockState = v
	return s
}

// Describes the T2 or T3 instance whose credit option for CPU usage was successfully
// modified.
type SuccessfulInstanceCreditSpecificationItem struct {
	_ struct{} `type:"structure"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`
}

// String returns the string representation
func (s SuccessfulInstanceCreditSpecificationItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SuccessfulInstanceCreditSpecificationItem) GoString() string {
	return s.String()
}

// SetInstanceId sets the InstanceId field's value.
func (s *SuccessfulInstanceCreditSpecificationItem) SetInstanceId(v string) *SuccessfulInstanceCreditSpecificationItem {
	s.InstanceId = &v
	return s
}

// Describes a tag.
type Tag struct {
	_ struct{} `type:"structure"`

	// The key of the tag.
	//
	// Constraints: Tag keys are case-sensitive and accept a maximum of 127 Unicode
	// characters. May not begin with aws:.
	Key *string `locationName:"key" type:"string"`

	// The value of the tag.
	//
	// Constraints: Tag values are case-sensitive and accept a maximum of 255 Unicode
	// characters.
	Value *string `locationName:"value" type:"string"`
}

// String returns the string representation
func (s Tag) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Tag) GoString() string {
	return s.String()
}

// SetKey sets the Key field's value.
func (s *Tag) SetKey(v string) *Tag {
	s.Key = &v
	return s
}

// SetValue sets the Value field's value.
func (s *Tag) SetValue(v string) *Tag {
	s.Value = &v
	return s
}

// Describes a tag.
type TagDescription struct {
	_ struct{} `type:"structure"`

	// The tag key.
	Key *string `locationName:"key" type:"string"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The resource type.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"ResourceType"`

	// The tag value.
	Value *string `locationName:"value" type:"string"`
}

// String returns the string representation
func (s TagDescription) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TagDescription) GoString() string {
	return s.String()
}

// SetKey sets the Key field's value.
func (s *TagDescription) SetKey(v string) *TagDescription {
	s.Key = &v
	return s
}

// SetResourceId sets the ResourceId field's value.
func (s *TagDescription) SetResourceId(v string) *TagDescription {
	s.ResourceId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TagDescription) SetResourceType(v string) *TagDescription {
	s.ResourceType = &v
	return s
}

// SetValue sets the Value field's value.
func (s *TagDescription) SetValue(v string) *TagDescription {
	s.Value = &v
	return s
}

// The tags to apply to a resource when the resource is being created.
type TagSpecification struct {
	_ struct{} `type:"structure"`

	// The type of resource to tag. Currently, the resource types that support tagging
	// on creation are fleet, dedicated-host, instance, snapshot, and volume. To
	// tag a resource after it has been created, see CreateTags.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"ResourceType"`

	// The tags to apply to the resource.
	Tags []*Tag `locationName:"Tag" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s TagSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TagSpecification) GoString() string {
	return s.String()
}

// SetResourceType sets the ResourceType field's value.
func (s *TagSpecification) SetResourceType(v string) *TagSpecification {
	s.ResourceType = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *TagSpecification) SetTags(v []*Tag) *TagSpecification {
	s.Tags = v
	return s
}

// The number of units to request. You can choose to set the target capacity
// in terms of instances or a performance characteristic that is important to
// your application workload, such as vCPUs, memory, or I/O. If the request
// type is maintain, you can specify a target capacity of 0 and add capacity
// later.
type TargetCapacitySpecification struct {
	_ struct{} `type:"structure"`

	// The default TotalTargetCapacity, which is either Spot or On-Demand.
	DefaultTargetCapacityType *string `locationName:"defaultTargetCapacityType" type:"string" enum:"DefaultTargetCapacityType"`

	// The number of On-Demand units to request.
	OnDemandTargetCapacity *int64 `locationName:"onDemandTargetCapacity" type:"integer"`

	// The maximum number of Spot units to launch.
	SpotTargetCapacity *int64 `locationName:"spotTargetCapacity" type:"integer"`

	// The number of units to request, filled using DefaultTargetCapacityType.
	TotalTargetCapacity *int64 `locationName:"totalTargetCapacity" type:"integer"`
}

// String returns the string representation
func (s TargetCapacitySpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetCapacitySpecification) GoString() string {
	return s.String()
}

// SetDefaultTargetCapacityType sets the DefaultTargetCapacityType field's value.
func (s *TargetCapacitySpecification) SetDefaultTargetCapacityType(v string) *TargetCapacitySpecification {
	s.DefaultTargetCapacityType = &v
	return s
}

// SetOnDemandTargetCapacity sets the OnDemandTargetCapacity field's value.
func (s *TargetCapacitySpecification) SetOnDemandTargetCapacity(v int64) *TargetCapacitySpecification {
	s.OnDemandTargetCapacity = &v
	return s
}

// SetSpotTargetCapacity sets the SpotTargetCapacity field's value.
func (s *TargetCapacitySpecification) SetSpotTargetCapacity(v int64) *TargetCapacitySpecification {
	s.SpotTargetCapacity = &v
	return s
}

// SetTotalTargetCapacity sets the TotalTargetCapacity field's value.
func (s *TargetCapacitySpecification) SetTotalTargetCapacity(v int64) *TargetCapacitySpecification {
	s.TotalTargetCapacity = &v
	return s
}

// The number of units to request. You can choose to set the target capacity
// in terms of instances or a performance characteristic that is important to
// your application workload, such as vCPUs, memory, or I/O. If the request
// type is maintain, you can specify a target capacity of 0 and add capacity
// later.
type TargetCapacitySpecificationRequest struct {
	_ struct{} `type:"structure"`

	// The default TotalTargetCapacity, which is either Spot or On-Demand.
	DefaultTargetCapacityType *string `type:"string" enum:"DefaultTargetCapacityType"`

	// The number of On-Demand units to request.
	OnDemandTargetCapacity *int64 `type:"integer"`

	// The number of Spot units to request.
	SpotTargetCapacity *int64 `type:"integer"`

	// The number of units to request, filled using DefaultTargetCapacityType.
	//
	// TotalTargetCapacity is a required field
	TotalTargetCapacity *int64 `type:"integer" required:"true"`
}

// String returns the string representation
func (s TargetCapacitySpecificationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetCapacitySpecificationRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *TargetCapacitySpecificationRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "TargetCapacitySpecificationRequest"}
	if s.TotalTargetCapacity == nil {
		invalidParams.Add(request.NewErrParamRequired("TotalTargetCapacity"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDefaultTargetCapacityType sets the DefaultTargetCapacityType field's value.
func (s *TargetCapacitySpecificationRequest) SetDefaultTargetCapacityType(v string) *TargetCapacitySpecificationRequest {
	s.DefaultTargetCapacityType = &v
	return s
}

// SetOnDemandTargetCapacity sets the OnDemandTargetCapacity field's value.
func (s *TargetCapacitySpecificationRequest) SetOnDemandTargetCapacity(v int64) *TargetCapacitySpecificationRequest {
	s.OnDemandTargetCapacity = &v
	return s
}

// SetSpotTargetCapacity sets the SpotTargetCapacity field's value.
func (s *TargetCapacitySpecificationRequest) SetSpotTargetCapacity(v int64) *TargetCapacitySpecificationRequest {
	s.SpotTargetCapacity = &v
	return s
}

// SetTotalTargetCapacity sets the TotalTargetCapacity field's value.
func (s *TargetCapacitySpecificationRequest) SetTotalTargetCapacity(v int64) *TargetCapacitySpecificationRequest {
	s.TotalTargetCapacity = &v
	return s
}

// Information about the Convertible Reserved Instance offering.
type TargetConfiguration struct {
	_ struct{} `type:"structure"`

	// The number of instances the Convertible Reserved Instance offering can be
	// applied to. This parameter is reserved and cannot be specified in a request
	InstanceCount *int64 `locationName:"instanceCount" type:"integer"`

	// The ID of the Convertible Reserved Instance offering.
	OfferingId *string `locationName:"offeringId" type:"string"`
}

// String returns the string representation
func (s TargetConfiguration) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetConfiguration) GoString() string {
	return s.String()
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *TargetConfiguration) SetInstanceCount(v int64) *TargetConfiguration {
	s.InstanceCount = &v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *TargetConfiguration) SetOfferingId(v string) *TargetConfiguration {
	s.OfferingId = &v
	return s
}

// Details about the target configuration.
type TargetConfigurationRequest struct {
	_ struct{} `type:"structure"`

	// The number of instances the Covertible Reserved Instance offering can be
	// applied to. This parameter is reserved and cannot be specified in a request
	InstanceCount *int64 `type:"integer"`

	// The Convertible Reserved Instance offering ID.
	//
	// OfferingId is a required field
	OfferingId *string `type:"string" required:"true"`
}

// String returns the string representation
func (s TargetConfigurationRequest) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetConfigurationRequest) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *TargetConfigurationRequest) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "TargetConfigurationRequest"}
	if s.OfferingId == nil {
		invalidParams.Add(request.NewErrParamRequired("OfferingId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetInstanceCount sets the InstanceCount field's value.
func (s *TargetConfigurationRequest) SetInstanceCount(v int64) *TargetConfigurationRequest {
	s.InstanceCount = &v
	return s
}

// SetOfferingId sets the OfferingId field's value.
func (s *TargetConfigurationRequest) SetOfferingId(v string) *TargetConfigurationRequest {
	s.OfferingId = &v
	return s
}

// Describes a load balancer target group.
type TargetGroup struct {
	_ struct{} `type:"structure"`

	// The Amazon Resource Name (ARN) of the target group.
	Arn *string `locationName:"arn" type:"string"`
}

// String returns the string representation
func (s TargetGroup) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetGroup) GoString() string {
	return s.String()
}

// SetArn sets the Arn field's value.
func (s *TargetGroup) SetArn(v string) *TargetGroup {
	s.Arn = &v
	return s
}

// Describes the target groups to attach to a Spot Fleet. Spot Fleet registers
// the running Spot Instances with these target groups.
type TargetGroupsConfig struct {
	_ struct{} `type:"structure"`

	// One or more target groups.
	TargetGroups []*TargetGroup `locationName:"targetGroups" locationNameList:"item" min:"1" type:"list"`
}

// String returns the string representation
func (s TargetGroupsConfig) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetGroupsConfig) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *TargetGroupsConfig) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "TargetGroupsConfig"}
	if s.TargetGroups != nil && len(s.TargetGroups) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("TargetGroups", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetTargetGroups sets the TargetGroups field's value.
func (s *TargetGroupsConfig) SetTargetGroups(v []*TargetGroup) *TargetGroupsConfig {
	s.TargetGroups = v
	return s
}

// Describes a target network associated with a Client VPN endpoint.
type TargetNetwork struct {
	_ struct{} `type:"structure"`

	// The ID of the association.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The ID of the Client VPN endpoint with which the target network is associated.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// The IDs of the security groups applied to the target network association.
	SecurityGroups []*string `locationName:"securityGroups" locationNameList:"item" type:"list"`

	// The current state of the target network association.
	Status *AssociationStatus `locationName:"status" type:"structure"`

	// The ID of the subnet specified as the target network.
	TargetNetworkId *string `locationName:"targetNetworkId" type:"string"`

	// The ID of the VPC in which the target network (subnet) is located.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s TargetNetwork) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetNetwork) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *TargetNetwork) SetAssociationId(v string) *TargetNetwork {
	s.AssociationId = &v
	return s
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *TargetNetwork) SetClientVpnEndpointId(v string) *TargetNetwork {
	s.ClientVpnEndpointId = &v
	return s
}

// SetSecurityGroups sets the SecurityGroups field's value.
func (s *TargetNetwork) SetSecurityGroups(v []*string) *TargetNetwork {
	s.SecurityGroups = v
	return s
}

// SetStatus sets the Status field's value.
func (s *TargetNetwork) SetStatus(v *AssociationStatus) *TargetNetwork {
	s.Status = v
	return s
}

// SetTargetNetworkId sets the TargetNetworkId field's value.
func (s *TargetNetwork) SetTargetNetworkId(v string) *TargetNetwork {
	s.TargetNetworkId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *TargetNetwork) SetVpcId(v string) *TargetNetwork {
	s.VpcId = &v
	return s
}

// The total value of the new Convertible Reserved Instances.
type TargetReservationValue struct {
	_ struct{} `type:"structure"`

	// The total value of the Convertible Reserved Instances that make up the exchange.
	// This is the sum of the list value, remaining upfront price, and additional
	// upfront cost of the exchange.
	ReservationValue *ReservationValue `locationName:"reservationValue" type:"structure"`

	// The configuration of the Convertible Reserved Instances that make up the
	// exchange.
	TargetConfiguration *TargetConfiguration `locationName:"targetConfiguration" type:"structure"`
}

// String returns the string representation
func (s TargetReservationValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TargetReservationValue) GoString() string {
	return s.String()
}

// SetReservationValue sets the ReservationValue field's value.
func (s *TargetReservationValue) SetReservationValue(v *ReservationValue) *TargetReservationValue {
	s.ReservationValue = v
	return s
}

// SetTargetConfiguration sets the TargetConfiguration field's value.
func (s *TargetReservationValue) SetTargetConfiguration(v *TargetConfiguration) *TargetReservationValue {
	s.TargetConfiguration = v
	return s
}

type TerminateClientVpnConnectionsInput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint to which the client is connected.
	//
	// ClientVpnEndpointId is a required field
	ClientVpnEndpointId *string `type:"string" required:"true"`

	// The ID of the client connection to be terminated.
	ConnectionId *string `type:"string"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The name of the user who initiated the connection. Use this option to terminate
	// all active connections for the specified user. This option can only be used
	// if the user has established up to five connections.
	Username *string `type:"string"`
}

// String returns the string representation
func (s TerminateClientVpnConnectionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TerminateClientVpnConnectionsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *TerminateClientVpnConnectionsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "TerminateClientVpnConnectionsInput"}
	if s.ClientVpnEndpointId == nil {
		invalidParams.Add(request.NewErrParamRequired("ClientVpnEndpointId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *TerminateClientVpnConnectionsInput) SetClientVpnEndpointId(v string) *TerminateClientVpnConnectionsInput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetConnectionId sets the ConnectionId field's value.
func (s *TerminateClientVpnConnectionsInput) SetConnectionId(v string) *TerminateClientVpnConnectionsInput {
	s.ConnectionId = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *TerminateClientVpnConnectionsInput) SetDryRun(v bool) *TerminateClientVpnConnectionsInput {
	s.DryRun = &v
	return s
}

// SetUsername sets the Username field's value.
func (s *TerminateClientVpnConnectionsInput) SetUsername(v string) *TerminateClientVpnConnectionsInput {
	s.Username = &v
	return s
}

type TerminateClientVpnConnectionsOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the Client VPN endpoint.
	ClientVpnEndpointId *string `locationName:"clientVpnEndpointId" type:"string"`

	// The current state of the client connections.
	ConnectionStatuses []*TerminateConnectionStatus `locationName:"connectionStatuses" locationNameList:"item" type:"list"`

	// The user who established the terminated client connections.
	Username *string `locationName:"username" type:"string"`
}

// String returns the string representation
func (s TerminateClientVpnConnectionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TerminateClientVpnConnectionsOutput) GoString() string {
	return s.String()
}

// SetClientVpnEndpointId sets the ClientVpnEndpointId field's value.
func (s *TerminateClientVpnConnectionsOutput) SetClientVpnEndpointId(v string) *TerminateClientVpnConnectionsOutput {
	s.ClientVpnEndpointId = &v
	return s
}

// SetConnectionStatuses sets the ConnectionStatuses field's value.
func (s *TerminateClientVpnConnectionsOutput) SetConnectionStatuses(v []*TerminateConnectionStatus) *TerminateClientVpnConnectionsOutput {
	s.ConnectionStatuses = v
	return s
}

// SetUsername sets the Username field's value.
func (s *TerminateClientVpnConnectionsOutput) SetUsername(v string) *TerminateClientVpnConnectionsOutput {
	s.Username = &v
	return s
}

// Information about a terminated Client VPN endpoint client connection.
type TerminateConnectionStatus struct {
	_ struct{} `type:"structure"`

	// The ID of the client connection.
	ConnectionId *string `locationName:"connectionId" type:"string"`

	// A message about the status of the client connection, if applicable.
	CurrentStatus *ClientVpnConnectionStatus `locationName:"currentStatus" type:"structure"`

	// The state of the client connection.
	PreviousStatus *ClientVpnConnectionStatus `locationName:"previousStatus" type:"structure"`
}

// String returns the string representation
func (s TerminateConnectionStatus) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TerminateConnectionStatus) GoString() string {
	return s.String()
}

// SetConnectionId sets the ConnectionId field's value.
func (s *TerminateConnectionStatus) SetConnectionId(v string) *TerminateConnectionStatus {
	s.ConnectionId = &v
	return s
}

// SetCurrentStatus sets the CurrentStatus field's value.
func (s *TerminateConnectionStatus) SetCurrentStatus(v *ClientVpnConnectionStatus) *TerminateConnectionStatus {
	s.CurrentStatus = v
	return s
}

// SetPreviousStatus sets the PreviousStatus field's value.
func (s *TerminateConnectionStatus) SetPreviousStatus(v *ClientVpnConnectionStatus) *TerminateConnectionStatus {
	s.PreviousStatus = v
	return s
}

type TerminateInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more instance IDs.
	//
	// Constraints: Up to 1000 instance IDs. We recommend breaking up this request
	// into smaller batches.
	//
	// InstanceIds is a required field
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list" required:"true"`
}

// String returns the string representation
func (s TerminateInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TerminateInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *TerminateInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "TerminateInstancesInput"}
	if s.InstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *TerminateInstancesInput) SetDryRun(v bool) *TerminateInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *TerminateInstancesInput) SetInstanceIds(v []*string) *TerminateInstancesInput {
	s.InstanceIds = v
	return s
}

type TerminateInstancesOutput struct {
	_ struct{} `type:"structure"`

	// Information about one or more terminated instances.
	TerminatingInstances []*InstanceStateChange `locationName:"instancesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s TerminateInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TerminateInstancesOutput) GoString() string {
	return s.String()
}

// SetTerminatingInstances sets the TerminatingInstances field's value.
func (s *TerminateInstancesOutput) SetTerminatingInstances(v []*InstanceStateChange) *TerminateInstancesOutput {
	s.TerminatingInstances = v
	return s
}

// Describes a transit gateway.
type TransitGateway struct {
	_ struct{} `type:"structure"`

	// The creation time.
	CreationTime *time.Time `locationName:"creationTime" type:"timestamp"`

	// The description of the transit gateway.
	Description *string `locationName:"description" type:"string"`

	// The transit gateway options.
	Options *TransitGatewayOptions `locationName:"options" type:"structure"`

	// The ID of the AWS account ID that owns the transit gateway.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The state of the transit gateway.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayState"`

	// The tags for the transit gateway.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The Amazon Resource Name (ARN) of the transit gateway.
	TransitGatewayArn *string `locationName:"transitGatewayArn" type:"string"`

	// The ID of the transit gateway.
	TransitGatewayId *string `locationName:"transitGatewayId" type:"string"`
}

// String returns the string representation
func (s TransitGateway) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGateway) GoString() string {
	return s.String()
}

// SetCreationTime sets the CreationTime field's value.
func (s *TransitGateway) SetCreationTime(v time.Time) *TransitGateway {
	s.CreationTime = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *TransitGateway) SetDescription(v string) *TransitGateway {
	s.Description = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *TransitGateway) SetOptions(v *TransitGatewayOptions) *TransitGateway {
	s.Options = v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *TransitGateway) SetOwnerId(v string) *TransitGateway {
	s.OwnerId = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGateway) SetState(v string) *TransitGateway {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *TransitGateway) SetTags(v []*Tag) *TransitGateway {
	s.Tags = v
	return s
}

// SetTransitGatewayArn sets the TransitGatewayArn field's value.
func (s *TransitGateway) SetTransitGatewayArn(v string) *TransitGateway {
	s.TransitGatewayArn = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *TransitGateway) SetTransitGatewayId(v string) *TransitGateway {
	s.TransitGatewayId = &v
	return s
}

// Describes an association between a resource attachment and a transit gateway
// route table.
type TransitGatewayAssociation struct {
	_ struct{} `type:"structure"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The resource type.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"`

	// The state of the association.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayAssociationState"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`

	// The ID of the transit gateway route table.
	TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayAssociation) GoString() string {
	return s.String()
}

// SetResourceId sets the ResourceId field's value.
func (s *TransitGatewayAssociation) SetResourceId(v string) *TransitGatewayAssociation {
	s.ResourceId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TransitGatewayAssociation) SetResourceType(v string) *TransitGatewayAssociation {
	s.ResourceType = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayAssociation) SetState(v string) *TransitGatewayAssociation {
	s.State = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayAssociation) SetTransitGatewayAttachmentId(v string) *TransitGatewayAssociation {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *TransitGatewayAssociation) SetTransitGatewayRouteTableId(v string) *TransitGatewayAssociation {
	s.TransitGatewayRouteTableId = &v
	return s
}

// Describes an attachment between a resource and a transit gateway.
type TransitGatewayAttachment struct {
	_ struct{} `type:"structure"`

	// The association.
	Association *TransitGatewayAttachmentAssociation `locationName:"association" type:"structure"`

	// The creation time.
	CreationTime *time.Time `locationName:"creationTime" type:"timestamp"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The ID of the AWS account that owns the resource.
	ResourceOwnerId *string `locationName:"resourceOwnerId" type:"string"`

	// The resource type.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"`

	// The attachment state.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayAttachmentState"`

	// The tags for the attachment.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`

	// The ID of the transit gateway.
	TransitGatewayId *string `locationName:"transitGatewayId" type:"string"`

	// The ID of the AWS account that owns the transit gateway.
	TransitGatewayOwnerId *string `locationName:"transitGatewayOwnerId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayAttachment) GoString() string {
	return s.String()
}

// SetAssociation sets the Association field's value.
func (s *TransitGatewayAttachment) SetAssociation(v *TransitGatewayAttachmentAssociation) *TransitGatewayAttachment {
	s.Association = v
	return s
}

// SetCreationTime sets the CreationTime field's value.
func (s *TransitGatewayAttachment) SetCreationTime(v time.Time) *TransitGatewayAttachment {
	s.CreationTime = &v
	return s
}

// SetResourceId sets the ResourceId field's value.
func (s *TransitGatewayAttachment) SetResourceId(v string) *TransitGatewayAttachment {
	s.ResourceId = &v
	return s
}

// SetResourceOwnerId sets the ResourceOwnerId field's value.
func (s *TransitGatewayAttachment) SetResourceOwnerId(v string) *TransitGatewayAttachment {
	s.ResourceOwnerId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TransitGatewayAttachment) SetResourceType(v string) *TransitGatewayAttachment {
	s.ResourceType = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayAttachment) SetState(v string) *TransitGatewayAttachment {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *TransitGatewayAttachment) SetTags(v []*Tag) *TransitGatewayAttachment {
	s.Tags = v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayAttachment) SetTransitGatewayAttachmentId(v string) *TransitGatewayAttachment {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *TransitGatewayAttachment) SetTransitGatewayId(v string) *TransitGatewayAttachment {
	s.TransitGatewayId = &v
	return s
}

// SetTransitGatewayOwnerId sets the TransitGatewayOwnerId field's value.
func (s *TransitGatewayAttachment) SetTransitGatewayOwnerId(v string) *TransitGatewayAttachment {
	s.TransitGatewayOwnerId = &v
	return s
}

// Describes an association.
type TransitGatewayAttachmentAssociation struct {
	_ struct{} `type:"structure"`

	// The state of the association.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayAssociationState"`

	// The ID of the route table for the transit gateway.
	TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayAttachmentAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayAttachmentAssociation) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *TransitGatewayAttachmentAssociation) SetState(v string) *TransitGatewayAttachmentAssociation {
	s.State = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *TransitGatewayAttachmentAssociation) SetTransitGatewayRouteTableId(v string) *TransitGatewayAttachmentAssociation {
	s.TransitGatewayRouteTableId = &v
	return s
}

// Describes a propagation route table.
type TransitGatewayAttachmentPropagation struct {
	_ struct{} `type:"structure"`

	// The state of the propagation route table.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayPropagationState"`

	// The ID of the propagation route table.
	TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayAttachmentPropagation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayAttachmentPropagation) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *TransitGatewayAttachmentPropagation) SetState(v string) *TransitGatewayAttachmentPropagation {
	s.State = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *TransitGatewayAttachmentPropagation) SetTransitGatewayRouteTableId(v string) *TransitGatewayAttachmentPropagation {
	s.TransitGatewayRouteTableId = &v
	return s
}

// Describes the options for a transit gateway.
type TransitGatewayOptions struct {
	_ struct{} `type:"structure"`

	// A private Autonomous System Number (ASN) for the Amazon side of a BGP session.
	// The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294
	// for 32-bit ASNs.
	AmazonSideAsn *int64 `locationName:"amazonSideAsn" type:"long"`

	// The ID of the default association route table.
	AssociationDefaultRouteTableId *string `locationName:"associationDefaultRouteTableId" type:"string"`

	// Indicates whether attachment requests are automatically accepted.
	AutoAcceptSharedAttachments *string `locationName:"autoAcceptSharedAttachments" type:"string" enum:"AutoAcceptSharedAttachmentsValue"`

	// Indicates whether resource attachments are automatically associated with
	// the default association route table.
	DefaultRouteTableAssociation *string `locationName:"defaultRouteTableAssociation" type:"string" enum:"DefaultRouteTableAssociationValue"`

	// Indicates whether resource attachments automatically propagate routes to
	// the default propagation route table.
	DefaultRouteTablePropagation *string `locationName:"defaultRouteTablePropagation" type:"string" enum:"DefaultRouteTablePropagationValue"`

	// Indicates whether DNS support is enabled.
	DnsSupport *string `locationName:"dnsSupport" type:"string" enum:"DnsSupportValue"`

	// The ID of the default propagation route table.
	PropagationDefaultRouteTableId *string `locationName:"propagationDefaultRouteTableId" type:"string"`

	// Indicates whether Equal Cost Multipath Protocol support is enabled.
	VpnEcmpSupport *string `locationName:"vpnEcmpSupport" type:"string" enum:"VpnEcmpSupportValue"`
}

// String returns the string representation
func (s TransitGatewayOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayOptions) GoString() string {
	return s.String()
}

// SetAmazonSideAsn sets the AmazonSideAsn field's value.
func (s *TransitGatewayOptions) SetAmazonSideAsn(v int64) *TransitGatewayOptions {
	s.AmazonSideAsn = &v
	return s
}

// SetAssociationDefaultRouteTableId sets the AssociationDefaultRouteTableId field's value.
func (s *TransitGatewayOptions) SetAssociationDefaultRouteTableId(v string) *TransitGatewayOptions {
	s.AssociationDefaultRouteTableId = &v
	return s
}

// SetAutoAcceptSharedAttachments sets the AutoAcceptSharedAttachments field's value.
func (s *TransitGatewayOptions) SetAutoAcceptSharedAttachments(v string) *TransitGatewayOptions {
	s.AutoAcceptSharedAttachments = &v
	return s
}

// SetDefaultRouteTableAssociation sets the DefaultRouteTableAssociation field's value.
func (s *TransitGatewayOptions) SetDefaultRouteTableAssociation(v string) *TransitGatewayOptions {
	s.DefaultRouteTableAssociation = &v
	return s
}

// SetDefaultRouteTablePropagation sets the DefaultRouteTablePropagation field's value.
func (s *TransitGatewayOptions) SetDefaultRouteTablePropagation(v string) *TransitGatewayOptions {
	s.DefaultRouteTablePropagation = &v
	return s
}

// SetDnsSupport sets the DnsSupport field's value.
func (s *TransitGatewayOptions) SetDnsSupport(v string) *TransitGatewayOptions {
	s.DnsSupport = &v
	return s
}

// SetPropagationDefaultRouteTableId sets the PropagationDefaultRouteTableId field's value.
func (s *TransitGatewayOptions) SetPropagationDefaultRouteTableId(v string) *TransitGatewayOptions {
	s.PropagationDefaultRouteTableId = &v
	return s
}

// SetVpnEcmpSupport sets the VpnEcmpSupport field's value.
func (s *TransitGatewayOptions) SetVpnEcmpSupport(v string) *TransitGatewayOptions {
	s.VpnEcmpSupport = &v
	return s
}

// Describes route propagation.
type TransitGatewayPropagation struct {
	_ struct{} `type:"structure"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The resource type.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"`

	// The state.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayPropagationState"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`

	// The ID of the transit gateway route table.
	TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayPropagation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayPropagation) GoString() string {
	return s.String()
}

// SetResourceId sets the ResourceId field's value.
func (s *TransitGatewayPropagation) SetResourceId(v string) *TransitGatewayPropagation {
	s.ResourceId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TransitGatewayPropagation) SetResourceType(v string) *TransitGatewayPropagation {
	s.ResourceType = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayPropagation) SetState(v string) *TransitGatewayPropagation {
	s.State = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayPropagation) SetTransitGatewayAttachmentId(v string) *TransitGatewayPropagation {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *TransitGatewayPropagation) SetTransitGatewayRouteTableId(v string) *TransitGatewayPropagation {
	s.TransitGatewayRouteTableId = &v
	return s
}

// Describes the options for a transit gateway.
type TransitGatewayRequestOptions struct {
	_ struct{} `type:"structure"`

	// A private Autonomous System Number (ASN) for the Amazon side of a BGP session.
	// The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294
	// for 32-bit ASNs.
	AmazonSideAsn *int64 `type:"long"`

	// Enable or disable automatic acceptance of attachment requests. The default
	// is disable.
	AutoAcceptSharedAttachments *string `type:"string" enum:"AutoAcceptSharedAttachmentsValue"`

	// Enable or disable automatic association with the default association route
	// table. The default is enable.
	DefaultRouteTableAssociation *string `type:"string" enum:"DefaultRouteTableAssociationValue"`

	// Enable or disable automatic propagation of routes to the default propagation
	// route table. The default is enable.
	DefaultRouteTablePropagation *string `type:"string" enum:"DefaultRouteTablePropagationValue"`

	// Enable or disable DNS support.
	DnsSupport *string `type:"string" enum:"DnsSupportValue"`

	// Enable or disable Equal Cost Multipath Protocol support.
	VpnEcmpSupport *string `type:"string" enum:"VpnEcmpSupportValue"`
}

// String returns the string representation
func (s TransitGatewayRequestOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayRequestOptions) GoString() string {
	return s.String()
}

// SetAmazonSideAsn sets the AmazonSideAsn field's value.
func (s *TransitGatewayRequestOptions) SetAmazonSideAsn(v int64) *TransitGatewayRequestOptions {
	s.AmazonSideAsn = &v
	return s
}

// SetAutoAcceptSharedAttachments sets the AutoAcceptSharedAttachments field's value.
func (s *TransitGatewayRequestOptions) SetAutoAcceptSharedAttachments(v string) *TransitGatewayRequestOptions {
	s.AutoAcceptSharedAttachments = &v
	return s
}

// SetDefaultRouteTableAssociation sets the DefaultRouteTableAssociation field's value.
func (s *TransitGatewayRequestOptions) SetDefaultRouteTableAssociation(v string) *TransitGatewayRequestOptions {
	s.DefaultRouteTableAssociation = &v
	return s
}

// SetDefaultRouteTablePropagation sets the DefaultRouteTablePropagation field's value.
func (s *TransitGatewayRequestOptions) SetDefaultRouteTablePropagation(v string) *TransitGatewayRequestOptions {
	s.DefaultRouteTablePropagation = &v
	return s
}

// SetDnsSupport sets the DnsSupport field's value.
func (s *TransitGatewayRequestOptions) SetDnsSupport(v string) *TransitGatewayRequestOptions {
	s.DnsSupport = &v
	return s
}

// SetVpnEcmpSupport sets the VpnEcmpSupport field's value.
func (s *TransitGatewayRequestOptions) SetVpnEcmpSupport(v string) *TransitGatewayRequestOptions {
	s.VpnEcmpSupport = &v
	return s
}

// Describes a route for a transit gateway route table.
type TransitGatewayRoute struct {
	_ struct{} `type:"structure"`

	// The CIDR block used for destination matches.
	DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"`

	// The state of the route.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayRouteState"`

	// The attachments.
	TransitGatewayAttachments []*TransitGatewayRouteAttachment `locationName:"transitGatewayAttachments" locationNameList:"item" type:"list"`

	// The route type.
	Type *string `locationName:"type" type:"string" enum:"TransitGatewayRouteType"`
}

// String returns the string representation
func (s TransitGatewayRoute) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayRoute) GoString() string {
	return s.String()
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *TransitGatewayRoute) SetDestinationCidrBlock(v string) *TransitGatewayRoute {
	s.DestinationCidrBlock = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayRoute) SetState(v string) *TransitGatewayRoute {
	s.State = &v
	return s
}

// SetTransitGatewayAttachments sets the TransitGatewayAttachments field's value.
func (s *TransitGatewayRoute) SetTransitGatewayAttachments(v []*TransitGatewayRouteAttachment) *TransitGatewayRoute {
	s.TransitGatewayAttachments = v
	return s
}

// SetType sets the Type field's value.
func (s *TransitGatewayRoute) SetType(v string) *TransitGatewayRoute {
	s.Type = &v
	return s
}

// Describes a route attachment.
type TransitGatewayRouteAttachment struct {
	_ struct{} `type:"structure"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The resource type.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayRouteAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayRouteAttachment) GoString() string {
	return s.String()
}

// SetResourceId sets the ResourceId field's value.
func (s *TransitGatewayRouteAttachment) SetResourceId(v string) *TransitGatewayRouteAttachment {
	s.ResourceId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TransitGatewayRouteAttachment) SetResourceType(v string) *TransitGatewayRouteAttachment {
	s.ResourceType = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayRouteAttachment) SetTransitGatewayAttachmentId(v string) *TransitGatewayRouteAttachment {
	s.TransitGatewayAttachmentId = &v
	return s
}

// Describes a transit gateway route table.
type TransitGatewayRouteTable struct {
	_ struct{} `type:"structure"`

	// The creation time.
	CreationTime *time.Time `locationName:"creationTime" type:"timestamp"`

	// Indicates whether this is the default association route table for the transit
	// gateway.
	DefaultAssociationRouteTable *bool `locationName:"defaultAssociationRouteTable" type:"boolean"`

	// Indicates whether this is the default propagation route table for the transit
	// gateway.
	DefaultPropagationRouteTable *bool `locationName:"defaultPropagationRouteTable" type:"boolean"`

	// The state of the transit gateway route table.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayRouteTableState"`

	// Any tags assigned to the route table.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the transit gateway.
	TransitGatewayId *string `locationName:"transitGatewayId" type:"string"`

	// The ID of the transit gateway route table.
	TransitGatewayRouteTableId *string `locationName:"transitGatewayRouteTableId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayRouteTable) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayRouteTable) GoString() string {
	return s.String()
}

// SetCreationTime sets the CreationTime field's value.
func (s *TransitGatewayRouteTable) SetCreationTime(v time.Time) *TransitGatewayRouteTable {
	s.CreationTime = &v
	return s
}

// SetDefaultAssociationRouteTable sets the DefaultAssociationRouteTable field's value.
func (s *TransitGatewayRouteTable) SetDefaultAssociationRouteTable(v bool) *TransitGatewayRouteTable {
	s.DefaultAssociationRouteTable = &v
	return s
}

// SetDefaultPropagationRouteTable sets the DefaultPropagationRouteTable field's value.
func (s *TransitGatewayRouteTable) SetDefaultPropagationRouteTable(v bool) *TransitGatewayRouteTable {
	s.DefaultPropagationRouteTable = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayRouteTable) SetState(v string) *TransitGatewayRouteTable {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *TransitGatewayRouteTable) SetTags(v []*Tag) *TransitGatewayRouteTable {
	s.Tags = v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *TransitGatewayRouteTable) SetTransitGatewayId(v string) *TransitGatewayRouteTable {
	s.TransitGatewayId = &v
	return s
}

// SetTransitGatewayRouteTableId sets the TransitGatewayRouteTableId field's value.
func (s *TransitGatewayRouteTable) SetTransitGatewayRouteTableId(v string) *TransitGatewayRouteTable {
	s.TransitGatewayRouteTableId = &v
	return s
}

// Describes an association between a route table and a resource attachment.
type TransitGatewayRouteTableAssociation struct {
	_ struct{} `type:"structure"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The resource type.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"`

	// The state of the association.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayAssociationState"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayRouteTableAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayRouteTableAssociation) GoString() string {
	return s.String()
}

// SetResourceId sets the ResourceId field's value.
func (s *TransitGatewayRouteTableAssociation) SetResourceId(v string) *TransitGatewayRouteTableAssociation {
	s.ResourceId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TransitGatewayRouteTableAssociation) SetResourceType(v string) *TransitGatewayRouteTableAssociation {
	s.ResourceType = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayRouteTableAssociation) SetState(v string) *TransitGatewayRouteTableAssociation {
	s.State = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayRouteTableAssociation) SetTransitGatewayAttachmentId(v string) *TransitGatewayRouteTableAssociation {
	s.TransitGatewayAttachmentId = &v
	return s
}

// Describes a route table propagation.
type TransitGatewayRouteTablePropagation struct {
	_ struct{} `type:"structure"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`

	// The type of resource.
	ResourceType *string `locationName:"resourceType" type:"string" enum:"TransitGatewayAttachmentResourceType"`

	// The state of the resource.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayPropagationState"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayRouteTablePropagation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayRouteTablePropagation) GoString() string {
	return s.String()
}

// SetResourceId sets the ResourceId field's value.
func (s *TransitGatewayRouteTablePropagation) SetResourceId(v string) *TransitGatewayRouteTablePropagation {
	s.ResourceId = &v
	return s
}

// SetResourceType sets the ResourceType field's value.
func (s *TransitGatewayRouteTablePropagation) SetResourceType(v string) *TransitGatewayRouteTablePropagation {
	s.ResourceType = &v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayRouteTablePropagation) SetState(v string) *TransitGatewayRouteTablePropagation {
	s.State = &v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayRouteTablePropagation) SetTransitGatewayAttachmentId(v string) *TransitGatewayRouteTablePropagation {
	s.TransitGatewayAttachmentId = &v
	return s
}

// Describes a VPC attachment.
type TransitGatewayVpcAttachment struct {
	_ struct{} `type:"structure"`

	// The creation time.
	CreationTime *time.Time `locationName:"creationTime" type:"timestamp"`

	// The VPC attachment options.
	Options *TransitGatewayVpcAttachmentOptions `locationName:"options" type:"structure"`

	// The state of the VPC attachment.
	State *string `locationName:"state" type:"string" enum:"TransitGatewayAttachmentState"`

	// The IDs of the subnets.
	SubnetIds []*string `locationName:"subnetIds" locationNameList:"item" type:"list"`

	// The tags for the VPC attachment.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the attachment.
	TransitGatewayAttachmentId *string `locationName:"transitGatewayAttachmentId" type:"string"`

	// The ID of the transit gateway.
	TransitGatewayId *string `locationName:"transitGatewayId" type:"string"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`

	// The ID of the AWS account that owns the VPC.
	VpcOwnerId *string `locationName:"vpcOwnerId" type:"string"`
}

// String returns the string representation
func (s TransitGatewayVpcAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayVpcAttachment) GoString() string {
	return s.String()
}

// SetCreationTime sets the CreationTime field's value.
func (s *TransitGatewayVpcAttachment) SetCreationTime(v time.Time) *TransitGatewayVpcAttachment {
	s.CreationTime = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *TransitGatewayVpcAttachment) SetOptions(v *TransitGatewayVpcAttachmentOptions) *TransitGatewayVpcAttachment {
	s.Options = v
	return s
}

// SetState sets the State field's value.
func (s *TransitGatewayVpcAttachment) SetState(v string) *TransitGatewayVpcAttachment {
	s.State = &v
	return s
}

// SetSubnetIds sets the SubnetIds field's value.
func (s *TransitGatewayVpcAttachment) SetSubnetIds(v []*string) *TransitGatewayVpcAttachment {
	s.SubnetIds = v
	return s
}

// SetTags sets the Tags field's value.
func (s *TransitGatewayVpcAttachment) SetTags(v []*Tag) *TransitGatewayVpcAttachment {
	s.Tags = v
	return s
}

// SetTransitGatewayAttachmentId sets the TransitGatewayAttachmentId field's value.
func (s *TransitGatewayVpcAttachment) SetTransitGatewayAttachmentId(v string) *TransitGatewayVpcAttachment {
	s.TransitGatewayAttachmentId = &v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *TransitGatewayVpcAttachment) SetTransitGatewayId(v string) *TransitGatewayVpcAttachment {
	s.TransitGatewayId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *TransitGatewayVpcAttachment) SetVpcId(v string) *TransitGatewayVpcAttachment {
	s.VpcId = &v
	return s
}

// SetVpcOwnerId sets the VpcOwnerId field's value.
func (s *TransitGatewayVpcAttachment) SetVpcOwnerId(v string) *TransitGatewayVpcAttachment {
	s.VpcOwnerId = &v
	return s
}

// Describes the VPC attachment options.
type TransitGatewayVpcAttachmentOptions struct {
	_ struct{} `type:"structure"`

	// Indicates whether DNS support is enabled.
	DnsSupport *string `locationName:"dnsSupport" type:"string" enum:"DnsSupportValue"`

	// Indicates whether IPv6 support is enabled.
	Ipv6Support *string `locationName:"ipv6Support" type:"string" enum:"Ipv6SupportValue"`
}

// String returns the string representation
func (s TransitGatewayVpcAttachmentOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TransitGatewayVpcAttachmentOptions) GoString() string {
	return s.String()
}

// SetDnsSupport sets the DnsSupport field's value.
func (s *TransitGatewayVpcAttachmentOptions) SetDnsSupport(v string) *TransitGatewayVpcAttachmentOptions {
	s.DnsSupport = &v
	return s
}

// SetIpv6Support sets the Ipv6Support field's value.
func (s *TransitGatewayVpcAttachmentOptions) SetIpv6Support(v string) *TransitGatewayVpcAttachmentOptions {
	s.Ipv6Support = &v
	return s
}

type UnassignIpv6AddressesInput struct {
	_ struct{} `type:"structure"`

	// The IPv6 addresses to unassign from the network interface.
	//
	// Ipv6Addresses is a required field
	Ipv6Addresses []*string `locationName:"ipv6Addresses" locationNameList:"item" type:"list" required:"true"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`
}

// String returns the string representation
func (s UnassignIpv6AddressesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnassignIpv6AddressesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UnassignIpv6AddressesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UnassignIpv6AddressesInput"}
	if s.Ipv6Addresses == nil {
		invalidParams.Add(request.NewErrParamRequired("Ipv6Addresses"))
	}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetIpv6Addresses sets the Ipv6Addresses field's value.
func (s *UnassignIpv6AddressesInput) SetIpv6Addresses(v []*string) *UnassignIpv6AddressesInput {
	s.Ipv6Addresses = v
	return s
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *UnassignIpv6AddressesInput) SetNetworkInterfaceId(v string) *UnassignIpv6AddressesInput {
	s.NetworkInterfaceId = &v
	return s
}

type UnassignIpv6AddressesOutput struct {
	_ struct{} `type:"structure"`

	// The ID of the network interface.
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string"`

	// The IPv6 addresses that have been unassigned from the network interface.
	UnassignedIpv6Addresses []*string `locationName:"unassignedIpv6Addresses" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s UnassignIpv6AddressesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnassignIpv6AddressesOutput) GoString() string {
	return s.String()
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *UnassignIpv6AddressesOutput) SetNetworkInterfaceId(v string) *UnassignIpv6AddressesOutput {
	s.NetworkInterfaceId = &v
	return s
}

// SetUnassignedIpv6Addresses sets the UnassignedIpv6Addresses field's value.
func (s *UnassignIpv6AddressesOutput) SetUnassignedIpv6Addresses(v []*string) *UnassignIpv6AddressesOutput {
	s.UnassignedIpv6Addresses = v
	return s
}

// Contains the parameters for UnassignPrivateIpAddresses.
type UnassignPrivateIpAddressesInput struct {
	_ struct{} `type:"structure"`

	// The ID of the network interface.
	//
	// NetworkInterfaceId is a required field
	NetworkInterfaceId *string `locationName:"networkInterfaceId" type:"string" required:"true"`

	// The secondary private IP addresses to unassign from the network interface.
	// You can specify this option multiple times to unassign more than one IP address.
	//
	// PrivateIpAddresses is a required field
	PrivateIpAddresses []*string `locationName:"privateIpAddress" locationNameList:"PrivateIpAddress" type:"list" required:"true"`
}

// String returns the string representation
func (s UnassignPrivateIpAddressesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnassignPrivateIpAddressesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UnassignPrivateIpAddressesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UnassignPrivateIpAddressesInput"}
	if s.NetworkInterfaceId == nil {
		invalidParams.Add(request.NewErrParamRequired("NetworkInterfaceId"))
	}
	if s.PrivateIpAddresses == nil {
		invalidParams.Add(request.NewErrParamRequired("PrivateIpAddresses"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetNetworkInterfaceId sets the NetworkInterfaceId field's value.
func (s *UnassignPrivateIpAddressesInput) SetNetworkInterfaceId(v string) *UnassignPrivateIpAddressesInput {
	s.NetworkInterfaceId = &v
	return s
}

// SetPrivateIpAddresses sets the PrivateIpAddresses field's value.
func (s *UnassignPrivateIpAddressesInput) SetPrivateIpAddresses(v []*string) *UnassignPrivateIpAddressesInput {
	s.PrivateIpAddresses = v
	return s
}

type UnassignPrivateIpAddressesOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s UnassignPrivateIpAddressesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnassignPrivateIpAddressesOutput) GoString() string {
	return s.String()
}

type UnmonitorInstancesInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `locationName:"dryRun" type:"boolean"`

	// One or more instance IDs.
	//
	// InstanceIds is a required field
	InstanceIds []*string `locationName:"InstanceId" locationNameList:"InstanceId" type:"list" required:"true"`
}

// String returns the string representation
func (s UnmonitorInstancesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnmonitorInstancesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UnmonitorInstancesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UnmonitorInstancesInput"}
	if s.InstanceIds == nil {
		invalidParams.Add(request.NewErrParamRequired("InstanceIds"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *UnmonitorInstancesInput) SetDryRun(v bool) *UnmonitorInstancesInput {
	s.DryRun = &v
	return s
}

// SetInstanceIds sets the InstanceIds field's value.
func (s *UnmonitorInstancesInput) SetInstanceIds(v []*string) *UnmonitorInstancesInput {
	s.InstanceIds = v
	return s
}

type UnmonitorInstancesOutput struct {
	_ struct{} `type:"structure"`

	// The monitoring information.
	InstanceMonitorings []*InstanceMonitoring `locationName:"instancesSet" locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s UnmonitorInstancesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnmonitorInstancesOutput) GoString() string {
	return s.String()
}

// SetInstanceMonitorings sets the InstanceMonitorings field's value.
func (s *UnmonitorInstancesOutput) SetInstanceMonitorings(v []*InstanceMonitoring) *UnmonitorInstancesOutput {
	s.InstanceMonitorings = v
	return s
}

// Describes the T2 or T3 instance whose credit option for CPU usage was not
// modified.
type UnsuccessfulInstanceCreditSpecificationItem struct {
	_ struct{} `type:"structure"`

	// The applicable error for the T2 or T3 instance whose credit option for CPU
	// usage was not modified.
	Error *UnsuccessfulInstanceCreditSpecificationItemError `locationName:"error" type:"structure"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`
}

// String returns the string representation
func (s UnsuccessfulInstanceCreditSpecificationItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnsuccessfulInstanceCreditSpecificationItem) GoString() string {
	return s.String()
}

// SetError sets the Error field's value.
func (s *UnsuccessfulInstanceCreditSpecificationItem) SetError(v *UnsuccessfulInstanceCreditSpecificationItemError) *UnsuccessfulInstanceCreditSpecificationItem {
	s.Error = v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *UnsuccessfulInstanceCreditSpecificationItem) SetInstanceId(v string) *UnsuccessfulInstanceCreditSpecificationItem {
	s.InstanceId = &v
	return s
}

// Information about the error for the T2 or T3 instance whose credit option
// for CPU usage was not modified.
type UnsuccessfulInstanceCreditSpecificationItemError struct {
	_ struct{} `type:"structure"`

	// The error code.
	Code *string `locationName:"code" type:"string" enum:"UnsuccessfulInstanceCreditSpecificationErrorCode"`

	// The applicable error message.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s UnsuccessfulInstanceCreditSpecificationItemError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnsuccessfulInstanceCreditSpecificationItemError) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *UnsuccessfulInstanceCreditSpecificationItemError) SetCode(v string) *UnsuccessfulInstanceCreditSpecificationItemError {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *UnsuccessfulInstanceCreditSpecificationItemError) SetMessage(v string) *UnsuccessfulInstanceCreditSpecificationItemError {
	s.Message = &v
	return s
}

// Information about items that were not successfully processed in a batch call.
type UnsuccessfulItem struct {
	_ struct{} `type:"structure"`

	// Information about the error.
	Error *UnsuccessfulItemError `locationName:"error" type:"structure"`

	// The ID of the resource.
	ResourceId *string `locationName:"resourceId" type:"string"`
}

// String returns the string representation
func (s UnsuccessfulItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnsuccessfulItem) GoString() string {
	return s.String()
}

// SetError sets the Error field's value.
func (s *UnsuccessfulItem) SetError(v *UnsuccessfulItemError) *UnsuccessfulItem {
	s.Error = v
	return s
}

// SetResourceId sets the ResourceId field's value.
func (s *UnsuccessfulItem) SetResourceId(v string) *UnsuccessfulItem {
	s.ResourceId = &v
	return s
}

// Information about the error that occurred. For more information about errors,
// see Error Codes (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html).
type UnsuccessfulItemError struct {
	_ struct{} `type:"structure"`

	// The error code.
	Code *string `locationName:"code" type:"string"`

	// The error message accompanying the error code.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s UnsuccessfulItemError) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UnsuccessfulItemError) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *UnsuccessfulItemError) SetCode(v string) *UnsuccessfulItemError {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *UnsuccessfulItemError) SetMessage(v string) *UnsuccessfulItemError {
	s.Message = &v
	return s
}

type UpdateSecurityGroupRuleDescriptionsEgressInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the security group. You must specify either the security group
	// ID or the security group name in the request. For security groups in a nondefault
	// VPC, you must specify the security group ID.
	GroupId *string `type:"string"`

	// [Default VPC] The name of the security group. You must specify either the
	// security group ID or the security group name in the request.
	GroupName *string `type:"string"`

	// The IP permissions for the security group rule.
	//
	// IpPermissions is a required field
	IpPermissions []*IpPermission `locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsEgressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsEgressInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateSecurityGroupRuleDescriptionsEgressInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UpdateSecurityGroupRuleDescriptionsEgressInput"}
	if s.IpPermissions == nil {
		invalidParams.Add(request.NewErrParamRequired("IpPermissions"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *UpdateSecurityGroupRuleDescriptionsEgressInput) SetDryRun(v bool) *UpdateSecurityGroupRuleDescriptionsEgressInput {
	s.DryRun = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *UpdateSecurityGroupRuleDescriptionsEgressInput) SetGroupId(v string) *UpdateSecurityGroupRuleDescriptionsEgressInput {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *UpdateSecurityGroupRuleDescriptionsEgressInput) SetGroupName(v string) *UpdateSecurityGroupRuleDescriptionsEgressInput {
	s.GroupName = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *UpdateSecurityGroupRuleDescriptionsEgressInput) SetIpPermissions(v []*IpPermission) *UpdateSecurityGroupRuleDescriptionsEgressInput {
	s.IpPermissions = v
	return s
}

type UpdateSecurityGroupRuleDescriptionsEgressOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsEgressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsEgressOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *UpdateSecurityGroupRuleDescriptionsEgressOutput) SetReturn(v bool) *UpdateSecurityGroupRuleDescriptionsEgressOutput {
	s.Return = &v
	return s
}

type UpdateSecurityGroupRuleDescriptionsIngressInput struct {
	_ struct{} `type:"structure"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`

	// The ID of the security group. You must specify either the security group
	// ID or the security group name in the request. For security groups in a nondefault
	// VPC, you must specify the security group ID.
	GroupId *string `type:"string"`

	// [EC2-Classic, default VPC] The name of the security group. You must specify
	// either the security group ID or the security group name in the request.
	GroupName *string `type:"string"`

	// The IP permissions for the security group rule.
	//
	// IpPermissions is a required field
	IpPermissions []*IpPermission `locationNameList:"item" type:"list" required:"true"`
}

// String returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsIngressInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsIngressInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateSecurityGroupRuleDescriptionsIngressInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UpdateSecurityGroupRuleDescriptionsIngressInput"}
	if s.IpPermissions == nil {
		invalidParams.Add(request.NewErrParamRequired("IpPermissions"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetDryRun sets the DryRun field's value.
func (s *UpdateSecurityGroupRuleDescriptionsIngressInput) SetDryRun(v bool) *UpdateSecurityGroupRuleDescriptionsIngressInput {
	s.DryRun = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *UpdateSecurityGroupRuleDescriptionsIngressInput) SetGroupId(v string) *UpdateSecurityGroupRuleDescriptionsIngressInput {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *UpdateSecurityGroupRuleDescriptionsIngressInput) SetGroupName(v string) *UpdateSecurityGroupRuleDescriptionsIngressInput {
	s.GroupName = &v
	return s
}

// SetIpPermissions sets the IpPermissions field's value.
func (s *UpdateSecurityGroupRuleDescriptionsIngressInput) SetIpPermissions(v []*IpPermission) *UpdateSecurityGroupRuleDescriptionsIngressInput {
	s.IpPermissions = v
	return s
}

type UpdateSecurityGroupRuleDescriptionsIngressOutput struct {
	_ struct{} `type:"structure"`

	// Returns true if the request succeeds; otherwise, returns an error.
	Return *bool `locationName:"return" type:"boolean"`
}

// String returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsIngressOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateSecurityGroupRuleDescriptionsIngressOutput) GoString() string {
	return s.String()
}

// SetReturn sets the Return field's value.
func (s *UpdateSecurityGroupRuleDescriptionsIngressOutput) SetReturn(v bool) *UpdateSecurityGroupRuleDescriptionsIngressOutput {
	s.Return = &v
	return s
}

// Describes the S3 bucket for the disk image.
type UserBucket struct {
	_ struct{} `type:"structure"`

	// The name of the S3 bucket where the disk image is located.
	S3Bucket *string `type:"string"`

	// The file name of the disk image.
	S3Key *string `type:"string"`
}

// String returns the string representation
func (s UserBucket) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UserBucket) GoString() string {
	return s.String()
}

// SetS3Bucket sets the S3Bucket field's value.
func (s *UserBucket) SetS3Bucket(v string) *UserBucket {
	s.S3Bucket = &v
	return s
}

// SetS3Key sets the S3Key field's value.
func (s *UserBucket) SetS3Key(v string) *UserBucket {
	s.S3Key = &v
	return s
}

// Describes the S3 bucket for the disk image.
type UserBucketDetails struct {
	_ struct{} `type:"structure"`

	// The S3 bucket from which the disk image was created.
	S3Bucket *string `locationName:"s3Bucket" type:"string"`

	// The file name of the disk image.
	S3Key *string `locationName:"s3Key" type:"string"`
}

// String returns the string representation
func (s UserBucketDetails) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UserBucketDetails) GoString() string {
	return s.String()
}

// SetS3Bucket sets the S3Bucket field's value.
func (s *UserBucketDetails) SetS3Bucket(v string) *UserBucketDetails {
	s.S3Bucket = &v
	return s
}

// SetS3Key sets the S3Key field's value.
func (s *UserBucketDetails) SetS3Key(v string) *UserBucketDetails {
	s.S3Key = &v
	return s
}

// Describes the user data for an instance.
type UserData struct {
	_ struct{} `type:"structure"`

	// The user data. If you are using an AWS SDK or command line tool, Base64-encoding
	// is performed for you, and you can load the text from a file. Otherwise, you
	// must provide Base64-encoded text.
	Data *string `locationName:"data" type:"string"`
}

// String returns the string representation
func (s UserData) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UserData) GoString() string {
	return s.String()
}

// SetData sets the Data field's value.
func (s *UserData) SetData(v string) *UserData {
	s.Data = &v
	return s
}

// Describes a security group and AWS account ID pair.
type UserIdGroupPair struct {
	_ struct{} `type:"structure"`

	// A description for the security group rule that references this user ID group
	// pair.
	//
	// Constraints: Up to 255 characters in length. Allowed characters are a-z,
	// A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*
	Description *string `locationName:"description" type:"string"`

	// The ID of the security group.
	GroupId *string `locationName:"groupId" type:"string"`

	// The name of the security group. In a request, use this parameter for a security
	// group in EC2-Classic or a default VPC only. For a security group in a nondefault
	// VPC, use the security group ID.
	//
	// For a referenced security group in another VPC, this value is not returned
	// if the referenced security group is deleted.
	GroupName *string `locationName:"groupName" type:"string"`

	// The status of a VPC peering connection, if applicable.
	PeeringStatus *string `locationName:"peeringStatus" type:"string"`

	// The ID of an AWS account.
	//
	// For a referenced security group in another VPC, the account ID of the referenced
	// security group is returned in the response. If the referenced security group
	// is deleted, this value is not returned.
	//
	// [EC2-Classic] Required when adding or removing rules that reference a security
	// group in another AWS account.
	UserId *string `locationName:"userId" type:"string"`

	// The ID of the VPC for the referenced security group, if applicable.
	VpcId *string `locationName:"vpcId" type:"string"`

	// The ID of the VPC peering connection, if applicable.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s UserIdGroupPair) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UserIdGroupPair) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *UserIdGroupPair) SetDescription(v string) *UserIdGroupPair {
	s.Description = &v
	return s
}

// SetGroupId sets the GroupId field's value.
func (s *UserIdGroupPair) SetGroupId(v string) *UserIdGroupPair {
	s.GroupId = &v
	return s
}

// SetGroupName sets the GroupName field's value.
func (s *UserIdGroupPair) SetGroupName(v string) *UserIdGroupPair {
	s.GroupName = &v
	return s
}

// SetPeeringStatus sets the PeeringStatus field's value.
func (s *UserIdGroupPair) SetPeeringStatus(v string) *UserIdGroupPair {
	s.PeeringStatus = &v
	return s
}

// SetUserId sets the UserId field's value.
func (s *UserIdGroupPair) SetUserId(v string) *UserIdGroupPair {
	s.UserId = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *UserIdGroupPair) SetVpcId(v string) *UserIdGroupPair {
	s.VpcId = &v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *UserIdGroupPair) SetVpcPeeringConnectionId(v string) *UserIdGroupPair {
	s.VpcPeeringConnectionId = &v
	return s
}

// Describes telemetry for a VPN tunnel.
type VgwTelemetry struct {
	_ struct{} `type:"structure"`

	// The number of accepted routes.
	AcceptedRouteCount *int64 `locationName:"acceptedRouteCount" type:"integer"`

	// The date and time of the last change in status.
	LastStatusChange *time.Time `locationName:"lastStatusChange" type:"timestamp"`

	// The Internet-routable IP address of the virtual private gateway's outside
	// interface.
	OutsideIpAddress *string `locationName:"outsideIpAddress" type:"string"`

	// The status of the VPN tunnel.
	Status *string `locationName:"status" type:"string" enum:"TelemetryStatus"`

	// If an error occurs, a description of the error.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s VgwTelemetry) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VgwTelemetry) GoString() string {
	return s.String()
}

// SetAcceptedRouteCount sets the AcceptedRouteCount field's value.
func (s *VgwTelemetry) SetAcceptedRouteCount(v int64) *VgwTelemetry {
	s.AcceptedRouteCount = &v
	return s
}

// SetLastStatusChange sets the LastStatusChange field's value.
func (s *VgwTelemetry) SetLastStatusChange(v time.Time) *VgwTelemetry {
	s.LastStatusChange = &v
	return s
}

// SetOutsideIpAddress sets the OutsideIpAddress field's value.
func (s *VgwTelemetry) SetOutsideIpAddress(v string) *VgwTelemetry {
	s.OutsideIpAddress = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *VgwTelemetry) SetStatus(v string) *VgwTelemetry {
	s.Status = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *VgwTelemetry) SetStatusMessage(v string) *VgwTelemetry {
	s.StatusMessage = &v
	return s
}

// Describes a volume.
type Volume struct {
	_ struct{} `type:"structure"`

	// Information about the volume attachments.
	Attachments []*VolumeAttachment `locationName:"attachmentSet" locationNameList:"item" type:"list"`

	// The Availability Zone for the volume.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The time stamp when volume creation was initiated.
	CreateTime *time.Time `locationName:"createTime" type:"timestamp"`

	// Indicates whether the volume will be encrypted.
	Encrypted *bool `locationName:"encrypted" type:"boolean"`

	// The number of I/O operations per second (IOPS) that the volume supports.
	// For Provisioned IOPS SSD volumes, this represents the number of IOPS that
	// are provisioned for the volume. For General Purpose SSD volumes, this represents
	// the baseline performance of the volume and the rate at which the volume accumulates
	// I/O credits for bursting. For more information about General Purpose SSD
	// baseline performance, I/O credits, and bursting, see Amazon EBS Volume Types
	// (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Constraints: Range is 100-16,000 IOPS for gp2 volumes and 100 to 64,000IOPS
	// for io1 volumes in most regions. Maximum io1IOPS of 64,000 is guaranteed
	// only on Nitro-based instances (AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances).
	// Other instance families guarantee performance up to 32,000 IOPS. For more
	// information, see Amazon EBS Volume Types (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumeTypes.html)
	// in the Amazon Elastic Compute Cloud User Guide.
	//
	// Condition: This parameter is required for requests to create io1 volumes;
	// it is not used in requests to create gp2, st1, sc1, or standard volumes.
	Iops *int64 `locationName:"iops" type:"integer"`

	// The full ARN of the AWS Key Management Service (AWS KMS) customer master
	// key (CMK) that was used to protect the volume encryption key for the volume.
	KmsKeyId *string `locationName:"kmsKeyId" type:"string"`

	// The size of the volume, in GiBs.
	Size *int64 `locationName:"size" type:"integer"`

	// The snapshot from which the volume was created, if applicable.
	SnapshotId *string `locationName:"snapshotId" type:"string"`

	// The volume state.
	State *string `locationName:"status" type:"string" enum:"VolumeState"`

	// Any tags assigned to the volume.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the volume.
	VolumeId *string `locationName:"volumeId" type:"string"`

	// The volume type. This can be gp2 for General Purpose SSD, io1 for Provisioned
	// IOPS SSD, st1 for Throughput Optimized HDD, sc1 for Cold HDD, or standard
	// for Magnetic volumes.
	VolumeType *string `locationName:"volumeType" type:"string" enum:"VolumeType"`
}

// String returns the string representation
func (s Volume) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Volume) GoString() string {
	return s.String()
}

// SetAttachments sets the Attachments field's value.
func (s *Volume) SetAttachments(v []*VolumeAttachment) *Volume {
	s.Attachments = v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *Volume) SetAvailabilityZone(v string) *Volume {
	s.AvailabilityZone = &v
	return s
}

// SetCreateTime sets the CreateTime field's value.
func (s *Volume) SetCreateTime(v time.Time) *Volume {
	s.CreateTime = &v
	return s
}

// SetEncrypted sets the Encrypted field's value.
func (s *Volume) SetEncrypted(v bool) *Volume {
	s.Encrypted = &v
	return s
}

// SetIops sets the Iops field's value.
func (s *Volume) SetIops(v int64) *Volume {
	s.Iops = &v
	return s
}

// SetKmsKeyId sets the KmsKeyId field's value.
func (s *Volume) SetKmsKeyId(v string) *Volume {
	s.KmsKeyId = &v
	return s
}

// SetSize sets the Size field's value.
func (s *Volume) SetSize(v int64) *Volume {
	s.Size = &v
	return s
}

// SetSnapshotId sets the SnapshotId field's value.
func (s *Volume) SetSnapshotId(v string) *Volume {
	s.SnapshotId = &v
	return s
}

// SetState sets the State field's value.
func (s *Volume) SetState(v string) *Volume {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Volume) SetTags(v []*Tag) *Volume {
	s.Tags = v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *Volume) SetVolumeId(v string) *Volume {
	s.VolumeId = &v
	return s
}

// SetVolumeType sets the VolumeType field's value.
func (s *Volume) SetVolumeType(v string) *Volume {
	s.VolumeType = &v
	return s
}

// Describes volume attachment details.
type VolumeAttachment struct {
	_ struct{} `type:"structure"`

	// The time stamp when the attachment initiated.
	AttachTime *time.Time `locationName:"attachTime" type:"timestamp"`

	// Indicates whether the EBS volume is deleted on instance termination.
	DeleteOnTermination *bool `locationName:"deleteOnTermination" type:"boolean"`

	// The device name.
	Device *string `locationName:"device" type:"string"`

	// The ID of the instance.
	InstanceId *string `locationName:"instanceId" type:"string"`

	// The attachment state of the volume.
	State *string `locationName:"status" type:"string" enum:"VolumeAttachmentState"`

	// The ID of the volume.
	VolumeId *string `locationName:"volumeId" type:"string"`
}

// String returns the string representation
func (s VolumeAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeAttachment) GoString() string {
	return s.String()
}

// SetAttachTime sets the AttachTime field's value.
func (s *VolumeAttachment) SetAttachTime(v time.Time) *VolumeAttachment {
	s.AttachTime = &v
	return s
}

// SetDeleteOnTermination sets the DeleteOnTermination field's value.
func (s *VolumeAttachment) SetDeleteOnTermination(v bool) *VolumeAttachment {
	s.DeleteOnTermination = &v
	return s
}

// SetDevice sets the Device field's value.
func (s *VolumeAttachment) SetDevice(v string) *VolumeAttachment {
	s.Device = &v
	return s
}

// SetInstanceId sets the InstanceId field's value.
func (s *VolumeAttachment) SetInstanceId(v string) *VolumeAttachment {
	s.InstanceId = &v
	return s
}

// SetState sets the State field's value.
func (s *VolumeAttachment) SetState(v string) *VolumeAttachment {
	s.State = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *VolumeAttachment) SetVolumeId(v string) *VolumeAttachment {
	s.VolumeId = &v
	return s
}

// Describes an EBS volume.
type VolumeDetail struct {
	_ struct{} `type:"structure"`

	// The size of the volume, in GiB.
	//
	// Size is a required field
	Size *int64 `locationName:"size" type:"long" required:"true"`
}

// String returns the string representation
func (s VolumeDetail) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeDetail) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *VolumeDetail) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "VolumeDetail"}
	if s.Size == nil {
		invalidParams.Add(request.NewErrParamRequired("Size"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetSize sets the Size field's value.
func (s *VolumeDetail) SetSize(v int64) *VolumeDetail {
	s.Size = &v
	return s
}

// Describes the modification status of an EBS volume.
//
// If the volume has never been modified, some element values will be null.
type VolumeModification struct {
	_ struct{} `type:"structure"`

	// The modification completion or failure time.
	EndTime *time.Time `locationName:"endTime" type:"timestamp"`

	// The current modification state. The modification state is null for unmodified
	// volumes.
	ModificationState *string `locationName:"modificationState" type:"string" enum:"VolumeModificationState"`

	// The original IOPS rate of the volume.
	OriginalIops *int64 `locationName:"originalIops" type:"integer"`

	// The original size of the volume.
	OriginalSize *int64 `locationName:"originalSize" type:"integer"`

	// The original EBS volume type of the volume.
	OriginalVolumeType *string `locationName:"originalVolumeType" type:"string" enum:"VolumeType"`

	// The modification progress, from 0 to 100 percent complete.
	Progress *int64 `locationName:"progress" type:"long"`

	// The modification start time.
	StartTime *time.Time `locationName:"startTime" type:"timestamp"`

	// A status message about the modification progress or failure.
	StatusMessage *string `locationName:"statusMessage" type:"string"`

	// The target IOPS rate of the volume.
	TargetIops *int64 `locationName:"targetIops" type:"integer"`

	// The target size of the volume, in GiB.
	TargetSize *int64 `locationName:"targetSize" type:"integer"`

	// The target EBS volume type of the volume.
	TargetVolumeType *string `locationName:"targetVolumeType" type:"string" enum:"VolumeType"`

	// The ID of the volume.
	VolumeId *string `locationName:"volumeId" type:"string"`
}

// String returns the string representation
func (s VolumeModification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeModification) GoString() string {
	return s.String()
}

// SetEndTime sets the EndTime field's value.
func (s *VolumeModification) SetEndTime(v time.Time) *VolumeModification {
	s.EndTime = &v
	return s
}

// SetModificationState sets the ModificationState field's value.
func (s *VolumeModification) SetModificationState(v string) *VolumeModification {
	s.ModificationState = &v
	return s
}

// SetOriginalIops sets the OriginalIops field's value.
func (s *VolumeModification) SetOriginalIops(v int64) *VolumeModification {
	s.OriginalIops = &v
	return s
}

// SetOriginalSize sets the OriginalSize field's value.
func (s *VolumeModification) SetOriginalSize(v int64) *VolumeModification {
	s.OriginalSize = &v
	return s
}

// SetOriginalVolumeType sets the OriginalVolumeType field's value.
func (s *VolumeModification) SetOriginalVolumeType(v string) *VolumeModification {
	s.OriginalVolumeType = &v
	return s
}

// SetProgress sets the Progress field's value.
func (s *VolumeModification) SetProgress(v int64) *VolumeModification {
	s.Progress = &v
	return s
}

// SetStartTime sets the StartTime field's value.
func (s *VolumeModification) SetStartTime(v time.Time) *VolumeModification {
	s.StartTime = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *VolumeModification) SetStatusMessage(v string) *VolumeModification {
	s.StatusMessage = &v
	return s
}

// SetTargetIops sets the TargetIops field's value.
func (s *VolumeModification) SetTargetIops(v int64) *VolumeModification {
	s.TargetIops = &v
	return s
}

// SetTargetSize sets the TargetSize field's value.
func (s *VolumeModification) SetTargetSize(v int64) *VolumeModification {
	s.TargetSize = &v
	return s
}

// SetTargetVolumeType sets the TargetVolumeType field's value.
func (s *VolumeModification) SetTargetVolumeType(v string) *VolumeModification {
	s.TargetVolumeType = &v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *VolumeModification) SetVolumeId(v string) *VolumeModification {
	s.VolumeId = &v
	return s
}

// Describes a volume status operation code.
type VolumeStatusAction struct {
	_ struct{} `type:"structure"`

	// The code identifying the operation, for example, enable-volume-io.
	Code *string `locationName:"code" type:"string"`

	// A description of the operation.
	Description *string `locationName:"description" type:"string"`

	// The ID of the event associated with this operation.
	EventId *string `locationName:"eventId" type:"string"`

	// The event type associated with this operation.
	EventType *string `locationName:"eventType" type:"string"`
}

// String returns the string representation
func (s VolumeStatusAction) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeStatusAction) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *VolumeStatusAction) SetCode(v string) *VolumeStatusAction {
	s.Code = &v
	return s
}

// SetDescription sets the Description field's value.
func (s *VolumeStatusAction) SetDescription(v string) *VolumeStatusAction {
	s.Description = &v
	return s
}

// SetEventId sets the EventId field's value.
func (s *VolumeStatusAction) SetEventId(v string) *VolumeStatusAction {
	s.EventId = &v
	return s
}

// SetEventType sets the EventType field's value.
func (s *VolumeStatusAction) SetEventType(v string) *VolumeStatusAction {
	s.EventType = &v
	return s
}

// Describes a volume status.
type VolumeStatusDetails struct {
	_ struct{} `type:"structure"`

	// The name of the volume status.
	Name *string `locationName:"name" type:"string" enum:"VolumeStatusName"`

	// The intended status of the volume status.
	Status *string `locationName:"status" type:"string"`
}

// String returns the string representation
func (s VolumeStatusDetails) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeStatusDetails) GoString() string {
	return s.String()
}

// SetName sets the Name field's value.
func (s *VolumeStatusDetails) SetName(v string) *VolumeStatusDetails {
	s.Name = &v
	return s
}

// SetStatus sets the Status field's value.
func (s *VolumeStatusDetails) SetStatus(v string) *VolumeStatusDetails {
	s.Status = &v
	return s
}

// Describes a volume status event.
type VolumeStatusEvent struct {
	_ struct{} `type:"structure"`

	// A description of the event.
	Description *string `locationName:"description" type:"string"`

	// The ID of this event.
	EventId *string `locationName:"eventId" type:"string"`

	// The type of this event.
	EventType *string `locationName:"eventType" type:"string"`

	// The latest end time of the event.
	NotAfter *time.Time `locationName:"notAfter" type:"timestamp"`

	// The earliest start time of the event.
	NotBefore *time.Time `locationName:"notBefore" type:"timestamp"`
}

// String returns the string representation
func (s VolumeStatusEvent) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeStatusEvent) GoString() string {
	return s.String()
}

// SetDescription sets the Description field's value.
func (s *VolumeStatusEvent) SetDescription(v string) *VolumeStatusEvent {
	s.Description = &v
	return s
}

// SetEventId sets the EventId field's value.
func (s *VolumeStatusEvent) SetEventId(v string) *VolumeStatusEvent {
	s.EventId = &v
	return s
}

// SetEventType sets the EventType field's value.
func (s *VolumeStatusEvent) SetEventType(v string) *VolumeStatusEvent {
	s.EventType = &v
	return s
}

// SetNotAfter sets the NotAfter field's value.
func (s *VolumeStatusEvent) SetNotAfter(v time.Time) *VolumeStatusEvent {
	s.NotAfter = &v
	return s
}

// SetNotBefore sets the NotBefore field's value.
func (s *VolumeStatusEvent) SetNotBefore(v time.Time) *VolumeStatusEvent {
	s.NotBefore = &v
	return s
}

// Describes the status of a volume.
type VolumeStatusInfo struct {
	_ struct{} `type:"structure"`

	// The details of the volume status.
	Details []*VolumeStatusDetails `locationName:"details" locationNameList:"item" type:"list"`

	// The status of the volume.
	Status *string `locationName:"status" type:"string" enum:"VolumeStatusInfoStatus"`
}

// String returns the string representation
func (s VolumeStatusInfo) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeStatusInfo) GoString() string {
	return s.String()
}

// SetDetails sets the Details field's value.
func (s *VolumeStatusInfo) SetDetails(v []*VolumeStatusDetails) *VolumeStatusInfo {
	s.Details = v
	return s
}

// SetStatus sets the Status field's value.
func (s *VolumeStatusInfo) SetStatus(v string) *VolumeStatusInfo {
	s.Status = &v
	return s
}

// Describes the volume status.
type VolumeStatusItem struct {
	_ struct{} `type:"structure"`

	// The details of the operation.
	Actions []*VolumeStatusAction `locationName:"actionsSet" locationNameList:"item" type:"list"`

	// The Availability Zone of the volume.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// A list of events associated with the volume.
	Events []*VolumeStatusEvent `locationName:"eventsSet" locationNameList:"item" type:"list"`

	// The volume ID.
	VolumeId *string `locationName:"volumeId" type:"string"`

	// The volume status.
	VolumeStatus *VolumeStatusInfo `locationName:"volumeStatus" type:"structure"`
}

// String returns the string representation
func (s VolumeStatusItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VolumeStatusItem) GoString() string {
	return s.String()
}

// SetActions sets the Actions field's value.
func (s *VolumeStatusItem) SetActions(v []*VolumeStatusAction) *VolumeStatusItem {
	s.Actions = v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *VolumeStatusItem) SetAvailabilityZone(v string) *VolumeStatusItem {
	s.AvailabilityZone = &v
	return s
}

// SetEvents sets the Events field's value.
func (s *VolumeStatusItem) SetEvents(v []*VolumeStatusEvent) *VolumeStatusItem {
	s.Events = v
	return s
}

// SetVolumeId sets the VolumeId field's value.
func (s *VolumeStatusItem) SetVolumeId(v string) *VolumeStatusItem {
	s.VolumeId = &v
	return s
}

// SetVolumeStatus sets the VolumeStatus field's value.
func (s *VolumeStatusItem) SetVolumeStatus(v *VolumeStatusInfo) *VolumeStatusItem {
	s.VolumeStatus = v
	return s
}

// Describes a VPC.
type Vpc struct {
	_ struct{} `type:"structure"`

	// The primary IPv4 CIDR block for the VPC.
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Information about the IPv4 CIDR blocks associated with the VPC.
	CidrBlockAssociationSet []*VpcCidrBlockAssociation `locationName:"cidrBlockAssociationSet" locationNameList:"item" type:"list"`

	// The ID of the set of DHCP options you've associated with the VPC (or default
	// if the default options are associated with the VPC).
	DhcpOptionsId *string `locationName:"dhcpOptionsId" type:"string"`

	// The allowed tenancy of instances launched into the VPC.
	InstanceTenancy *string `locationName:"instanceTenancy" type:"string" enum:"Tenancy"`

	// Information about the IPv6 CIDR blocks associated with the VPC.
	Ipv6CidrBlockAssociationSet []*VpcIpv6CidrBlockAssociation `locationName:"ipv6CidrBlockAssociationSet" locationNameList:"item" type:"list"`

	// Indicates whether the VPC is the default VPC.
	IsDefault *bool `locationName:"isDefault" type:"boolean"`

	// The ID of the AWS account that owns the VPC.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// The current state of the VPC.
	State *string `locationName:"state" type:"string" enum:"VpcState"`

	// Any tags assigned to the VPC.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s Vpc) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Vpc) GoString() string {
	return s.String()
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *Vpc) SetCidrBlock(v string) *Vpc {
	s.CidrBlock = &v
	return s
}

// SetCidrBlockAssociationSet sets the CidrBlockAssociationSet field's value.
func (s *Vpc) SetCidrBlockAssociationSet(v []*VpcCidrBlockAssociation) *Vpc {
	s.CidrBlockAssociationSet = v
	return s
}

// SetDhcpOptionsId sets the DhcpOptionsId field's value.
func (s *Vpc) SetDhcpOptionsId(v string) *Vpc {
	s.DhcpOptionsId = &v
	return s
}

// SetInstanceTenancy sets the InstanceTenancy field's value.
func (s *Vpc) SetInstanceTenancy(v string) *Vpc {
	s.InstanceTenancy = &v
	return s
}

// SetIpv6CidrBlockAssociationSet sets the Ipv6CidrBlockAssociationSet field's value.
func (s *Vpc) SetIpv6CidrBlockAssociationSet(v []*VpcIpv6CidrBlockAssociation) *Vpc {
	s.Ipv6CidrBlockAssociationSet = v
	return s
}

// SetIsDefault sets the IsDefault field's value.
func (s *Vpc) SetIsDefault(v bool) *Vpc {
	s.IsDefault = &v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *Vpc) SetOwnerId(v string) *Vpc {
	s.OwnerId = &v
	return s
}

// SetState sets the State field's value.
func (s *Vpc) SetState(v string) *Vpc {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *Vpc) SetTags(v []*Tag) *Vpc {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *Vpc) SetVpcId(v string) *Vpc {
	s.VpcId = &v
	return s
}

// Describes an attachment between a virtual private gateway and a VPC.
type VpcAttachment struct {
	_ struct{} `type:"structure"`

	// The current state of the attachment.
	State *string `locationName:"state" type:"string" enum:"AttachmentStatus"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s VpcAttachment) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcAttachment) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *VpcAttachment) SetState(v string) *VpcAttachment {
	s.State = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *VpcAttachment) SetVpcId(v string) *VpcAttachment {
	s.VpcId = &v
	return s
}

// Describes an IPv4 CIDR block associated with a VPC.
type VpcCidrBlockAssociation struct {
	_ struct{} `type:"structure"`

	// The association ID for the IPv4 CIDR block.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The IPv4 CIDR block.
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Information about the state of the CIDR block.
	CidrBlockState *VpcCidrBlockState `locationName:"cidrBlockState" type:"structure"`
}

// String returns the string representation
func (s VpcCidrBlockAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcCidrBlockAssociation) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *VpcCidrBlockAssociation) SetAssociationId(v string) *VpcCidrBlockAssociation {
	s.AssociationId = &v
	return s
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *VpcCidrBlockAssociation) SetCidrBlock(v string) *VpcCidrBlockAssociation {
	s.CidrBlock = &v
	return s
}

// SetCidrBlockState sets the CidrBlockState field's value.
func (s *VpcCidrBlockAssociation) SetCidrBlockState(v *VpcCidrBlockState) *VpcCidrBlockAssociation {
	s.CidrBlockState = v
	return s
}

// Describes the state of a CIDR block.
type VpcCidrBlockState struct {
	_ struct{} `type:"structure"`

	// The state of the CIDR block.
	State *string `locationName:"state" type:"string" enum:"VpcCidrBlockStateCode"`

	// A message about the status of the CIDR block, if applicable.
	StatusMessage *string `locationName:"statusMessage" type:"string"`
}

// String returns the string representation
func (s VpcCidrBlockState) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcCidrBlockState) GoString() string {
	return s.String()
}

// SetState sets the State field's value.
func (s *VpcCidrBlockState) SetState(v string) *VpcCidrBlockState {
	s.State = &v
	return s
}

// SetStatusMessage sets the StatusMessage field's value.
func (s *VpcCidrBlockState) SetStatusMessage(v string) *VpcCidrBlockState {
	s.StatusMessage = &v
	return s
}

// Describes whether a VPC is enabled for ClassicLink.
type VpcClassicLink struct {
	_ struct{} `type:"structure"`

	// Indicates whether the VPC is enabled for ClassicLink.
	ClassicLinkEnabled *bool `locationName:"classicLinkEnabled" type:"boolean"`

	// Any tags assigned to the VPC.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s VpcClassicLink) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcClassicLink) GoString() string {
	return s.String()
}

// SetClassicLinkEnabled sets the ClassicLinkEnabled field's value.
func (s *VpcClassicLink) SetClassicLinkEnabled(v bool) *VpcClassicLink {
	s.ClassicLinkEnabled = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *VpcClassicLink) SetTags(v []*Tag) *VpcClassicLink {
	s.Tags = v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *VpcClassicLink) SetVpcId(v string) *VpcClassicLink {
	s.VpcId = &v
	return s
}

// Describes a VPC endpoint.
type VpcEndpoint struct {
	_ struct{} `type:"structure"`

	// The date and time the VPC endpoint was created.
	CreationTimestamp *time.Time `locationName:"creationTimestamp" type:"timestamp"`

	// (Interface endpoint) The DNS entries for the endpoint.
	DnsEntries []*DnsEntry `locationName:"dnsEntrySet" locationNameList:"item" type:"list"`

	// (Interface endpoint) Information about the security groups associated with
	// the network interface.
	Groups []*SecurityGroupIdentifier `locationName:"groupSet" locationNameList:"item" type:"list"`

	// (Interface endpoint) One or more network interfaces for the endpoint.
	NetworkInterfaceIds []*string `locationName:"networkInterfaceIdSet" locationNameList:"item" type:"list"`

	// The policy document associated with the endpoint, if applicable.
	PolicyDocument *string `locationName:"policyDocument" type:"string"`

	// (Interface endpoint) Indicates whether the VPC is associated with a private
	// hosted zone.
	PrivateDnsEnabled *bool `locationName:"privateDnsEnabled" type:"boolean"`

	// (Gateway endpoint) One or more route tables associated with the endpoint.
	RouteTableIds []*string `locationName:"routeTableIdSet" locationNameList:"item" type:"list"`

	// The name of the service to which the endpoint is associated.
	ServiceName *string `locationName:"serviceName" type:"string"`

	// The state of the VPC endpoint.
	State *string `locationName:"state" type:"string" enum:"State"`

	// (Interface endpoint) One or more subnets in which the endpoint is located.
	SubnetIds []*string `locationName:"subnetIdSet" locationNameList:"item" type:"list"`

	// The ID of the VPC endpoint.
	VpcEndpointId *string `locationName:"vpcEndpointId" type:"string"`

	// The type of endpoint.
	VpcEndpointType *string `locationName:"vpcEndpointType" type:"string" enum:"VpcEndpointType"`

	// The ID of the VPC to which the endpoint is associated.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s VpcEndpoint) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcEndpoint) GoString() string {
	return s.String()
}

// SetCreationTimestamp sets the CreationTimestamp field's value.
func (s *VpcEndpoint) SetCreationTimestamp(v time.Time) *VpcEndpoint {
	s.CreationTimestamp = &v
	return s
}

// SetDnsEntries sets the DnsEntries field's value.
func (s *VpcEndpoint) SetDnsEntries(v []*DnsEntry) *VpcEndpoint {
	s.DnsEntries = v
	return s
}

// SetGroups sets the Groups field's value.
func (s *VpcEndpoint) SetGroups(v []*SecurityGroupIdentifier) *VpcEndpoint {
	s.Groups = v
	return s
}

// SetNetworkInterfaceIds sets the NetworkInterfaceIds field's value.
func (s *VpcEndpoint) SetNetworkInterfaceIds(v []*string) *VpcEndpoint {
	s.NetworkInterfaceIds = v
	return s
}

// SetPolicyDocument sets the PolicyDocument field's value.
func (s *VpcEndpoint) SetPolicyDocument(v string) *VpcEndpoint {
	s.PolicyDocument = &v
	return s
}

// SetPrivateDnsEnabled sets the PrivateDnsEnabled field's value.
func (s *VpcEndpoint) SetPrivateDnsEnabled(v bool) *VpcEndpoint {
	s.PrivateDnsEnabled = &v
	return s
}

// SetRouteTableIds sets the RouteTableIds field's value.
func (s *VpcEndpoint) SetRouteTableIds(v []*string) *VpcEndpoint {
	s.RouteTableIds = v
	return s
}

// SetServiceName sets the ServiceName field's value.
func (s *VpcEndpoint) SetServiceName(v string) *VpcEndpoint {
	s.ServiceName = &v
	return s
}

// SetState sets the State field's value.
func (s *VpcEndpoint) SetState(v string) *VpcEndpoint {
	s.State = &v
	return s
}

// SetSubnetIds sets the SubnetIds field's value.
func (s *VpcEndpoint) SetSubnetIds(v []*string) *VpcEndpoint {
	s.SubnetIds = v
	return s
}

// SetVpcEndpointId sets the VpcEndpointId field's value.
func (s *VpcEndpoint) SetVpcEndpointId(v string) *VpcEndpoint {
	s.VpcEndpointId = &v
	return s
}

// SetVpcEndpointType sets the VpcEndpointType field's value.
func (s *VpcEndpoint) SetVpcEndpointType(v string) *VpcEndpoint {
	s.VpcEndpointType = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *VpcEndpoint) SetVpcId(v string) *VpcEndpoint {
	s.VpcId = &v
	return s
}

// Describes a VPC endpoint connection to a service.
type VpcEndpointConnection struct {
	_ struct{} `type:"structure"`

	// The date and time the VPC endpoint was created.
	CreationTimestamp *time.Time `locationName:"creationTimestamp" type:"timestamp"`

	// The ID of the service to which the endpoint is connected.
	ServiceId *string `locationName:"serviceId" type:"string"`

	// The ID of the VPC endpoint.
	VpcEndpointId *string `locationName:"vpcEndpointId" type:"string"`

	// The AWS account ID of the owner of the VPC endpoint.
	VpcEndpointOwner *string `locationName:"vpcEndpointOwner" type:"string"`

	// The state of the VPC endpoint.
	VpcEndpointState *string `locationName:"vpcEndpointState" type:"string" enum:"State"`
}

// String returns the string representation
func (s VpcEndpointConnection) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcEndpointConnection) GoString() string {
	return s.String()
}

// SetCreationTimestamp sets the CreationTimestamp field's value.
func (s *VpcEndpointConnection) SetCreationTimestamp(v time.Time) *VpcEndpointConnection {
	s.CreationTimestamp = &v
	return s
}

// SetServiceId sets the ServiceId field's value.
func (s *VpcEndpointConnection) SetServiceId(v string) *VpcEndpointConnection {
	s.ServiceId = &v
	return s
}

// SetVpcEndpointId sets the VpcEndpointId field's value.
func (s *VpcEndpointConnection) SetVpcEndpointId(v string) *VpcEndpointConnection {
	s.VpcEndpointId = &v
	return s
}

// SetVpcEndpointOwner sets the VpcEndpointOwner field's value.
func (s *VpcEndpointConnection) SetVpcEndpointOwner(v string) *VpcEndpointConnection {
	s.VpcEndpointOwner = &v
	return s
}

// SetVpcEndpointState sets the VpcEndpointState field's value.
func (s *VpcEndpointConnection) SetVpcEndpointState(v string) *VpcEndpointConnection {
	s.VpcEndpointState = &v
	return s
}

// Describes an IPv6 CIDR block associated with a VPC.
type VpcIpv6CidrBlockAssociation struct {
	_ struct{} `type:"structure"`

	// The association ID for the IPv6 CIDR block.
	AssociationId *string `locationName:"associationId" type:"string"`

	// The IPv6 CIDR block.
	Ipv6CidrBlock *string `locationName:"ipv6CidrBlock" type:"string"`

	// Information about the state of the CIDR block.
	Ipv6CidrBlockState *VpcCidrBlockState `locationName:"ipv6CidrBlockState" type:"structure"`
}

// String returns the string representation
func (s VpcIpv6CidrBlockAssociation) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcIpv6CidrBlockAssociation) GoString() string {
	return s.String()
}

// SetAssociationId sets the AssociationId field's value.
func (s *VpcIpv6CidrBlockAssociation) SetAssociationId(v string) *VpcIpv6CidrBlockAssociation {
	s.AssociationId = &v
	return s
}

// SetIpv6CidrBlock sets the Ipv6CidrBlock field's value.
func (s *VpcIpv6CidrBlockAssociation) SetIpv6CidrBlock(v string) *VpcIpv6CidrBlockAssociation {
	s.Ipv6CidrBlock = &v
	return s
}

// SetIpv6CidrBlockState sets the Ipv6CidrBlockState field's value.
func (s *VpcIpv6CidrBlockAssociation) SetIpv6CidrBlockState(v *VpcCidrBlockState) *VpcIpv6CidrBlockAssociation {
	s.Ipv6CidrBlockState = v
	return s
}

// Describes a VPC peering connection.
type VpcPeeringConnection struct {
	_ struct{} `type:"structure"`

	// Information about the accepter VPC. CIDR block information is only returned
	// when describing an active VPC peering connection.
	AccepterVpcInfo *VpcPeeringConnectionVpcInfo `locationName:"accepterVpcInfo" type:"structure"`

	// The time that an unaccepted VPC peering connection will expire.
	ExpirationTime *time.Time `locationName:"expirationTime" type:"timestamp"`

	// Information about the requester VPC. CIDR block information is only returned
	// when describing an active VPC peering connection.
	RequesterVpcInfo *VpcPeeringConnectionVpcInfo `locationName:"requesterVpcInfo" type:"structure"`

	// The status of the VPC peering connection.
	Status *VpcPeeringConnectionStateReason `locationName:"status" type:"structure"`

	// Any tags assigned to the resource.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the VPC peering connection.
	VpcPeeringConnectionId *string `locationName:"vpcPeeringConnectionId" type:"string"`
}

// String returns the string representation
func (s VpcPeeringConnection) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcPeeringConnection) GoString() string {
	return s.String()
}

// SetAccepterVpcInfo sets the AccepterVpcInfo field's value.
func (s *VpcPeeringConnection) SetAccepterVpcInfo(v *VpcPeeringConnectionVpcInfo) *VpcPeeringConnection {
	s.AccepterVpcInfo = v
	return s
}

// SetExpirationTime sets the ExpirationTime field's value.
func (s *VpcPeeringConnection) SetExpirationTime(v time.Time) *VpcPeeringConnection {
	s.ExpirationTime = &v
	return s
}

// SetRequesterVpcInfo sets the RequesterVpcInfo field's value.
func (s *VpcPeeringConnection) SetRequesterVpcInfo(v *VpcPeeringConnectionVpcInfo) *VpcPeeringConnection {
	s.RequesterVpcInfo = v
	return s
}

// SetStatus sets the Status field's value.
func (s *VpcPeeringConnection) SetStatus(v *VpcPeeringConnectionStateReason) *VpcPeeringConnection {
	s.Status = v
	return s
}

// SetTags sets the Tags field's value.
func (s *VpcPeeringConnection) SetTags(v []*Tag) *VpcPeeringConnection {
	s.Tags = v
	return s
}

// SetVpcPeeringConnectionId sets the VpcPeeringConnectionId field's value.
func (s *VpcPeeringConnection) SetVpcPeeringConnectionId(v string) *VpcPeeringConnection {
	s.VpcPeeringConnectionId = &v
	return s
}

// Describes the VPC peering connection options.
type VpcPeeringConnectionOptionsDescription struct {
	_ struct{} `type:"structure"`

	// Indicates whether a local VPC can resolve public DNS hostnames to private
	// IP addresses when queried from instances in a peer VPC.
	AllowDnsResolutionFromRemoteVpc *bool `locationName:"allowDnsResolutionFromRemoteVpc" type:"boolean"`

	// Indicates whether a local ClassicLink connection can communicate with the
	// peer VPC over the VPC peering connection.
	AllowEgressFromLocalClassicLinkToRemoteVpc *bool `locationName:"allowEgressFromLocalClassicLinkToRemoteVpc" type:"boolean"`

	// Indicates whether a local VPC can communicate with a ClassicLink connection
	// in the peer VPC over the VPC peering connection.
	AllowEgressFromLocalVpcToRemoteClassicLink *bool `locationName:"allowEgressFromLocalVpcToRemoteClassicLink" type:"boolean"`
}

// String returns the string representation
func (s VpcPeeringConnectionOptionsDescription) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcPeeringConnectionOptionsDescription) GoString() string {
	return s.String()
}

// SetAllowDnsResolutionFromRemoteVpc sets the AllowDnsResolutionFromRemoteVpc field's value.
func (s *VpcPeeringConnectionOptionsDescription) SetAllowDnsResolutionFromRemoteVpc(v bool) *VpcPeeringConnectionOptionsDescription {
	s.AllowDnsResolutionFromRemoteVpc = &v
	return s
}

// SetAllowEgressFromLocalClassicLinkToRemoteVpc sets the AllowEgressFromLocalClassicLinkToRemoteVpc field's value.
func (s *VpcPeeringConnectionOptionsDescription) SetAllowEgressFromLocalClassicLinkToRemoteVpc(v bool) *VpcPeeringConnectionOptionsDescription {
	s.AllowEgressFromLocalClassicLinkToRemoteVpc = &v
	return s
}

// SetAllowEgressFromLocalVpcToRemoteClassicLink sets the AllowEgressFromLocalVpcToRemoteClassicLink field's value.
func (s *VpcPeeringConnectionOptionsDescription) SetAllowEgressFromLocalVpcToRemoteClassicLink(v bool) *VpcPeeringConnectionOptionsDescription {
	s.AllowEgressFromLocalVpcToRemoteClassicLink = &v
	return s
}

// Describes the status of a VPC peering connection.
type VpcPeeringConnectionStateReason struct {
	_ struct{} `type:"structure"`

	// The status of the VPC peering connection.
	Code *string `locationName:"code" type:"string" enum:"VpcPeeringConnectionStateReasonCode"`

	// A message that provides more information about the status, if applicable.
	Message *string `locationName:"message" type:"string"`
}

// String returns the string representation
func (s VpcPeeringConnectionStateReason) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcPeeringConnectionStateReason) GoString() string {
	return s.String()
}

// SetCode sets the Code field's value.
func (s *VpcPeeringConnectionStateReason) SetCode(v string) *VpcPeeringConnectionStateReason {
	s.Code = &v
	return s
}

// SetMessage sets the Message field's value.
func (s *VpcPeeringConnectionStateReason) SetMessage(v string) *VpcPeeringConnectionStateReason {
	s.Message = &v
	return s
}

// Describes a VPC in a VPC peering connection.
type VpcPeeringConnectionVpcInfo struct {
	_ struct{} `type:"structure"`

	// The IPv4 CIDR block for the VPC.
	CidrBlock *string `locationName:"cidrBlock" type:"string"`

	// Information about the IPv4 CIDR blocks for the VPC.
	CidrBlockSet []*CidrBlock `locationName:"cidrBlockSet" locationNameList:"item" type:"list"`

	// The IPv6 CIDR block for the VPC.
	Ipv6CidrBlockSet []*Ipv6CidrBlock `locationName:"ipv6CidrBlockSet" locationNameList:"item" type:"list"`

	// The AWS account ID of the VPC owner.
	OwnerId *string `locationName:"ownerId" type:"string"`

	// Information about the VPC peering connection options for the accepter or
	// requester VPC.
	PeeringOptions *VpcPeeringConnectionOptionsDescription `locationName:"peeringOptions" type:"structure"`

	// The region in which the VPC is located.
	Region *string `locationName:"region" type:"string"`

	// The ID of the VPC.
	VpcId *string `locationName:"vpcId" type:"string"`
}

// String returns the string representation
func (s VpcPeeringConnectionVpcInfo) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpcPeeringConnectionVpcInfo) GoString() string {
	return s.String()
}

// SetCidrBlock sets the CidrBlock field's value.
func (s *VpcPeeringConnectionVpcInfo) SetCidrBlock(v string) *VpcPeeringConnectionVpcInfo {
	s.CidrBlock = &v
	return s
}

// SetCidrBlockSet sets the CidrBlockSet field's value.
func (s *VpcPeeringConnectionVpcInfo) SetCidrBlockSet(v []*CidrBlock) *VpcPeeringConnectionVpcInfo {
	s.CidrBlockSet = v
	return s
}

// SetIpv6CidrBlockSet sets the Ipv6CidrBlockSet field's value.
func (s *VpcPeeringConnectionVpcInfo) SetIpv6CidrBlockSet(v []*Ipv6CidrBlock) *VpcPeeringConnectionVpcInfo {
	s.Ipv6CidrBlockSet = v
	return s
}

// SetOwnerId sets the OwnerId field's value.
func (s *VpcPeeringConnectionVpcInfo) SetOwnerId(v string) *VpcPeeringConnectionVpcInfo {
	s.OwnerId = &v
	return s
}

// SetPeeringOptions sets the PeeringOptions field's value.
func (s *VpcPeeringConnectionVpcInfo) SetPeeringOptions(v *VpcPeeringConnectionOptionsDescription) *VpcPeeringConnectionVpcInfo {
	s.PeeringOptions = v
	return s
}

// SetRegion sets the Region field's value.
func (s *VpcPeeringConnectionVpcInfo) SetRegion(v string) *VpcPeeringConnectionVpcInfo {
	s.Region = &v
	return s
}

// SetVpcId sets the VpcId field's value.
func (s *VpcPeeringConnectionVpcInfo) SetVpcId(v string) *VpcPeeringConnectionVpcInfo {
	s.VpcId = &v
	return s
}

// Describes a VPN connection.
type VpnConnection struct {
	_ struct{} `type:"structure"`

	// The category of the VPN connection. A value of VPN indicates an AWS VPN connection.
	// A value of VPN-Classic indicates an AWS Classic VPN connection.
	Category *string `locationName:"category" type:"string"`

	// The configuration information for the VPN connection's customer gateway (in
	// the native XML format). This element is always present in the CreateVpnConnection
	// response; however, it's present in the DescribeVpnConnections response only
	// if the VPN connection is in the pending or available state.
	CustomerGatewayConfiguration *string `locationName:"customerGatewayConfiguration" type:"string"`

	// The ID of the customer gateway at your end of the VPN connection.
	CustomerGatewayId *string `locationName:"customerGatewayId" type:"string"`

	// The VPN connection options.
	Options *VpnConnectionOptions `locationName:"options" type:"structure"`

	// The static routes associated with the VPN connection.
	Routes []*VpnStaticRoute `locationName:"routes" locationNameList:"item" type:"list"`

	// The current state of the VPN connection.
	State *string `locationName:"state" type:"string" enum:"VpnState"`

	// Any tags assigned to the VPN connection.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The ID of the transit gateway associated with the VPN connection.
	TransitGatewayId *string `locationName:"transitGatewayId" type:"string"`

	// The type of VPN connection.
	Type *string `locationName:"type" type:"string" enum:"GatewayType"`

	// Information about the VPN tunnel.
	VgwTelemetry []*VgwTelemetry `locationName:"vgwTelemetry" locationNameList:"item" type:"list"`

	// The ID of the VPN connection.
	VpnConnectionId *string `locationName:"vpnConnectionId" type:"string"`

	// The ID of the virtual private gateway at the AWS side of the VPN connection.
	VpnGatewayId *string `locationName:"vpnGatewayId" type:"string"`
}

// String returns the string representation
func (s VpnConnection) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpnConnection) GoString() string {
	return s.String()
}

// SetCategory sets the Category field's value.
func (s *VpnConnection) SetCategory(v string) *VpnConnection {
	s.Category = &v
	return s
}

// SetCustomerGatewayConfiguration sets the CustomerGatewayConfiguration field's value.
func (s *VpnConnection) SetCustomerGatewayConfiguration(v string) *VpnConnection {
	s.CustomerGatewayConfiguration = &v
	return s
}

// SetCustomerGatewayId sets the CustomerGatewayId field's value.
func (s *VpnConnection) SetCustomerGatewayId(v string) *VpnConnection {
	s.CustomerGatewayId = &v
	return s
}

// SetOptions sets the Options field's value.
func (s *VpnConnection) SetOptions(v *VpnConnectionOptions) *VpnConnection {
	s.Options = v
	return s
}

// SetRoutes sets the Routes field's value.
func (s *VpnConnection) SetRoutes(v []*VpnStaticRoute) *VpnConnection {
	s.Routes = v
	return s
}

// SetState sets the State field's value.
func (s *VpnConnection) SetState(v string) *VpnConnection {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *VpnConnection) SetTags(v []*Tag) *VpnConnection {
	s.Tags = v
	return s
}

// SetTransitGatewayId sets the TransitGatewayId field's value.
func (s *VpnConnection) SetTransitGatewayId(v string) *VpnConnection {
	s.TransitGatewayId = &v
	return s
}

// SetType sets the Type field's value.
func (s *VpnConnection) SetType(v string) *VpnConnection {
	s.Type = &v
	return s
}

// SetVgwTelemetry sets the VgwTelemetry field's value.
func (s *VpnConnection) SetVgwTelemetry(v []*VgwTelemetry) *VpnConnection {
	s.VgwTelemetry = v
	return s
}

// SetVpnConnectionId sets the VpnConnectionId field's value.
func (s *VpnConnection) SetVpnConnectionId(v string) *VpnConnection {
	s.VpnConnectionId = &v
	return s
}

// SetVpnGatewayId sets the VpnGatewayId field's value.
func (s *VpnConnection) SetVpnGatewayId(v string) *VpnConnection {
	s.VpnGatewayId = &v
	return s
}

// Describes VPN connection options.
type VpnConnectionOptions struct {
	_ struct{} `type:"structure"`

	// Indicates whether the VPN connection uses static routes only. Static routes
	// must be used for devices that don't support BGP.
	StaticRoutesOnly *bool `locationName:"staticRoutesOnly" type:"boolean"`
}

// String returns the string representation
func (s VpnConnectionOptions) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpnConnectionOptions) GoString() string {
	return s.String()
}

// SetStaticRoutesOnly sets the StaticRoutesOnly field's value.
func (s *VpnConnectionOptions) SetStaticRoutesOnly(v bool) *VpnConnectionOptions {
	s.StaticRoutesOnly = &v
	return s
}

// Describes VPN connection options.
type VpnConnectionOptionsSpecification struct {
	_ struct{} `type:"structure"`

	// Indicate whether the VPN connection uses static routes only. If you are creating
	// a VPN connection for a device that does not support BGP, you must specify
	// true. Use CreateVpnConnectionRoute to create a static route.
	//
	// Default: false
	StaticRoutesOnly *bool `locationName:"staticRoutesOnly" type:"boolean"`

	// The tunnel options for the VPN connection.
	TunnelOptions []*VpnTunnelOptionsSpecification `locationNameList:"item" type:"list"`
}

// String returns the string representation
func (s VpnConnectionOptionsSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpnConnectionOptionsSpecification) GoString() string {
	return s.String()
}

// SetStaticRoutesOnly sets the StaticRoutesOnly field's value.
func (s *VpnConnectionOptionsSpecification) SetStaticRoutesOnly(v bool) *VpnConnectionOptionsSpecification {
	s.StaticRoutesOnly = &v
	return s
}

// SetTunnelOptions sets the TunnelOptions field's value.
func (s *VpnConnectionOptionsSpecification) SetTunnelOptions(v []*VpnTunnelOptionsSpecification) *VpnConnectionOptionsSpecification {
	s.TunnelOptions = v
	return s
}

// Describes a virtual private gateway.
type VpnGateway struct {
	_ struct{} `type:"structure"`

	// The private Autonomous System Number (ASN) for the Amazon side of a BGP session.
	AmazonSideAsn *int64 `locationName:"amazonSideAsn" type:"long"`

	// The Availability Zone where the virtual private gateway was created, if applicable.
	// This field may be empty or not returned.
	AvailabilityZone *string `locationName:"availabilityZone" type:"string"`

	// The current state of the virtual private gateway.
	State *string `locationName:"state" type:"string" enum:"VpnState"`

	// Any tags assigned to the virtual private gateway.
	Tags []*Tag `locationName:"tagSet" locationNameList:"item" type:"list"`

	// The type of VPN connection the virtual private gateway supports.
	Type *string `locationName:"type" type:"string" enum:"GatewayType"`

	// Any VPCs attached to the virtual private gateway.
	VpcAttachments []*VpcAttachment `locationName:"attachments" locationNameList:"item" type:"list"`

	// The ID of the virtual private gateway.
	VpnGatewayId *string `locationName:"vpnGatewayId" type:"string"`
}

// String returns the string representation
func (s VpnGateway) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpnGateway) GoString() string {
	return s.String()
}

// SetAmazonSideAsn sets the AmazonSideAsn field's value.
func (s *VpnGateway) SetAmazonSideAsn(v int64) *VpnGateway {
	s.AmazonSideAsn = &v
	return s
}

// SetAvailabilityZone sets the AvailabilityZone field's value.
func (s *VpnGateway) SetAvailabilityZone(v string) *VpnGateway {
	s.AvailabilityZone = &v
	return s
}

// SetState sets the State field's value.
func (s *VpnGateway) SetState(v string) *VpnGateway {
	s.State = &v
	return s
}

// SetTags sets the Tags field's value.
func (s *VpnGateway) SetTags(v []*Tag) *VpnGateway {
	s.Tags = v
	return s
}

// SetType sets the Type field's value.
func (s *VpnGateway) SetType(v string) *VpnGateway {
	s.Type = &v
	return s
}

// SetVpcAttachments sets the VpcAttachments field's value.
func (s *VpnGateway) SetVpcAttachments(v []*VpcAttachment) *VpnGateway {
	s.VpcAttachments = v
	return s
}

// SetVpnGatewayId sets the VpnGatewayId field's value.
func (s *VpnGateway) SetVpnGatewayId(v string) *VpnGateway {
	s.VpnGatewayId = &v
	return s
}

// Describes a static route for a VPN connection.
type VpnStaticRoute struct {
	_ struct{} `type:"structure"`

	// The CIDR block associated with the local subnet of the customer data center.
	DestinationCidrBlock *string `locationName:"destinationCidrBlock" type:"string"`

	// Indicates how the routes were provided.
	Source *string `locationName:"source" type:"string" enum:"VpnStaticRouteSource"`

	// The current state of the static route.
	State *string `locationName:"state" type:"string" enum:"VpnState"`
}

// String returns the string representation
func (s VpnStaticRoute) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpnStaticRoute) GoString() string {
	return s.String()
}

// SetDestinationCidrBlock sets the DestinationCidrBlock field's value.
func (s *VpnStaticRoute) SetDestinationCidrBlock(v string) *VpnStaticRoute {
	s.DestinationCidrBlock = &v
	return s
}

// SetSource sets the Source field's value.
func (s *VpnStaticRoute) SetSource(v string) *VpnStaticRoute {
	s.Source = &v
	return s
}

// SetState sets the State field's value.
func (s *VpnStaticRoute) SetState(v string) *VpnStaticRoute {
	s.State = &v
	return s
}

// The tunnel options for a VPN connection.
type VpnTunnelOptionsSpecification struct {
	_ struct{} `type:"structure"`

	// The pre-shared key (PSK) to establish initial authentication between the
	// virtual private gateway and customer gateway.
	//
	// Constraints: Allowed characters are alphanumeric characters and ._. Must
	// be between 8 and 64 characters in length and cannot start with zero (0).
	PreSharedKey *string `type:"string"`

	// The range of inside IP addresses for the tunnel. Any specified CIDR blocks
	// must be unique across all VPN connections that use the same virtual private
	// gateway.
	//
	// Constraints: A size /30 CIDR block from the 169.254.0.0/16 range. The following
	// CIDR blocks are reserved and cannot be used:
	//
	//    * 169.254.0.0/30
	//
	//    * 169.254.1.0/30
	//
	//    * 169.254.2.0/30
	//
	//    * 169.254.3.0/30
	//
	//    * 169.254.4.0/30
	//
	//    * 169.254.5.0/30
	//
	//    * 169.254.169.252/30
	TunnelInsideCidr *string `type:"string"`
}

// String returns the string representation
func (s VpnTunnelOptionsSpecification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s VpnTunnelOptionsSpecification) GoString() string {
	return s.String()
}

// SetPreSharedKey sets the PreSharedKey field's value.
func (s *VpnTunnelOptionsSpecification) SetPreSharedKey(v string) *VpnTunnelOptionsSpecification {
	s.PreSharedKey = &v
	return s
}

// SetTunnelInsideCidr sets the TunnelInsideCidr field's value.
func (s *VpnTunnelOptionsSpecification) SetTunnelInsideCidr(v string) *VpnTunnelOptionsSpecification {
	s.TunnelInsideCidr = &v
	return s
}

type WithdrawByoipCidrInput struct {
	_ struct{} `type:"structure"`

	// The public IPv4 address range, in CIDR notation.
	//
	// Cidr is a required field
	Cidr *string `type:"string" required:"true"`

	// Checks whether you have the required permissions for the action, without
	// actually making the request, and provides an error response. If you have
	// the required permissions, the error response is DryRunOperation. Otherwise,
	// it is UnauthorizedOperation.
	DryRun *bool `type:"boolean"`
}

// String returns the string representation
func (s WithdrawByoipCidrInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s WithdrawByoipCidrInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *WithdrawByoipCidrInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "WithdrawByoipCidrInput"}
	if s.Cidr == nil {
		invalidParams.Add(request.NewErrParamRequired("Cidr"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCidr sets the Cidr field's value.
func (s *WithdrawByoipCidrInput) SetCidr(v string) *WithdrawByoipCidrInput {
	s.Cidr = &v
	return s
}

// SetDryRun sets the DryRun field's value.
func (s *WithdrawByoipCidrInput) SetDryRun(v bool) *WithdrawByoipCidrInput {
	s.DryRun = &v
	return s
}

type WithdrawByoipCidrOutput struct {
	_ struct{} `type:"structure"`

	// Information about the address pool.
	ByoipCidr *ByoipCidr `locationName:"byoipCidr" type:"structure"`
}

// String returns the string representation
func (s WithdrawByoipCidrOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s WithdrawByoipCidrOutput) GoString() string {
	return s.String()
}

// SetByoipCidr sets the ByoipCidr field's value.
func (s *WithdrawByoipCidrOutput) SetByoipCidr(v *ByoipCidr) *WithdrawByoipCidrOutput {
	s.ByoipCidr = v
	return s
}

const (
	// AccountAttributeNameSupportedPlatforms is a AccountAttributeName enum value
	AccountAttributeNameSupportedPlatforms = "supported-platforms"

	// AccountAttributeNameDefaultVpc is a AccountAttributeName enum value
	AccountAttributeNameDefaultVpc = "default-vpc"
)

const (
	// ActivityStatusError is a ActivityStatus enum value
	ActivityStatusError = "error"

	// ActivityStatusPendingFulfillment is a ActivityStatus enum value
	ActivityStatusPendingFulfillment = "pending_fulfillment"

	// ActivityStatusPendingTermination is a ActivityStatus enum value
	ActivityStatusPendingTermination = "pending_termination"

	// ActivityStatusFulfilled is a ActivityStatus enum value
	ActivityStatusFulfilled = "fulfilled"
)

const (
	// AffinityDefault is a Affinity enum value
	AffinityDefault = "default"

	// AffinityHost is a Affinity enum value
	AffinityHost = "host"
)

const (
	// AllocationStateAvailable is a AllocationState enum value
	AllocationStateAvailable = "available"

	// AllocationStateUnderAssessment is a AllocationState enum value
	AllocationStateUnderAssessment = "under-assessment"

	// AllocationStatePermanentFailure is a AllocationState enum value
	AllocationStatePermanentFailure = "permanent-failure"

	// AllocationStateReleased is a AllocationState enum value
	AllocationStateReleased = "released"

	// AllocationStateReleasedPermanentFailure is a AllocationState enum value
	AllocationStateReleasedPermanentFailure = "released-permanent-failure"
)

const (
	// AllocationStrategyLowestPrice is a AllocationStrategy enum value
	AllocationStrategyLowestPrice = "lowestPrice"

	// AllocationStrategyDiversified is a AllocationStrategy enum value
	AllocationStrategyDiversified = "diversified"
)

const (
	// ArchitectureValuesI386 is a ArchitectureValues enum value
	ArchitectureValuesI386 = "i386"

	// ArchitectureValuesX8664 is a ArchitectureValues enum value
	ArchitectureValuesX8664 = "x86_64"

	// ArchitectureValuesArm64 is a ArchitectureValues enum value
	ArchitectureValuesArm64 = "arm64"
)

const (
	// AssociatedNetworkTypeVpc is a AssociatedNetworkType enum value
	AssociatedNetworkTypeVpc = "vpc"
)

const (
	// AssociationStatusCodeAssociating is a AssociationStatusCode enum value
	AssociationStatusCodeAssociating = "associating"

	// AssociationStatusCodeAssociated is a AssociationStatusCode enum value
	AssociationStatusCodeAssociated = "associated"

	// AssociationStatusCodeAssociationFailed is a AssociationStatusCode enum value
	AssociationStatusCodeAssociationFailed = "association-failed"

	// AssociationStatusCodeDisassociating is a AssociationStatusCode enum value
	AssociationStatusCodeDisassociating = "disassociating"

	// AssociationStatusCodeDisassociated is a AssociationStatusCode enum value
	AssociationStatusCodeDisassociated = "disassociated"
)

const (
	// AttachmentStatusAttaching is a AttachmentStatus enum value
	AttachmentStatusAttaching = "attaching"

	// AttachmentStatusAttached is a AttachmentStatus enum value
	AttachmentStatusAttached = "attached"

	// AttachmentStatusDetaching is a AttachmentStatus enum value
	AttachmentStatusDetaching = "detaching"

	// AttachmentStatusDetached is a AttachmentStatus enum value
	AttachmentStatusDetached = "detached"
)

const (
	// AutoAcceptSharedAttachmentsValueEnable is a AutoAcceptSharedAttachmentsValue enum value
	AutoAcceptSharedAttachmentsValueEnable = "enable"

	// AutoAcceptSharedAttachmentsValueDisable is a AutoAcceptSharedAttachmentsValue enum value
	AutoAcceptSharedAttachmentsValueDisable = "disable"
)

const (
	// AutoPlacementOn is a AutoPlacement enum value
	AutoPlacementOn = "on"

	// AutoPlacementOff is a AutoPlacement enum value
	AutoPlacementOff = "off"
)

const (
	// AvailabilityZoneStateAvailable is a AvailabilityZoneState enum value
	AvailabilityZoneStateAvailable = "available"

	// AvailabilityZoneStateInformation is a AvailabilityZoneState enum value
	AvailabilityZoneStateInformation = "information"

	// AvailabilityZoneStateImpaired is a AvailabilityZoneState enum value
	AvailabilityZoneStateImpaired = "impaired"

	// AvailabilityZoneStateUnavailable is a AvailabilityZoneState enum value
	AvailabilityZoneStateUnavailable = "unavailable"
)

const (
	// BatchStateSubmitted is a BatchState enum value
	BatchStateSubmitted = "submitted"

	// BatchStateActive is a BatchState enum value
	BatchStateActive = "active"

	// BatchStateCancelled is a BatchState enum value
	BatchStateCancelled = "cancelled"

	// BatchStateFailed is a BatchState enum value
	BatchStateFailed = "failed"

	// BatchStateCancelledRunning is a BatchState enum value
	BatchStateCancelledRunning = "cancelled_running"

	// BatchStateCancelledTerminating is a BatchState enum value
	BatchStateCancelledTerminating = "cancelled_terminating"

	// BatchStateModifying is a BatchState enum value
	BatchStateModifying = "modifying"
)

const (
	// BundleTaskStatePending is a BundleTaskState enum value
	BundleTaskStatePending = "pending"

	// BundleTaskStateWaitingForShutdown is a BundleTaskState enum value
	BundleTaskStateWaitingForShutdown = "waiting-for-shutdown"

	// BundleTaskStateBundling is a BundleTaskState enum value
	BundleTaskStateBundling = "bundling"

	// BundleTaskStateStoring is a BundleTaskState enum value
	BundleTaskStateStoring = "storing"

	// BundleTaskStateCancelling is a BundleTaskState enum value
	BundleTaskStateCancelling = "cancelling"

	// BundleTaskStateComplete is a BundleTaskState enum value
	BundleTaskStateComplete = "complete"

	// BundleTaskStateFailed is a BundleTaskState enum value
	BundleTaskStateFailed = "failed"
)

const (
	// ByoipCidrStateAdvertised is a ByoipCidrState enum value
	ByoipCidrStateAdvertised = "advertised"

	// ByoipCidrStateDeprovisioned is a ByoipCidrState enum value
	ByoipCidrStateDeprovisioned = "deprovisioned"

	// ByoipCidrStateFailedDeprovision is a ByoipCidrState enum value
	ByoipCidrStateFailedDeprovision = "failed-deprovision"

	// ByoipCidrStateFailedProvision is a ByoipCidrState enum value
	ByoipCidrStateFailedProvision = "failed-provision"

	// ByoipCidrStatePendingDeprovision is a ByoipCidrState enum value
	ByoipCidrStatePendingDeprovision = "pending-deprovision"

	// ByoipCidrStatePendingProvision is a ByoipCidrState enum value
	ByoipCidrStatePendingProvision = "pending-provision"

	// ByoipCidrStateProvisioned is a ByoipCidrState enum value
	ByoipCidrStateProvisioned = "provisioned"
)

const (
	// CancelBatchErrorCodeFleetRequestIdDoesNotExist is a CancelBatchErrorCode enum value
	CancelBatchErrorCodeFleetRequestIdDoesNotExist = "fleetRequestIdDoesNotExist"

	// CancelBatchErrorCodeFleetRequestIdMalformed is a CancelBatchErrorCode enum value
	CancelBatchErrorCodeFleetRequestIdMalformed = "fleetRequestIdMalformed"

	// CancelBatchErrorCodeFleetRequestNotInCancellableState is a CancelBatchErrorCode enum value
	CancelBatchErrorCodeFleetRequestNotInCancellableState = "fleetRequestNotInCancellableState"

	// CancelBatchErrorCodeUnexpectedError is a CancelBatchErrorCode enum value
	CancelBatchErrorCodeUnexpectedError = "unexpectedError"
)

const (
	// CancelSpotInstanceRequestStateActive is a CancelSpotInstanceRequestState enum value
	CancelSpotInstanceRequestStateActive = "active"

	// CancelSpotInstanceRequestStateOpen is a CancelSpotInstanceRequestState enum value
	CancelSpotInstanceRequestStateOpen = "open"

	// CancelSpotInstanceRequestStateClosed is a CancelSpotInstanceRequestState enum value
	CancelSpotInstanceRequestStateClosed = "closed"

	// CancelSpotInstanceRequestStateCancelled is a CancelSpotInstanceRequestState enum value
	CancelSpotInstanceRequestStateCancelled = "cancelled"

	// CancelSpotInstanceRequestStateCompleted is a CancelSpotInstanceRequestState enum value
	CancelSpotInstanceRequestStateCompleted = "completed"
)

const (
	// CapacityReservationInstancePlatformLinuxUnix is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformLinuxUnix = "Linux/UNIX"

	// CapacityReservationInstancePlatformRedHatEnterpriseLinux is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformRedHatEnterpriseLinux = "Red Hat Enterprise Linux"

	// CapacityReservationInstancePlatformSuselinux is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformSuselinux = "SUSE Linux"

	// CapacityReservationInstancePlatformWindows is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformWindows = "Windows"

	// CapacityReservationInstancePlatformWindowswithSqlserver is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformWindowswithSqlserver = "Windows with SQL Server"

	// CapacityReservationInstancePlatformWindowswithSqlserverEnterprise is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformWindowswithSqlserverEnterprise = "Windows with SQL Server Enterprise"

	// CapacityReservationInstancePlatformWindowswithSqlserverStandard is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformWindowswithSqlserverStandard = "Windows with SQL Server Standard"

	// CapacityReservationInstancePlatformWindowswithSqlserverWeb is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformWindowswithSqlserverWeb = "Windows with SQL Server Web"

	// CapacityReservationInstancePlatformLinuxwithSqlserverStandard is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformLinuxwithSqlserverStandard = "Linux with SQL Server Standard"

	// CapacityReservationInstancePlatformLinuxwithSqlserverWeb is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformLinuxwithSqlserverWeb = "Linux with SQL Server Web"

	// CapacityReservationInstancePlatformLinuxwithSqlserverEnterprise is a CapacityReservationInstancePlatform enum value
	CapacityReservationInstancePlatformLinuxwithSqlserverEnterprise = "Linux with SQL Server Enterprise"
)

const (
	// CapacityReservationPreferenceOpen is a CapacityReservationPreference enum value
	CapacityReservationPreferenceOpen = "open"

	// CapacityReservationPreferenceNone is a CapacityReservationPreference enum value
	CapacityReservationPreferenceNone = "none"
)

const (
	// CapacityReservationStateActive is a CapacityReservationState enum value
	CapacityReservationStateActive = "active"

	// CapacityReservationStateExpired is a CapacityReservationState enum value
	CapacityReservationStateExpired = "expired"

	// CapacityReservationStateCancelled is a CapacityReservationState enum value
	CapacityReservationStateCancelled = "cancelled"

	// CapacityReservationStatePending is a CapacityReservationState enum value
	CapacityReservationStatePending = "pending"

	// CapacityReservationStateFailed is a CapacityReservationState enum value
	CapacityReservationStateFailed = "failed"
)

const (
	// CapacityReservationTenancyDefault is a CapacityReservationTenancy enum value
	CapacityReservationTenancyDefault = "default"

	// CapacityReservationTenancyDedicated is a CapacityReservationTenancy enum value
	CapacityReservationTenancyDedicated = "dedicated"
)

const (
	// ClientCertificateRevocationListStatusCodePending is a ClientCertificateRevocationListStatusCode enum value
	ClientCertificateRevocationListStatusCodePending = "pending"

	// ClientCertificateRevocationListStatusCodeActive is a ClientCertificateRevocationListStatusCode enum value
	ClientCertificateRevocationListStatusCodeActive = "active"
)

const (
	// ClientVpnAuthenticationTypeCertificateAuthentication is a ClientVpnAuthenticationType enum value
	ClientVpnAuthenticationTypeCertificateAuthentication = "certificate-authentication"

	// ClientVpnAuthenticationTypeDirectoryServiceAuthentication is a ClientVpnAuthenticationType enum value
	ClientVpnAuthenticationTypeDirectoryServiceAuthentication = "directory-service-authentication"
)

const (
	// ClientVpnAuthorizationRuleStatusCodeAuthorizing is a ClientVpnAuthorizationRuleStatusCode enum value
	ClientVpnAuthorizationRuleStatusCodeAuthorizing = "authorizing"

	// ClientVpnAuthorizationRuleStatusCodeActive is a ClientVpnAuthorizationRuleStatusCode enum value
	ClientVpnAuthorizationRuleStatusCodeActive = "active"

	// ClientVpnAuthorizationRuleStatusCodeFailed is a ClientVpnAuthorizationRuleStatusCode enum value
	ClientVpnAuthorizationRuleStatusCodeFailed = "failed"

	// ClientVpnAuthorizationRuleStatusCodeRevoking is a ClientVpnAuthorizationRuleStatusCode enum value
	ClientVpnAuthorizationRuleStatusCodeRevoking = "revoking"
)

const (
	// ClientVpnConnectionStatusCodeActive is a ClientVpnConnectionStatusCode enum value
	ClientVpnConnectionStatusCodeActive = "active"

	// ClientVpnConnectionStatusCodeFailedToTerminate is a ClientVpnConnectionStatusCode enum value
	ClientVpnConnectionStatusCodeFailedToTerminate = "failed-to-terminate"

	// ClientVpnConnectionStatusCodeTerminating is a ClientVpnConnectionStatusCode enum value
	ClientVpnConnectionStatusCodeTerminating = "terminating"

	// ClientVpnConnectionStatusCodeTerminated is a ClientVpnConnectionStatusCode enum value
	ClientVpnConnectionStatusCodeTerminated = "terminated"
)

const (
	// ClientVpnEndpointStatusCodePendingAssociate is a ClientVpnEndpointStatusCode enum value
	ClientVpnEndpointStatusCodePendingAssociate = "pending-associate"

	// ClientVpnEndpointStatusCodeAvailable is a ClientVpnEndpointStatusCode enum value
	ClientVpnEndpointStatusCodeAvailable = "available"

	// ClientVpnEndpointStatusCodeDeleting is a ClientVpnEndpointStatusCode enum value
	ClientVpnEndpointStatusCodeDeleting = "deleting"

	// ClientVpnEndpointStatusCodeDeleted is a ClientVpnEndpointStatusCode enum value
	ClientVpnEndpointStatusCodeDeleted = "deleted"
)

const (
	// ClientVpnRouteStatusCodeCreating is a ClientVpnRouteStatusCode enum value
	ClientVpnRouteStatusCodeCreating = "creating"

	// ClientVpnRouteStatusCodeActive is a ClientVpnRouteStatusCode enum value
	ClientVpnRouteStatusCodeActive = "active"

	// ClientVpnRouteStatusCodeFailed is a ClientVpnRouteStatusCode enum value
	ClientVpnRouteStatusCodeFailed = "failed"

	// ClientVpnRouteStatusCodeDeleting is a ClientVpnRouteStatusCode enum value
	ClientVpnRouteStatusCodeDeleting = "deleting"
)

const (
	// ConnectionNotificationStateEnabled is a ConnectionNotificationState enum value
	ConnectionNotificationStateEnabled = "Enabled"

	// ConnectionNotificationStateDisabled is a ConnectionNotificationState enum value
	ConnectionNotificationStateDisabled = "Disabled"
)

const (
	// ConnectionNotificationTypeTopic is a ConnectionNotificationType enum value
	ConnectionNotificationTypeTopic = "Topic"
)

const (
	// ContainerFormatOva is a ContainerFormat enum value
	ContainerFormatOva = "ova"
)

const (
	// ConversionTaskStateActive is a ConversionTaskState enum value
	ConversionTaskStateActive = "active"

	// ConversionTaskStateCancelling is a ConversionTaskState enum value
	ConversionTaskStateCancelling = "cancelling"

	// ConversionTaskStateCancelled is a ConversionTaskState enum value
	ConversionTaskStateCancelled = "cancelled"

	// ConversionTaskStateCompleted is a ConversionTaskState enum value
	ConversionTaskStateCompleted = "completed"
)

const (
	// CurrencyCodeValuesUsd is a CurrencyCodeValues enum value
	CurrencyCodeValuesUsd = "USD"
)

const (
	// DatafeedSubscriptionStateActive is a DatafeedSubscriptionState enum value
	DatafeedSubscriptionStateActive = "Active"

	// DatafeedSubscriptionStateInactive is a DatafeedSubscriptionState enum value
	DatafeedSubscriptionStateInactive = "Inactive"
)

const (
	// DefaultRouteTableAssociationValueEnable is a DefaultRouteTableAssociationValue enum value
	DefaultRouteTableAssociationValueEnable = "enable"

	// DefaultRouteTableAssociationValueDisable is a DefaultRouteTableAssociationValue enum value
	DefaultRouteTableAssociationValueDisable = "disable"
)

const (
	// DefaultRouteTablePropagationValueEnable is a DefaultRouteTablePropagationValue enum value
	DefaultRouteTablePropagationValueEnable = "enable"

	// DefaultRouteTablePropagationValueDisable is a DefaultRouteTablePropagationValue enum value
	DefaultRouteTablePropagationValueDisable = "disable"
)

const (
	// DefaultTargetCapacityTypeSpot is a DefaultTargetCapacityType enum value
	DefaultTargetCapacityTypeSpot = "spot"

	// DefaultTargetCapacityTypeOnDemand is a DefaultTargetCapacityType enum value
	DefaultTargetCapacityTypeOnDemand = "on-demand"
)

const (
	// DeleteFleetErrorCodeFleetIdDoesNotExist is a DeleteFleetErrorCode enum value
	DeleteFleetErrorCodeFleetIdDoesNotExist = "fleetIdDoesNotExist"

	// DeleteFleetErrorCodeFleetIdMalformed is a DeleteFleetErrorCode enum value
	DeleteFleetErrorCodeFleetIdMalformed = "fleetIdMalformed"

	// DeleteFleetErrorCodeFleetNotInDeletableState is a DeleteFleetErrorCode enum value
	DeleteFleetErrorCodeFleetNotInDeletableState = "fleetNotInDeletableState"

	// DeleteFleetErrorCodeUnexpectedError is a DeleteFleetErrorCode enum value
	DeleteFleetErrorCodeUnexpectedError = "unexpectedError"
)

const (
	// DeviceTypeEbs is a DeviceType enum value
	DeviceTypeEbs = "ebs"

	// DeviceTypeInstanceStore is a DeviceType enum value
	DeviceTypeInstanceStore = "instance-store"
)

const (
	// DiskImageFormatVmdk is a DiskImageFormat enum value
	DiskImageFormatVmdk = "VMDK"

	// DiskImageFormatRaw is a DiskImageFormat enum value
	DiskImageFormatRaw = "RAW"

	// DiskImageFormatVhd is a DiskImageFormat enum value
	DiskImageFormatVhd = "VHD"
)

const (
	// DnsSupportValueEnable is a DnsSupportValue enum value
	DnsSupportValueEnable = "enable"

	// DnsSupportValueDisable is a DnsSupportValue enum value
	DnsSupportValueDisable = "disable"
)

const (
	// DomainTypeVpc is a DomainType enum value
	DomainTypeVpc = "vpc"

	// DomainTypeStandard is a DomainType enum value
	DomainTypeStandard = "standard"
)

const (
	// ElasticGpuStateAttached is a ElasticGpuState enum value
	ElasticGpuStateAttached = "ATTACHED"
)

const (
	// ElasticGpuStatusOk is a ElasticGpuStatus enum value
	ElasticGpuStatusOk = "OK"

	// ElasticGpuStatusImpaired is a ElasticGpuStatus enum value
	ElasticGpuStatusImpaired = "IMPAIRED"
)

const (
	// EndDateTypeUnlimited is a EndDateType enum value
	EndDateTypeUnlimited = "unlimited"

	// EndDateTypeLimited is a EndDateType enum value
	EndDateTypeLimited = "limited"
)

const (
	// EventCodeInstanceReboot is a EventCode enum value
	EventCodeInstanceReboot = "instance-reboot"

	// EventCodeSystemReboot is a EventCode enum value
	EventCodeSystemReboot = "system-reboot"

	// EventCodeSystemMaintenance is a EventCode enum value
	EventCodeSystemMaintenance = "system-maintenance"

	// EventCodeInstanceRetirement is a EventCode enum value
	EventCodeInstanceRetirement = "instance-retirement"

	// EventCodeInstanceStop is a EventCode enum value
	EventCodeInstanceStop = "instance-stop"
)

const (
	// EventTypeInstanceChange is a EventType enum value
	EventTypeInstanceChange = "instanceChange"

	// EventTypeFleetRequestChange is a EventType enum value
	EventTypeFleetRequestChange = "fleetRequestChange"

	// EventTypeError is a EventType enum value
	EventTypeError = "error"
)

const (
	// ExcessCapacityTerminationPolicyNoTermination is a ExcessCapacityTerminationPolicy enum value
	ExcessCapacityTerminationPolicyNoTermination = "noTermination"

	// ExcessCapacityTerminationPolicyDefault is a ExcessCapacityTerminationPolicy enum value
	ExcessCapacityTerminationPolicyDefault = "default"
)

const (
	// ExportEnvironmentCitrix is a ExportEnvironment enum value
	ExportEnvironmentCitrix = "citrix"

	// ExportEnvironmentVmware is a ExportEnvironment enum value
	ExportEnvironmentVmware = "vmware"

	// ExportEnvironmentMicrosoft is a ExportEnvironment enum value
	ExportEnvironmentMicrosoft = "microsoft"
)

const (
	// ExportTaskStateActive is a ExportTaskState enum value
	ExportTaskStateActive = "active"

	// ExportTaskStateCancelling is a ExportTaskState enum value
	ExportTaskStateCancelling = "cancelling"

	// ExportTaskStateCancelled is a ExportTaskState enum value
	ExportTaskStateCancelled = "cancelled"

	// ExportTaskStateCompleted is a ExportTaskState enum value
	ExportTaskStateCompleted = "completed"
)

const (
	// FleetActivityStatusError is a FleetActivityStatus enum value
	FleetActivityStatusError = "error"

	// FleetActivityStatusPendingFulfillment is a FleetActivityStatus enum value
	FleetActivityStatusPendingFulfillment = "pending-fulfillment"

	// FleetActivityStatusPendingTermination is a FleetActivityStatus enum value
	FleetActivityStatusPendingTermination = "pending-termination"

	// FleetActivityStatusFulfilled is a FleetActivityStatus enum value
	FleetActivityStatusFulfilled = "fulfilled"
)

const (
	// FleetEventTypeInstanceChange is a FleetEventType enum value
	FleetEventTypeInstanceChange = "instance-change"

	// FleetEventTypeFleetChange is a FleetEventType enum value
	FleetEventTypeFleetChange = "fleet-change"

	// FleetEventTypeServiceError is a FleetEventType enum value
	FleetEventTypeServiceError = "service-error"
)

const (
	// FleetExcessCapacityTerminationPolicyNoTermination is a FleetExcessCapacityTerminationPolicy enum value
	FleetExcessCapacityTerminationPolicyNoTermination = "no-termination"

	// FleetExcessCapacityTerminationPolicyTermination is a FleetExcessCapacityTerminationPolicy enum value
	FleetExcessCapacityTerminationPolicyTermination = "termination"
)

const (
	// FleetOnDemandAllocationStrategyLowestPrice is a FleetOnDemandAllocationStrategy enum value
	FleetOnDemandAllocationStrategyLowestPrice = "lowest-price"

	// FleetOnDemandAllocationStrategyPrioritized is a FleetOnDemandAllocationStrategy enum value
	FleetOnDemandAllocationStrategyPrioritized = "prioritized"
)

const (
	// FleetStateCodeSubmitted is a FleetStateCode enum value
	FleetStateCodeSubmitted = "submitted"

	// FleetStateCodeActive is a FleetStateCode enum value
	FleetStateCodeActive = "active"

	// FleetStateCodeDeleted is a FleetStateCode enum value
	FleetStateCodeDeleted = "deleted"

	// FleetStateCodeFailed is a FleetStateCode enum value
	FleetStateCodeFailed = "failed"

	// FleetStateCodeDeletedRunning is a FleetStateCode enum value
	FleetStateCodeDeletedRunning = "deleted-running"

	// FleetStateCodeDeletedTerminating is a FleetStateCode enum value
	FleetStateCodeDeletedTerminating = "deleted-terminating"

	// FleetStateCodeModifying is a FleetStateCode enum value
	FleetStateCodeModifying = "modifying"
)

const (
	// FleetTypeRequest is a FleetType enum value
	FleetTypeRequest = "request"

	// FleetTypeMaintain is a FleetType enum value
	FleetTypeMaintain = "maintain"

	// FleetTypeInstant is a FleetType enum value
	FleetTypeInstant = "instant"
)

const (
	// FlowLogsResourceTypeVpc is a FlowLogsResourceType enum value
	FlowLogsResourceTypeVpc = "VPC"

	// FlowLogsResourceTypeSubnet is a FlowLogsResourceType enum value
	FlowLogsResourceTypeSubnet = "Subnet"

	// FlowLogsResourceTypeNetworkInterface is a FlowLogsResourceType enum value
	FlowLogsResourceTypeNetworkInterface = "NetworkInterface"
)

const (
	// FpgaImageAttributeNameDescription is a FpgaImageAttributeName enum value
	FpgaImageAttributeNameDescription = "description"

	// FpgaImageAttributeNameName is a FpgaImageAttributeName enum value
	FpgaImageAttributeNameName = "name"

	// FpgaImageAttributeNameLoadPermission is a FpgaImageAttributeName enum value
	FpgaImageAttributeNameLoadPermission = "loadPermission"

	// FpgaImageAttributeNameProductCodes is a FpgaImageAttributeName enum value
	FpgaImageAttributeNameProductCodes = "productCodes"
)

const (
	// FpgaImageStateCodePending is a FpgaImageStateCode enum value
	FpgaImageStateCodePending = "pending"

	// FpgaImageStateCodeFailed is a FpgaImageStateCode enum value
	FpgaImageStateCodeFailed = "failed"

	// FpgaImageStateCodeAvailable is a FpgaImageStateCode enum value
	FpgaImageStateCodeAvailable = "available"

	// FpgaImageStateCodeUnavailable is a FpgaImageStateCode enum value
	FpgaImageStateCodeUnavailable = "unavailable"
)

const (
	// GatewayTypeIpsec1 is a GatewayType enum value
	GatewayTypeIpsec1 = "ipsec.1"
)

const (
	// HostTenancyDedicated is a HostTenancy enum value
	HostTenancyDedicated = "dedicated"

	// HostTenancyHost is a HostTenancy enum value
	HostTenancyHost = "host"
)

const (
	// HypervisorTypeOvm is a HypervisorType enum value
	HypervisorTypeOvm = "ovm"

	// HypervisorTypeXen is a HypervisorType enum value
	HypervisorTypeXen = "xen"
)

const (
	// IamInstanceProfileAssociationStateAssociating is a IamInstanceProfileAssociationState enum value
	IamInstanceProfileAssociationStateAssociating = "associating"

	// IamInstanceProfileAssociationStateAssociated is a IamInstanceProfileAssociationState enum value
	IamInstanceProfileAssociationStateAssociated = "associated"

	// IamInstanceProfileAssociationStateDisassociating is a IamInstanceProfileAssociationState enum value
	IamInstanceProfileAssociationStateDisassociating = "disassociating"

	// IamInstanceProfileAssociationStateDisassociated is a IamInstanceProfileAssociationState enum value
	IamInstanceProfileAssociationStateDisassociated = "disassociated"
)

const (
	// ImageAttributeNameDescription is a ImageAttributeName enum value
	ImageAttributeNameDescription = "description"

	// ImageAttributeNameKernel is a ImageAttributeName enum value
	ImageAttributeNameKernel = "kernel"

	// ImageAttributeNameRamdisk is a ImageAttributeName enum value
	ImageAttributeNameRamdisk = "ramdisk"

	// ImageAttributeNameLaunchPermission is a ImageAttributeName enum value
	ImageAttributeNameLaunchPermission = "launchPermission"

	// ImageAttributeNameProductCodes is a ImageAttributeName enum value
	ImageAttributeNameProductCodes = "productCodes"

	// ImageAttributeNameBlockDeviceMapping is a ImageAttributeName enum value
	ImageAttributeNameBlockDeviceMapping = "blockDeviceMapping"

	// ImageAttributeNameSriovNetSupport is a ImageAttributeName enum value
	ImageAttributeNameSriovNetSupport = "sriovNetSupport"
)

const (
	// ImageStatePending is a ImageState enum value
	ImageStatePending = "pending"

	// ImageStateAvailable is a ImageState enum value
	ImageStateAvailable = "available"

	// ImageStateInvalid is a ImageState enum value
	ImageStateInvalid = "invalid"

	// ImageStateDeregistered is a ImageState enum value
	ImageStateDeregistered = "deregistered"

	// ImageStateTransient is a ImageState enum value
	ImageStateTransient = "transient"

	// ImageStateFailed is a ImageState enum value
	ImageStateFailed = "failed"

	// ImageStateError is a ImageState enum value
	ImageStateError = "error"
)

const (
	// ImageTypeValuesMachine is a ImageTypeValues enum value
	ImageTypeValuesMachine = "machine"

	// ImageTypeValuesKernel is a ImageTypeValues enum value
	ImageTypeValuesKernel = "kernel"

	// ImageTypeValuesRamdisk is a ImageTypeValues enum value
	ImageTypeValuesRamdisk = "ramdisk"
)

const (
	// InstanceAttributeNameInstanceType is a InstanceAttributeName enum value
	InstanceAttributeNameInstanceType = "instanceType"

	// InstanceAttributeNameKernel is a InstanceAttributeName enum value
	InstanceAttributeNameKernel = "kernel"

	// InstanceAttributeNameRamdisk is a InstanceAttributeName enum value
	InstanceAttributeNameRamdisk = "ramdisk"

	// InstanceAttributeNameUserData is a InstanceAttributeName enum value
	InstanceAttributeNameUserData = "userData"

	// InstanceAttributeNameDisableApiTermination is a InstanceAttributeName enum value
	InstanceAttributeNameDisableApiTermination = "disableApiTermination"

	// InstanceAttributeNameInstanceInitiatedShutdownBehavior is a InstanceAttributeName enum value
	InstanceAttributeNameInstanceInitiatedShutdownBehavior = "instanceInitiatedShutdownBehavior"

	// InstanceAttributeNameRootDeviceName is a InstanceAttributeName enum value
	InstanceAttributeNameRootDeviceName = "rootDeviceName"

	// InstanceAttributeNameBlockDeviceMapping is a InstanceAttributeName enum value
	InstanceAttributeNameBlockDeviceMapping = "blockDeviceMapping"

	// InstanceAttributeNameProductCodes is a InstanceAttributeName enum value
	InstanceAttributeNameProductCodes = "productCodes"

	// InstanceAttributeNameSourceDestCheck is a InstanceAttributeName enum value
	InstanceAttributeNameSourceDestCheck = "sourceDestCheck"

	// InstanceAttributeNameGroupSet is a InstanceAttributeName enum value
	InstanceAttributeNameGroupSet = "groupSet"

	// InstanceAttributeNameEbsOptimized is a InstanceAttributeName enum value
	InstanceAttributeNameEbsOptimized = "ebsOptimized"

	// InstanceAttributeNameSriovNetSupport is a InstanceAttributeName enum value
	InstanceAttributeNameSriovNetSupport = "sriovNetSupport"

	// InstanceAttributeNameEnaSupport is a InstanceAttributeName enum value
	InstanceAttributeNameEnaSupport = "enaSupport"
)

const (
	// InstanceHealthStatusHealthy is a InstanceHealthStatus enum value
	InstanceHealthStatusHealthy = "healthy"

	// InstanceHealthStatusUnhealthy is a InstanceHealthStatus enum value
	InstanceHealthStatusUnhealthy = "unhealthy"
)

const (
	// InstanceInterruptionBehaviorHibernate is a InstanceInterruptionBehavior enum value
	InstanceInterruptionBehaviorHibernate = "hibernate"

	// InstanceInterruptionBehaviorStop is a InstanceInterruptionBehavior enum value
	InstanceInterruptionBehaviorStop = "stop"

	// InstanceInterruptionBehaviorTerminate is a InstanceInterruptionBehavior enum value
	InstanceInterruptionBehaviorTerminate = "terminate"
)

const (
	// InstanceLifecycleSpot is a InstanceLifecycle enum value
	InstanceLifecycleSpot = "spot"

	// InstanceLifecycleOnDemand is a InstanceLifecycle enum value
	InstanceLifecycleOnDemand = "on-demand"
)

const (
	// InstanceLifecycleTypeSpot is a InstanceLifecycleType enum value
	InstanceLifecycleTypeSpot = "spot"

	// InstanceLifecycleTypeScheduled is a InstanceLifecycleType enum value
	InstanceLifecycleTypeScheduled = "scheduled"
)

const (
	// InstanceMatchCriteriaOpen is a InstanceMatchCriteria enum value
	InstanceMatchCriteriaOpen = "open"

	// InstanceMatchCriteriaTargeted is a InstanceMatchCriteria enum value
	InstanceMatchCriteriaTargeted = "targeted"
)

const (
	// InstanceStateNamePending is a InstanceStateName enum value
	InstanceStateNamePending = "pending"

	// InstanceStateNameRunning is a InstanceStateName enum value
	InstanceStateNameRunning = "running"

	// InstanceStateNameShuttingDown is a InstanceStateName enum value
	InstanceStateNameShuttingDown = "shutting-down"

	// InstanceStateNameTerminated is a InstanceStateName enum value
	InstanceStateNameTerminated = "terminated"

	// InstanceStateNameStopping is a InstanceStateName enum value
	InstanceStateNameStopping = "stopping"

	// InstanceStateNameStopped is a InstanceStateName enum value
	InstanceStateNameStopped = "stopped"
)

const (
	// InstanceTypeT1Micro is a InstanceType enum value
	InstanceTypeT1Micro = "t1.micro"

	// InstanceTypeT2Nano is a InstanceType enum value
	InstanceTypeT2Nano = "t2.nano"

	// InstanceTypeT2Micro is a InstanceType enum value
	InstanceTypeT2Micro = "t2.micro"

	// InstanceTypeT2Small is a InstanceType enum value
	InstanceTypeT2Small = "t2.small"

	// InstanceTypeT2Medium is a InstanceType enum value
	InstanceTypeT2Medium = "t2.medium"

	// InstanceTypeT2Large is a InstanceType enum value
	InstanceTypeT2Large = "t2.large"

	// InstanceTypeT2Xlarge is a InstanceType enum value
	InstanceTypeT2Xlarge = "t2.xlarge"

	// InstanceTypeT22xlarge is a InstanceType enum value
	InstanceTypeT22xlarge = "t2.2xlarge"

	// InstanceTypeT3Nano is a InstanceType enum value
	InstanceTypeT3Nano = "t3.nano"

	// InstanceTypeT3Micro is a InstanceType enum value
	InstanceTypeT3Micro = "t3.micro"

	// InstanceTypeT3Small is a InstanceType enum value
	InstanceTypeT3Small = "t3.small"

	// InstanceTypeT3Medium is a InstanceType enum value
	InstanceTypeT3Medium = "t3.medium"

	// InstanceTypeT3Large is a InstanceType enum value
	InstanceTypeT3Large = "t3.large"

	// InstanceTypeT3Xlarge is a InstanceType enum value
	InstanceTypeT3Xlarge = "t3.xlarge"

	// InstanceTypeT32xlarge is a InstanceType enum value
	InstanceTypeT32xlarge = "t3.2xlarge"

	// InstanceTypeM1Small is a InstanceType enum value
	InstanceTypeM1Small = "m1.small"

	// InstanceTypeM1Medium is a InstanceType enum value
	InstanceTypeM1Medium = "m1.medium"

	// InstanceTypeM1Large is a InstanceType enum value
	InstanceTypeM1Large = "m1.large"

	// InstanceTypeM1Xlarge is a InstanceType enum value
	InstanceTypeM1Xlarge = "m1.xlarge"

	// InstanceTypeM3Medium is a InstanceType enum value
	InstanceTypeM3Medium = "m3.medium"

	// InstanceTypeM3Large is a InstanceType enum value
	InstanceTypeM3Large = "m3.large"

	// InstanceTypeM3Xlarge is a InstanceType enum value
	InstanceTypeM3Xlarge = "m3.xlarge"

	// InstanceTypeM32xlarge is a InstanceType enum value
	InstanceTypeM32xlarge = "m3.2xlarge"

	// InstanceTypeM4Large is a InstanceType enum value
	InstanceTypeM4Large = "m4.large"

	// InstanceTypeM4Xlarge is a InstanceType enum value
	InstanceTypeM4Xlarge = "m4.xlarge"

	// InstanceTypeM42xlarge is a InstanceType enum value
	InstanceTypeM42xlarge = "m4.2xlarge"

	// InstanceTypeM44xlarge is a InstanceType enum value
	InstanceTypeM44xlarge = "m4.4xlarge"

	// InstanceTypeM410xlarge is a InstanceType enum value
	InstanceTypeM410xlarge = "m4.10xlarge"

	// InstanceTypeM416xlarge is a InstanceType enum value
	InstanceTypeM416xlarge = "m4.16xlarge"

	// InstanceTypeM2Xlarge is a InstanceType enum value
	InstanceTypeM2Xlarge = "m2.xlarge"

	// InstanceTypeM22xlarge is a InstanceType enum value
	InstanceTypeM22xlarge = "m2.2xlarge"

	// InstanceTypeM24xlarge is a InstanceType enum value
	InstanceTypeM24xlarge = "m2.4xlarge"

	// InstanceTypeCr18xlarge is a InstanceType enum value
	InstanceTypeCr18xlarge = "cr1.8xlarge"

	// InstanceTypeR3Large is a InstanceType enum value
	InstanceTypeR3Large = "r3.large"

	// InstanceTypeR3Xlarge is a InstanceType enum value
	InstanceTypeR3Xlarge = "r3.xlarge"

	// InstanceTypeR32xlarge is a InstanceType enum value
	InstanceTypeR32xlarge = "r3.2xlarge"

	// InstanceTypeR34xlarge is a InstanceType enum value
	InstanceTypeR34xlarge = "r3.4xlarge"

	// InstanceTypeR38xlarge is a InstanceType enum value
	InstanceTypeR38xlarge = "r3.8xlarge"

	// InstanceTypeR4Large is a InstanceType enum value
	InstanceTypeR4Large = "r4.large"

	// InstanceTypeR4Xlarge is a InstanceType enum value
	InstanceTypeR4Xlarge = "r4.xlarge"

	// InstanceTypeR42xlarge is a InstanceType enum value
	InstanceTypeR42xlarge = "r4.2xlarge"

	// InstanceTypeR44xlarge is a InstanceType enum value
	InstanceTypeR44xlarge = "r4.4xlarge"

	// InstanceTypeR48xlarge is a InstanceType enum value
	InstanceTypeR48xlarge = "r4.8xlarge"

	// InstanceTypeR416xlarge is a InstanceType enum value
	InstanceTypeR416xlarge = "r4.16xlarge"

	// InstanceTypeR5Large is a InstanceType enum value
	InstanceTypeR5Large = "r5.large"

	// InstanceTypeR5Xlarge is a InstanceType enum value
	InstanceTypeR5Xlarge = "r5.xlarge"

	// InstanceTypeR52xlarge is a InstanceType enum value
	InstanceTypeR52xlarge = "r5.2xlarge"

	// InstanceTypeR54xlarge is a InstanceType enum value
	InstanceTypeR54xlarge = "r5.4xlarge"

	// InstanceTypeR512xlarge is a InstanceType enum value
	InstanceTypeR512xlarge = "r5.12xlarge"

	// InstanceTypeR524xlarge is a InstanceType enum value
	InstanceTypeR524xlarge = "r5.24xlarge"

	// InstanceTypeR5Metal is a InstanceType enum value
	InstanceTypeR5Metal = "r5.metal"

	// InstanceTypeR5aLarge is a InstanceType enum value
	InstanceTypeR5aLarge = "r5a.large"

	// InstanceTypeR5aXlarge is a InstanceType enum value
	InstanceTypeR5aXlarge = "r5a.xlarge"

	// InstanceTypeR5a2xlarge is a InstanceType enum value
	InstanceTypeR5a2xlarge = "r5a.2xlarge"

	// InstanceTypeR5a4xlarge is a InstanceType enum value
	InstanceTypeR5a4xlarge = "r5a.4xlarge"

	// InstanceTypeR5a12xlarge is a InstanceType enum value
	InstanceTypeR5a12xlarge = "r5a.12xlarge"

	// InstanceTypeR5a24xlarge is a InstanceType enum value
	InstanceTypeR5a24xlarge = "r5a.24xlarge"

	// InstanceTypeR5dLarge is a InstanceType enum value
	InstanceTypeR5dLarge = "r5d.large"

	// InstanceTypeR5dXlarge is a InstanceType enum value
	InstanceTypeR5dXlarge = "r5d.xlarge"

	// InstanceTypeR5d2xlarge is a InstanceType enum value
	InstanceTypeR5d2xlarge = "r5d.2xlarge"

	// InstanceTypeR5d4xlarge is a InstanceType enum value
	InstanceTypeR5d4xlarge = "r5d.4xlarge"

	// InstanceTypeR5d12xlarge is a InstanceType enum value
	InstanceTypeR5d12xlarge = "r5d.12xlarge"

	// InstanceTypeR5d24xlarge is a InstanceType enum value
	InstanceTypeR5d24xlarge = "r5d.24xlarge"

	// InstanceTypeR5dMetal is a InstanceType enum value
	InstanceTypeR5dMetal = "r5d.metal"

	// InstanceTypeX116xlarge is a InstanceType enum value
	InstanceTypeX116xlarge = "x1.16xlarge"

	// InstanceTypeX132xlarge is a InstanceType enum value
	InstanceTypeX132xlarge = "x1.32xlarge"

	// InstanceTypeX1eXlarge is a InstanceType enum value
	InstanceTypeX1eXlarge = "x1e.xlarge"

	// InstanceTypeX1e2xlarge is a InstanceType enum value
	InstanceTypeX1e2xlarge = "x1e.2xlarge"

	// InstanceTypeX1e4xlarge is a InstanceType enum value
	InstanceTypeX1e4xlarge = "x1e.4xlarge"

	// InstanceTypeX1e8xlarge is a InstanceType enum value
	InstanceTypeX1e8xlarge = "x1e.8xlarge"

	// InstanceTypeX1e16xlarge is a InstanceType enum value
	InstanceTypeX1e16xlarge = "x1e.16xlarge"

	// InstanceTypeX1e32xlarge is a InstanceType enum value
	InstanceTypeX1e32xlarge = "x1e.32xlarge"

	// InstanceTypeI2Xlarge is a InstanceType enum value
	InstanceTypeI2Xlarge = "i2.xlarge"

	// InstanceTypeI22xlarge is a InstanceType enum value
	InstanceTypeI22xlarge = "i2.2xlarge"

	// InstanceTypeI24xlarge is a InstanceType enum value
	InstanceTypeI24xlarge = "i2.4xlarge"

	// InstanceTypeI28xlarge is a InstanceType enum value
	InstanceTypeI28xlarge = "i2.8xlarge"

	// InstanceTypeI3Large is a InstanceType enum value
	InstanceTypeI3Large = "i3.large"

	// InstanceTypeI3Xlarge is a InstanceType enum value
	InstanceTypeI3Xlarge = "i3.xlarge"

	// InstanceTypeI32xlarge is a InstanceType enum value
	InstanceTypeI32xlarge = "i3.2xlarge"

	// InstanceTypeI34xlarge is a InstanceType enum value
	InstanceTypeI34xlarge = "i3.4xlarge"

	// InstanceTypeI38xlarge is a InstanceType enum value
	InstanceTypeI38xlarge = "i3.8xlarge"

	// InstanceTypeI316xlarge is a InstanceType enum value
	InstanceTypeI316xlarge = "i3.16xlarge"

	// InstanceTypeI3Metal is a InstanceType enum value
	InstanceTypeI3Metal = "i3.metal"

	// InstanceTypeHi14xlarge is a InstanceType enum value
	InstanceTypeHi14xlarge = "hi1.4xlarge"

	// InstanceTypeHs18xlarge is a InstanceType enum value
	InstanceTypeHs18xlarge = "hs1.8xlarge"

	// InstanceTypeC1Medium is a InstanceType enum value
	InstanceTypeC1Medium = "c1.medium"

	// InstanceTypeC1Xlarge is a InstanceType enum value
	InstanceTypeC1Xlarge = "c1.xlarge"

	// InstanceTypeC3Large is a InstanceType enum value
	InstanceTypeC3Large = "c3.large"

	// InstanceTypeC3Xlarge is a InstanceType enum value
	InstanceTypeC3Xlarge = "c3.xlarge"

	// InstanceTypeC32xlarge is a InstanceType enum value
	InstanceTypeC32xlarge = "c3.2xlarge"

	// InstanceTypeC34xlarge is a InstanceType enum value
	InstanceTypeC34xlarge = "c3.4xlarge"

	// InstanceTypeC38xlarge is a InstanceType enum value
	InstanceTypeC38xlarge = "c3.8xlarge"

	// InstanceTypeC4Large is a InstanceType enum value
	InstanceTypeC4Large = "c4.large"

	// InstanceTypeC4Xlarge is a InstanceType enum value
	InstanceTypeC4Xlarge = "c4.xlarge"

	// InstanceTypeC42xlarge is a InstanceType enum value
	InstanceTypeC42xlarge = "c4.2xlarge"

	// InstanceTypeC44xlarge is a InstanceType enum value
	InstanceTypeC44xlarge = "c4.4xlarge"

	// InstanceTypeC48xlarge is a InstanceType enum value
	InstanceTypeC48xlarge = "c4.8xlarge"

	// InstanceTypeC5Large is a InstanceType enum value
	InstanceTypeC5Large = "c5.large"

	// InstanceTypeC5Xlarge is a InstanceType enum value
	InstanceTypeC5Xlarge = "c5.xlarge"

	// InstanceTypeC52xlarge is a InstanceType enum value
	InstanceTypeC52xlarge = "c5.2xlarge"

	// InstanceTypeC54xlarge is a InstanceType enum value
	InstanceTypeC54xlarge = "c5.4xlarge"

	// InstanceTypeC59xlarge is a InstanceType enum value
	InstanceTypeC59xlarge = "c5.9xlarge"

	// InstanceTypeC518xlarge is a InstanceType enum value
	InstanceTypeC518xlarge = "c5.18xlarge"

	// InstanceTypeC5dLarge is a InstanceType enum value
	InstanceTypeC5dLarge = "c5d.large"

	// InstanceTypeC5dXlarge is a InstanceType enum value
	InstanceTypeC5dXlarge = "c5d.xlarge"

	// InstanceTypeC5d2xlarge is a InstanceType enum value
	InstanceTypeC5d2xlarge = "c5d.2xlarge"

	// InstanceTypeC5d4xlarge is a InstanceType enum value
	InstanceTypeC5d4xlarge = "c5d.4xlarge"

	// InstanceTypeC5d9xlarge is a InstanceType enum value
	InstanceTypeC5d9xlarge = "c5d.9xlarge"

	// InstanceTypeC5d18xlarge is a InstanceType enum value
	InstanceTypeC5d18xlarge = "c5d.18xlarge"

	// InstanceTypeC5nLarge is a InstanceType enum value
	InstanceTypeC5nLarge = "c5n.large"

	// InstanceTypeC5nXlarge is a InstanceType enum value
	InstanceTypeC5nXlarge = "c5n.xlarge"

	// InstanceTypeC5n2xlarge is a InstanceType enum value
	InstanceTypeC5n2xlarge = "c5n.2xlarge"

	// InstanceTypeC5n4xlarge is a InstanceType enum value
	InstanceTypeC5n4xlarge = "c5n.4xlarge"

	// InstanceTypeC5n9xlarge is a InstanceType enum value
	InstanceTypeC5n9xlarge = "c5n.9xlarge"

	// InstanceTypeC5n18xlarge is a InstanceType enum value
	InstanceTypeC5n18xlarge = "c5n.18xlarge"

	// InstanceTypeCc14xlarge is a InstanceType enum value
	InstanceTypeCc14xlarge = "cc1.4xlarge"

	// InstanceTypeCc28xlarge is a InstanceType enum value
	InstanceTypeCc28xlarge = "cc2.8xlarge"

	// InstanceTypeG22xlarge is a InstanceType enum value
	InstanceTypeG22xlarge = "g2.2xlarge"

	// InstanceTypeG28xlarge is a InstanceType enum value
	InstanceTypeG28xlarge = "g2.8xlarge"

	// InstanceTypeG34xlarge is a InstanceType enum value
	InstanceTypeG34xlarge = "g3.4xlarge"

	// InstanceTypeG38xlarge is a InstanceType enum value
	InstanceTypeG38xlarge = "g3.8xlarge"

	// InstanceTypeG316xlarge is a InstanceType enum value
	InstanceTypeG316xlarge = "g3.16xlarge"

	// InstanceTypeG3sXlarge is a InstanceType enum value
	InstanceTypeG3sXlarge = "g3s.xlarge"

	// InstanceTypeCg14xlarge is a InstanceType enum value
	InstanceTypeCg14xlarge = "cg1.4xlarge"

	// InstanceTypeP2Xlarge is a InstanceType enum value
	InstanceTypeP2Xlarge = "p2.xlarge"

	// InstanceTypeP28xlarge is a InstanceType enum value
	InstanceTypeP28xlarge = "p2.8xlarge"

	// InstanceTypeP216xlarge is a InstanceType enum value
	InstanceTypeP216xlarge = "p2.16xlarge"

	// InstanceTypeP32xlarge is a InstanceType enum value
	InstanceTypeP32xlarge = "p3.2xlarge"

	// InstanceTypeP38xlarge is a InstanceType enum value
	InstanceTypeP38xlarge = "p3.8xlarge"

	// InstanceTypeP316xlarge is a InstanceType enum value
	InstanceTypeP316xlarge = "p3.16xlarge"

	// InstanceTypeP3dn24xlarge is a InstanceType enum value
	InstanceTypeP3dn24xlarge = "p3dn.24xlarge"

	// InstanceTypeD2Xlarge is a InstanceType enum value
	InstanceTypeD2Xlarge = "d2.xlarge"

	// InstanceTypeD22xlarge is a InstanceType enum value
	InstanceTypeD22xlarge = "d2.2xlarge"

	// InstanceTypeD24xlarge is a InstanceType enum value
	InstanceTypeD24xlarge = "d2.4xlarge"

	// InstanceTypeD28xlarge is a InstanceType enum value
	InstanceTypeD28xlarge = "d2.8xlarge"

	// InstanceTypeF12xlarge is a InstanceType enum value
	InstanceTypeF12xlarge = "f1.2xlarge"

	// InstanceTypeF14xlarge is a InstanceType enum value
	InstanceTypeF14xlarge = "f1.4xlarge"

	// InstanceTypeF116xlarge is a InstanceType enum value
	InstanceTypeF116xlarge = "f1.16xlarge"

	// InstanceTypeM5Large is a InstanceType enum value
	InstanceTypeM5Large = "m5.large"

	// InstanceTypeM5Xlarge is a InstanceType enum value
	InstanceTypeM5Xlarge = "m5.xlarge"

	// InstanceTypeM52xlarge is a InstanceType enum value
	InstanceTypeM52xlarge = "m5.2xlarge"

	// InstanceTypeM54xlarge is a InstanceType enum value
	InstanceTypeM54xlarge = "m5.4xlarge"

	// InstanceTypeM512xlarge is a InstanceType enum value
	InstanceTypeM512xlarge = "m5.12xlarge"

	// InstanceTypeM524xlarge is a InstanceType enum value
	InstanceTypeM524xlarge = "m5.24xlarge"

	// InstanceTypeM5aLarge is a InstanceType enum value
	InstanceTypeM5aLarge = "m5a.large"

	// InstanceTypeM5aXlarge is a InstanceType enum value
	InstanceTypeM5aXlarge = "m5a.xlarge"

	// InstanceTypeM5a2xlarge is a InstanceType enum value
	InstanceTypeM5a2xlarge = "m5a.2xlarge"

	// InstanceTypeM5a4xlarge is a InstanceType enum value
	InstanceTypeM5a4xlarge = "m5a.4xlarge"

	// InstanceTypeM5a12xlarge is a InstanceType enum value
	InstanceTypeM5a12xlarge = "m5a.12xlarge"

	// InstanceTypeM5a24xlarge is a InstanceType enum value
	InstanceTypeM5a24xlarge = "m5a.24xlarge"

	// InstanceTypeM5dLarge is a InstanceType enum value
	InstanceTypeM5dLarge = "m5d.large"

	// InstanceTypeM5dXlarge is a InstanceType enum value
	InstanceTypeM5dXlarge = "m5d.xlarge"

	// InstanceTypeM5d2xlarge is a InstanceType enum value
	InstanceTypeM5d2xlarge = "m5d.2xlarge"

	// InstanceTypeM5d4xlarge is a InstanceType enum value
	InstanceTypeM5d4xlarge = "m5d.4xlarge"

	// InstanceTypeM5d12xlarge is a InstanceType enum value
	InstanceTypeM5d12xlarge = "m5d.12xlarge"

	// InstanceTypeM5d24xlarge is a InstanceType enum value
	InstanceTypeM5d24xlarge = "m5d.24xlarge"

	// InstanceTypeH12xlarge is a InstanceType enum value
	InstanceTypeH12xlarge = "h1.2xlarge"

	// InstanceTypeH14xlarge is a InstanceType enum value
	InstanceTypeH14xlarge = "h1.4xlarge"

	// InstanceTypeH18xlarge is a InstanceType enum value
	InstanceTypeH18xlarge = "h1.8xlarge"

	// InstanceTypeH116xlarge is a InstanceType enum value
	InstanceTypeH116xlarge = "h1.16xlarge"

	// InstanceTypeZ1dLarge is a InstanceType enum value
	InstanceTypeZ1dLarge = "z1d.large"

	// InstanceTypeZ1dXlarge is a InstanceType enum value
	InstanceTypeZ1dXlarge = "z1d.xlarge"

	// InstanceTypeZ1d2xlarge is a InstanceType enum value
	InstanceTypeZ1d2xlarge = "z1d.2xlarge"

	// InstanceTypeZ1d3xlarge is a InstanceType enum value
	InstanceTypeZ1d3xlarge = "z1d.3xlarge"

	// InstanceTypeZ1d6xlarge is a InstanceType enum value
	InstanceTypeZ1d6xlarge = "z1d.6xlarge"

	// InstanceTypeZ1d12xlarge is a InstanceType enum value
	InstanceTypeZ1d12xlarge = "z1d.12xlarge"

	// InstanceTypeU6tb1Metal is a InstanceType enum value
	InstanceTypeU6tb1Metal = "u-6tb1.metal"

	// InstanceTypeU9tb1Metal is a InstanceType enum value
	InstanceTypeU9tb1Metal = "u-9tb1.metal"

	// InstanceTypeU12tb1Metal is a InstanceType enum value
	InstanceTypeU12tb1Metal = "u-12tb1.metal"

	// InstanceTypeA1Medium is a InstanceType enum value
	InstanceTypeA1Medium = "a1.medium"

	// InstanceTypeA1Large is a InstanceType enum value
	InstanceTypeA1Large = "a1.large"

	// InstanceTypeA1Xlarge is a InstanceType enum value
	InstanceTypeA1Xlarge = "a1.xlarge"

	// InstanceTypeA12xlarge is a InstanceType enum value
	InstanceTypeA12xlarge = "a1.2xlarge"

	// InstanceTypeA14xlarge is a InstanceType enum value
	InstanceTypeA14xlarge = "a1.4xlarge"
)

const (
	// InterfacePermissionTypeInstanceAttach is a InterfacePermissionType enum value
	InterfacePermissionTypeInstanceAttach = "INSTANCE-ATTACH"

	// InterfacePermissionTypeEipAssociate is a InterfacePermissionType enum value
	InterfacePermissionTypeEipAssociate = "EIP-ASSOCIATE"
)

const (
	// Ipv6SupportValueEnable is a Ipv6SupportValue enum value
	Ipv6SupportValueEnable = "enable"

	// Ipv6SupportValueDisable is a Ipv6SupportValue enum value
	Ipv6SupportValueDisable = "disable"
)

const (
	// LaunchTemplateErrorCodeLaunchTemplateIdDoesNotExist is a LaunchTemplateErrorCode enum value
	LaunchTemplateErrorCodeLaunchTemplateIdDoesNotExist = "launchTemplateIdDoesNotExist"

	// LaunchTemplateErrorCodeLaunchTemplateIdMalformed is a LaunchTemplateErrorCode enum value
	LaunchTemplateErrorCodeLaunchTemplateIdMalformed = "launchTemplateIdMalformed"

	// LaunchTemplateErrorCodeLaunchTemplateNameDoesNotExist is a LaunchTemplateErrorCode enum value
	LaunchTemplateErrorCodeLaunchTemplateNameDoesNotExist = "launchTemplateNameDoesNotExist"

	// LaunchTemplateErrorCodeLaunchTemplateNameMalformed is a LaunchTemplateErrorCode enum value
	LaunchTemplateErrorCodeLaunchTemplateNameMalformed = "launchTemplateNameMalformed"

	// LaunchTemplateErrorCodeLaunchTemplateVersionDoesNotExist is a LaunchTemplateErrorCode enum value
	LaunchTemplateErrorCodeLaunchTemplateVersionDoesNotExist = "launchTemplateVersionDoesNotExist"

	// LaunchTemplateErrorCodeUnexpectedError is a LaunchTemplateErrorCode enum value
	LaunchTemplateErrorCodeUnexpectedError = "unexpectedError"
)

const (
	// ListingStateAvailable is a ListingState enum value
	ListingStateAvailable = "available"

	// ListingStateSold is a ListingState enum value
	ListingStateSold = "sold"

	// ListingStateCancelled is a ListingState enum value
	ListingStateCancelled = "cancelled"

	// ListingStatePending is a ListingState enum value
	ListingStatePending = "pending"
)

const (
	// ListingStatusActive is a ListingStatus enum value
	ListingStatusActive = "active"

	// ListingStatusPending is a ListingStatus enum value
	ListingStatusPending = "pending"

	// ListingStatusCancelled is a ListingStatus enum value
	ListingStatusCancelled = "cancelled"

	// ListingStatusClosed is a ListingStatus enum value
	ListingStatusClosed = "closed"
)

const (
	// LogDestinationTypeCloudWatchLogs is a LogDestinationType enum value
	LogDestinationTypeCloudWatchLogs = "cloud-watch-logs"

	// LogDestinationTypeS3 is a LogDestinationType enum value
	LogDestinationTypeS3 = "s3"
)

const (
	// MarketTypeSpot is a MarketType enum value
	MarketTypeSpot = "spot"
)

const (
	// MonitoringStateDisabled is a MonitoringState enum value
	MonitoringStateDisabled = "disabled"

	// MonitoringStateDisabling is a MonitoringState enum value
	MonitoringStateDisabling = "disabling"

	// MonitoringStateEnabled is a MonitoringState enum value
	MonitoringStateEnabled = "enabled"

	// MonitoringStatePending is a MonitoringState enum value
	MonitoringStatePending = "pending"
)

const (
	// MoveStatusMovingToVpc is a MoveStatus enum value
	MoveStatusMovingToVpc = "movingToVpc"

	// MoveStatusRestoringToClassic is a MoveStatus enum value
	MoveStatusRestoringToClassic = "restoringToClassic"
)

const (
	// NatGatewayStatePending is a NatGatewayState enum value
	NatGatewayStatePending = "pending"

	// NatGatewayStateFailed is a NatGatewayState enum value
	NatGatewayStateFailed = "failed"

	// NatGatewayStateAvailable is a NatGatewayState enum value
	NatGatewayStateAvailable = "available"

	// NatGatewayStateDeleting is a NatGatewayState enum value
	NatGatewayStateDeleting = "deleting"

	// NatGatewayStateDeleted is a NatGatewayState enum value
	NatGatewayStateDeleted = "deleted"
)

const (
	// NetworkInterfaceAttributeDescription is a NetworkInterfaceAttribute enum value
	NetworkInterfaceAttributeDescription = "description"

	// NetworkInterfaceAttributeGroupSet is a NetworkInterfaceAttribute enum value
	NetworkInterfaceAttributeGroupSet = "groupSet"

	// NetworkInterfaceAttributeSourceDestCheck is a NetworkInterfaceAttribute enum value
	NetworkInterfaceAttributeSourceDestCheck = "sourceDestCheck"

	// NetworkInterfaceAttributeAttachment is a NetworkInterfaceAttribute enum value
	NetworkInterfaceAttributeAttachment = "attachment"
)

const (
	// NetworkInterfacePermissionStateCodePending is a NetworkInterfacePermissionStateCode enum value
	NetworkInterfacePermissionStateCodePending = "pending"

	// NetworkInterfacePermissionStateCodeGranted is a NetworkInterfacePermissionStateCode enum value
	NetworkInterfacePermissionStateCodeGranted = "granted"

	// NetworkInterfacePermissionStateCodeRevoking is a NetworkInterfacePermissionStateCode enum value
	NetworkInterfacePermissionStateCodeRevoking = "revoking"

	// NetworkInterfacePermissionStateCodeRevoked is a NetworkInterfacePermissionStateCode enum value
	NetworkInterfacePermissionStateCodeRevoked = "revoked"
)

const (
	// NetworkInterfaceStatusAvailable is a NetworkInterfaceStatus enum value
	NetworkInterfaceStatusAvailable = "available"

	// NetworkInterfaceStatusAssociated is a NetworkInterfaceStatus enum value
	NetworkInterfaceStatusAssociated = "associated"

	// NetworkInterfaceStatusAttaching is a NetworkInterfaceStatus enum value
	NetworkInterfaceStatusAttaching = "attaching"

	// NetworkInterfaceStatusInUse is a NetworkInterfaceStatus enum value
	NetworkInterfaceStatusInUse = "in-use"

	// NetworkInterfaceStatusDetaching is a NetworkInterfaceStatus enum value
	NetworkInterfaceStatusDetaching = "detaching"
)

const (
	// NetworkInterfaceTypeInterface is a NetworkInterfaceType enum value
	NetworkInterfaceTypeInterface = "interface"

	// NetworkInterfaceTypeNatGateway is a NetworkInterfaceType enum value
	NetworkInterfaceTypeNatGateway = "natGateway"
)

const (
	// OfferingClassTypeStandard is a OfferingClassType enum value
	OfferingClassTypeStandard = "standard"

	// OfferingClassTypeConvertible is a OfferingClassType enum value
	OfferingClassTypeConvertible = "convertible"
)

const (
	// OfferingTypeValuesHeavyUtilization is a OfferingTypeValues enum value
	OfferingTypeValuesHeavyUtilization = "Heavy Utilization"

	// OfferingTypeValuesMediumUtilization is a OfferingTypeValues enum value
	OfferingTypeValuesMediumUtilization = "Medium Utilization"

	// OfferingTypeValuesLightUtilization is a OfferingTypeValues enum value
	OfferingTypeValuesLightUtilization = "Light Utilization"

	// OfferingTypeValuesNoUpfront is a OfferingTypeValues enum value
	OfferingTypeValuesNoUpfront = "No Upfront"

	// OfferingTypeValuesPartialUpfront is a OfferingTypeValues enum value
	OfferingTypeValuesPartialUpfront = "Partial Upfront"

	// OfferingTypeValuesAllUpfront is a OfferingTypeValues enum value
	OfferingTypeValuesAllUpfront = "All Upfront"
)

const (
	// OnDemandAllocationStrategyLowestPrice is a OnDemandAllocationStrategy enum value
	OnDemandAllocationStrategyLowestPrice = "lowestPrice"

	// OnDemandAllocationStrategyPrioritized is a OnDemandAllocationStrategy enum value
	OnDemandAllocationStrategyPrioritized = "prioritized"
)

const (
	// OperationTypeAdd is a OperationType enum value
	OperationTypeAdd = "add"

	// OperationTypeRemove is a OperationType enum value
	OperationTypeRemove = "remove"
)

const (
	// PaymentOptionAllUpfront is a PaymentOption enum value
	PaymentOptionAllUpfront = "AllUpfront"

	// PaymentOptionPartialUpfront is a PaymentOption enum value
	PaymentOptionPartialUpfront = "PartialUpfront"

	// PaymentOptionNoUpfront is a PaymentOption enum value
	PaymentOptionNoUpfront = "NoUpfront"
)

const (
	// PermissionGroupAll is a PermissionGroup enum value
	PermissionGroupAll = "all"
)

const (
	// PlacementGroupStatePending is a PlacementGroupState enum value
	PlacementGroupStatePending = "pending"

	// PlacementGroupStateAvailable is a PlacementGroupState enum value
	PlacementGroupStateAvailable = "available"

	// PlacementGroupStateDeleting is a PlacementGroupState enum value
	PlacementGroupStateDeleting = "deleting"

	// PlacementGroupStateDeleted is a PlacementGroupState enum value
	PlacementGroupStateDeleted = "deleted"
)

const (
	// PlacementStrategyCluster is a PlacementStrategy enum value
	PlacementStrategyCluster = "cluster"

	// PlacementStrategySpread is a PlacementStrategy enum value
	PlacementStrategySpread = "spread"

	// PlacementStrategyPartition is a PlacementStrategy enum value
	PlacementStrategyPartition = "partition"
)

const (
	// PlatformValuesWindows is a PlatformValues enum value
	PlatformValuesWindows = "Windows"
)

const (
	// PrincipalTypeAll is a PrincipalType enum value
	PrincipalTypeAll = "All"

	// PrincipalTypeService is a PrincipalType enum value
	PrincipalTypeService = "Service"

	// PrincipalTypeOrganizationUnit is a PrincipalType enum value
	PrincipalTypeOrganizationUnit = "OrganizationUnit"

	// PrincipalTypeAccount is a PrincipalType enum value
	PrincipalTypeAccount = "Account"

	// PrincipalTypeUser is a PrincipalType enum value
	PrincipalTypeUser = "User"

	// PrincipalTypeRole is a PrincipalType enum value
	PrincipalTypeRole = "Role"
)

const (
	// ProductCodeValuesDevpay is a ProductCodeValues enum value
	ProductCodeValuesDevpay = "devpay"

	// ProductCodeValuesMarketplace is a ProductCodeValues enum value
	ProductCodeValuesMarketplace = "marketplace"
)

const (
	// RIProductDescriptionLinuxUnix is a RIProductDescription enum value
	RIProductDescriptionLinuxUnix = "Linux/UNIX"

	// RIProductDescriptionLinuxUnixamazonVpc is a RIProductDescription enum value
	RIProductDescriptionLinuxUnixamazonVpc = "Linux/UNIX (Amazon VPC)"

	// RIProductDescriptionWindows is a RIProductDescription enum value
	RIProductDescriptionWindows = "Windows"

	// RIProductDescriptionWindowsAmazonVpc is a RIProductDescription enum value
	RIProductDescriptionWindowsAmazonVpc = "Windows (Amazon VPC)"
)

const (
	// RecurringChargeFrequencyHourly is a RecurringChargeFrequency enum value
	RecurringChargeFrequencyHourly = "Hourly"
)

const (
	// ReportInstanceReasonCodesInstanceStuckInState is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesInstanceStuckInState = "instance-stuck-in-state"

	// ReportInstanceReasonCodesUnresponsive is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesUnresponsive = "unresponsive"

	// ReportInstanceReasonCodesNotAcceptingCredentials is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesNotAcceptingCredentials = "not-accepting-credentials"

	// ReportInstanceReasonCodesPasswordNotAvailable is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesPasswordNotAvailable = "password-not-available"

	// ReportInstanceReasonCodesPerformanceNetwork is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesPerformanceNetwork = "performance-network"

	// ReportInstanceReasonCodesPerformanceInstanceStore is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesPerformanceInstanceStore = "performance-instance-store"

	// ReportInstanceReasonCodesPerformanceEbsVolume is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesPerformanceEbsVolume = "performance-ebs-volume"

	// ReportInstanceReasonCodesPerformanceOther is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesPerformanceOther = "performance-other"

	// ReportInstanceReasonCodesOther is a ReportInstanceReasonCodes enum value
	ReportInstanceReasonCodesOther = "other"
)

const (
	// ReportStatusTypeOk is a ReportStatusType enum value
	ReportStatusTypeOk = "ok"

	// ReportStatusTypeImpaired is a ReportStatusType enum value
	ReportStatusTypeImpaired = "impaired"
)

const (
	// ReservationStatePaymentPending is a ReservationState enum value
	ReservationStatePaymentPending = "payment-pending"

	// ReservationStatePaymentFailed is a ReservationState enum value
	ReservationStatePaymentFailed = "payment-failed"

	// ReservationStateActive is a ReservationState enum value
	ReservationStateActive = "active"

	// ReservationStateRetired is a ReservationState enum value
	ReservationStateRetired = "retired"
)

const (
	// ReservedInstanceStatePaymentPending is a ReservedInstanceState enum value
	ReservedInstanceStatePaymentPending = "payment-pending"

	// ReservedInstanceStateActive is a ReservedInstanceState enum value
	ReservedInstanceStateActive = "active"

	// ReservedInstanceStatePaymentFailed is a ReservedInstanceState enum value
	ReservedInstanceStatePaymentFailed = "payment-failed"

	// ReservedInstanceStateRetired is a ReservedInstanceState enum value
	ReservedInstanceStateRetired = "retired"
)

const (
	// ResetFpgaImageAttributeNameLoadPermission is a ResetFpgaImageAttributeName enum value
	ResetFpgaImageAttributeNameLoadPermission = "loadPermission"
)

const (
	// ResetImageAttributeNameLaunchPermission is a ResetImageAttributeName enum value
	ResetImageAttributeNameLaunchPermission = "launchPermission"
)

const (
	// ResourceTypeCustomerGateway is a ResourceType enum value
	ResourceTypeCustomerGateway = "customer-gateway"

	// ResourceTypeDedicatedHost is a ResourceType enum value
	ResourceTypeDedicatedHost = "dedicated-host"

	// ResourceTypeDhcpOptions is a ResourceType enum value
	ResourceTypeDhcpOptions = "dhcp-options"

	// ResourceTypeElasticIp is a ResourceType enum value
	ResourceTypeElasticIp = "elastic-ip"

	// ResourceTypeFleet is a ResourceType enum value
	ResourceTypeFleet = "fleet"

	// ResourceTypeFpgaImage is a ResourceType enum value
	ResourceTypeFpgaImage = "fpga-image"

	// ResourceTypeImage is a ResourceType enum value
	ResourceTypeImage = "image"

	// ResourceTypeInstance is a ResourceType enum value
	ResourceTypeInstance = "instance"

	// ResourceTypeInternetGateway is a ResourceType enum value
	ResourceTypeInternetGateway = "internet-gateway"

	// ResourceTypeLaunchTemplate is a ResourceType enum value
	ResourceTypeLaunchTemplate = "launch-template"

	// ResourceTypeNatgateway is a ResourceType enum value
	ResourceTypeNatgateway = "natgateway"

	// ResourceTypeNetworkAcl is a ResourceType enum value
	ResourceTypeNetworkAcl = "network-acl"

	// ResourceTypeNetworkInterface is a ResourceType enum value
	ResourceTypeNetworkInterface = "network-interface"

	// ResourceTypeReservedInstances is a ResourceType enum value
	ResourceTypeReservedInstances = "reserved-instances"

	// ResourceTypeRouteTable is a ResourceType enum value
	ResourceTypeRouteTable = "route-table"

	// ResourceTypeSecurityGroup is a ResourceType enum value
	ResourceTypeSecurityGroup = "security-group"

	// ResourceTypeSnapshot is a ResourceType enum value
	ResourceTypeSnapshot = "snapshot"

	// ResourceTypeSpotInstancesRequest is a ResourceType enum value
	ResourceTypeSpotInstancesRequest = "spot-instances-request"

	// ResourceTypeSubnet is a ResourceType enum value
	ResourceTypeSubnet = "subnet"

	// ResourceTypeTransitGateway is a ResourceType enum value
	ResourceTypeTransitGateway = "transit-gateway"

	// ResourceTypeTransitGatewayAttachment is a ResourceType enum value
	ResourceTypeTransitGatewayAttachment = "transit-gateway-attachment"

	// ResourceTypeTransitGatewayRouteTable is a ResourceType enum value
	ResourceTypeTransitGatewayRouteTable = "transit-gateway-route-table"

	// ResourceTypeVolume is a ResourceType enum value
	ResourceTypeVolume = "volume"

	// ResourceTypeVpc is a ResourceType enum value
	ResourceTypeVpc = "vpc"

	// ResourceTypeVpcPeeringConnection is a ResourceType enum value
	ResourceTypeVpcPeeringConnection = "vpc-peering-connection"

	// ResourceTypeVpnConnection is a ResourceType enum value
	ResourceTypeVpnConnection = "vpn-connection"

	// ResourceTypeVpnGateway is a ResourceType enum value
	ResourceTypeVpnGateway = "vpn-gateway"
)

const (
	// RouteOriginCreateRouteTable is a RouteOrigin enum value
	RouteOriginCreateRouteTable = "CreateRouteTable"

	// RouteOriginCreateRoute is a RouteOrigin enum value
	RouteOriginCreateRoute = "CreateRoute"

	// RouteOriginEnableVgwRoutePropagation is a RouteOrigin enum value
	RouteOriginEnableVgwRoutePropagation = "EnableVgwRoutePropagation"
)

const (
	// RouteStateActive is a RouteState enum value
	RouteStateActive = "active"

	// RouteStateBlackhole is a RouteState enum value
	RouteStateBlackhole = "blackhole"
)

const (
	// RuleActionAllow is a RuleAction enum value
	RuleActionAllow = "allow"

	// RuleActionDeny is a RuleAction enum value
	RuleActionDeny = "deny"
)

const (
	// ServiceStatePending is a ServiceState enum value
	ServiceStatePending = "Pending"

	// ServiceStateAvailable is a ServiceState enum value
	ServiceStateAvailable = "Available"

	// ServiceStateDeleting is a ServiceState enum value
	ServiceStateDeleting = "Deleting"

	// ServiceStateDeleted is a ServiceState enum value
	ServiceStateDeleted = "Deleted"

	// ServiceStateFailed is a ServiceState enum value
	ServiceStateFailed = "Failed"
)

const (
	// ServiceTypeInterface is a ServiceType enum value
	ServiceTypeInterface = "Interface"

	// ServiceTypeGateway is a ServiceType enum value
	ServiceTypeGateway = "Gateway"
)

const (
	// ShutdownBehaviorStop is a ShutdownBehavior enum value
	ShutdownBehaviorStop = "stop"

	// ShutdownBehaviorTerminate is a ShutdownBehavior enum value
	ShutdownBehaviorTerminate = "terminate"
)

const (
	// SnapshotAttributeNameProductCodes is a SnapshotAttributeName enum value
	SnapshotAttributeNameProductCodes = "productCodes"

	// SnapshotAttributeNameCreateVolumePermission is a SnapshotAttributeName enum value
	SnapshotAttributeNameCreateVolumePermission = "createVolumePermission"
)

const (
	// SnapshotStatePending is a SnapshotState enum value
	SnapshotStatePending = "pending"

	// SnapshotStateCompleted is a SnapshotState enum value
	SnapshotStateCompleted = "completed"

	// SnapshotStateError is a SnapshotState enum value
	SnapshotStateError = "error"
)

const (
	// SpotAllocationStrategyLowestPrice is a SpotAllocationStrategy enum value
	SpotAllocationStrategyLowestPrice = "lowest-price"

	// SpotAllocationStrategyDiversified is a SpotAllocationStrategy enum value
	SpotAllocationStrategyDiversified = "diversified"
)

const (
	// SpotInstanceInterruptionBehaviorHibernate is a SpotInstanceInterruptionBehavior enum value
	SpotInstanceInterruptionBehaviorHibernate = "hibernate"

	// SpotInstanceInterruptionBehaviorStop is a SpotInstanceInterruptionBehavior enum value
	SpotInstanceInterruptionBehaviorStop = "stop"

	// SpotInstanceInterruptionBehaviorTerminate is a SpotInstanceInterruptionBehavior enum value
	SpotInstanceInterruptionBehaviorTerminate = "terminate"
)

const (
	// SpotInstanceStateOpen is a SpotInstanceState enum value
	SpotInstanceStateOpen = "open"

	// SpotInstanceStateActive is a SpotInstanceState enum value
	SpotInstanceStateActive = "active"

	// SpotInstanceStateClosed is a SpotInstanceState enum value
	SpotInstanceStateClosed = "closed"

	// SpotInstanceStateCancelled is a SpotInstanceState enum value
	SpotInstanceStateCancelled = "cancelled"

	// SpotInstanceStateFailed is a SpotInstanceState enum value
	SpotInstanceStateFailed = "failed"
)

const (
	// SpotInstanceTypeOneTime is a SpotInstanceType enum value
	SpotInstanceTypeOneTime = "one-time"

	// SpotInstanceTypePersistent is a SpotInstanceType enum value
	SpotInstanceTypePersistent = "persistent"
)

const (
	// StatePendingAcceptance is a State enum value
	StatePendingAcceptance = "PendingAcceptance"

	// StatePending is a State enum value
	StatePending = "Pending"

	// StateAvailable is a State enum value
	StateAvailable = "Available"

	// StateDeleting is a State enum value
	StateDeleting = "Deleting"

	// StateDeleted is a State enum value
	StateDeleted = "Deleted"

	// StateRejected is a State enum value
	StateRejected = "Rejected"

	// StateFailed is a State enum value
	StateFailed = "Failed"

	// StateExpired is a State enum value
	StateExpired = "Expired"
)

const (
	// StatusMoveInProgress is a Status enum value
	StatusMoveInProgress = "MoveInProgress"

	// StatusInVpc is a Status enum value
	StatusInVpc = "InVpc"

	// StatusInClassic is a Status enum value
	StatusInClassic = "InClassic"
)

const (
	// StatusNameReachability is a StatusName enum value
	StatusNameReachability = "reachability"
)

const (
	// StatusTypePassed is a StatusType enum value
	StatusTypePassed = "passed"

	// StatusTypeFailed is a StatusType enum value
	StatusTypeFailed = "failed"

	// StatusTypeInsufficientData is a StatusType enum value
	StatusTypeInsufficientData = "insufficient-data"

	// StatusTypeInitializing is a StatusType enum value
	StatusTypeInitializing = "initializing"
)

const (
	// SubnetCidrBlockStateCodeAssociating is a SubnetCidrBlockStateCode enum value
	SubnetCidrBlockStateCodeAssociating = "associating"

	// SubnetCidrBlockStateCodeAssociated is a SubnetCidrBlockStateCode enum value
	SubnetCidrBlockStateCodeAssociated = "associated"

	// SubnetCidrBlockStateCodeDisassociating is a SubnetCidrBlockStateCode enum value
	SubnetCidrBlockStateCodeDisassociating = "disassociating"

	// SubnetCidrBlockStateCodeDisassociated is a SubnetCidrBlockStateCode enum value
	SubnetCidrBlockStateCodeDisassociated = "disassociated"

	// SubnetCidrBlockStateCodeFailing is a SubnetCidrBlockStateCode enum value
	SubnetCidrBlockStateCodeFailing = "failing"

	// SubnetCidrBlockStateCodeFailed is a SubnetCidrBlockStateCode enum value
	SubnetCidrBlockStateCodeFailed = "failed"
)

const (
	// SubnetStatePending is a SubnetState enum value
	SubnetStatePending = "pending"

	// SubnetStateAvailable is a SubnetState enum value
	SubnetStateAvailable = "available"
)

const (
	// SummaryStatusOk is a SummaryStatus enum value
	SummaryStatusOk = "ok"

	// SummaryStatusImpaired is a SummaryStatus enum value
	SummaryStatusImpaired = "impaired"

	// SummaryStatusInsufficientData is a SummaryStatus enum value
	SummaryStatusInsufficientData = "insufficient-data"

	// SummaryStatusNotApplicable is a SummaryStatus enum value
	SummaryStatusNotApplicable = "not-applicable"

	// SummaryStatusInitializing is a SummaryStatus enum value
	SummaryStatusInitializing = "initializing"
)

const (
	// TelemetryStatusUp is a TelemetryStatus enum value
	TelemetryStatusUp = "UP"

	// TelemetryStatusDown is a TelemetryStatus enum value
	TelemetryStatusDown = "DOWN"
)

const (
	// TenancyDefault is a Tenancy enum value
	TenancyDefault = "default"

	// TenancyDedicated is a Tenancy enum value
	TenancyDedicated = "dedicated"

	// TenancyHost is a Tenancy enum value
	TenancyHost = "host"
)

const (
	// TrafficTypeAccept is a TrafficType enum value
	TrafficTypeAccept = "ACCEPT"

	// TrafficTypeReject is a TrafficType enum value
	TrafficTypeReject = "REJECT"

	// TrafficTypeAll is a TrafficType enum value
	TrafficTypeAll = "ALL"
)

const (
	// TransitGatewayAssociationStateAssociating is a TransitGatewayAssociationState enum value
	TransitGatewayAssociationStateAssociating = "associating"

	// TransitGatewayAssociationStateAssociated is a TransitGatewayAssociationState enum value
	TransitGatewayAssociationStateAssociated = "associated"

	// TransitGatewayAssociationStateDisassociating is a TransitGatewayAssociationState enum value
	TransitGatewayAssociationStateDisassociating = "disassociating"

	// TransitGatewayAssociationStateDisassociated is a TransitGatewayAssociationState enum value
	TransitGatewayAssociationStateDisassociated = "disassociated"
)

const (
	// TransitGatewayAttachmentResourceTypeVpc is a TransitGatewayAttachmentResourceType enum value
	TransitGatewayAttachmentResourceTypeVpc = "vpc"

	// TransitGatewayAttachmentResourceTypeVpn is a TransitGatewayAttachmentResourceType enum value
	TransitGatewayAttachmentResourceTypeVpn = "vpn"
)

const (
	// TransitGatewayAttachmentStatePendingAcceptance is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStatePendingAcceptance = "pendingAcceptance"

	// TransitGatewayAttachmentStateRollingBack is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateRollingBack = "rollingBack"

	// TransitGatewayAttachmentStatePending is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStatePending = "pending"

	// TransitGatewayAttachmentStateAvailable is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateAvailable = "available"

	// TransitGatewayAttachmentStateModifying is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateModifying = "modifying"

	// TransitGatewayAttachmentStateDeleting is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateDeleting = "deleting"

	// TransitGatewayAttachmentStateDeleted is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateDeleted = "deleted"

	// TransitGatewayAttachmentStateFailed is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateFailed = "failed"

	// TransitGatewayAttachmentStateRejected is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateRejected = "rejected"

	// TransitGatewayAttachmentStateRejecting is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateRejecting = "rejecting"

	// TransitGatewayAttachmentStateFailing is a TransitGatewayAttachmentState enum value
	TransitGatewayAttachmentStateFailing = "failing"
)

const (
	// TransitGatewayPropagationStateEnabling is a TransitGatewayPropagationState enum value
	TransitGatewayPropagationStateEnabling = "enabling"

	// TransitGatewayPropagationStateEnabled is a TransitGatewayPropagationState enum value
	TransitGatewayPropagationStateEnabled = "enabled"

	// TransitGatewayPropagationStateDisabling is a TransitGatewayPropagationState enum value
	TransitGatewayPropagationStateDisabling = "disabling"

	// TransitGatewayPropagationStateDisabled is a TransitGatewayPropagationState enum value
	TransitGatewayPropagationStateDisabled = "disabled"
)

const (
	// TransitGatewayRouteStatePending is a TransitGatewayRouteState enum value
	TransitGatewayRouteStatePending = "pending"

	// TransitGatewayRouteStateActive is a TransitGatewayRouteState enum value
	TransitGatewayRouteStateActive = "active"

	// TransitGatewayRouteStateBlackhole is a TransitGatewayRouteState enum value
	TransitGatewayRouteStateBlackhole = "blackhole"

	// TransitGatewayRouteStateDeleting is a TransitGatewayRouteState enum value
	TransitGatewayRouteStateDeleting = "deleting"

	// TransitGatewayRouteStateDeleted is a TransitGatewayRouteState enum value
	TransitGatewayRouteStateDeleted = "deleted"
)

const (
	// TransitGatewayRouteTableStatePending is a TransitGatewayRouteTableState enum value
	TransitGatewayRouteTableStatePending = "pending"

	// TransitGatewayRouteTableStateAvailable is a TransitGatewayRouteTableState enum value
	TransitGatewayRouteTableStateAvailable = "available"

	// TransitGatewayRouteTableStateDeleting is a TransitGatewayRouteTableState enum value
	TransitGatewayRouteTableStateDeleting = "deleting"

	// TransitGatewayRouteTableStateDeleted is a TransitGatewayRouteTableState enum value
	TransitGatewayRouteTableStateDeleted = "deleted"
)

const (
	// TransitGatewayRouteTypeStatic is a TransitGatewayRouteType enum value
	TransitGatewayRouteTypeStatic = "static"

	// TransitGatewayRouteTypePropagated is a TransitGatewayRouteType enum value
	TransitGatewayRouteTypePropagated = "propagated"
)

const (
	// TransitGatewayStatePending is a TransitGatewayState enum value
	TransitGatewayStatePending = "pending"

	// TransitGatewayStateAvailable is a TransitGatewayState enum value
	TransitGatewayStateAvailable = "available"

	// TransitGatewayStateModifying is a TransitGatewayState enum value
	TransitGatewayStateModifying = "modifying"

	// TransitGatewayStateDeleting is a TransitGatewayState enum value
	TransitGatewayStateDeleting = "deleting"

	// TransitGatewayStateDeleted is a TransitGatewayState enum value
	TransitGatewayStateDeleted = "deleted"
)

const (
	// TransportProtocolTcp is a TransportProtocol enum value
	TransportProtocolTcp = "tcp"

	// TransportProtocolUdp is a TransportProtocol enum value
	TransportProtocolUdp = "udp"
)

const (
	// UnsuccessfulInstanceCreditSpecificationErrorCodeInvalidInstanceIdMalformed is a UnsuccessfulInstanceCreditSpecificationErrorCode enum value
	UnsuccessfulInstanceCreditSpecificationErrorCodeInvalidInstanceIdMalformed = "InvalidInstanceID.Malformed"

	// UnsuccessfulInstanceCreditSpecificationErrorCodeInvalidInstanceIdNotFound is a UnsuccessfulInstanceCreditSpecificationErrorCode enum value
	UnsuccessfulInstanceCreditSpecificationErrorCodeInvalidInstanceIdNotFound = "InvalidInstanceID.NotFound"

	// UnsuccessfulInstanceCreditSpecificationErrorCodeIncorrectInstanceState is a UnsuccessfulInstanceCreditSpecificationErrorCode enum value
	UnsuccessfulInstanceCreditSpecificationErrorCodeIncorrectInstanceState = "IncorrectInstanceState"

	// UnsuccessfulInstanceCreditSpecificationErrorCodeInstanceCreditSpecificationNotSupported is a UnsuccessfulInstanceCreditSpecificationErrorCode enum value
	UnsuccessfulInstanceCreditSpecificationErrorCodeInstanceCreditSpecificationNotSupported = "InstanceCreditSpecification.NotSupported"
)

const (
	// VirtualizationTypeHvm is a VirtualizationType enum value
	VirtualizationTypeHvm = "hvm"

	// VirtualizationTypeParavirtual is a VirtualizationType enum value
	VirtualizationTypeParavirtual = "paravirtual"
)

const (
	// VolumeAttachmentStateAttaching is a VolumeAttachmentState enum value
	VolumeAttachmentStateAttaching = "attaching"

	// VolumeAttachmentStateAttached is a VolumeAttachmentState enum value
	VolumeAttachmentStateAttached = "attached"

	// VolumeAttachmentStateDetaching is a VolumeAttachmentState enum value
	VolumeAttachmentStateDetaching = "detaching"

	// VolumeAttachmentStateDetached is a VolumeAttachmentState enum value
	VolumeAttachmentStateDetached = "detached"

	// VolumeAttachmentStateBusy is a VolumeAttachmentState enum value
	VolumeAttachmentStateBusy = "busy"
)

const (
	// VolumeAttributeNameAutoEnableIo is a VolumeAttributeName enum value
	VolumeAttributeNameAutoEnableIo = "autoEnableIO"

	// VolumeAttributeNameProductCodes is a VolumeAttributeName enum value
	VolumeAttributeNameProductCodes = "productCodes"
)

const (
	// VolumeModificationStateModifying is a VolumeModificationState enum value
	VolumeModificationStateModifying = "modifying"

	// VolumeModificationStateOptimizing is a VolumeModificationState enum value
	VolumeModificationStateOptimizing = "optimizing"

	// VolumeModificationStateCompleted is a VolumeModificationState enum value
	VolumeModificationStateCompleted = "completed"

	// VolumeModificationStateFailed is a VolumeModificationState enum value
	VolumeModificationStateFailed = "failed"
)

const (
	// VolumeStateCreating is a VolumeState enum value
	VolumeStateCreating = "creating"

	// VolumeStateAvailable is a VolumeState enum value
	VolumeStateAvailable = "available"

	// VolumeStateInUse is a VolumeState enum value
	VolumeStateInUse = "in-use"

	// VolumeStateDeleting is a VolumeState enum value
	VolumeStateDeleting = "deleting"

	// VolumeStateDeleted is a VolumeState enum value
	VolumeStateDeleted = "deleted"

	// VolumeStateError is a VolumeState enum value
	VolumeStateError = "error"
)

const (
	// VolumeStatusInfoStatusOk is a VolumeStatusInfoStatus enum value
	VolumeStatusInfoStatusOk = "ok"

	// VolumeStatusInfoStatusImpaired is a VolumeStatusInfoStatus enum value
	VolumeStatusInfoStatusImpaired = "impaired"

	// VolumeStatusInfoStatusInsufficientData is a VolumeStatusInfoStatus enum value
	VolumeStatusInfoStatusInsufficientData = "insufficient-data"
)

const (
	// VolumeStatusNameIoEnabled is a VolumeStatusName enum value
	VolumeStatusNameIoEnabled = "io-enabled"

	// VolumeStatusNameIoPerformance is a VolumeStatusName enum value
	VolumeStatusNameIoPerformance = "io-performance"
)

const (
	// VolumeTypeStandard is a VolumeType enum value
	VolumeTypeStandard = "standard"

	// VolumeTypeIo1 is a VolumeType enum value
	VolumeTypeIo1 = "io1"

	// VolumeTypeGp2 is a VolumeType enum value
	VolumeTypeGp2 = "gp2"

	// VolumeTypeSc1 is a VolumeType enum value
	VolumeTypeSc1 = "sc1"

	// VolumeTypeSt1 is a VolumeType enum value
	VolumeTypeSt1 = "st1"
)

const (
	// VpcAttributeNameEnableDnsSupport is a VpcAttributeName enum value
	VpcAttributeNameEnableDnsSupport = "enableDnsSupport"

	// VpcAttributeNameEnableDnsHostnames is a VpcAttributeName enum value
	VpcAttributeNameEnableDnsHostnames = "enableDnsHostnames"
)

const (
	// VpcCidrBlockStateCodeAssociating is a VpcCidrBlockStateCode enum value
	VpcCidrBlockStateCodeAssociating = "associating"

	// VpcCidrBlockStateCodeAssociated is a VpcCidrBlockStateCode enum value
	VpcCidrBlockStateCodeAssociated = "associated"

	// VpcCidrBlockStateCodeDisassociating is a VpcCidrBlockStateCode enum value
	VpcCidrBlockStateCodeDisassociating = "disassociating"

	// VpcCidrBlockStateCodeDisassociated is a VpcCidrBlockStateCode enum value
	VpcCidrBlockStateCodeDisassociated = "disassociated"

	// VpcCidrBlockStateCodeFailing is a VpcCidrBlockStateCode enum value
	VpcCidrBlockStateCodeFailing = "failing"

	// VpcCidrBlockStateCodeFailed is a VpcCidrBlockStateCode enum value
	VpcCidrBlockStateCodeFailed = "failed"
)

const (
	// VpcEndpointTypeInterface is a VpcEndpointType enum value
	VpcEndpointTypeInterface = "Interface"

	// VpcEndpointTypeGateway is a VpcEndpointType enum value
	VpcEndpointTypeGateway = "Gateway"
)

const (
	// VpcPeeringConnectionStateReasonCodeInitiatingRequest is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeInitiatingRequest = "initiating-request"

	// VpcPeeringConnectionStateReasonCodePendingAcceptance is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodePendingAcceptance = "pending-acceptance"

	// VpcPeeringConnectionStateReasonCodeActive is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeActive = "active"

	// VpcPeeringConnectionStateReasonCodeDeleted is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeDeleted = "deleted"

	// VpcPeeringConnectionStateReasonCodeRejected is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeRejected = "rejected"

	// VpcPeeringConnectionStateReasonCodeFailed is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeFailed = "failed"

	// VpcPeeringConnectionStateReasonCodeExpired is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeExpired = "expired"

	// VpcPeeringConnectionStateReasonCodeProvisioning is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeProvisioning = "provisioning"

	// VpcPeeringConnectionStateReasonCodeDeleting is a VpcPeeringConnectionStateReasonCode enum value
	VpcPeeringConnectionStateReasonCodeDeleting = "deleting"
)

const (
	// VpcStatePending is a VpcState enum value
	VpcStatePending = "pending"

	// VpcStateAvailable is a VpcState enum value
	VpcStateAvailable = "available"
)

const (
	// VpcTenancyDefault is a VpcTenancy enum value
	VpcTenancyDefault = "default"
)

const (
	// VpnEcmpSupportValueEnable is a VpnEcmpSupportValue enum value
	VpnEcmpSupportValueEnable = "enable"

	// VpnEcmpSupportValueDisable is a VpnEcmpSupportValue enum value
	VpnEcmpSupportValueDisable = "disable"
)

const (
	// VpnProtocolOpenvpn is a VpnProtocol enum value
	VpnProtocolOpenvpn = "openvpn"
)

const (
	// VpnStatePending is a VpnState enum value
	VpnStatePending = "pending"

	// VpnStateAvailable is a VpnState enum value
	VpnStateAvailable = "available"

	// VpnStateDeleting is a VpnState enum value
	VpnStateDeleting = "deleting"

	// VpnStateDeleted is a VpnState enum value
	VpnStateDeleted = "deleted"
)

const (
	// VpnStaticRouteSourceStatic is a VpnStaticRouteSource enum value
	VpnStaticRouteSourceStatic = "Static"
)

const (
	// ScopeAvailabilityZone is a scope enum value
	ScopeAvailabilityZone = "Availability Zone"

	// ScopeRegion is a scope enum value
	ScopeRegion = "Region"
)
