// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AmazonEC2SkeletonInterface.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.5.6  Built on : Aug 30, 2011 (10:00:16 CEST)
 */
package com.amazon.ec2;

/**
 *  AmazonEC2SkeletonInterface java skeleton interface for the axisService
 */
public interface AmazonEC2SkeletonInterface {

    /**
     * Auto generated method signature
     *
                                * @param describePlacementGroups
     */

    public com.amazon.ec2.DescribePlacementGroupsResponse describePlacementGroups(com.amazon.ec2.DescribePlacementGroups describePlacementGroups);

    /**
     * Auto generated method signature
     *
                                * @param createSecurityGroup
     */

    public com.amazon.ec2.CreateSecurityGroupResponse createSecurityGroup(com.amazon.ec2.CreateSecurityGroup createSecurityGroup);

    /**
     * Auto generated method signature
     *
                                * @param resetNetworkInterfaceAttribute
     */

    public com.amazon.ec2.ResetNetworkInterfaceAttributeResponse resetNetworkInterfaceAttribute(
        com.amazon.ec2.ResetNetworkInterfaceAttribute resetNetworkInterfaceAttribute);

    /**
     * Auto generated method signature
     *
                                * @param createDhcpOptions
     */

    public com.amazon.ec2.CreateDhcpOptionsResponse createDhcpOptions(com.amazon.ec2.CreateDhcpOptions createDhcpOptions);

    /**
     * Auto generated method signature
     *
                                * @param createRouteTable
     */

    public com.amazon.ec2.CreateRouteTableResponse createRouteTable(com.amazon.ec2.CreateRouteTable createRouteTable);

    /**
     * Auto generated method signature
     *
                                * @param describeSubnets
     */

    public com.amazon.ec2.DescribeSubnetsResponse describeSubnets(com.amazon.ec2.DescribeSubnets describeSubnets);

    /**
     * Auto generated method signature
     *
                                * @param deactivateLicense
     */

    public com.amazon.ec2.DeactivateLicenseResponse deactivateLicense(com.amazon.ec2.DeactivateLicense deactivateLicense);

    /**
     * Auto generated method signature
     *
                                * @param deleteVpc
     */

    public com.amazon.ec2.DeleteVpcResponse deleteVpc(com.amazon.ec2.DeleteVpc deleteVpc);

    /**
     * Auto generated method signature
     *
                                * @param cancelSpotInstanceRequests
     */

    public com.amazon.ec2.CancelSpotInstanceRequestsResponse cancelSpotInstanceRequests(com.amazon.ec2.CancelSpotInstanceRequests cancelSpotInstanceRequests);

    /**
     * Auto generated method signature
     *
                                * @param createSubnet
     */

    public com.amazon.ec2.CreateSubnetResponse createSubnet(com.amazon.ec2.CreateSubnet createSubnet);

    /**
     * Auto generated method signature
     *
                                * @param deleteVpnGateway
     */

    public com.amazon.ec2.DeleteVpnGatewayResponse deleteVpnGateway(com.amazon.ec2.DeleteVpnGateway deleteVpnGateway);

    /**
     * Auto generated method signature
     *
                                * @param createNetworkAclEntry
     */

    public com.amazon.ec2.CreateNetworkAclEntryResponse createNetworkAclEntry(com.amazon.ec2.CreateNetworkAclEntry createNetworkAclEntry);

    /**
     * Auto generated method signature
     *
                                * @param requestSpotInstances
     */

    public com.amazon.ec2.RequestSpotInstancesResponse requestSpotInstances(com.amazon.ec2.RequestSpotInstances requestSpotInstances);

    /**
     * Auto generated method signature
     *
                                * @param describeVolumeAttribute
     */

    public com.amazon.ec2.DescribeVolumeAttributeResponse describeVolumeAttribute(com.amazon.ec2.DescribeVolumeAttribute describeVolumeAttribute);

    /**
     * Auto generated method signature
     *
                                * @param associateDhcpOptions
     */

    public com.amazon.ec2.AssociateDhcpOptionsResponse associateDhcpOptions(com.amazon.ec2.AssociateDhcpOptions associateDhcpOptions);

    /**
     * Auto generated method signature
     *
                                * @param describeTags
     */

    public com.amazon.ec2.DescribeTagsResponse describeTags(com.amazon.ec2.DescribeTags describeTags);

    /**
     * Auto generated method signature
     *
                                * @param importKeyPair
     */

    public com.amazon.ec2.ImportKeyPairResponse importKeyPair(com.amazon.ec2.ImportKeyPair importKeyPair);

    /**
     * Auto generated method signature
     *
                                * @param deleteNetworkInterface
     */

    public com.amazon.ec2.DeleteNetworkInterfaceResponse deleteNetworkInterface(com.amazon.ec2.DeleteNetworkInterface deleteNetworkInterface);

    /**
     * Auto generated method signature
     *
                                * @param describeVpcs
     */

    public com.amazon.ec2.DescribeVpcsResponse describeVpcs(com.amazon.ec2.DescribeVpcs describeVpcs);

    /**
     * Auto generated method signature
     *
                                * @param describeLicenses
     */

    public com.amazon.ec2.DescribeLicensesResponse describeLicenses(com.amazon.ec2.DescribeLicenses describeLicenses);

    /**
     * Auto generated method signature
     *
                                * @param bundleInstance
     */

    public com.amazon.ec2.BundleInstanceResponse bundleInstance(com.amazon.ec2.BundleInstance bundleInstance);

    /**
     * Auto generated method signature
     *
                                * @param describeVpnConnections
     */

    public com.amazon.ec2.DescribeVpnConnectionsResponse describeVpnConnections(com.amazon.ec2.DescribeVpnConnections describeVpnConnections);

    /**
     * Auto generated method signature
     *
                                * @param describeImages
     */

    public com.amazon.ec2.DescribeImagesResponse describeImages(com.amazon.ec2.DescribeImages describeImages);

    /**
     * Auto generated method signature
     *
                                * @param createInternetGateway
     */

    public com.amazon.ec2.CreateInternetGatewayResponse createInternetGateway(com.amazon.ec2.CreateInternetGateway createInternetGateway);

    /**
     * Auto generated method signature
     *
                                * @param disassociateRouteTable
     */

    public com.amazon.ec2.DisassociateRouteTableResponse disassociateRouteTable(com.amazon.ec2.DisassociateRouteTable disassociateRouteTable);

    /**
     * Auto generated method signature
     *
                                * @param replaceNetworkAclEntry
     */

    public com.amazon.ec2.ReplaceNetworkAclEntryResponse replaceNetworkAclEntry(com.amazon.ec2.ReplaceNetworkAclEntry replaceNetworkAclEntry);

    /**
     * Auto generated method signature
     *
                                * @param authorizeSecurityGroupIngress
     */

    public com.amazon.ec2.AuthorizeSecurityGroupIngressResponse authorizeSecurityGroupIngress(com.amazon.ec2.AuthorizeSecurityGroupIngress authorizeSecurityGroupIngress);

    /**
     * Auto generated method signature
     *
                                * @param describeSnapshotAttribute
     */

    public com.amazon.ec2.DescribeSnapshotAttributeResponse describeSnapshotAttribute(com.amazon.ec2.DescribeSnapshotAttribute describeSnapshotAttribute);

    /**
     * Auto generated method signature
     *
                                * @param createVpnGateway
     */

    public com.amazon.ec2.CreateVpnGatewayResponse createVpnGateway(com.amazon.ec2.CreateVpnGateway createVpnGateway);

    /**
     * Auto generated method signature
     *
                                * @param resetInstanceAttribute
     */

    public com.amazon.ec2.ResetInstanceAttributeResponse resetInstanceAttribute(com.amazon.ec2.ResetInstanceAttribute resetInstanceAttribute);

    /**
     * Auto generated method signature
     *
                                * @param createTags
     */

    public com.amazon.ec2.CreateTagsResponse createTags(com.amazon.ec2.CreateTags createTags);

    /**
     * Auto generated method signature
     *
                                * @param authorizeSecurityGroupEgress
     */

    public com.amazon.ec2.AuthorizeSecurityGroupEgressResponse authorizeSecurityGroupEgress(com.amazon.ec2.AuthorizeSecurityGroupEgress authorizeSecurityGroupEgress);

    /**
     * Auto generated method signature
     *
                                * @param associateAddress
     */

    public com.amazon.ec2.AssociateAddressResponse associateAddress(com.amazon.ec2.AssociateAddress associateAddress);

    /**
     * Auto generated method signature
     *
                                * @param describeImageAttribute
     */

    public com.amazon.ec2.DescribeImageAttributeResponse describeImageAttribute(com.amazon.ec2.DescribeImageAttribute describeImageAttribute);

    /**
     * Auto generated method signature
     *
                                * @param describeSpotPriceHistory
     */

    public com.amazon.ec2.DescribeSpotPriceHistoryResponse describeSpotPriceHistory(com.amazon.ec2.DescribeSpotPriceHistory describeSpotPriceHistory);

    /**
     * Auto generated method signature
     *
                                * @param modifySnapshotAttribute
     */

    public com.amazon.ec2.ModifySnapshotAttributeResponse modifySnapshotAttribute(com.amazon.ec2.ModifySnapshotAttribute modifySnapshotAttribute);

    /**
     * Auto generated method signature
     *
                                * @param describeSpotInstanceRequests
     */

    public com.amazon.ec2.DescribeSpotInstanceRequestsResponse describeSpotInstanceRequests(com.amazon.ec2.DescribeSpotInstanceRequests describeSpotInstanceRequests);

    /**
     * Auto generated method signature
     *
                                * @param importInstance
     */

    public com.amazon.ec2.ImportInstanceResponse importInstance(com.amazon.ec2.ImportInstance importInstance);

    /**
     * Auto generated method signature
     *
                                * @param describeKeyPairs
     */

    public com.amazon.ec2.DescribeKeyPairsResponse describeKeyPairs(com.amazon.ec2.DescribeKeyPairs describeKeyPairs);

    /**
     * Auto generated method signature
     *
                                * @param revokeSecurityGroupIngress
     */

    public com.amazon.ec2.RevokeSecurityGroupIngressResponse revokeSecurityGroupIngress(com.amazon.ec2.RevokeSecurityGroupIngress revokeSecurityGroupIngress);

    /**
     * Auto generated method signature
     *
                                * @param createPlacementGroup
     */

    public com.amazon.ec2.CreatePlacementGroupResponse createPlacementGroup(com.amazon.ec2.CreatePlacementGroup createPlacementGroup);

    /**
     * Auto generated method signature
     *
                                * @param deleteNetworkAclEntry
     */

    public com.amazon.ec2.DeleteNetworkAclEntryResponse deleteNetworkAclEntry(com.amazon.ec2.DeleteNetworkAclEntry deleteNetworkAclEntry);

    /**
     * Auto generated method signature
     *
                                * @param activateLicense
     */

    public com.amazon.ec2.ActivateLicenseResponse activateLicense(com.amazon.ec2.ActivateLicense activateLicense);

    /**
     * Auto generated method signature
     *
                                * @param deleteRouteTable
     */

    public com.amazon.ec2.DeleteRouteTableResponse deleteRouteTable(com.amazon.ec2.DeleteRouteTable deleteRouteTable);

    /**
     * Auto generated method signature
     *
                                * @param unmonitorInstances
     */

    public com.amazon.ec2.UnmonitorInstancesResponse unmonitorInstances(com.amazon.ec2.UnmonitorInstances unmonitorInstances);

    /**
     * Auto generated method signature
     *
                                * @param startInstances
     */

    public com.amazon.ec2.StartInstancesResponse startInstances(com.amazon.ec2.StartInstances startInstances);

    /**
     * Auto generated method signature
     *
                                * @param confirmProductInstance
     */

    public com.amazon.ec2.ConfirmProductInstanceResponse confirmProductInstance(com.amazon.ec2.ConfirmProductInstance confirmProductInstance);

    /**
     * Auto generated method signature
     *
                                * @param describeNetworkInterfaceAttribute
     */

    public com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse describeNetworkInterfaceAttribute(
        com.amazon.ec2.DescribeNetworkInterfaceAttribute describeNetworkInterfaceAttribute);

    /**
     * Auto generated method signature
     *
                                * @param runInstances
     */

    public com.amazon.ec2.RunInstancesResponse runInstances(com.amazon.ec2.RunInstances runInstances);

    /**
     * Auto generated method signature
     *
                                * @param createReservedInstancesListing
     */

    public com.amazon.ec2.CreateReservedInstancesListingResponse createReservedInstancesListing(
        com.amazon.ec2.CreateReservedInstancesListing createReservedInstancesListing);

    /**
     * Auto generated method signature
     *
                                * @param createCustomerGateway
     */

    public com.amazon.ec2.CreateCustomerGatewayResponse createCustomerGateway(com.amazon.ec2.CreateCustomerGateway createCustomerGateway);

    /**
     * Auto generated method signature
     *
                                * @param createNetworkAcl
     */

    public com.amazon.ec2.CreateNetworkAclResponse createNetworkAcl(com.amazon.ec2.CreateNetworkAcl createNetworkAcl);

    /**
     * Auto generated method signature
     *
                                * @param resetImageAttribute
     */

    public com.amazon.ec2.ResetImageAttributeResponse resetImageAttribute(com.amazon.ec2.ResetImageAttribute resetImageAttribute);

    /**
     * Auto generated method signature
     *
                                * @param modifyVolumeAttribute
     */

    public com.amazon.ec2.ModifyVolumeAttributeResponse modifyVolumeAttribute(com.amazon.ec2.ModifyVolumeAttribute modifyVolumeAttribute);

    /**
     * Auto generated method signature
     *
                                * @param describeReservedInstances
     */

    public com.amazon.ec2.DescribeReservedInstancesResponse describeReservedInstances(com.amazon.ec2.DescribeReservedInstances describeReservedInstances);

    /**
     * Auto generated method signature
     *
                                * @param resetSnapshotAttribute
     */

    public com.amazon.ec2.ResetSnapshotAttributeResponse resetSnapshotAttribute(com.amazon.ec2.ResetSnapshotAttribute resetSnapshotAttribute);

    /**
     * Auto generated method signature
     *
                                * @param deleteVolume
     */

    public com.amazon.ec2.DeleteVolumeResponse deleteVolume(com.amazon.ec2.DeleteVolume deleteVolume);

    /**
     * Auto generated method signature
     *
                                * @param describeAvailabilityZones
     */

    public com.amazon.ec2.DescribeAvailabilityZonesResponse describeAvailabilityZones(com.amazon.ec2.DescribeAvailabilityZones describeAvailabilityZones);

    /**
     * Auto generated method signature
     *
                                * @param createVpnConnection
     */

    public com.amazon.ec2.CreateVpnConnectionResponse createVpnConnection(com.amazon.ec2.CreateVpnConnection createVpnConnection);

    /**
     * Auto generated method signature
     *
                                * @param cancelBundleTask
     */

    public com.amazon.ec2.CancelBundleTaskResponse cancelBundleTask(com.amazon.ec2.CancelBundleTask cancelBundleTask);

    /**
     * Auto generated method signature
     *
                                * @param replaceNetworkAclAssociation
     */

    public com.amazon.ec2.ReplaceNetworkAclAssociationResponse replaceNetworkAclAssociation(com.amazon.ec2.ReplaceNetworkAclAssociation replaceNetworkAclAssociation);

    /**
     * Auto generated method signature
     *
                                * @param detachVpnGateway
     */

    public com.amazon.ec2.DetachVpnGatewayResponse detachVpnGateway(com.amazon.ec2.DetachVpnGateway detachVpnGateway);

    /**
     * Auto generated method signature
     *
                                * @param describeSnapshots
     */

    public com.amazon.ec2.DescribeSnapshotsResponse describeSnapshots(com.amazon.ec2.DescribeSnapshots describeSnapshots);

    /**
     * Auto generated method signature
     *
                                * @param deleteSubnet
     */

    public com.amazon.ec2.DeleteSubnetResponse deleteSubnet(com.amazon.ec2.DeleteSubnet deleteSubnet);

    /**
     * Auto generated method signature
     *
                                * @param describeBundleTasks
     */

    public com.amazon.ec2.DescribeBundleTasksResponse describeBundleTasks(com.amazon.ec2.DescribeBundleTasks describeBundleTasks);

    /**
     * Auto generated method signature
     *
                                * @param createKeyPair
     */

    public com.amazon.ec2.CreateKeyPairResponse createKeyPair(com.amazon.ec2.CreateKeyPair createKeyPair);

    /**
     * Auto generated method signature
     *
                                * @param createImage
     */

    public com.amazon.ec2.CreateImageResponse createImage(com.amazon.ec2.CreateImage createImage);

    /**
     * Auto generated method signature
     *
                                * @param enableVgwRoutePropagation
     */

    public com.amazon.ec2.EnableVgwRoutePropagationResponse enableVgwRoutePropagation(com.amazon.ec2.EnableVgwRoutePropagation enableVgwRoutePropagation);

    /**
     * Auto generated method signature
     *
                                * @param unassignPrivateIpAddresses
     */

    public com.amazon.ec2.UnassignPrivateIpAddressesResponse unassignPrivateIpAddresses(com.amazon.ec2.UnassignPrivateIpAddresses unassignPrivateIpAddresses);

    /**
     * Auto generated method signature
     *
                                * @param deregisterImage
     */

    public com.amazon.ec2.DeregisterImageResponse deregisterImage(com.amazon.ec2.DeregisterImage deregisterImage);

    /**
     * Auto generated method signature
     *
                                * @param deleteVpnConnectionRoute
     */

    public com.amazon.ec2.DeleteVpnConnectionRouteResponse deleteVpnConnectionRoute(com.amazon.ec2.DeleteVpnConnectionRoute deleteVpnConnectionRoute);

    /**
     * Auto generated method signature
     *
                                * @param modifyImageAttribute
     */

    public com.amazon.ec2.ModifyImageAttributeResponse modifyImageAttribute(com.amazon.ec2.ModifyImageAttribute modifyImageAttribute);

    /**
     * Auto generated method signature
     *
                                * @param cancelConversionTask
     */

    public com.amazon.ec2.CancelConversionTaskResponse cancelConversionTask(com.amazon.ec2.CancelConversionTask cancelConversionTask);

    /**
     * Auto generated method signature
     *
                                * @param describeVolumes
     */

    public com.amazon.ec2.DescribeVolumesResponse describeVolumes(com.amazon.ec2.DescribeVolumes describeVolumes);

    /**
     * Auto generated method signature
     *
                                * @param cancelReservedInstancesListing
     */

    public com.amazon.ec2.CancelReservedInstancesListingResponse cancelReservedInstancesListing(
        com.amazon.ec2.CancelReservedInstancesListing cancelReservedInstancesListing);

    /**
     * Auto generated method signature
     *
                                * @param getPasswordData
     */

    public com.amazon.ec2.GetPasswordDataResponse getPasswordData(com.amazon.ec2.GetPasswordData getPasswordData);

    /**
     * Auto generated method signature
     *
                                * @param allocateAddress
     */

    public com.amazon.ec2.AllocateAddressResponse allocateAddress(com.amazon.ec2.AllocateAddress allocateAddress);

    /**
     * Auto generated method signature
     *
                                * @param deleteSecurityGroup
     */

    public com.amazon.ec2.DeleteSecurityGroupResponse deleteSecurityGroup(com.amazon.ec2.DeleteSecurityGroup deleteSecurityGroup);

    /**
     * Auto generated method signature
     *
                                * @param deletePlacementGroup
     */

    public com.amazon.ec2.DeletePlacementGroupResponse deletePlacementGroup(com.amazon.ec2.DeletePlacementGroup deletePlacementGroup);

    /**
     * Auto generated method signature
     *
                                * @param disassociateAddress
     */

    public com.amazon.ec2.DisassociateAddressResponse disassociateAddress(com.amazon.ec2.DisassociateAddress disassociateAddress);

    /**
     * Auto generated method signature
     *
                                * @param deleteDhcpOptions
     */

    public com.amazon.ec2.DeleteDhcpOptionsResponse deleteDhcpOptions(com.amazon.ec2.DeleteDhcpOptions deleteDhcpOptions);

    /**
     * Auto generated method signature
     *
                                * @param describeSpotDatafeedSubscription
     */

    public com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse describeSpotDatafeedSubscription(
        com.amazon.ec2.DescribeSpotDatafeedSubscription describeSpotDatafeedSubscription);

    /**
     * Auto generated method signature
     *
                                * @param describeNetworkAcls
     */

    public com.amazon.ec2.DescribeNetworkAclsResponse describeNetworkAcls(com.amazon.ec2.DescribeNetworkAcls describeNetworkAcls);

    /**
     * Auto generated method signature
     *
                                * @param enableVolumeIO
     */

    public com.amazon.ec2.EnableVolumeIOResponse enableVolumeIO(com.amazon.ec2.EnableVolumeIO enableVolumeIO);

    /**
     * Auto generated method signature
     *
                                * @param attachVpnGateway
     */

    public com.amazon.ec2.AttachVpnGatewayResponse attachVpnGateway(com.amazon.ec2.AttachVpnGateway attachVpnGateway);

    /**
     * Auto generated method signature
     *
                                * @param describeInternetGateways
     */

    public com.amazon.ec2.DescribeInternetGatewaysResponse describeInternetGateways(com.amazon.ec2.DescribeInternetGateways describeInternetGateways);

    /**
     * Auto generated method signature
     *
                                * @param describeDhcpOptions
     */

    public com.amazon.ec2.DescribeDhcpOptionsResponse describeDhcpOptions(com.amazon.ec2.DescribeDhcpOptions describeDhcpOptions);

    /**
     * Auto generated method signature
     *
                                * @param createSpotDatafeedSubscription
     */

    public com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse createSpotDatafeedSubscription(
        com.amazon.ec2.CreateSpotDatafeedSubscription createSpotDatafeedSubscription);

    /**
     * Auto generated method signature
     *
                                * @param describeReservedInstancesListings
     */

    public com.amazon.ec2.DescribeReservedInstancesListingsResponse describeReservedInstancesListings(
        com.amazon.ec2.DescribeReservedInstancesListings describeReservedInstancesListings);

    /**
     * Auto generated method signature
     *
                                * @param describeInstanceStatus
     */

    public com.amazon.ec2.DescribeInstanceStatusResponse describeInstanceStatus(com.amazon.ec2.DescribeInstanceStatus describeInstanceStatus);

    /**
     * Auto generated method signature
     *
                                * @param modifyNetworkInterfaceAttribute
     */

    public com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse modifyNetworkInterfaceAttribute(
        com.amazon.ec2.ModifyNetworkInterfaceAttribute modifyNetworkInterfaceAttribute);

    /**
     * Auto generated method signature
     *
                                * @param disableVgwRoutePropagation
     */

    public com.amazon.ec2.DisableVgwRoutePropagationResponse disableVgwRoutePropagation(com.amazon.ec2.DisableVgwRoutePropagation disableVgwRoutePropagation);

    /**
     * Auto generated method signature
     *
                                * @param describeVolumeStatus
     */

    public com.amazon.ec2.DescribeVolumeStatusResponse describeVolumeStatus(com.amazon.ec2.DescribeVolumeStatus describeVolumeStatus);

    /**
     * Auto generated method signature
     *
                                * @param detachNetworkInterface
     */

    public com.amazon.ec2.DetachNetworkInterfaceResponse detachNetworkInterface(com.amazon.ec2.DetachNetworkInterface detachNetworkInterface);

    /**
     * Auto generated method signature
     *
                                * @param describeSecurityGroups
     */

    public com.amazon.ec2.DescribeSecurityGroupsResponse describeSecurityGroups(com.amazon.ec2.DescribeSecurityGroups describeSecurityGroups);

    /**
     * Auto generated method signature
     *
                                * @param describeInstances
     */

    public com.amazon.ec2.DescribeInstancesResponse describeInstances(com.amazon.ec2.DescribeInstances describeInstances);

    /**
     * Auto generated method signature
     *
                                * @param describeNetworkInterfaces
     */

    public com.amazon.ec2.DescribeNetworkInterfacesResponse describeNetworkInterfaces(com.amazon.ec2.DescribeNetworkInterfaces describeNetworkInterfaces);

    /**
     * Auto generated method signature
     *
                                * @param deleteKeyPair
     */

    public com.amazon.ec2.DeleteKeyPairResponse deleteKeyPair(com.amazon.ec2.DeleteKeyPair deleteKeyPair);

    /**
     * Auto generated method signature
     *
                                * @param createSnapshot
     */

    public com.amazon.ec2.CreateSnapshotResponse createSnapshot(com.amazon.ec2.CreateSnapshot createSnapshot);

    /**
     * Auto generated method signature
     *
                                * @param describeVpnGateways
     */

    public com.amazon.ec2.DescribeVpnGatewaysResponse describeVpnGateways(com.amazon.ec2.DescribeVpnGateways describeVpnGateways);

    /**
     * Auto generated method signature
     *
                                * @param deleteTags
     */

    public com.amazon.ec2.DeleteTagsResponse deleteTags(com.amazon.ec2.DeleteTags deleteTags);

    /**
     * Auto generated method signature
     *
                                * @param deleteSnapshot
     */

    public com.amazon.ec2.DeleteSnapshotResponse deleteSnapshot(com.amazon.ec2.DeleteSnapshot deleteSnapshot);

    /**
     * Auto generated method signature
     *
                                * @param deleteCustomerGateway
     */

    public com.amazon.ec2.DeleteCustomerGatewayResponse deleteCustomerGateway(com.amazon.ec2.DeleteCustomerGateway deleteCustomerGateway);

    /**
     * Auto generated method signature
     *
                                * @param createVolume
     */

    public com.amazon.ec2.CreateVolumeResponse createVolume(com.amazon.ec2.CreateVolume createVolume);

    /**
     * Auto generated method signature
     *
                                * @param cancelExportTask
     */

    public com.amazon.ec2.CancelExportTaskResponse cancelExportTask(com.amazon.ec2.CancelExportTask cancelExportTask);

    /**
     * Auto generated method signature
     *
                                * @param registerImage
     */

    public com.amazon.ec2.RegisterImageResponse registerImage(com.amazon.ec2.RegisterImage registerImage);

    /**
     * Auto generated method signature
     *
                                * @param detachVolume
     */

    public com.amazon.ec2.DetachVolumeResponse detachVolume(com.amazon.ec2.DetachVolume detachVolume);

    /**
     * Auto generated method signature
     *
                                * @param stopInstances
     */

    public com.amazon.ec2.StopInstancesResponse stopInstances(com.amazon.ec2.StopInstances stopInstances);

    /**
     * Auto generated method signature
     *
                                * @param createRoute
     */

    public com.amazon.ec2.CreateRouteResponse createRoute(com.amazon.ec2.CreateRoute createRoute);

    /**
     * Auto generated method signature
     *
                                * @param releaseAddress
     */

    public com.amazon.ec2.ReleaseAddressResponse releaseAddress(com.amazon.ec2.ReleaseAddress releaseAddress);

    /**
     * Auto generated method signature
     *
                                * @param describeRouteTables
     */

    public com.amazon.ec2.DescribeRouteTablesResponse describeRouteTables(com.amazon.ec2.DescribeRouteTables describeRouteTables);

    /**
     * Auto generated method signature
     *
                                * @param describeCustomerGateways
     */

    public com.amazon.ec2.DescribeCustomerGatewaysResponse describeCustomerGateways(com.amazon.ec2.DescribeCustomerGateways describeCustomerGateways);

    /**
     * Auto generated method signature
     *
                                * @param deleteNetworkAcl
     */

    public com.amazon.ec2.DeleteNetworkAclResponse deleteNetworkAcl(com.amazon.ec2.DeleteNetworkAcl deleteNetworkAcl);

    /**
     * Auto generated method signature
     *
                                * @param deleteRoute
     */

    public com.amazon.ec2.DeleteRouteResponse deleteRoute(com.amazon.ec2.DeleteRoute deleteRoute);

    /**
     * Auto generated method signature
     *
                                * @param rebootInstances
     */

    public com.amazon.ec2.RebootInstancesResponse rebootInstances(com.amazon.ec2.RebootInstances rebootInstances);

    /**
     * Auto generated method signature
     *
                                * @param modifyInstanceAttribute
     */

    public com.amazon.ec2.ModifyInstanceAttributeResponse modifyInstanceAttribute(com.amazon.ec2.ModifyInstanceAttribute modifyInstanceAttribute);

    /**
     * Auto generated method signature
     *
                                * @param terminateInstances
     */

    public com.amazon.ec2.TerminateInstancesResponse terminateInstances(com.amazon.ec2.TerminateInstances terminateInstances);

    /**
     * Auto generated method signature
     *
                                * @param createVpnConnectionRoute
     */

    public com.amazon.ec2.CreateVpnConnectionRouteResponse createVpnConnectionRoute(com.amazon.ec2.CreateVpnConnectionRoute createVpnConnectionRoute);

    /**
     * Auto generated method signature
     *
                                * @param describeConversionTasks
     */

    public com.amazon.ec2.DescribeConversionTasksResponse describeConversionTasks(com.amazon.ec2.DescribeConversionTasks describeConversionTasks);

    /**
     * Auto generated method signature
     *
                                * @param describeAddresses
     */

    public com.amazon.ec2.DescribeAddressesResponse describeAddresses(com.amazon.ec2.DescribeAddresses describeAddresses);

    /**
     * Auto generated method signature
     *
                                * @param describeInstanceAttribute
     */

    public com.amazon.ec2.DescribeInstanceAttributeResponse describeInstanceAttribute(com.amazon.ec2.DescribeInstanceAttribute describeInstanceAttribute);

    /**
     * Auto generated method signature
     *
                                * @param attachInternetGateway
     */

    public com.amazon.ec2.AttachInternetGatewayResponse attachInternetGateway(com.amazon.ec2.AttachInternetGateway attachInternetGateway);

    /**
     * Auto generated method signature
     *
                                * @param createVpc
     */

    public com.amazon.ec2.CreateVpcResponse createVpc(com.amazon.ec2.CreateVpc createVpc);

    /**
     * Auto generated method signature
     *
                                * @param replaceRouteTableAssociation
     */

    public com.amazon.ec2.ReplaceRouteTableAssociationResponse replaceRouteTableAssociation(com.amazon.ec2.ReplaceRouteTableAssociation replaceRouteTableAssociation);

    /**
     * Auto generated method signature
     *
                                * @param associateRouteTable
     */

    public com.amazon.ec2.AssociateRouteTableResponse associateRouteTable(com.amazon.ec2.AssociateRouteTable associateRouteTable);

    /**
     * Auto generated method signature
     *
                                * @param detachInternetGateway
     */

    public com.amazon.ec2.DetachInternetGatewayResponse detachInternetGateway(com.amazon.ec2.DetachInternetGateway detachInternetGateway);

    /**
     * Auto generated method signature
     *
                                * @param purchaseReservedInstancesOffering
     */

    public com.amazon.ec2.PurchaseReservedInstancesOfferingResponse purchaseReservedInstancesOffering(
        com.amazon.ec2.PurchaseReservedInstancesOffering purchaseReservedInstancesOffering);

    /**
     * Auto generated method signature
     *
                                * @param importVolume
     */

    public com.amazon.ec2.ImportVolumeResponse importVolume(com.amazon.ec2.ImportVolume importVolume);

    /**
     * Auto generated method signature
     *
                                * @param describeExportTasks
     */

    public com.amazon.ec2.DescribeExportTasksResponse describeExportTasks(com.amazon.ec2.DescribeExportTasks describeExportTasks);

    /**
     * Auto generated method signature
     *
                                * @param createInstanceExportTask
     */

    public com.amazon.ec2.CreateInstanceExportTaskResponse createInstanceExportTask(com.amazon.ec2.CreateInstanceExportTask createInstanceExportTask);

    /**
     * Auto generated method signature
     *
                                * @param assignPrivateIpAddresses
     */

    public com.amazon.ec2.AssignPrivateIpAddressesResponse assignPrivateIpAddresses(com.amazon.ec2.AssignPrivateIpAddresses assignPrivateIpAddresses);

    /**
     * Auto generated method signature
     *
                                * @param reportInstanceStatus
     */

    public com.amazon.ec2.ReportInstanceStatusResponse reportInstanceStatus(com.amazon.ec2.ReportInstanceStatus reportInstanceStatus);

    /**
     * Auto generated method signature
     *
                                * @param describeReservedInstancesOfferings
     */

    public com.amazon.ec2.DescribeReservedInstancesOfferingsResponse describeReservedInstancesOfferings(
        com.amazon.ec2.DescribeReservedInstancesOfferings describeReservedInstancesOfferings);

    /**
     * Auto generated method signature
     *
                                * @param deleteVpnConnection
     */

    public com.amazon.ec2.DeleteVpnConnectionResponse deleteVpnConnection(com.amazon.ec2.DeleteVpnConnection deleteVpnConnection);

    /**
     * Auto generated method signature
     *
                                * @param deleteInternetGateway
     */

    public com.amazon.ec2.DeleteInternetGatewayResponse deleteInternetGateway(com.amazon.ec2.DeleteInternetGateway deleteInternetGateway);

    /**
     * Auto generated method signature
     *
                                * @param deleteSpotDatafeedSubscription
     */

    public com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse deleteSpotDatafeedSubscription(
        com.amazon.ec2.DeleteSpotDatafeedSubscription deleteSpotDatafeedSubscription);

    /**
     * Auto generated method signature
     *
                                * @param attachNetworkInterface
     */

    public com.amazon.ec2.AttachNetworkInterfaceResponse attachNetworkInterface(com.amazon.ec2.AttachNetworkInterface attachNetworkInterface);

    /**
     * Auto generated method signature
     *
                                * @param createNetworkInterface
     */

    public com.amazon.ec2.CreateNetworkInterfaceResponse createNetworkInterface(com.amazon.ec2.CreateNetworkInterface createNetworkInterface);

    /**
     * Auto generated method signature
     *
                                * @param revokeSecurityGroupEgress
     */

    public com.amazon.ec2.RevokeSecurityGroupEgressResponse revokeSecurityGroupEgress(com.amazon.ec2.RevokeSecurityGroupEgress revokeSecurityGroupEgress);

    /**
     * Auto generated method signature
     *
                                * @param monitorInstances
     */

    public com.amazon.ec2.MonitorInstancesResponse monitorInstances(com.amazon.ec2.MonitorInstances monitorInstances);

    /**
     * Auto generated method signature
     *
                                * @param replaceRoute
     */

    public com.amazon.ec2.ReplaceRouteResponse replaceRoute(com.amazon.ec2.ReplaceRoute replaceRoute);

    /**
     * Auto generated method signature
     *
                                * @param attachVolume
     */

    public com.amazon.ec2.AttachVolumeResponse attachVolume(com.amazon.ec2.AttachVolume attachVolume);

    /**
     * Auto generated method signature
     *
                                * @param getConsoleOutput
     */

    public com.amazon.ec2.GetConsoleOutputResponse getConsoleOutput(com.amazon.ec2.GetConsoleOutput getConsoleOutput);

    /**
     * Auto generated method signature
     *
                                * @param describeRegions
     */

    public com.amazon.ec2.DescribeRegionsResponse describeRegions(com.amazon.ec2.DescribeRegions describeRegions);

}
