Repository: aws-cloudformation/rain
Pull request #197 (2023-09-13 23:30:40)

Adding duration estimate to forecast command
Still a draft since I need to fill in the database of estimates for each resource type.



Patch:
diff --git a/.gitignore b/.gitignore
index c7da66d9..33584e20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,7 @@ go.work
 .vscode/
 main
 rain
+parse-perf
 local/
 .idea
 
diff --git a/cft/graph/graph.go b/cft/graph/graph.go
index 48cf9da1..fb2f587a 100644
--- a/cft/graph/graph.go
+++ b/cft/graph/graph.go
@@ -94,8 +94,8 @@ func (g *Graph) String() string {
 	out := strings.Builder{}
 
 	for _, left := range g.order {
+		out.WriteString(fmt.Sprintf("%s:\n", left))
 		if len(g.nodes[left]) > 0 {
-			out.WriteString(fmt.Sprintf("%s:\n", left))
 			for right := range g.nodes[left] {
 				out.WriteString(fmt.Sprintf("- %s\n", right))
 			}
diff --git a/cft/graph/util.go b/cft/graph/util.go
index b346748f..5efdafa9 100644
--- a/cft/graph/util.go
+++ b/cft/graph/util.go
@@ -4,6 +4,8 @@ import (
 	"fmt"
 	"regexp"
 	"strings"
+
+	"github.com/aws-cloudformation/rain/internal/config"
 )
 
 var subRe = regexp.MustCompile(`\$\{([^!].+?)\}`)
@@ -17,6 +19,17 @@ func findRefs(t map[string]interface{}) []string {
 
 	for key, value := range t {
 		switch key {
+		case "DependsOn":
+			switch v := value.(type) {
+			case string:
+				refs = append(refs, v)
+			case []interface{}:
+				for _, d := range v {
+					refs = append(refs, d.(string))
+				}
+			default:
+				config.Debugf("invalid DependsOn: %v, %v", key, value)
+			}
 		case "Ref":
 			refs = append(refs, value.(string))
 		case "Fn::GetAtt":
diff --git a/internal/cmd/deploy/deploy.go b/internal/cmd/deploy/deploy.go
index 3687be6c..7d9c1c56 100644
--- a/internal/cmd/deploy/deploy.go
+++ b/internal/cmd/deploy/deploy.go
@@ -92,6 +92,10 @@ YAML:
 			panic(err)
 		}
 
+		// Figure out how long we thing the stack will take to execute
+		//totalSeconds := forecast.PredictTotalEstimate(template, stackExists)
+		// TODO - Wait until the forecast command is GA and add this to output
+
 		// Create change set
 		spinner.Push("Creating change set")
 		changeSetName, createErr := cfn.CreateChangeSet(template, dc.Params, dc.Tags, stackName, roleArn)
diff --git a/internal/cmd/forecast/all-types.txt b/internal/cmd/forecast/all-types.txt
new file mode 100644
index 00000000..604fef42
--- /dev/null
+++ b/internal/cmd/forecast/all-types.txt
@@ -0,0 +1,1135 @@
+AWS::ACMPCA::Certificate
+AWS::ACMPCA::CertificateAuthority
+AWS::ACMPCA::CertificateAuthorityActivation
+AWS::ACMPCA::Permission
+AWS::APS::RuleGroupsNamespace
+AWS::APS::Workspace
+AWS::AccessAnalyzer::Analyzer
+AWS::AmazonMQ::Broker
+AWS::AmazonMQ::Configuration
+AWS::AmazonMQ::ConfigurationAssociation
+AWS::Amplify::App
+AWS::Amplify::Branch
+AWS::Amplify::Domain
+AWS::AmplifyUIBuilder::Component
+AWS::AmplifyUIBuilder::Form
+AWS::AmplifyUIBuilder::Theme
+AWS::ApiGateway::Account
+AWS::ApiGateway::ApiKey
+AWS::ApiGateway::Authorizer
+AWS::ApiGateway::BasePathMapping
+AWS::ApiGateway::ClientCertificate
+AWS::ApiGateway::Deployment
+AWS::ApiGateway::DocumentationPart
+AWS::ApiGateway::DocumentationVersion
+AWS::ApiGateway::DomainName
+AWS::ApiGateway::GatewayResponse
+AWS::ApiGateway::Method
+AWS::ApiGateway::Model
+AWS::ApiGateway::RequestValidator
+AWS::ApiGateway::Resource
+AWS::ApiGateway::RestApi
+AWS::ApiGateway::Stage
+AWS::ApiGateway::UsagePlan
+AWS::ApiGateway::UsagePlanKey
+AWS::ApiGateway::VpcLink
+AWS::ApiGatewayV2::Api
+AWS::ApiGatewayV2::ApiGatewayManagedOverrides
+AWS::ApiGatewayV2::ApiMapping
+AWS::ApiGatewayV2::Authorizer
+AWS::ApiGatewayV2::Deployment
+AWS::ApiGatewayV2::DomainName
+AWS::ApiGatewayV2::Integration
+AWS::ApiGatewayV2::IntegrationResponse
+AWS::ApiGatewayV2::Model
+AWS::ApiGatewayV2::Route
+AWS::ApiGatewayV2::RouteResponse
+AWS::ApiGatewayV2::Stage
+AWS::ApiGatewayV2::VpcLink
+AWS::AppConfig::Application
+AWS::AppConfig::ConfigurationProfile
+AWS::AppConfig::Deployment
+AWS::AppConfig::DeploymentStrategy
+AWS::AppConfig::Environment
+AWS::AppConfig::Extension
+AWS::AppConfig::ExtensionAssociation
+AWS::AppConfig::HostedConfigurationVersion
+AWS::AppFlow::Connector
+AWS::AppFlow::ConnectorProfile
+AWS::AppFlow::Flow
+AWS::AppIntegrations::DataIntegration
+AWS::AppIntegrations::EventIntegration
+AWS::AppMesh::GatewayRoute
+AWS::AppMesh::Mesh
+AWS::AppMesh::Route
+AWS::AppMesh::VirtualGateway
+AWS::AppMesh::VirtualNode
+AWS::AppMesh::VirtualRouter
+AWS::AppMesh::VirtualService
+AWS::AppRunner::AutoScalingConfiguration
+AWS::AppRunner::ObservabilityConfiguration
+AWS::AppRunner::Service
+AWS::AppRunner::VpcConnector
+AWS::AppRunner::VpcIngressConnection
+AWS::AppStream::AppBlock
+AWS::AppStream::AppBlockBuilder
+AWS::AppStream::Application
+AWS::AppStream::ApplicationEntitlementAssociation
+AWS::AppStream::ApplicationFleetAssociation
+AWS::AppStream::DirectoryConfig
+AWS::AppStream::Entitlement
+AWS::AppStream::Fleet
+AWS::AppStream::ImageBuilder
+AWS::AppStream::Stack
+AWS::AppStream::StackFleetAssociation
+AWS::AppStream::StackUserAssociation
+AWS::AppStream::User
+AWS::AppSync::ApiCache
+AWS::AppSync::ApiKey
+AWS::AppSync::DataSource
+AWS::AppSync::DomainName
+AWS::AppSync::DomainNameApiAssociation
+AWS::AppSync::FunctionConfiguration
+AWS::AppSync::GraphQLApi
+AWS::AppSync::GraphQLSchema
+AWS::AppSync::Resolver
+AWS::AppSync::SourceApiAssociation
+AWS::ApplicationAutoScaling::ScalableTarget
+AWS::ApplicationAutoScaling::ScalingPolicy
+AWS::ApplicationInsights::Application
+AWS::Athena::CapacityReservation
+AWS::Athena::DataCatalog
+AWS::Athena::NamedQuery
+AWS::Athena::PreparedStatement
+AWS::Athena::WorkGroup
+AWS::AuditManager::Assessment
+AWS::AutoScaling::AutoScalingGroup
+AWS::AutoScaling::LaunchConfiguration
+AWS::AutoScaling::LifecycleHook
+AWS::AutoScaling::ScalingPolicy
+AWS::AutoScaling::ScheduledAction
+AWS::AutoScaling::WarmPool
+AWS::AutoScalingPlans::ScalingPlan
+AWS::Backup::BackupPlan
+AWS::Backup::BackupSelection
+AWS::Backup::BackupVault
+AWS::Backup::Framework
+AWS::Backup::ReportPlan
+AWS::BackupGateway::Hypervisor
+AWS::Batch::ComputeEnvironment
+AWS::Batch::JobDefinition
+AWS::Batch::JobQueue
+AWS::Batch::SchedulingPolicy
+AWS::BillingConductor::BillingGroup
+AWS::BillingConductor::CustomLineItem
+AWS::BillingConductor::PricingPlan
+AWS::BillingConductor::PricingRule
+AWS::Budgets::Budget
+AWS::Budgets::BudgetsAction
+AWS::CE::AnomalyMonitor
+AWS::CE::AnomalySubscription
+AWS::CE::CostCategory
+AWS::CUR::ReportDefinition
+AWS::Cassandra::Keyspace
+AWS::Cassandra::Table
+AWS::CertificateManager::Account
+AWS::CertificateManager::Certificate
+AWS::Chatbot::MicrosoftTeamsChannelConfiguration
+AWS::Chatbot::SlackChannelConfiguration
+AWS::CleanRooms::AnalysisTemplate
+AWS::CleanRooms::Collaboration
+AWS::CleanRooms::ConfiguredTable
+AWS::CleanRooms::ConfiguredTableAssociation
+AWS::CleanRooms::Membership
+AWS::Cloud9::EnvironmentEC2
+AWS::CloudFormation::CustomResource
+AWS::CloudFormation::HookDefaultVersion
+AWS::CloudFormation::HookTypeConfig
+AWS::CloudFormation::HookVersion
+AWS::CloudFormation::Macro
+AWS::CloudFormation::ModuleDefaultVersion
+AWS::CloudFormation::ModuleVersion
+AWS::CloudFormation::PublicTypeVersion
+AWS::CloudFormation::Publisher
+AWS::CloudFormation::ResourceDefaultVersion
+AWS::CloudFormation::ResourceVersion
+AWS::CloudFormation::Stack
+AWS::CloudFormation::StackSet
+AWS::CloudFormation::TypeActivation
+AWS::CloudFormation::WaitCondition
+AWS::CloudFormation::WaitConditionHandle
+AWS::CloudFront::CachePolicy
+AWS::CloudFront::CloudFrontOriginAccessIdentity
+AWS::CloudFront::ContinuousDeploymentPolicy
+AWS::CloudFront::Distribution
+AWS::CloudFront::Function
+AWS::CloudFront::KeyGroup
+AWS::CloudFront::MonitoringSubscription
+AWS::CloudFront::OriginAccessControl
+AWS::CloudFront::OriginRequestPolicy
+AWS::CloudFront::PublicKey
+AWS::CloudFront::RealtimeLogConfig
+AWS::CloudFront::ResponseHeadersPolicy
+AWS::CloudFront::StreamingDistribution
+AWS::CloudTrail::Channel
+AWS::CloudTrail::EventDataStore
+AWS::CloudTrail::ResourcePolicy
+AWS::CloudTrail::Trail
+AWS::CloudWatch::Alarm
+AWS::CloudWatch::AnomalyDetector
+AWS::CloudWatch::CompositeAlarm
+AWS::CloudWatch::Dashboard
+AWS::CloudWatch::InsightRule
+AWS::CloudWatch::MetricStream
+AWS::CodeArtifact::Domain
+AWS::CodeArtifact::Repository
+AWS::CodeBuild::Project
+AWS::CodeBuild::ReportGroup
+AWS::CodeBuild::SourceCredential
+AWS::CodeCommit::Repository
+AWS::CodeDeploy::Application
+AWS::CodeDeploy::DeploymentConfig
+AWS::CodeDeploy::DeploymentGroup
+AWS::CodeGuruProfiler::ProfilingGroup
+AWS::CodeGuruReviewer::RepositoryAssociation
+AWS::CodePipeline::CustomActionType
+AWS::CodePipeline::Pipeline
+AWS::CodePipeline::Webhook
+AWS::CodeStar::GitHubRepository
+AWS::CodeStarConnections::Connection
+AWS::CodeStarNotifications::NotificationRule
+AWS::Cognito::IdentityPool
+AWS::Cognito::IdentityPoolPrincipalTag
+AWS::Cognito::IdentityPoolRoleAttachment
+AWS::Cognito::UserPool
+AWS::Cognito::UserPoolClient
+AWS::Cognito::UserPoolDomain
+AWS::Cognito::UserPoolGroup
+AWS::Cognito::UserPoolIdentityProvider
+AWS::Cognito::UserPoolResourceServer
+AWS::Cognito::UserPoolRiskConfigurationAttachment
+AWS::Cognito::UserPoolUICustomizationAttachment
+AWS::Cognito::UserPoolUser
+AWS::Cognito::UserPoolUserToGroupAttachment
+AWS::Comprehend::DocumentClassifier
+AWS::Comprehend::Flywheel
+AWS::Config::AggregationAuthorization
+AWS::Config::ConfigRule
+AWS::Config::ConfigurationAggregator
+AWS::Config::ConfigurationRecorder
+AWS::Config::ConformancePack
+AWS::Config::DeliveryChannel
+AWS::Config::OrganizationConfigRule
+AWS::Config::OrganizationConformancePack
+AWS::Config::RemediationConfiguration
+AWS::Config::StoredQuery
+AWS::Connect::ApprovedOrigin
+AWS::Connect::ContactFlow
+AWS::Connect::ContactFlowModule
+AWS::Connect::EvaluationForm
+AWS::Connect::HoursOfOperation
+AWS::Connect::Instance
+AWS::Connect::InstanceStorageConfig
+AWS::Connect::IntegrationAssociation
+AWS::Connect::PhoneNumber
+AWS::Connect::Prompt
+AWS::Connect::Queue
+AWS::Connect::QuickConnect
+AWS::Connect::RoutingProfile
+AWS::Connect::Rule
+AWS::Connect::SecurityKey
+AWS::Connect::TaskTemplate
+AWS::Connect::TrafficDistributionGroup
+AWS::Connect::User
+AWS::Connect::UserHierarchyGroup
+AWS::Connect::View
+AWS::Connect::ViewVersion
+AWS::ConnectCampaigns::Campaign
+AWS::ControlTower::EnabledControl
+AWS::CustomerProfiles::CalculatedAttributeDefinition
+AWS::CustomerProfiles::Domain
+AWS::CustomerProfiles::EventStream
+AWS::CustomerProfiles::Integration
+AWS::CustomerProfiles::ObjectType
+AWS::DAX::Cluster
+AWS::DAX::ParameterGroup
+AWS::DAX::SubnetGroup
+AWS::DLM::LifecyclePolicy
+AWS::DMS::Certificate
+AWS::DMS::Endpoint
+AWS::DMS::EventSubscription
+AWS::DMS::ReplicationConfig
+AWS::DMS::ReplicationInstance
+AWS::DMS::ReplicationSubnetGroup
+AWS::DMS::ReplicationTask
+AWS::DataBrew::Dataset
+AWS::DataBrew::Job
+AWS::DataBrew::Project
+AWS::DataBrew::Recipe
+AWS::DataBrew::Ruleset
+AWS::DataBrew::Schedule
+AWS::DataPipeline::Pipeline
+AWS::DataSync::Agent
+AWS::DataSync::LocationAzureBlob
+AWS::DataSync::LocationEFS
+AWS::DataSync::LocationFSxLustre
+AWS::DataSync::LocationFSxONTAP
+AWS::DataSync::LocationFSxOpenZFS
+AWS::DataSync::LocationFSxWindows
+AWS::DataSync::LocationHDFS
+AWS::DataSync::LocationNFS
+AWS::DataSync::LocationObjectStorage
+AWS::DataSync::LocationS3
+AWS::DataSync::LocationSMB
+AWS::DataSync::StorageSystem
+AWS::DataSync::Task
+AWS::Detective::Graph
+AWS::Detective::MemberInvitation
+AWS::Detective::OrganizationAdmin
+AWS::DevOpsGuru::LogAnomalyDetectionIntegration
+AWS::DevOpsGuru::NotificationChannel
+AWS::DevOpsGuru::ResourceCollection
+AWS::DirectoryService::MicrosoftAD
+AWS::DirectoryService::SimpleAD
+AWS::DocDB::DBCluster
+AWS::DocDB::DBClusterParameterGroup
+AWS::DocDB::DBInstance
+AWS::DocDB::DBSubnetGroup
+AWS::DocDBElastic::Cluster
+AWS::DynamoDB::GlobalTable
+AWS::DynamoDB::Table
+AWS::EC2::CapacityReservation
+AWS::EC2::CapacityReservationFleet
+AWS::EC2::CarrierGateway
+AWS::EC2::ClientVpnAuthorizationRule
+AWS::EC2::ClientVpnEndpoint
+AWS::EC2::ClientVpnRoute
+AWS::EC2::ClientVpnTargetNetworkAssociation
+AWS::EC2::CustomerGateway
+AWS::EC2::DHCPOptions
+AWS::EC2::EC2Fleet
+AWS::EC2::EIP
+AWS::EC2::EIPAssociation
+AWS::EC2::EgressOnlyInternetGateway
+AWS::EC2::EnclaveCertificateIamRoleAssociation
+AWS::EC2::FlowLog
+AWS::EC2::GatewayRouteTableAssociation
+AWS::EC2::Host
+AWS::EC2::IPAM
+AWS::EC2::IPAMAllocation
+AWS::EC2::IPAMPool
+AWS::EC2::IPAMPoolCidr
+AWS::EC2::IPAMResourceDiscovery
+AWS::EC2::IPAMResourceDiscoveryAssociation
+AWS::EC2::IPAMScope
+AWS::EC2::Instance
+AWS::EC2::InstanceConnectEndpoint
+AWS::EC2::InternetGateway
+AWS::EC2::KeyPair
+AWS::EC2::LaunchTemplate
+AWS::EC2::LocalGatewayRoute
+AWS::EC2::LocalGatewayRouteTable
+AWS::EC2::LocalGatewayRouteTableVPCAssociation
+AWS::EC2::LocalGatewayRouteTableVirtualInterfaceGroupAssociation
+AWS::EC2::NatGateway
+AWS::EC2::NetworkAcl
+AWS::EC2::NetworkAclEntry
+AWS::EC2::NetworkInsightsAccessScope
+AWS::EC2::NetworkInsightsAccessScopeAnalysis
+AWS::EC2::NetworkInsightsAnalysis
+AWS::EC2::NetworkInsightsPath
+AWS::EC2::NetworkInterface
+AWS::EC2::NetworkInterfaceAttachment
+AWS::EC2::NetworkInterfacePermission
+AWS::EC2::NetworkPerformanceMetricSubscription
+AWS::EC2::PlacementGroup
+AWS::EC2::PrefixList
+AWS::EC2::Route
+AWS::EC2::RouteTable
+AWS::EC2::SecurityGroup
+AWS::EC2::SecurityGroupEgress
+AWS::EC2::SecurityGroupIngress
+AWS::EC2::SpotFleet
+AWS::EC2::Subnet
+AWS::EC2::SubnetCidrBlock
+AWS::EC2::SubnetNetworkAclAssociation
+AWS::EC2::SubnetRouteTableAssociation
+AWS::EC2::TrafficMirrorFilter
+AWS::EC2::TrafficMirrorFilterRule
+AWS::EC2::TrafficMirrorSession
+AWS::EC2::TrafficMirrorTarget
+AWS::EC2::TransitGateway
+AWS::EC2::TransitGatewayAttachment
+AWS::EC2::TransitGatewayConnect
+AWS::EC2::TransitGatewayMulticastDomain
+AWS::EC2::TransitGatewayMulticastDomainAssociation
+AWS::EC2::TransitGatewayMulticastGroupMember
+AWS::EC2::TransitGatewayMulticastGroupSource
+AWS::EC2::TransitGatewayPeeringAttachment
+AWS::EC2::TransitGatewayRoute
+AWS::EC2::TransitGatewayRouteTable
+AWS::EC2::TransitGatewayRouteTableAssociation
+AWS::EC2::TransitGatewayRouteTablePropagation
+AWS::EC2::TransitGatewayVpcAttachment
+AWS::EC2::VPC
+AWS::EC2::VPCCidrBlock
+AWS::EC2::VPCDHCPOptionsAssociation
+AWS::EC2::VPCEndpoint
+AWS::EC2::VPCEndpointConnectionNotification
+AWS::EC2::VPCEndpointService
+AWS::EC2::VPCEndpointServicePermissions
+AWS::EC2::VPCGatewayAttachment
+AWS::EC2::VPCPeeringConnection
+AWS::EC2::VPNConnection
+AWS::EC2::VPNConnectionRoute
+AWS::EC2::VPNGateway
+AWS::EC2::VPNGatewayRoutePropagation
+AWS::EC2::VerifiedAccessEndpoint
+AWS::EC2::VerifiedAccessGroup
+AWS::EC2::VerifiedAccessInstance
+AWS::EC2::VerifiedAccessTrustProvider
+AWS::EC2::Volume
+AWS::EC2::VolumeAttachment
+AWS::ECR::PublicRepository
+AWS::ECR::PullThroughCacheRule
+AWS::ECR::RegistryPolicy
+AWS::ECR::ReplicationConfiguration
+AWS::ECR::Repository
+AWS::ECS::CapacityProvider
+AWS::ECS::Cluster
+AWS::ECS::ClusterCapacityProviderAssociations
+AWS::ECS::PrimaryTaskSet
+AWS::ECS::Service
+AWS::ECS::TaskDefinition
+AWS::ECS::TaskSet
+AWS::EFS::AccessPoint
+AWS::EFS::FileSystem
+AWS::EFS::MountTarget
+AWS::EKS::Addon
+AWS::EKS::Cluster
+AWS::EKS::FargateProfile
+AWS::EKS::IdentityProviderConfig
+AWS::EKS::Nodegroup
+AWS::EMR::Cluster
+AWS::EMR::InstanceFleetConfig
+AWS::EMR::InstanceGroupConfig
+AWS::EMR::SecurityConfiguration
+AWS::EMR::Step
+AWS::EMR::Studio
+AWS::EMR::StudioSessionMapping
+AWS::EMR::WALWorkspace
+AWS::EMRContainers::VirtualCluster
+AWS::EMRServerless::Application
+AWS::ElastiCache::CacheCluster
+AWS::ElastiCache::GlobalReplicationGroup
+AWS::ElastiCache::ParameterGroup
+AWS::ElastiCache::ReplicationGroup
+AWS::ElastiCache::SecurityGroup
+AWS::ElastiCache::SecurityGroupIngress
+AWS::ElastiCache::SubnetGroup
+AWS::ElastiCache::User
+AWS::ElastiCache::UserGroup
+AWS::ElasticBeanstalk::Application
+AWS::ElasticBeanstalk::ApplicationVersion
+AWS::ElasticBeanstalk::ConfigurationTemplate
+AWS::ElasticBeanstalk::Environment
+AWS::ElasticLoadBalancing::LoadBalancer
+AWS::ElasticLoadBalancingV2::Listener
+AWS::ElasticLoadBalancingV2::ListenerCertificate
+AWS::ElasticLoadBalancingV2::ListenerRule
+AWS::ElasticLoadBalancingV2::LoadBalancer
+AWS::ElasticLoadBalancingV2::TargetGroup
+AWS::Elasticsearch::Domain
+AWS::EntityResolution::MatchingWorkflow
+AWS::EntityResolution::SchemaMapping
+AWS::EventSchemas::Discoverer
+AWS::EventSchemas::Registry
+AWS::EventSchemas::RegistryPolicy
+AWS::EventSchemas::Schema
+AWS::Events::ApiDestination
+AWS::Events::Archive
+AWS::Events::Connection
+AWS::Events::Endpoint
+AWS::Events::EventBus
+AWS::Events::EventBusPolicy
+AWS::Events::Rule
+AWS::Evidently::Experiment
+AWS::Evidently::Feature
+AWS::Evidently::Launch
+AWS::Evidently::Project
+AWS::Evidently::Segment
+AWS::FIS::ExperimentTemplate
+AWS::FMS::NotificationChannel
+AWS::FMS::Policy
+AWS::FMS::ResourceSet
+AWS::FSx::DataRepositoryAssociation
+AWS::FSx::FileSystem
+AWS::FSx::Snapshot
+AWS::FSx::StorageVirtualMachine
+AWS::FSx::Volume
+AWS::FinSpace::Environment
+AWS::Forecast::Dataset
+AWS::Forecast::DatasetGroup
+AWS::FraudDetector::Detector
+AWS::FraudDetector::EntityType
+AWS::FraudDetector::EventType
+AWS::FraudDetector::Label
+AWS::FraudDetector::List
+AWS::FraudDetector::Outcome
+AWS::FraudDetector::Variable
+AWS::GameLift::Alias
+AWS::GameLift::Build
+AWS::GameLift::Fleet
+AWS::GameLift::GameServerGroup
+AWS::GameLift::GameSessionQueue
+AWS::GameLift::Location
+AWS::GameLift::MatchmakingConfiguration
+AWS::GameLift::MatchmakingRuleSet
+AWS::GameLift::Script
+AWS::GlobalAccelerator::Accelerator
+AWS::GlobalAccelerator::EndpointGroup
+AWS::GlobalAccelerator::Listener
+AWS::Glue::Classifier
+AWS::Glue::Connection
+AWS::Glue::Crawler
+AWS::Glue::DataCatalogEncryptionSettings
+AWS::Glue::DataQualityRuleset
+AWS::Glue::Database
+AWS::Glue::DevEndpoint
+AWS::Glue::Job
+AWS::Glue::MLTransform
+AWS::Glue::Partition
+AWS::Glue::Registry
+AWS::Glue::Schema
+AWS::Glue::SchemaVersion
+AWS::Glue::SchemaVersionMetadata
+AWS::Glue::SecurityConfiguration
+AWS::Glue::Table
+AWS::Glue::Trigger
+AWS::Glue::Workflow
+AWS::Grafana::Workspace
+AWS::Greengrass::ConnectorDefinition
+AWS::Greengrass::ConnectorDefinitionVersion
+AWS::Greengrass::CoreDefinition
+AWS::Greengrass::CoreDefinitionVersion
+AWS::Greengrass::DeviceDefinition
+AWS::Greengrass::DeviceDefinitionVersion
+AWS::Greengrass::FunctionDefinition
+AWS::Greengrass::FunctionDefinitionVersion
+AWS::Greengrass::Group
+AWS::Greengrass::GroupVersion
+AWS::Greengrass::LoggerDefinition
+AWS::Greengrass::LoggerDefinitionVersion
+AWS::Greengrass::ResourceDefinition
+AWS::Greengrass::ResourceDefinitionVersion
+AWS::Greengrass::SubscriptionDefinition
+AWS::Greengrass::SubscriptionDefinitionVersion
+AWS::GreengrassV2::ComponentVersion
+AWS::GreengrassV2::Deployment
+AWS::GroundStation::Config
+AWS::GroundStation::DataflowEndpointGroup
+AWS::GroundStation::MissionProfile
+AWS::GuardDuty::Detector
+AWS::GuardDuty::Filter
+AWS::GuardDuty::IPSet
+AWS::GuardDuty::Master
+AWS::GuardDuty::Member
+AWS::GuardDuty::ThreatIntelSet
+AWS::HealthLake::FHIRDatastore
+AWS::IAM::AccessKey
+AWS::IAM::Group
+AWS::IAM::GroupPolicy
+AWS::IAM::InstanceProfile
+AWS::IAM::ManagedPolicy
+AWS::IAM::OIDCProvider
+AWS::IAM::Policy
+AWS::IAM::Role
+AWS::IAM::RolePolicy
+AWS::IAM::SAMLProvider
+AWS::IAM::ServerCertificate
+AWS::IAM::ServiceLinkedRole
+AWS::IAM::User
+AWS::IAM::UserPolicy
+AWS::IAM::UserToGroupAddition
+AWS::IAM::VirtualMFADevice
+AWS::IVS::Channel
+AWS::IVS::PlaybackKeyPair
+AWS::IVS::RecordingConfiguration
+AWS::IVS::StreamKey
+AWS::IVSChat::LoggingConfiguration
+AWS::IVSChat::Room
+AWS::IdentityStore::Group
+AWS::IdentityStore::GroupMembership
+AWS::ImageBuilder::Component
+AWS::ImageBuilder::ContainerRecipe
+AWS::ImageBuilder::DistributionConfiguration
+AWS::ImageBuilder::Image
+AWS::ImageBuilder::ImagePipeline
+AWS::ImageBuilder::ImageRecipe
+AWS::ImageBuilder::InfrastructureConfiguration
+AWS::Inspector::AssessmentTarget
+AWS::Inspector::AssessmentTemplate
+AWS::Inspector::ResourceGroup
+AWS::InspectorV2::Filter
+AWS::InternetMonitor::Monitor
+AWS::IoT1Click::Device
+AWS::IoT1Click::Placement
+AWS::IoT1Click::Project
+AWS::IoT::AccountAuditConfiguration
+AWS::IoT::Authorizer
+AWS::IoT::BillingGroup
+AWS::IoT::CACertificate
+AWS::IoT::Certificate
+AWS::IoT::CustomMetric
+AWS::IoT::Dimension
+AWS::IoT::DomainConfiguration
+AWS::IoT::FleetMetric
+AWS::IoT::JobTemplate
+AWS::IoT::Logging
+AWS::IoT::MitigationAction
+AWS::IoT::Policy
+AWS::IoT::PolicyPrincipalAttachment
+AWS::IoT::ProvisioningTemplate
+AWS::IoT::ResourceSpecificLogging
+AWS::IoT::RoleAlias
+AWS::IoT::ScheduledAudit
+AWS::IoT::SecurityProfile
+AWS::IoT::Thing
+AWS::IoT::ThingGroup
+AWS::IoT::ThingPrincipalAttachment
+AWS::IoT::ThingType
+AWS::IoT::TopicRule
+AWS::IoT::TopicRuleDestination
+AWS::IoTAnalytics::Channel
+AWS::IoTAnalytics::Dataset
+AWS::IoTAnalytics::Datastore
+AWS::IoTAnalytics::Pipeline
+AWS::IoTCoreDeviceAdvisor::SuiteDefinition
+AWS::IoTEvents::AlarmModel
+AWS::IoTEvents::DetectorModel
+AWS::IoTEvents::Input
+AWS::IoTFleetHub::Application
+AWS::IoTFleetWise::Campaign
+AWS::IoTFleetWise::DecoderManifest
+AWS::IoTFleetWise::Fleet
+AWS::IoTFleetWise::ModelManifest
+AWS::IoTFleetWise::SignalCatalog
+AWS::IoTFleetWise::Vehicle
+AWS::IoTSiteWise::AccessPolicy
+AWS::IoTSiteWise::Asset
+AWS::IoTSiteWise::AssetModel
+AWS::IoTSiteWise::Dashboard
+AWS::IoTSiteWise::Gateway
+AWS::IoTSiteWise::Portal
+AWS::IoTSiteWise::Project
+AWS::IoTThingsGraph::FlowTemplate
+AWS::IoTTwinMaker::ComponentType
+AWS::IoTTwinMaker::Entity
+AWS::IoTTwinMaker::Scene
+AWS::IoTTwinMaker::SyncJob
+AWS::IoTTwinMaker::Workspace
+AWS::IoTWireless::Destination
+AWS::IoTWireless::DeviceProfile
+AWS::IoTWireless::FuotaTask
+AWS::IoTWireless::MulticastGroup
+AWS::IoTWireless::NetworkAnalyzerConfiguration
+AWS::IoTWireless::PartnerAccount
+AWS::IoTWireless::ServiceProfile
+AWS::IoTWireless::TaskDefinition
+AWS::IoTWireless::WirelessDevice
+AWS::IoTWireless::WirelessDeviceImportTask
+AWS::IoTWireless::WirelessGateway
+AWS::KMS::Alias
+AWS::KMS::Key
+AWS::KMS::ReplicaKey
+AWS::KafkaConnect::Connector
+AWS::Kendra::DataSource
+AWS::Kendra::Faq
+AWS::Kendra::Index
+AWS::KendraRanking::ExecutionPlan
+AWS::Kinesis::Stream
+AWS::Kinesis::StreamConsumer
+AWS::KinesisAnalytics::Application
+AWS::KinesisAnalytics::ApplicationOutput
+AWS::KinesisAnalytics::ApplicationReferenceDataSource
+AWS::KinesisAnalyticsV2::Application
+AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption
+AWS::KinesisAnalyticsV2::ApplicationOutput
+AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource
+AWS::KinesisFirehose::DeliveryStream
+AWS::KinesisVideo::SignalingChannel
+AWS::KinesisVideo::Stream
+AWS::LakeFormation::DataCellsFilter
+AWS::LakeFormation::DataLakeSettings
+AWS::LakeFormation::Permissions
+AWS::LakeFormation::PrincipalPermissions
+AWS::LakeFormation::Resource
+AWS::LakeFormation::Tag
+AWS::LakeFormation::TagAssociation
+AWS::Lambda::Alias
+AWS::Lambda::CodeSigningConfig
+AWS::Lambda::EventInvokeConfig
+AWS::Lambda::EventSourceMapping
+AWS::Lambda::Function
+AWS::Lambda::LayerVersion
+AWS::Lambda::LayerVersionPermission
+AWS::Lambda::Permission
+AWS::Lambda::Url
+AWS::Lambda::Version
+AWS::Lex::Bot
+AWS::Lex::BotAlias
+AWS::Lex::BotVersion
+AWS::Lex::ResourcePolicy
+AWS::LicenseManager::Grant
+AWS::LicenseManager::License
+AWS::Lightsail::Alarm
+AWS::Lightsail::Bucket
+AWS::Lightsail::Certificate
+AWS::Lightsail::Container
+AWS::Lightsail::Database
+AWS::Lightsail::Disk
+AWS::Lightsail::Distribution
+AWS::Lightsail::Instance
+AWS::Lightsail::LoadBalancer
+AWS::Lightsail::LoadBalancerTlsCertificate
+AWS::Lightsail::StaticIp
+AWS::Location::GeofenceCollection
+AWS::Location::Map
+AWS::Location::PlaceIndex
+AWS::Location::RouteCalculator
+AWS::Location::Tracker
+AWS::Location::TrackerConsumer
+AWS::Logs::AccountPolicy
+AWS::Logs::Destination
+AWS::Logs::LogGroup
+AWS::Logs::LogStream
+AWS::Logs::LogStream
+AWS::Logs::MetricFilter
+AWS::Logs::QueryDefinition
+AWS::Logs::ResourcePolicy
+AWS::Logs::SubscriptionFilter
+AWS::LookoutEquipment::InferenceScheduler
+AWS::LookoutMetrics::Alert
+AWS::LookoutMetrics::AnomalyDetector
+AWS::LookoutVision::Project
+AWS::M2::Application
+AWS::M2::Environment
+AWS::MSK::BatchScramSecret
+AWS::MSK::Cluster
+AWS::MSK::ClusterPolicy
+AWS::MSK::Configuration
+AWS::MSK::ServerlessCluster
+AWS::MSK::VpcConnection
+AWS::MWAA::Environment
+AWS::Macie::AllowList
+AWS::Macie::CustomDataIdentifier
+AWS::Macie::FindingsFilter
+AWS::Macie::Session
+AWS::ManagedBlockchain::Accessor
+AWS::ManagedBlockchain::Member
+AWS::ManagedBlockchain::Node
+AWS::MediaConnect::Bridge
+AWS::MediaConnect::BridgeOutput
+AWS::MediaConnect::BridgeSource
+AWS::MediaConnect::Flow
+AWS::MediaConnect::FlowEntitlement
+AWS::MediaConnect::FlowOutput
+AWS::MediaConnect::FlowSource
+AWS::MediaConnect::FlowVpcInterface
+AWS::MediaConnect::Gateway
+AWS::MediaConvert::JobTemplate
+AWS::MediaConvert::Preset
+AWS::MediaConvert::Queue
+AWS::MediaLive::Channel
+AWS::MediaLive::Input
+AWS::MediaLive::InputSecurityGroup
+AWS::MediaPackage::Asset
+AWS::MediaPackage::Channel
+AWS::MediaPackage::OriginEndpoint
+AWS::MediaPackage::PackagingConfiguration
+AWS::MediaPackage::PackagingGroup
+AWS::MediaStore::Container
+AWS::MediaTailor::Channel
+AWS::MediaTailor::ChannelPolicy
+AWS::MediaTailor::LiveSource
+AWS::MediaTailor::PlaybackConfiguration
+AWS::MediaTailor::SourceLocation
+AWS::MediaTailor::VodSource
+AWS::MemoryDB::ACL
+AWS::MemoryDB::Cluster
+AWS::MemoryDB::ParameterGroup
+AWS::MemoryDB::SubnetGroup
+AWS::MemoryDB::User
+AWS::Neptune::DBCluster
+AWS::Neptune::DBClusterParameterGroup
+AWS::Neptune::DBInstance
+AWS::Neptune::DBParameterGroup
+AWS::Neptune::DBSubnetGroup
+AWS::NetworkFirewall::Firewall
+AWS::NetworkFirewall::FirewallPolicy
+AWS::NetworkFirewall::LoggingConfiguration
+AWS::NetworkFirewall::RuleGroup
+AWS::NetworkManager::ConnectAttachment
+AWS::NetworkManager::ConnectPeer
+AWS::NetworkManager::CoreNetwork
+AWS::NetworkManager::CustomerGatewayAssociation
+AWS::NetworkManager::Device
+AWS::NetworkManager::GlobalNetwork
+AWS::NetworkManager::Link
+AWS::NetworkManager::LinkAssociation
+AWS::NetworkManager::Site
+AWS::NetworkManager::SiteToSiteVpnAttachment
+AWS::NetworkManager::TransitGatewayPeering
+AWS::NetworkManager::TransitGatewayRegistration
+AWS::NetworkManager::TransitGatewayRouteTableAttachment
+AWS::NetworkManager::VpcAttachment
+AWS::NimbleStudio::LaunchProfile
+AWS::NimbleStudio::StreamingImage
+AWS::NimbleStudio::Studio
+AWS::NimbleStudio::StudioComponent
+AWS::OSIS::Pipeline
+AWS::Oam::Link
+AWS::Oam::Sink
+AWS::Omics::AnnotationStore
+AWS::Omics::ReferenceStore
+AWS::Omics::RunGroup
+AWS::Omics::SequenceStore
+AWS::Omics::VariantStore
+AWS::Omics::Workflow
+AWS::OpenSearchServerless::AccessPolicy
+AWS::OpenSearchServerless::Collection
+AWS::OpenSearchServerless::SecurityConfig
+AWS::OpenSearchServerless::SecurityPolicy
+AWS::OpenSearchServerless::VpcEndpoint
+AWS::OpenSearchService::Domain
+AWS::OpsWorks::App
+AWS::OpsWorks::ElasticLoadBalancerAttachment
+AWS::OpsWorks::Instance
+AWS::OpsWorks::Layer
+AWS::OpsWorks::Stack
+AWS::OpsWorks::UserProfile
+AWS::OpsWorks::Volume
+AWS::OpsWorksCM::Server
+AWS::Organizations::Account
+AWS::Organizations::Organization
+AWS::Organizations::OrganizationalUnit
+AWS::Organizations::Policy
+AWS::Organizations::ResourcePolicy
+AWS::PCAConnectorAD::Connector
+AWS::PCAConnectorAD::DirectoryRegistration
+AWS::PCAConnectorAD::ServicePrincipalName
+AWS::PCAConnectorAD::Template
+AWS::PCAConnectorAD::TemplateGroupAccessControlEntry
+AWS::Panorama::ApplicationInstance
+AWS::Panorama::Package
+AWS::Panorama::PackageVersion
+AWS::Personalize::Dataset
+AWS::Personalize::DatasetGroup
+AWS::Personalize::Schema
+AWS::Personalize::Solution
+AWS::Pinpoint::ADMChannel
+AWS::Pinpoint::APNSChannel
+AWS::Pinpoint::APNSSandboxChannel
+AWS::Pinpoint::APNSVoipChannel
+AWS::Pinpoint::APNSVoipSandboxChannel
+AWS::Pinpoint::App
+AWS::Pinpoint::ApplicationSettings
+AWS::Pinpoint::BaiduChannel
+AWS::Pinpoint::Campaign
+AWS::Pinpoint::EmailChannel
+AWS::Pinpoint::EmailTemplate
+AWS::Pinpoint::EventStream
+AWS::Pinpoint::GCMChannel
+AWS::Pinpoint::InAppTemplate
+AWS::Pinpoint::PushTemplate
+AWS::Pinpoint::SMSChannel
+AWS::Pinpoint::Segment
+AWS::Pinpoint::SmsTemplate
+AWS::Pinpoint::VoiceChannel
+AWS::PinpointEmail::ConfigurationSet
+AWS::PinpointEmail::ConfigurationSetEventDestination
+AWS::PinpointEmail::DedicatedIpPool
+AWS::PinpointEmail::Identity
+AWS::Pipes::Pipe
+AWS::Proton::EnvironmentAccountConnection
+AWS::Proton::EnvironmentTemplate
+AWS::Proton::ServiceTemplate
+AWS::QLDB::Ledger
+AWS::QLDB::Stream
+AWS::QuickSight::Analysis
+AWS::QuickSight::Dashboard
+AWS::QuickSight::DataSet
+AWS::QuickSight::DataSource
+AWS::QuickSight::RefreshSchedule
+AWS::QuickSight::Template
+AWS::QuickSight::Theme
+AWS::QuickSight::Topic
+AWS::QuickSight::VPCConnection
+AWS::RAM::Permission
+AWS::RAM::ResourceShare
+AWS::RDS::CustomDBEngineVersion
+AWS::RDS::DBCluster
+AWS::RDS::DBClusterParameterGroup
+AWS::RDS::DBInstance
+AWS::RDS::DBParameterGroup
+AWS::RDS::DBProxy
+AWS::RDS::DBProxyEndpoint
+AWS::RDS::DBProxyTargetGroup
+AWS::RDS::DBSecurityGroup
+AWS::RDS::DBSecurityGroupIngress
+AWS::RDS::DBSubnetGroup
+AWS::RDS::EventSubscription
+AWS::RDS::GlobalCluster
+AWS::RDS::OptionGroup
+AWS::RUM::AppMonitor
+AWS::Redshift::Cluster
+AWS::Redshift::ClusterParameterGroup
+AWS::Redshift::ClusterSecurityGroup
+AWS::Redshift::ClusterSecurityGroupIngress
+AWS::Redshift::ClusterSubnetGroup
+AWS::Redshift::EndpointAccess
+AWS::Redshift::EndpointAuthorization
+AWS::Redshift::EventSubscription
+AWS::Redshift::ScheduledAction
+AWS::RedshiftServerless::Namespace
+AWS::RedshiftServerless::Workgroup
+AWS::RefactorSpaces::Application
+AWS::RefactorSpaces::Environment
+AWS::RefactorSpaces::Route
+AWS::RefactorSpaces::Service
+AWS::Rekognition::Collection
+AWS::Rekognition::Project
+AWS::Rekognition::StreamProcessor
+AWS::ResilienceHub::App
+AWS::ResilienceHub::ResiliencyPolicy
+AWS::ResourceExplorer2::DefaultViewAssociation
+AWS::ResourceExplorer2::Index
+AWS::ResourceExplorer2::View
+AWS::ResourceGroups::Group
+AWS::RoboMaker::Fleet
+AWS::RoboMaker::Robot
+AWS::RoboMaker::RobotApplication
+AWS::RoboMaker::RobotApplicationVersion
+AWS::RoboMaker::SimulationApplication
+AWS::RoboMaker::SimulationApplicationVersion
+AWS::RolesAnywhere::CRL
+AWS::RolesAnywhere::Profile
+AWS::RolesAnywhere::TrustAnchor
+AWS::Route53::CidrCollection
+AWS::Route53::DNSSEC
+AWS::Route53::HealthCheck
+AWS::Route53::HostedZone
+AWS::Route53::KeySigningKey
+AWS::Route53::RecordSet
+AWS::Route53::RecordSetGroup
+AWS::Route53RecoveryControl::Cluster
+AWS::Route53RecoveryControl::ControlPanel
+AWS::Route53RecoveryControl::RoutingControl
+AWS::Route53RecoveryControl::SafetyRule
+AWS::Route53RecoveryReadiness::Cell
+AWS::Route53RecoveryReadiness::ReadinessCheck
+AWS::Route53RecoveryReadiness::RecoveryGroup
+AWS::Route53RecoveryReadiness::ResourceSet
+AWS::Route53Resolver::FirewallDomainList
+AWS::Route53Resolver::FirewallRuleGroup
+AWS::Route53Resolver::FirewallRuleGroupAssociation
+AWS::Route53Resolver::OutpostResolver
+AWS::Route53Resolver::ResolverConfig
+AWS::Route53Resolver::ResolverDNSSECConfig
+AWS::Route53Resolver::ResolverEndpoint
+AWS::Route53Resolver::ResolverQueryLoggingConfig
+AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation
+AWS::Route53Resolver::ResolverRule
+AWS::Route53Resolver::ResolverRuleAssociation
+AWS::S3::AccessPoint
+AWS::S3::Bucket
+AWS::S3::BucketPolicy
+AWS::S3::MultiRegionAccessPoint
+AWS::S3::MultiRegionAccessPointPolicy
+AWS::S3::StorageLens
+AWS::S3ObjectLambda::AccessPoint
+AWS::S3ObjectLambda::AccessPointPolicy
+AWS::S3Outposts::AccessPoint
+AWS::S3Outposts::Bucket
+AWS::S3Outposts::BucketPolicy
+AWS::S3Outposts::Endpoint
+AWS::SDB::Domain
+AWS::SES::ConfigurationSet
+AWS::SES::ConfigurationSetEventDestination
+AWS::SES::ContactList
+AWS::SES::DedicatedIpPool
+AWS::SES::EmailIdentity
+AWS::SES::ReceiptFilter
+AWS::SES::ReceiptRule
+AWS::SES::ReceiptRuleSet
+AWS::SES::Template
+AWS::SES::VdmAttributes
+AWS::SNS::Subscription
+AWS::SNS::Topic
+AWS::SNS::TopicInlinePolicy
+AWS::SNS::TopicPolicy
+AWS::SQS::Queue
+AWS::SQS::QueueInlinePolicy
+AWS::SQS::QueuePolicy
+AWS::SSM::Association
+AWS::SSM::Document
+AWS::SSM::MaintenanceWindow
+AWS::SSM::MaintenanceWindowTarget
+AWS::SSM::MaintenanceWindowTask
+AWS::SSM::Parameter
+AWS::SSM::PatchBaseline
+AWS::SSM::ResourceDataSync
+AWS::SSM::ResourcePolicy
+AWS::SSMContacts::Contact
+AWS::SSMContacts::ContactChannel
+AWS::SSMContacts::Plan
+AWS::SSMContacts::Rotation
+AWS::SSMIncidents::ReplicationSet
+AWS::SSMIncidents::ResponsePlan
+AWS::SSO::Assignment
+AWS::SSO::InstanceAccessControlAttributeConfiguration
+AWS::SSO::PermissionSet
+AWS::SageMaker::App
+AWS::SageMaker::AppImageConfig
+AWS::SageMaker::CodeRepository
+AWS::SageMaker::DataQualityJobDefinition
+AWS::SageMaker::Device
+AWS::SageMaker::DeviceFleet
+AWS::SageMaker::Domain
+AWS::SageMaker::Endpoint
+AWS::SageMaker::EndpointConfig
+AWS::SageMaker::FeatureGroup
+AWS::SageMaker::Image
+AWS::SageMaker::ImageVersion
+AWS::SageMaker::InferenceExperiment
+AWS::SageMaker::Model
+AWS::SageMaker::ModelBiasJobDefinition
+AWS::SageMaker::ModelCard
+AWS::SageMaker::ModelExplainabilityJobDefinition
+AWS::SageMaker::ModelPackage
+AWS::SageMaker::ModelPackageGroup
+AWS::SageMaker::ModelQualityJobDefinition
+AWS::SageMaker::MonitoringSchedule
+AWS::SageMaker::NotebookInstance
+AWS::SageMaker::NotebookInstanceLifecycleConfig
+AWS::SageMaker::Pipeline
+AWS::SageMaker::Project
+AWS::SageMaker::Space
+AWS::SageMaker::UserProfile
+AWS::SageMaker::Workteam
+AWS::Scheduler::Schedule
+AWS::Scheduler::ScheduleGroup
+AWS::SecretsManager::ResourcePolicy
+AWS::SecretsManager::RotationSchedule
+AWS::SecretsManager::Secret
+AWS::SecretsManager::SecretTargetAttachment
+AWS::SecurityHub::AutomationRule
+AWS::SecurityHub::Hub
+AWS::SecurityHub::Standard
+AWS::ServiceCatalog::AcceptedPortfolioShare
+AWS::ServiceCatalog::CloudFormationProduct
+AWS::ServiceCatalog::CloudFormationProvisionedProduct
+AWS::ServiceCatalog::LaunchNotificationConstraint
+AWS::ServiceCatalog::LaunchRoleConstraint
+AWS::ServiceCatalog::LaunchTemplateConstraint
+AWS::ServiceCatalog::Portfolio
+AWS::ServiceCatalog::PortfolioPrincipalAssociation
+AWS::ServiceCatalog::PortfolioProductAssociation
+AWS::ServiceCatalog::PortfolioShare
+AWS::ServiceCatalog::ResourceUpdateConstraint
+AWS::ServiceCatalog::ServiceAction
+AWS::ServiceCatalog::ServiceActionAssociation
+AWS::ServiceCatalog::StackSetConstraint
+AWS::ServiceCatalog::TagOption
+AWS::ServiceCatalog::TagOptionAssociation
+AWS::ServiceCatalogAppRegistry::Application
+AWS::ServiceCatalogAppRegistry::AttributeGroup
+AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation
+AWS::ServiceCatalogAppRegistry::ResourceAssociation
+AWS::ServiceDiscovery::HttpNamespace
+AWS::ServiceDiscovery::Instance
+AWS::ServiceDiscovery::PrivateDnsNamespace
+AWS::ServiceDiscovery::PublicDnsNamespace
+AWS::ServiceDiscovery::Service
+AWS::Shield::DRTAccess
+AWS::Shield::ProactiveEngagement
+AWS::Shield::Protection
+AWS::Shield::ProtectionGroup
+AWS::Signer::ProfilePermission
+AWS::Signer::SigningProfile
+AWS::SimSpaceWeaver::Simulation
+AWS::StepFunctions::Activity
+AWS::StepFunctions::StateMachine
+AWS::StepFunctions::StateMachineAlias
+AWS::StepFunctions::StateMachineVersion
+AWS::SupportApp::AccountAlias
+AWS::SupportApp::SlackChannelConfiguration
+AWS::SupportApp::SlackWorkspaceConfiguration
+AWS::Synthetics::Canary
+AWS::Synthetics::Group
+AWS::SystemsManagerSAP::Application
+AWS::Timestream::Database
+AWS::Timestream::ScheduledQuery
+AWS::Timestream::Table
+AWS::Transfer::Agreement
+AWS::Transfer::Certificate
+AWS::Transfer::Connector
+AWS::Transfer::Profile
+AWS::Transfer::Server
+AWS::Transfer::User
+AWS::Transfer::Workflow
+AWS::VerifiedPermissions::IdentitySource
+AWS::VerifiedPermissions::Policy
+AWS::VerifiedPermissions::PolicyStore
+AWS::VerifiedPermissions::PolicyTemplate
+AWS::VoiceID::Domain
+AWS::VpcLattice::AccessLogSubscription
+AWS::VpcLattice::AuthPolicy
+AWS::VpcLattice::Listener
+AWS::VpcLattice::ResourcePolicy
+AWS::VpcLattice::Rule
+AWS::VpcLattice::Service
+AWS::VpcLattice::ServiceNetwork
+AWS::VpcLattice::ServiceNetworkServiceAssociation
+AWS::VpcLattice::ServiceNetworkVpcAssociation
+AWS::VpcLattice::TargetGroup
+AWS::WAF::ByteMatchSet
+AWS::WAF::IPSet
+AWS::WAF::Rule
+AWS::WAF::SizeConstraintSet
+AWS::WAF::SqlInjectionMatchSet
+AWS::WAF::WebACL
+AWS::WAF::XssMatchSet
+AWS::WAFRegional::ByteMatchSet
+AWS::WAFRegional::GeoMatchSet
+AWS::WAFRegional::IPSet
+AWS::WAFRegional::RateBasedRule
+AWS::WAFRegional::RegexPatternSet
+AWS::WAFRegional::Rule
+AWS::WAFRegional::SizeConstraintSet
+AWS::WAFRegional::SqlInjectionMatchSet
+AWS::WAFRegional::WebACL
+AWS::WAFRegional::WebACLAssociation
+AWS::WAFRegional::XssMatchSet
+AWS::WAFv2::IPSet
+AWS::WAFv2::LoggingConfiguration
+AWS::WAFv2::RegexPatternSet
+AWS::WAFv2::RuleGroup
+AWS::WAFv2::WebACL
+AWS::WAFv2::WebACLAssociation
+AWS::Wisdom::Assistant
+AWS::Wisdom::AssistantAssociation
+AWS::Wisdom::KnowledgeBase
+AWS::WorkSpaces::ConnectionAlias
+AWS::WorkSpaces::Workspace
+AWS::WorkSpacesWeb::BrowserSettings
+AWS::WorkSpacesWeb::IdentityProvider
+AWS::WorkSpacesWeb::IpAccessSettings
+AWS::WorkSpacesWeb::NetworkSettings
+AWS::WorkSpacesWeb::Portal
+AWS::WorkSpacesWeb::TrustStore
+AWS::WorkSpacesWeb::UserAccessLoggingSettings
+AWS::WorkSpacesWeb::UserSettings
+AWS::XRay::Group
+AWS::XRay::ResourcePolicy
+AWS::XRay::SamplingRule
diff --git a/internal/cmd/forecast/estimate.go b/internal/cmd/forecast/estimate.go
new file mode 100644
index 00000000..a8077fb4
--- /dev/null
+++ b/internal/cmd/forecast/estimate.go
@@ -0,0 +1,1368 @@
+package forecast
+
+import (
+	"fmt"
+
+	"github.com/aws-cloudformation/rain/cft"
+	"github.com/aws-cloudformation/rain/cft/graph"
+	"github.com/aws-cloudformation/rain/internal/config"
+	"github.com/aws-cloudformation/rain/internal/s11n"
+)
+
+// Estimates is a map of resource type name to ResourceEstimates, which are based on historical averages
+var Estimates map[string]ResourceEstimate
+
+// ResourceEstimate stores the estimated time, in seconds, to create,
+// update, or delete a specific resource type.
+// The Name is something like "AWS::S3::Bucket"
+type ResourceEstimate struct {
+	Name   string
+	Create int
+	Update int
+	Delete int
+}
+
+// NewResourceEstimate creates a new instance of ResourceEstimate
+func NewResourceEstimate(name string, create int, update int, del int) ResourceEstimate {
+	est := ResourceEstimate{}
+	est.Name = name
+	est.Create = create
+	est.Update = update
+	est.Delete = del
+	return est
+}
+
+type StackAction string
+
+const (
+	Create StackAction = "create"
+	Update StackAction = "update"
+	Delete StackAction = "delete"
+)
+
+// GetResourceEstimate returns the estimated time an action will take for the given resource type
+func GetResourceEstimate(resourceType string, action StackAction) (int, error) {
+
+	est, exists := Estimates[resourceType]
+	if exists {
+		switch action {
+		case Create:
+			return est.Create, nil
+		case Update:
+			return est.Update, nil
+		case Delete:
+			return est.Delete, nil
+		}
+		return 0, nil
+	} else {
+		return 0, fmt.Errorf("no estimate available for %v", resourceType)
+	}
+}
+
+// getResourceType returns the resource type for the logical id
+// For example, "MyBucket" would return "AWS::S3::Bucket" if it is present,
+// otherwise "" is returned
+func getResourceType(t cft.Template, logicalId string) string {
+	rootMap := t.Node.Content[0]
+	_, resources := s11n.GetMapValue(rootMap, "Resources")
+	if resources == nil {
+		panic("Expected to find a Resources section in the template")
+	}
+	for i, r := range resources.Content {
+		if i%2 != 0 {
+			continue
+		}
+		if logicalId == r.Value {
+			resource := resources.Content[i+1]
+			_, typeNode := s11n.GetMapValue(resource, "Type")
+			if typeNode == nil {
+				panic(fmt.Sprintf("Expected %v to have a Type", logicalId))
+			}
+			return typeNode.Value
+		}
+	}
+	return ""
+}
+
+// addDurations is a recursive function that dives down dependencies to add
+// the total duration estimated for stack actions
+func addDurations(
+	g graph.Graph,
+	t cft.Template,
+	action StackAction,
+	dependencies []graph.Node,
+	parentDuration *int,
+	indent string) {
+
+	if len(dependencies) == 0 {
+		return
+	}
+
+	maxDuration := 0
+
+	for _, d := range dependencies {
+		if d.Type != "Resources" {
+			continue
+		}
+		drt := getResourceType(t, d.Name)
+		if drt == "" {
+			panic(fmt.Sprintf("unexpected: no Type for %v", d.Name))
+		}
+		dd, err := GetResourceEstimate(drt, action)
+		if err != nil {
+			config.Debugf("no estimate for %v", drt)
+			continue
+		}
+		config.Debugf("%v- depends on %v (%vs)", indent, d.Name, dd)
+
+		childDuration := dd
+		addDurations(g, t, action, g.Get(d), &childDuration, indent+"  ")
+		if maxDuration < childDuration {
+			maxDuration = childDuration
+		}
+	}
+
+	*parentDuration += maxDuration
+}
+
+// PredictTotalEstimate returns the total number of seconds expected to deploy the stack.
+// This function takes into account resources that will be deployed in parallel.
+func PredictTotalEstimate(t cft.Template, stackExists bool) int {
+	total := 0
+
+	var action StackAction
+	action = "create"
+	if stackExists {
+		action = "update"
+	}
+
+	// Build a graph of dependencies
+	g := graph.New(t)
+
+	config.Debugf("g:\n%v", g.String())
+
+	// Dive down each path, add up durations. Longest duration from the top wins.
+	//
+	// (Downward is "depends on")
+	//
+	//       A   E  F      A: 2s
+	//      / \ /    \     B: 4s
+	//     B   C      G    C: 1s
+	//          \          D: 6s
+	//           D         E: 8s
+	//                     F: 2s
+	//                     G: 1s
+	//
+	// Deployment order:
+	//
+	// B-A		= 6s
+	// D-C-A    = 9s
+	// D-C-E    = 15s
+	// G-F      = 3s
+	//
+	// Expected deployment time is 15s
+
+	nodes := g.Nodes()
+	for _, n := range nodes {
+		if n.Type != "Resources" {
+			continue
+		}
+		// For every node in the graph, walk down its dependencies and
+		// add up the total duration.
+
+		resourceType := getResourceType(t, n.Name)
+		if resourceType == "" {
+			panic(fmt.Sprintf("unexpected: no Type for %v", n.Name))
+		}
+		duration, err := GetResourceEstimate(resourceType, action)
+		if err != nil {
+			config.Debugf("no estimate for %v", resourceType)
+			continue
+		}
+		config.Debugf("%v duration: %v", n.Name, duration)
+
+		dependencies := g.Get(n)
+		addDurations(g, t, action, dependencies, &duration, "  ")
+
+		config.Debugf("total duration for %v is %vs", n.Name, duration)
+		if total < duration {
+			total = duration
+		}
+	}
+
+	return total
+}
+
+// FormatEstimate returns a string in human readable format to represent the number of seconds.
+// For example, 61 would return "0h, 1m, 1s"
+func FormatEstimate(total int) string {
+	return fmt.Sprintf("%vh, %vm, %vs", total/360, total/60, total%60)
+}
+
+// init initializes the Estimates map for all AWS resource types
+func InitEstimates() {
+
+	Estimates = make(map[string]ResourceEstimate, 0)
+
+	Estimates["AWS::ACMPCA::Certificate"] = NewResourceEstimate("AWS::ACMPCA::Certificate", 3, 0, 1)
+	Estimates["AWS::ACMPCA::CertificateAuthority"] = NewResourceEstimate("AWS::ACMPCA::CertificateAuthority", 3, 2, 1)
+	Estimates["AWS::ACMPCA::CertificateAuthorityActivation"] = NewResourceEstimate("AWS::ACMPCA::CertificateAuthorityActivation", 2, 2, 1)
+	Estimates["AWS::ACMPCA::Permission"] = NewResourceEstimate("AWS::ACMPCA::Permission", 1, 0, 1)
+	Estimates["AWS::APS::RuleGroupsNamespace"] = NewResourceEstimate("AWS::APS::RuleGroupsNamespace", 47, 44, 1)
+	Estimates["AWS::APS::Workspace"] = NewResourceEstimate("AWS::APS::Workspace", 30, 66, 1)
+	Estimates["AWS::AccessAnalyzer::Analyzer"] = NewResourceEstimate("AWS::AccessAnalyzer::Analyzer", 1, 1, 1)
+	Estimates["AWS::AmazonMQ::Broker"] = NewResourceEstimate("AWS::AmazonMQ::Broker", 604, 3, 1)
+	Estimates["AWS::AmazonMQ::Configuration"] = NewResourceEstimate("AWS::AmazonMQ::Configuration", 2, 1, 1)
+	Estimates["AWS::AmazonMQ::ConfigurationAssociation"] = NewResourceEstimate("AWS::AmazonMQ::ConfigurationAssociation", 177, 1, 1)
+	Estimates["AWS::Amplify::App"] = NewResourceEstimate("AWS::Amplify::App", 2, 3, 1)
+	Estimates["AWS::Amplify::Branch"] = NewResourceEstimate("AWS::Amplify::Branch", 2, 3, 1)
+	Estimates["AWS::Amplify::Domain"] = NewResourceEstimate("AWS::Amplify::Domain", 46, 1, 1)
+	Estimates["AWS::AmplifyUIBuilder::Component"] = NewResourceEstimate("AWS::AmplifyUIBuilder::Component", 2, 2, 1)
+	Estimates["AWS::AmplifyUIBuilder::Form"] = NewResourceEstimate("AWS::AmplifyUIBuilder::Form", 2, 2, 1)
+	Estimates["AWS::AmplifyUIBuilder::Theme"] = NewResourceEstimate("AWS::AmplifyUIBuilder::Theme", 1, 2, 1)
+	Estimates["AWS::AmplifyUIBuilder::View"] = NewResourceEstimate("AWS::AmplifyUIBuilder::View", 2, 2, 1)
+	Estimates["AWS::ApiGateway::Account"] = NewResourceEstimate("AWS::ApiGateway::Account", 2, 1, 1)
+	Estimates["AWS::ApiGateway::ApiKey"] = NewResourceEstimate("AWS::ApiGateway::ApiKey", 2, 1, 1)
+	Estimates["AWS::ApiGateway::Authorizer"] = NewResourceEstimate("AWS::ApiGateway::Authorizer", 1, 0, 1)
+	Estimates["AWS::ApiGateway::BasePathMapping"] = NewResourceEstimate("AWS::ApiGateway::BasePathMapping", 12, 0, 1)
+	Estimates["AWS::ApiGateway::ClientCertificate"] = NewResourceEstimate("AWS::ApiGateway::ClientCertificate", 2, 2, 1)
+	Estimates["AWS::ApiGateway::Deployment"] = NewResourceEstimate("AWS::ApiGateway::Deployment", 3, 2, 1)
+	Estimates["AWS::ApiGateway::DocumentationPart"] = NewResourceEstimate("AWS::ApiGateway::DocumentationPart", 1, 3, 1)
+	Estimates["AWS::ApiGateway::DocumentationVersion"] = NewResourceEstimate("AWS::ApiGateway::DocumentationVersion", 2, 1, 1)
+	Estimates["AWS::ApiGateway::DomainName"] = NewResourceEstimate("AWS::ApiGateway::DomainName", 14, 3, 1)
+	Estimates["AWS::ApiGateway::GatewayResponse"] = NewResourceEstimate("AWS::ApiGateway::GatewayResponse", 1, 1, 1)
+	Estimates["AWS::ApiGateway::Method"] = NewResourceEstimate("AWS::ApiGateway::Method", 2, 2, 1)
+	Estimates["AWS::ApiGateway::Model"] = NewResourceEstimate("AWS::ApiGateway::Model", 2, 2, 1)
+	Estimates["AWS::ApiGateway::RequestValidator"] = NewResourceEstimate("AWS::ApiGateway::RequestValidator", 2, 4, 1)
+	Estimates["AWS::ApiGateway::Resource"] = NewResourceEstimate("AWS::ApiGateway::Resource", 2, 0, 1)
+	Estimates["AWS::ApiGateway::RestApi"] = NewResourceEstimate("AWS::ApiGateway::RestApi", 2, 2, 1)
+	Estimates["AWS::ApiGateway::Stage"] = NewResourceEstimate("AWS::ApiGateway::Stage", 2, 2, 1)
+	Estimates["AWS::ApiGateway::UsagePlan"] = NewResourceEstimate("AWS::ApiGateway::UsagePlan", 2, 1, 1)
+	Estimates["AWS::ApiGateway::UsagePlanKey"] = NewResourceEstimate("AWS::ApiGateway::UsagePlanKey", 2, 0, 1)
+	Estimates["AWS::ApiGateway::VpcLink"] = NewResourceEstimate("AWS::ApiGateway::VpcLink", 429, 2, 1)
+	Estimates["AWS::ApiGatewayV2::AccessPolicy"] = NewResourceEstimate("AWS::ApiGatewayV2::AccessPolicy", 2, 3, 1)
+	Estimates["AWS::ApiGatewayV2::Api"] = NewResourceEstimate("AWS::ApiGatewayV2::Api", 2, 1, 1)
+	Estimates["AWS::ApiGatewayV2::ApiMapping"] = NewResourceEstimate("AWS::ApiGatewayV2::ApiMapping", 1, 1, 1)
+	Estimates["AWS::ApiGatewayV2::Authorizer"] = NewResourceEstimate("AWS::ApiGatewayV2::Authorizer", 1, 0, 1)
+	Estimates["AWS::ApiGatewayV2::Deployment"] = NewResourceEstimate("AWS::ApiGatewayV2::Deployment", 2, 0, 1)
+	Estimates["AWS::ApiGatewayV2::DomainName"] = NewResourceEstimate("AWS::ApiGatewayV2::DomainName", 6, 1, 1)
+	Estimates["AWS::ApiGatewayV2::Integration"] = NewResourceEstimate("AWS::ApiGatewayV2::Integration", 1, 0, 1)
+	Estimates["AWS::ApiGatewayV2::IntegrationResponse"] = NewResourceEstimate("AWS::ApiGatewayV2::IntegrationResponse", 1, 1, 1)
+	Estimates["AWS::ApiGatewayV2::Model"] = NewResourceEstimate("AWS::ApiGatewayV2::Model", 1, 1, 1)
+	Estimates["AWS::ApiGatewayV2::Route"] = NewResourceEstimate("AWS::ApiGatewayV2::Route", 1, 3, 1)
+	Estimates["AWS::ApiGatewayV2::RouteResponse"] = NewResourceEstimate("AWS::ApiGatewayV2::RouteResponse", 1, 0, 1)
+	Estimates["AWS::ApiGatewayV2::Stage"] = NewResourceEstimate("AWS::ApiGatewayV2::Stage", 1, 1, 1)
+	Estimates["AWS::ApiGatewayV2::VpcLink"] = NewResourceEstimate("AWS::ApiGatewayV2::VpcLink", 124, 0, 1)
+	Estimates["AWS::AppConfig::Application"] = NewResourceEstimate("AWS::AppConfig::Application", 1, 1, 1)
+	Estimates["AWS::AppConfig::ConfigurationProfile"] = NewResourceEstimate("AWS::AppConfig::ConfigurationProfile", 1, 0, 1)
+	Estimates["AWS::AppConfig::Deployment"] = NewResourceEstimate("AWS::AppConfig::Deployment", 133, 0, 1)
+	Estimates["AWS::AppConfig::DeploymentStrategy"] = NewResourceEstimate("AWS::AppConfig::DeploymentStrategy", 1, 1, 1)
+	Estimates["AWS::AppConfig::Environment"] = NewResourceEstimate("AWS::AppConfig::Environment", 1, 1, 1)
+	Estimates["AWS::AppConfig::Extension"] = NewResourceEstimate("AWS::AppConfig::Extension", 1, 0, 1)
+	Estimates["AWS::AppConfig::ExtensionAssociation"] = NewResourceEstimate("AWS::AppConfig::ExtensionAssociation", 1, 1, 1)
+	Estimates["AWS::AppConfig::HostedConfigurationVersion"] = NewResourceEstimate("AWS::AppConfig::HostedConfigurationVersion", 1, 0, 1)
+	Estimates["AWS::AppFlow::Connector"] = NewResourceEstimate("AWS::AppFlow::Connector", 2, 0, 1)
+	Estimates["AWS::AppFlow::ConnectorProfile"] = NewResourceEstimate("AWS::AppFlow::ConnectorProfile", 9, 10, 1)
+	Estimates["AWS::AppFlow::Flow"] = NewResourceEstimate("AWS::AppFlow::Flow", 10, 10, 1)
+	Estimates["AWS::AppIntegrations::Application"] = NewResourceEstimate("AWS::AppIntegrations::Application", 1, 1, 1)
+	Estimates["AWS::AppIntegrations::DataIntegration"] = NewResourceEstimate("AWS::AppIntegrations::DataIntegration", 2, 2, 1)
+	Estimates["AWS::AppIntegrations::EventIntegration"] = NewResourceEstimate("AWS::AppIntegrations::EventIntegration", 1, 2, 1)
+	Estimates["AWS::AppMesh::GatewayRoute"] = NewResourceEstimate("AWS::AppMesh::GatewayRoute", 2, 1, 1)
+	Estimates["AWS::AppMesh::Mesh"] = NewResourceEstimate("AWS::AppMesh::Mesh", 1, 1, 1)
+	Estimates["AWS::AppMesh::Route"] = NewResourceEstimate("AWS::AppMesh::Route", 2, 1, 1)
+	Estimates["AWS::AppMesh::VirtualGateway"] = NewResourceEstimate("AWS::AppMesh::VirtualGateway", 2, 1, 1)
+	Estimates["AWS::AppMesh::VirtualNode"] = NewResourceEstimate("AWS::AppMesh::VirtualNode", 6, 1, 1)
+	Estimates["AWS::AppMesh::VirtualRouter"] = NewResourceEstimate("AWS::AppMesh::VirtualRouter", 1, 1, 1)
+	Estimates["AWS::AppMesh::VirtualService"] = NewResourceEstimate("AWS::AppMesh::VirtualService", 1, 1, 1)
+	Estimates["AWS::AppRunner::AutoScalingConfiguration"] = NewResourceEstimate("AWS::AppRunner::AutoScalingConfiguration", 1, 1, 1)
+	Estimates["AWS::AppRunner::ObservabilityConfiguration"] = NewResourceEstimate("AWS::AppRunner::ObservabilityConfiguration", 1, 1, 1)
+	Estimates["AWS::AppRunner::Service"] = NewResourceEstimate("AWS::AppRunner::Service", 218, 143, 1)
+	Estimates["AWS::AppRunner::VpcConnector"] = NewResourceEstimate("AWS::AppRunner::VpcConnector", 2, 1, 1)
+	Estimates["AWS::AppRunner::VpcIngressConnection"] = NewResourceEstimate("AWS::AppRunner::VpcIngressConnection", 38, 0, 1)
+	Estimates["AWS::AppStream::AppBlock"] = NewResourceEstimate("AWS::AppStream::AppBlock", 2, 1, 1)
+	Estimates["AWS::AppStream::Application"] = NewResourceEstimate("AWS::AppStream::Application", 2, 2, 1)
+	Estimates["AWS::AppStream::ApplicationEntitlementAssociation"] = NewResourceEstimate("AWS::AppStream::ApplicationEntitlementAssociation", 1, 1, 1)
+	Estimates["AWS::AppStream::ApplicationFleetAssociation"] = NewResourceEstimate("AWS::AppStream::ApplicationFleetAssociation", 2, 1, 1)
+	Estimates["AWS::AppStream::DirectoryConfig"] = NewResourceEstimate("AWS::AppStream::DirectoryConfig", 2, 1, 1)
+	Estimates["AWS::AppStream::Entitlement"] = NewResourceEstimate("AWS::AppStream::Entitlement", 1, 0, 1)
+	Estimates["AWS::AppStream::Fleet"] = NewResourceEstimate("AWS::AppStream::Fleet", 20, 3, 1)
+	Estimates["AWS::AppStream::ImageBuilder"] = NewResourceEstimate("AWS::AppStream::ImageBuilder", 817, 1, 1)
+	Estimates["AWS::AppStream::Stack"] = NewResourceEstimate("AWS::AppStream::Stack", 1, 1, 0)
+	Estimates["AWS::AppStream::StackFleetAssociation"] = NewResourceEstimate("AWS::AppStream::StackFleetAssociation", 2, 0, 1)
+	Estimates["AWS::AppSync::ApiCache"] = NewResourceEstimate("AWS::AppSync::ApiCache", 437, 1, 1)
+	Estimates["AWS::AppSync::ApiKey"] = NewResourceEstimate("AWS::AppSync::ApiKey", 2, 2, 1)
+	Estimates["AWS::AppSync::DataSource"] = NewResourceEstimate("AWS::AppSync::DataSource", 2, 1, 1)
+	Estimates["AWS::AppSync::DomainName"] = NewResourceEstimate("AWS::AppSync::DomainName", 5, 1, 1)
+	Estimates["AWS::AppSync::DomainNameApiAssociation"] = NewResourceEstimate("AWS::AppSync::DomainNameApiAssociation", 313, 200, 1)
+	Estimates["AWS::AppSync::FunctionConfiguration"] = NewResourceEstimate("AWS::AppSync::FunctionConfiguration", 2, 2, 1)
+	Estimates["AWS::AppSync::GraphQLApi"] = NewResourceEstimate("AWS::AppSync::GraphQLApi", 2, 2, 1)
+	Estimates["AWS::AppSync::GraphQLSchema"] = NewResourceEstimate("AWS::AppSync::GraphQLSchema", 8, 8, 1)
+	Estimates["AWS::AppSync::Resolver"] = NewResourceEstimate("AWS::AppSync::Resolver", 7, 1, 1)
+	Estimates["AWS::AppSync::SourceApiAssociation"] = NewResourceEstimate("AWS::AppSync::SourceApiAssociation", 7, 2, 1)
+	Estimates["AWS::ApplicationAutoScaling::ScalableTarget"] = NewResourceEstimate("AWS::ApplicationAutoScaling::ScalableTarget", 2, 0, 1)
+	Estimates["AWS::ApplicationAutoScaling::ScalingPolicy"] = NewResourceEstimate("AWS::ApplicationAutoScaling::ScalingPolicy", 1, 0, 1)
+	Estimates["AWS::ApplicationInsights::Application"] = NewResourceEstimate("AWS::ApplicationInsights::Application", 45, 1, 1)
+	Estimates["AWS::Athena::CapacityReservation"] = NewResourceEstimate("AWS::Athena::CapacityReservation", 84, 2, 1)
+	Estimates["AWS::Athena::DataCatalog"] = NewResourceEstimate("AWS::Athena::DataCatalog", 1, 1, 1)
+	Estimates["AWS::Athena::NamedQuery"] = NewResourceEstimate("AWS::Athena::NamedQuery", 5, 1, 1)
+	Estimates["AWS::Athena::PreparedStatement"] = NewResourceEstimate("AWS::Athena::PreparedStatement", 3, 2, 1)
+	Estimates["AWS::Athena::WorkGroup"] = NewResourceEstimate("AWS::Athena::WorkGroup", 2, 2, 1)
+	Estimates["AWS::AuditManager::Assessment"] = NewResourceEstimate("AWS::AuditManager::Assessment", 2, 2, 1)
+	Estimates["AWS::AutoScaling::AutoScalingGroup"] = NewResourceEstimate("AWS::AutoScaling::AutoScalingGroup", 3, 3, 1)
+	Estimates["AWS::AutoScaling::LaunchConfiguration"] = NewResourceEstimate("AWS::AutoScaling::LaunchConfiguration", 2, 0, 1)
+	Estimates["AWS::AutoScaling::LifecycleHook"] = NewResourceEstimate("AWS::AutoScaling::LifecycleHook", 2, 1, 1)
+	Estimates["AWS::AutoScaling::ScalingPolicy"] = NewResourceEstimate("AWS::AutoScaling::ScalingPolicy", 7, 0, 1)
+	Estimates["AWS::AutoScaling::ScheduledAction"] = NewResourceEstimate("AWS::AutoScaling::ScheduledAction", 12, 0, 1)
+	Estimates["AWS::AutoScaling::WarmPool"] = NewResourceEstimate("AWS::AutoScaling::WarmPool", 24, 12, 1)
+	Estimates["AWS::AutoScalingPlans::ScalingPlan"] = NewResourceEstimate("AWS::AutoScalingPlans::ScalingPlan", 61, 1, 1)
+	Estimates["AWS::Backup::BackupPlan"] = NewResourceEstimate("AWS::Backup::BackupPlan", 4, 1, 1)
+	Estimates["AWS::Backup::BackupSelection"] = NewResourceEstimate("AWS::Backup::BackupSelection", 2, 2, 1)
+	Estimates["AWS::Backup::BackupVault"] = NewResourceEstimate("AWS::Backup::BackupVault", 2, 1, 1)
+	Estimates["AWS::Backup::Framework"] = NewResourceEstimate("AWS::Backup::Framework", 22, 22, 1)
+	Estimates["AWS::Backup::ReportPlan"] = NewResourceEstimate("AWS::Backup::ReportPlan", 7, 7, 1)
+	Estimates["AWS::BackupGateway::Hypervisor"] = NewResourceEstimate("AWS::BackupGateway::Hypervisor", 2, 2, 1)
+	Estimates["AWS::Batch::ComputeEnvironment"] = NewResourceEstimate("AWS::Batch::ComputeEnvironment", 7, 8, 1)
+	Estimates["AWS::Batch::JobDefinition"] = NewResourceEstimate("AWS::Batch::JobDefinition", 6, 6, 1)
+	Estimates["AWS::Batch::JobQueue"] = NewResourceEstimate("AWS::Batch::JobQueue", 7, 6, 1)
+	Estimates["AWS::Batch::SchedulingPolicy"] = NewResourceEstimate("AWS::Batch::SchedulingPolicy", 1, 1, 1)
+	Estimates["AWS::Budgets::Budget"] = NewResourceEstimate("AWS::Budgets::Budget", 1, 16, 1)
+	Estimates["AWS::Budgets::BudgetsAction"] = NewResourceEstimate("AWS::Budgets::BudgetsAction", 1, 2, 1)
+	Estimates["AWS::CDK::GammaMetadata"] = NewResourceEstimate("AWS::CDK::GammaMetadata", 2, 1, 1)
+	Estimates["AWS::CDK::Metadata"] = NewResourceEstimate("AWS::CDK::Metadata", 1, 1, 1)
+	Estimates["AWS::CE::CostCategory"] = NewResourceEstimate("AWS::CE::CostCategory", 1, 2, 1)
+	Estimates["AWS::CUR::ReportDefinition"] = NewResourceEstimate("AWS::CUR::ReportDefinition", 2, 1, 1)
+	Estimates["AWS::Canary::SubnetCidrBlockCleanUp"] = NewResourceEstimate("AWS::Canary::SubnetCidrBlockCleanUp", 12, 1, 1)
+	Estimates["AWS::Cassandra::Keyspace"] = NewResourceEstimate("AWS::Cassandra::Keyspace", 16, 4, 1)
+	Estimates["AWS::Cassandra::Table"] = NewResourceEstimate("AWS::Cassandra::Table", 27, 38, 1)
+	Estimates["AWS::CertificateManager::Account"] = NewResourceEstimate("AWS::CertificateManager::Account", 3, 1, 1)
+	Estimates["AWS::CertificateManager::Certificate"] = NewResourceEstimate("AWS::CertificateManager::Certificate", 239, 0, 1)
+	Estimates["AWS::Chatbot::MicrosoftTeamsChannelConfiguration"] = NewResourceEstimate("AWS::Chatbot::MicrosoftTeamsChannelConfiguration", 2, 2, 1)
+	Estimates["AWS::Chatbot::SlackChannelConfiguration"] = NewResourceEstimate("AWS::Chatbot::SlackChannelConfiguration", 2, 2, 1)
+	Estimates["AWS::CleanRooms::AnalysisTemplate"] = NewResourceEstimate("AWS::CleanRooms::AnalysisTemplate", 4, 1, 1)
+	Estimates["AWS::CleanRooms::Collaboration"] = NewResourceEstimate("AWS::CleanRooms::Collaboration", 3, 2, 1)
+	Estimates["AWS::CleanRooms::ConfiguredTable"] = NewResourceEstimate("AWS::CleanRooms::ConfiguredTable", 4, 3, 1)
+	Estimates["AWS::CleanRooms::ConfiguredTableAssociation"] = NewResourceEstimate("AWS::CleanRooms::ConfiguredTableAssociation", 4, 3, 1)
+	Estimates["AWS::CleanRooms::Membership"] = NewResourceEstimate("AWS::CleanRooms::Membership", 4, 2, 1)
+	Estimates["AWS::Cloud9::EnvironmentEC2"] = NewResourceEstimate("AWS::Cloud9::EnvironmentEC2", 48, 1, 1)
+	Estimates["AWS::CloudFormation::CustomResource"] = NewResourceEstimate("AWS::CloudFormation::CustomResource", 119, 19, 1)
+	Estimates["AWS::CloudFormation::HookDefaultVersion"] = NewResourceEstimate("AWS::CloudFormation::HookDefaultVersion", 3, 1, 1)
+	Estimates["AWS::CloudFormation::HookTypeConfig"] = NewResourceEstimate("AWS::CloudFormation::HookTypeConfig", 1, 1, 1)
+	Estimates["AWS::CloudFormation::HookVersion"] = NewResourceEstimate("AWS::CloudFormation::HookVersion", 44, 1, 1)
+	Estimates["AWS::CloudFormation::Macro"] = NewResourceEstimate("AWS::CloudFormation::Macro", 1, 0, 1)
+	Estimates["AWS::CloudFormation::ModuleDefaultVersion"] = NewResourceEstimate("AWS::CloudFormation::ModuleDefaultVersion", 1, 1, 1)
+	Estimates["AWS::CloudFormation::ModuleVersion"] = NewResourceEstimate("AWS::CloudFormation::ModuleVersion", 17, 1, 1)
+	Estimates["AWS::CloudFormation::PublicTypeVersion"] = NewResourceEstimate("AWS::CloudFormation::PublicTypeVersion", 167, 1, 1)
+	Estimates["AWS::CloudFormation::Publisher"] = NewResourceEstimate("AWS::CloudFormation::Publisher", 1, 1, 1)
+	Estimates["AWS::CloudFormation::ResourceDefaultVersion"] = NewResourceEstimate("AWS::CloudFormation::ResourceDefaultVersion", 3, 1, 1)
+	Estimates["AWS::CloudFormation::ResourceTypeVersion"] = NewResourceEstimate("AWS::CloudFormation::ResourceTypeVersion", 1, 1, 1)
+	Estimates["AWS::CloudFormation::ResourceTypeVersionMapping"] = NewResourceEstimate("AWS::CloudFormation::ResourceTypeVersionMapping", 1, 0, 1)
+	Estimates["AWS::CloudFormation::ResourceVersion"] = NewResourceEstimate("AWS::CloudFormation::ResourceVersion", 108, 1, 1)
+	Estimates["AWS::CloudFormation::Stack"] = NewResourceEstimate("AWS::CloudFormation::Stack", 133, 37, 1)
+	Estimates["AWS::CloudFormation::StackSet"] = NewResourceEstimate("AWS::CloudFormation::StackSet", 17, 16, 1)
+	Estimates["AWS::CloudFormation::Transform"] = NewResourceEstimate("AWS::CloudFormation::Transform", 1, 0, 1)
+	Estimates["AWS::CloudFormation::TypeActivation"] = NewResourceEstimate("AWS::CloudFormation::TypeActivation", 1, 1, 1)
+	Estimates["AWS::CloudFormation::WaitCondition"] = NewResourceEstimate("AWS::CloudFormation::WaitCondition", 210, 0, 1)
+	Estimates["AWS::CloudFormation::WaitConditionHandle"] = NewResourceEstimate("AWS::CloudFormation::WaitConditionHandle", 0, 0, 1)
+	Estimates["AWS::CloudFront::CachePolicy"] = NewResourceEstimate("AWS::CloudFront::CachePolicy", 2, 4, 1)
+	Estimates["AWS::CloudFront::CloudFrontOriginAccessIdentity"] = NewResourceEstimate("AWS::CloudFront::CloudFrontOriginAccessIdentity", 2, 2, 1)
+	Estimates["AWS::CloudFront::ContinuousDeploymentPolicy"] = NewResourceEstimate("AWS::CloudFront::ContinuousDeploymentPolicy", 2, 2, 1)
+	Estimates["AWS::CloudFront::Distribution"] = NewResourceEstimate("AWS::CloudFront::Distribution", 266, 164, 1)
+	Estimates["AWS::CloudFront::Function"] = NewResourceEstimate("AWS::CloudFront::Function", 5, 41, 1)
+	Estimates["AWS::CloudFront::KeyGroup"] = NewResourceEstimate("AWS::CloudFront::KeyGroup", 2, 2, 1)
+	Estimates["AWS::CloudFront::OriginAccessControl"] = NewResourceEstimate("AWS::CloudFront::OriginAccessControl", 2, 0, 1)
+	Estimates["AWS::CloudFront::OriginRequestPolicy"] = NewResourceEstimate("AWS::CloudFront::OriginRequestPolicy", 2, 5, 1)
+	Estimates["AWS::CloudFront::PublicKey"] = NewResourceEstimate("AWS::CloudFront::PublicKey", 2, 2, 1)
+	Estimates["AWS::CloudFront::Random"] = NewResourceEstimate("AWS::CloudFront::Random", 1, 1, 1)
+	Estimates["AWS::CloudFront::RealtimeLogConfig"] = NewResourceEstimate("AWS::CloudFront::RealtimeLogConfig", 2, 1, 1)
+	Estimates["AWS::CloudFront::ResponseHeadersPolicy"] = NewResourceEstimate("AWS::CloudFront::ResponseHeadersPolicy", 2, 2, 1)
+	Estimates["AWS::CloudTrail::Channel"] = NewResourceEstimate("AWS::CloudTrail::Channel", 1, 1, 1)
+	Estimates["AWS::CloudTrail::EventDataStore"] = NewResourceEstimate("AWS::CloudTrail::EventDataStore", 4, 3, 1)
+	Estimates["AWS::CloudTrail::ResourcePolicy"] = NewResourceEstimate("AWS::CloudTrail::ResourcePolicy", 1, 1, 1)
+	Estimates["AWS::CloudTrail::Trail"] = NewResourceEstimate("AWS::CloudTrail::Trail", 2, 2, 1)
+	Estimates["AWS::CloudWatch::Alarm"] = NewResourceEstimate("AWS::CloudWatch::Alarm", 2, 0, 1)
+	Estimates["AWS::CloudWatch::AnomalyDetector"] = NewResourceEstimate("AWS::CloudWatch::AnomalyDetector", 1, 0, 1)
+	Estimates["AWS::CloudWatch::CompositeAlarm"] = NewResourceEstimate("AWS::CloudWatch::CompositeAlarm", 1, 2, 1)
+	Estimates["AWS::CloudWatch::Dashboard"] = NewResourceEstimate("AWS::CloudWatch::Dashboard", 2, 1, 1)
+	Estimates["AWS::CloudWatch::InsightRule"] = NewResourceEstimate("AWS::CloudWatch::InsightRule", 3, 2, 1)
+	Estimates["AWS::CloudWatch::MetricStream"] = NewResourceEstimate("AWS::CloudWatch::MetricStream", 1, 1, 1)
+	Estimates["AWS::CodeArtifact::Domain"] = NewResourceEstimate("AWS::CodeArtifact::Domain", 3, 1, 1)
+	Estimates["AWS::CodeArtifact::Repository"] = NewResourceEstimate("AWS::CodeArtifact::Repository", 12, 2, 1)
+	Estimates["AWS::CodeBuild::Project"] = NewResourceEstimate("AWS::CodeBuild::Project", 2, 3, 1)
+	Estimates["AWS::CodeBuild::ReportGroup"] = NewResourceEstimate("AWS::CodeBuild::ReportGroup", 2, 2, 1)
+	Estimates["AWS::CodeBuild::SourceCredential"] = NewResourceEstimate("AWS::CodeBuild::SourceCredential", 1, 1, 1)
+	Estimates["AWS::CodeCommit::Repository"] = NewResourceEstimate("AWS::CodeCommit::Repository", 2, 1, 1)
+	Estimates["AWS::CodeDeploy::Application"] = NewResourceEstimate("AWS::CodeDeploy::Application", 1, 1, 1)
+	Estimates["AWS::CodeDeploy::DeploymentConfig"] = NewResourceEstimate("AWS::CodeDeploy::DeploymentConfig", 1, 0, 1)
+	Estimates["AWS::CodeDeploy::DeploymentGroup"] = NewResourceEstimate("AWS::CodeDeploy::DeploymentGroup", 20, 9, 1)
+	Estimates["AWS::CodeGuruProfiler::ProfilingGroup"] = NewResourceEstimate("AWS::CodeGuruProfiler::ProfilingGroup", 1, 2, 1)
+	Estimates["AWS::CodeGuruReviewer::RepositoryAssociation"] = NewResourceEstimate("AWS::CodeGuruReviewer::RepositoryAssociation", 34, 1, 1)
+	Estimates["AWS::CodePipeline::CustomActionType"] = NewResourceEstimate("AWS::CodePipeline::CustomActionType", 2, 1, 1)
+	Estimates["AWS::CodePipeline::Pipeline"] = NewResourceEstimate("AWS::CodePipeline::Pipeline", 71, 3, 1)
+	Estimates["AWS::CodePipeline::Webhook"] = NewResourceEstimate("AWS::CodePipeline::Webhook", 2, 3, 1)
+	Estimates["AWS::CodeStar::GitHubRepository"] = NewResourceEstimate("AWS::CodeStar::GitHubRepository", 7, 1, 1)
+	Estimates["AWS::CodeStar::Project"] = NewResourceEstimate("AWS::CodeStar::Project", 12, 1, 1)
+	Estimates["AWS::CodeStar::SyncResources"] = NewResourceEstimate("AWS::CodeStar::SyncResources", 12, 1, 1)
+	Estimates["AWS::CodeStarConnections::Connection"] = NewResourceEstimate("AWS::CodeStarConnections::Connection", 1, 2, 1)
+	Estimates["AWS::CodeStarNotifications::NotificationRule"] = NewResourceEstimate("AWS::CodeStarNotifications::NotificationRule", 2, 2, 1)
+	Estimates["AWS::CodeTest::PersistentConfiguration"] = NewResourceEstimate("AWS::CodeTest::PersistentConfiguration", 50, 5, 1)
+	Estimates["AWS::CodeTest::Series"] = NewResourceEstimate("AWS::CodeTest::Series", 9, 13, 1)
+	Estimates["AWS::Cognito::IdentityPool"] = NewResourceEstimate("AWS::Cognito::IdentityPool", 1, 1, 1)
+	Estimates["AWS::Cognito::IdentityPoolPrincipalTag"] = NewResourceEstimate("AWS::Cognito::IdentityPoolPrincipalTag", 1, 1, 1)
+	Estimates["AWS::Cognito::IdentityPoolRoleAttachment"] = NewResourceEstimate("AWS::Cognito::IdentityPoolRoleAttachment", 1, 1, 1)
+	Estimates["AWS::Cognito::UserPool"] = NewResourceEstimate("AWS::Cognito::UserPool", 3, 2, 1)
+	Estimates["AWS::Cognito::UserPoolClient"] = NewResourceEstimate("AWS::Cognito::UserPoolClient", 1, 2, 1)
+	Estimates["AWS::Cognito::UserPoolDomain"] = NewResourceEstimate("AWS::Cognito::UserPoolDomain", 2, 0, 2)
+	Estimates["AWS::Cognito::UserPoolGroup"] = NewResourceEstimate("AWS::Cognito::UserPoolGroup", 21, 1, 1)
+	Estimates["AWS::Cognito::UserPoolIdentityProvider"] = NewResourceEstimate("AWS::Cognito::UserPoolIdentityProvider", 1, 0, 1)
+	Estimates["AWS::Cognito::UserPoolResourceServer"] = NewResourceEstimate("AWS::Cognito::UserPoolResourceServer", 1, 1, 1)
+	Estimates["AWS::Cognito::UserPoolRiskConfigurationAttachment"] = NewResourceEstimate("AWS::Cognito::UserPoolRiskConfigurationAttachment", 1, 1, 1)
+	Estimates["AWS::Cognito::UserPoolUICustomizationAttachment"] = NewResourceEstimate("AWS::Cognito::UserPoolUICustomizationAttachment", 1, 1, 1)
+	Estimates["AWS::Cognito::UserPoolUser"] = NewResourceEstimate("AWS::Cognito::UserPoolUser", 1, 1, 1)
+	Estimates["AWS::Cognito::UserPoolUserToGroupAttachment"] = NewResourceEstimate("AWS::Cognito::UserPoolUserToGroupAttachment", 1, 1, 1)
+	Estimates["AWS::Comprehend::DocumentClassifier"] = NewResourceEstimate("AWS::Comprehend::DocumentClassifier", 1846, 2, 1)
+	Estimates["AWS::Comprehend::Flywheel"] = NewResourceEstimate("AWS::Comprehend::Flywheel", 20, 2, 1)
+	Estimates["AWS::Config::AggregationAuthorization"] = NewResourceEstimate("AWS::Config::AggregationAuthorization", 4, 2, 1)
+	Estimates["AWS::Config::ConfigRule"] = NewResourceEstimate("AWS::Config::ConfigRule", 3, 0, 1)
+	Estimates["AWS::Config::ConfigurationAggregator"] = NewResourceEstimate("AWS::Config::ConfigurationAggregator", 4, 1, 1)
+	Estimates["AWS::Config::ConfigurationRecorder"] = NewResourceEstimate("AWS::Config::ConfigurationRecorder", 2, 1, 1)
+	Estimates["AWS::Config::ConformancePack"] = NewResourceEstimate("AWS::Config::ConformancePack", 34, 35, 1)
+	Estimates["AWS::Config::ConformancePackCompliance"] = NewResourceEstimate("AWS::Config::ConformancePackCompliance", 1, 1, 1)
+	Estimates["AWS::Config::DeliveryChannel"] = NewResourceEstimate("AWS::Config::DeliveryChannel", 1, 2, 1)
+	Estimates["AWS::Config::OrganizationConfigRule"] = NewResourceEstimate("AWS::Config::OrganizationConfigRule", 106, 1, 1)
+	Estimates["AWS::Config::OrganizationConformancePack"] = NewResourceEstimate("AWS::Config::OrganizationConformancePack", 227, 223, 1)
+	Estimates["AWS::Config::RemediationConfiguration"] = NewResourceEstimate("AWS::Config::RemediationConfiguration", 1, 1, 1)
+	Estimates["AWS::Config::StoredQuery"] = NewResourceEstimate("AWS::Config::StoredQuery", 4, 2, 1)
+	Estimates["AWS::Connect::ApprovedOrigin"] = NewResourceEstimate("AWS::Connect::ApprovedOrigin", 1, 1, 1)
+	Estimates["AWS::Connect::ContactFlow"] = NewResourceEstimate("AWS::Connect::ContactFlow", 2, 2, 1)
+	Estimates["AWS::Connect::ContactFlowModule"] = NewResourceEstimate("AWS::Connect::ContactFlowModule", 2, 2, 1)
+	Estimates["AWS::Connect::EvaluationForm"] = NewResourceEstimate("AWS::Connect::EvaluationForm", 2, 3, 1)
+	Estimates["AWS::Connect::HoursOfOperation"] = NewResourceEstimate("AWS::Connect::HoursOfOperation", 1, 2, 1)
+	Estimates["AWS::Connect::Instance"] = NewResourceEstimate("AWS::Connect::Instance", 71, 1, 1)
+	Estimates["AWS::Connect::InstanceStorageConfig"] = NewResourceEstimate("AWS::Connect::InstanceStorageConfig", 2, 0, 1)
+	Estimates["AWS::Connect::IntegrationAssociation"] = NewResourceEstimate("AWS::Connect::IntegrationAssociation", 2, 0, 1)
+	Estimates["AWS::Connect::PhoneNumber"] = NewResourceEstimate("AWS::Connect::PhoneNumber", 6, 33, 1)
+	Estimates["AWS::Connect::Prompt"] = NewResourceEstimate("AWS::Connect::Prompt", 3, 3, 1)
+	Estimates["AWS::Connect::Queue"] = NewResourceEstimate("AWS::Connect::Queue", 1, 1, 1)
+	Estimates["AWS::Connect::QuickConnect"] = NewResourceEstimate("AWS::Connect::QuickConnect", 1, 2, 1)
+	Estimates["AWS::Connect::RoutingProfile"] = NewResourceEstimate("AWS::Connect::RoutingProfile", 1, 1, 1)
+	Estimates["AWS::Connect::Rule"] = NewResourceEstimate("AWS::Connect::Rule", 2, 2, 1)
+	Estimates["AWS::Connect::SecurityKey"] = NewResourceEstimate("AWS::Connect::SecurityKey", 1, 1, 1)
+	Estimates["AWS::Connect::TaskTemplate"] = NewResourceEstimate("AWS::Connect::TaskTemplate", 1, 2, 1)
+	Estimates["AWS::Connect::TrafficDistributionGroup"] = NewResourceEstimate("AWS::Connect::TrafficDistributionGroup", 231, 2, 1)
+	Estimates["AWS::Connect::User"] = NewResourceEstimate("AWS::Connect::User", 3, 3, 1)
+	Estimates["AWS::Connect::UserHierarchyGroup"] = NewResourceEstimate("AWS::Connect::UserHierarchyGroup", 1, 1, 1)
+	Estimates["AWS::Connect::View"] = NewResourceEstimate("AWS::Connect::View", 2, 2, 1)
+	Estimates["AWS::Connect::ViewVersion"] = NewResourceEstimate("AWS::Connect::ViewVersion", 1, 1, 1)
+	Estimates["AWS::ConnectCampaigns::Campaign"] = NewResourceEstimate("AWS::ConnectCampaigns::Campaign", 2, 9, 1)
+	Estimates["AWS::ConsoleConfiguration::Endpoint"] = NewResourceEstimate("AWS::ConsoleConfiguration::Endpoint", 1, 1, 1)
+	Estimates["AWS::ControlTower::CustomWaiter"] = NewResourceEstimate("AWS::ControlTower::CustomWaiter", 152, 1, 1)
+	Estimates["AWS::ControlTower::EnabledControl"] = NewResourceEstimate("AWS::ControlTower::EnabledControl", 107, 1, 1)
+	Estimates["AWS::CustomerProfiles::CalculatedAttributeDefinition"] = NewResourceEstimate("AWS::CustomerProfiles::CalculatedAttributeDefinition", 1, 1, 1)
+	Estimates["AWS::CustomerProfiles::Domain"] = NewResourceEstimate("AWS::CustomerProfiles::Domain", 1, 1, 1)
+	Estimates["AWS::CustomerProfiles::EventStream"] = NewResourceEstimate("AWS::CustomerProfiles::EventStream", 2, 2, 1)
+	Estimates["AWS::CustomerProfiles::Integration"] = NewResourceEstimate("AWS::CustomerProfiles::Integration", 2, 2, 1)
+	Estimates["AWS::CustomerProfiles::ObjectType"] = NewResourceEstimate("AWS::CustomerProfiles::ObjectType", 1, 1, 1)
+	Estimates["AWS::DAX::Cluster"] = NewResourceEstimate("AWS::DAX::Cluster", 485, 0, 1)
+	Estimates["AWS::DAX::ParameterGroup"] = NewResourceEstimate("AWS::DAX::ParameterGroup", 2, 1, 1)
+	Estimates["AWS::DAX::SubnetGroup"] = NewResourceEstimate("AWS::DAX::SubnetGroup", 2, 0, 1)
+	Estimates["AWS::DLM::LifecyclePolicy"] = NewResourceEstimate("AWS::DLM::LifecyclePolicy", 1, 0, 1)
+	Estimates["AWS::DMS::Certificate"] = NewResourceEstimate("AWS::DMS::Certificate", 1, 1, 1)
+	Estimates["AWS::DMS::DataProvider"] = NewResourceEstimate("AWS::DMS::DataProvider", 2, 1, 1)
+	Estimates["AWS::DMS::Endpoint"] = NewResourceEstimate("AWS::DMS::Endpoint", 7, 12, 1)
+	Estimates["AWS::DMS::EventSubscription"] = NewResourceEstimate("AWS::DMS::EventSubscription", 20, 0, 1)
+	Estimates["AWS::DMS::InstanceProfile"] = NewResourceEstimate("AWS::DMS::InstanceProfile", 2, 1, 1)
+	Estimates["AWS::DMS::MigrationProject"] = NewResourceEstimate("AWS::DMS::MigrationProject", 3, 1, 1)
+	Estimates["AWS::DMS::ReplicationConfig"] = NewResourceEstimate("AWS::DMS::ReplicationConfig", 1, 1, 1)
+	Estimates["AWS::DMS::ReplicationInstance"] = NewResourceEstimate("AWS::DMS::ReplicationInstance", 778, 0, 1)
+	Estimates["AWS::DMS::ReplicationSubnetGroup"] = NewResourceEstimate("AWS::DMS::ReplicationSubnetGroup", 2, 19, 1)
+	Estimates["AWS::DMS::ReplicationTask"] = NewResourceEstimate("AWS::DMS::ReplicationTask", 54, 23, 1)
+	Estimates["AWS::DataBrew::Dataset"] = NewResourceEstimate("AWS::DataBrew::Dataset", 1, 1, 1)
+	Estimates["AWS::DataBrew::Job"] = NewResourceEstimate("AWS::DataBrew::Job", 2, 1, 1)
+	Estimates["AWS::DataBrew::Project"] = NewResourceEstimate("AWS::DataBrew::Project", 2, 1, 1)
+	Estimates["AWS::DataBrew::Recipe"] = NewResourceEstimate("AWS::DataBrew::Recipe", 2, 1, 1)
+	Estimates["AWS::DataBrew::Ruleset"] = NewResourceEstimate("AWS::DataBrew::Ruleset", 1, 1, 1)
+	Estimates["AWS::DataBrew::Schedule"] = NewResourceEstimate("AWS::DataBrew::Schedule", 2, 1, 1)
+	Estimates["AWS::DataPipeline::Pipeline"] = NewResourceEstimate("AWS::DataPipeline::Pipeline", 3, 4, 1)
+	Estimates["AWS::DataSync::Agent"] = NewResourceEstimate("AWS::DataSync::Agent", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationAzureBlob"] = NewResourceEstimate("AWS::DataSync::LocationAzureBlob", 6, 2, 1)
+	Estimates["AWS::DataSync::LocationEFS"] = NewResourceEstimate("AWS::DataSync::LocationEFS", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationFSxLustre"] = NewResourceEstimate("AWS::DataSync::LocationFSxLustre", 6, 2, 1)
+	Estimates["AWS::DataSync::LocationFSxONTAP"] = NewResourceEstimate("AWS::DataSync::LocationFSxONTAP", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationFSxOpenZFS"] = NewResourceEstimate("AWS::DataSync::LocationFSxOpenZFS", 6, 2, 1)
+	Estimates["AWS::DataSync::LocationFSxWindows"] = NewResourceEstimate("AWS::DataSync::LocationFSxWindows", 6, 2, 1)
+	Estimates["AWS::DataSync::LocationHDFS"] = NewResourceEstimate("AWS::DataSync::LocationHDFS", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationNFS"] = NewResourceEstimate("AWS::DataSync::LocationNFS", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationObjectStorage"] = NewResourceEstimate("AWS::DataSync::LocationObjectStorage", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationS3"] = NewResourceEstimate("AWS::DataSync::LocationS3", 5, 2, 1)
+	Estimates["AWS::DataSync::LocationSMB"] = NewResourceEstimate("AWS::DataSync::LocationSMB", 6, 2, 1)
+	Estimates["AWS::DataSync::StorageSystem"] = NewResourceEstimate("AWS::DataSync::StorageSystem", 6, 2, 1)
+	Estimates["AWS::DataSync::Task"] = NewResourceEstimate("AWS::DataSync::Task", 4, 2, 1)
+	Estimates["AWS::DeadlineCloud::Fleet"] = NewResourceEstimate("AWS::DeadlineCloud::Fleet", 1, 71, 1)
+	Estimates["AWS::DeadlineCloud::Queue"] = NewResourceEstimate("AWS::DeadlineCloud::Queue", 3, 1, 1)
+	Estimates["AWS::Detective::Graph"] = NewResourceEstimate("AWS::Detective::Graph", 18, 2, 1)
+	Estimates["AWS::Detective::MemberInvitation"] = NewResourceEstimate("AWS::Detective::MemberInvitation", 32, 1, 1)
+	Estimates["AWS::Detective::OrganizationAdmin"] = NewResourceEstimate("AWS::Detective::OrganizationAdmin", 5, 1, 1)
+	Estimates["AWS::DevOpsGuru::LogAnomalyDetectionIntegration"] = NewResourceEstimate("AWS::DevOpsGuru::LogAnomalyDetectionIntegration", 2, 1, 1)
+	Estimates["AWS::DevOpsGuru::NotificationChannel"] = NewResourceEstimate("AWS::DevOpsGuru::NotificationChannel", 2, 1, 1)
+	Estimates["AWS::DevOpsGuru::ResourceCollection"] = NewResourceEstimate("AWS::DevOpsGuru::ResourceCollection", 2, 1, 1)
+	Estimates["AWS::DeviceFarm::DevicePool"] = NewResourceEstimate("AWS::DeviceFarm::DevicePool", 7, 3, 1)
+	Estimates["AWS::DeviceFarm::InstanceProfile"] = NewResourceEstimate("AWS::DeviceFarm::InstanceProfile", 6, 2, 1)
+	Estimates["AWS::DeviceFarm::NetworkProfile"] = NewResourceEstimate("AWS::DeviceFarm::NetworkProfile", 6, 2, 1)
+	Estimates["AWS::DeviceFarm::Project"] = NewResourceEstimate("AWS::DeviceFarm::Project", 5, 2, 1)
+	Estimates["AWS::DeviceFarm::TestGridProject"] = NewResourceEstimate("AWS::DeviceFarm::TestGridProject", 7, 2, 1)
+	Estimates["AWS::DeviceFarm::VPCEConfiguration"] = NewResourceEstimate("AWS::DeviceFarm::VPCEConfiguration", 6, 2, 1)
+	Estimates["AWS::DirectoryService::MicrosoftAD"] = NewResourceEstimate("AWS::DirectoryService::MicrosoftAD", 1698, 1, 1)
+	Estimates["AWS::DirectoryService::SimpleAD"] = NewResourceEstimate("AWS::DirectoryService::SimpleAD", 435, 2, 1)
+	Estimates["AWS::DocDB::DBCluster"] = NewResourceEstimate("AWS::DocDB::DBCluster", 68, 1, 1)
+	Estimates["AWS::DocDB::DBClusterParameterGroup"] = NewResourceEstimate("AWS::DocDB::DBClusterParameterGroup", 3, 2, 1)
+	Estimates["AWS::DocDB::DBInstance"] = NewResourceEstimate("AWS::DocDB::DBInstance", 298, 2, 1)
+	Estimates["AWS::DocDB::DBSubnetGroup"] = NewResourceEstimate("AWS::DocDB::DBSubnetGroup", 3, 2, 1)
+	Estimates["AWS::DocDB::EventSubscription"] = NewResourceEstimate("AWS::DocDB::EventSubscription", 2, 1, 1)
+	Estimates["AWS::DocDBElastic::Cluster"] = NewResourceEstimate("AWS::DocDBElastic::Cluster", 1299, 193, 1)
+	Estimates["AWS::DynamoDB::GlobalTable"] = NewResourceEstimate("AWS::DynamoDB::GlobalTable", 64, 13, 1)
+	Estimates["AWS::DynamoDB::Table"] = NewResourceEstimate("AWS::DynamoDB::Table", 15, 10, 1)
+	Estimates["AWS::EC2::CapacityReservation"] = NewResourceEstimate("AWS::EC2::CapacityReservation", 2, 2, 1)
+	Estimates["AWS::EC2::CapacityReservationFleet"] = NewResourceEstimate("AWS::EC2::CapacityReservationFleet", 33, 135, 1)
+	Estimates["AWS::EC2::CarrierGateway"] = NewResourceEstimate("AWS::EC2::CarrierGateway", 4, 4, 1)
+	Estimates["AWS::EC2::ClientVpnAuthorizationRule"] = NewResourceEstimate("AWS::EC2::ClientVpnAuthorizationRule", 240, 0, 1)
+	Estimates["AWS::EC2::ClientVpnEndpoint"] = NewResourceEstimate("AWS::EC2::ClientVpnEndpoint", 3, 2, 1)
+	Estimates["AWS::EC2::ClientVpnRoute"] = NewResourceEstimate("AWS::EC2::ClientVpnRoute", 37, 1, 1)
+	Estimates["AWS::EC2::ClientVpnTargetNetworkAssociation"] = NewResourceEstimate("AWS::EC2::ClientVpnTargetNetworkAssociation", 463, 0, 1)
+	Estimates["AWS::EC2::CoipCidr"] = NewResourceEstimate("AWS::EC2::CoipCidr", 4, 1, 1)
+	Estimates["AWS::EC2::CoipPool"] = NewResourceEstimate("AWS::EC2::CoipPool", 4, 4, 1)
+	Estimates["AWS::EC2::CustomerGateway"] = NewResourceEstimate("AWS::EC2::CustomerGateway", 17, 2, 1)
+	Estimates["AWS::EC2::DHCPOptions"] = NewResourceEstimate("AWS::EC2::DHCPOptions", 7, 7, 1)
+	Estimates["AWS::EC2::EC2Fleet"] = NewResourceEstimate("AWS::EC2::EC2Fleet", 3, 57, 1)
+	Estimates["AWS::EC2::EIP"] = NewResourceEstimate("AWS::EC2::EIP", 17, 2, 1)
+	Estimates["AWS::EC2::EIPAssociation"] = NewResourceEstimate("AWS::EC2::EIPAssociation", 5, 1, 1)
+	Estimates["AWS::EC2::EgressOnlyInternetGateway"] = NewResourceEstimate("AWS::EC2::EgressOnlyInternetGateway", 17, 1, 1)
+	Estimates["AWS::EC2::FlowLog"] = NewResourceEstimate("AWS::EC2::FlowLog", 2, 2, 1)
+	Estimates["AWS::EC2::GatewayRouteTableAssociation"] = NewResourceEstimate("AWS::EC2::GatewayRouteTableAssociation", 6, 6, 1)
+	Estimates["AWS::EC2::Host"] = NewResourceEstimate("AWS::EC2::Host", 17, 2, 1)
+	Estimates["AWS::EC2::IPAM"] = NewResourceEstimate("AWS::EC2::IPAM", 2, 2, 1)
+	Estimates["AWS::EC2::IPAMAllocation"] = NewResourceEstimate("AWS::EC2::IPAMAllocation", 1, 1, 1)
+	Estimates["AWS::EC2::IPAMPool"] = NewResourceEstimate("AWS::EC2::IPAMPool", 18, 28, 1)
+	Estimates["AWS::EC2::IPAMPoolCidr"] = NewResourceEstimate("AWS::EC2::IPAMPoolCidr", 10, 1, 1)
+	Estimates["AWS::EC2::IPAMResourceDiscovery"] = NewResourceEstimate("AWS::EC2::IPAMResourceDiscovery", 2, 1, 1)
+	Estimates["AWS::EC2::IPAMResourceDiscoveryAssociation"] = NewResourceEstimate("AWS::EC2::IPAMResourceDiscoveryAssociation", 2, 1, 1)
+	Estimates["AWS::EC2::IPAMScope"] = NewResourceEstimate("AWS::EC2::IPAMScope", 2, 1, 1)
+	Estimates["AWS::EC2::Instance"] = NewResourceEstimate("AWS::EC2::Instance", 16, 16, 1)
+	Estimates["AWS::EC2::InstanceConnectEndpoint"] = NewResourceEstimate("AWS::EC2::InstanceConnectEndpoint", 316, 2, 1)
+	Estimates["AWS::EC2::InternetGateway"] = NewResourceEstimate("AWS::EC2::InternetGateway", 17, 16, 1)
+	Estimates["AWS::EC2::IpPoolRouteTableAssociation"] = NewResourceEstimate("AWS::EC2::IpPoolRouteTableAssociation", 6, 1, 1)
+	Estimates["AWS::EC2::KeyPair"] = NewResourceEstimate("AWS::EC2::KeyPair", 1, 0, 1)
+	Estimates["AWS::EC2::LaunchTemplate"] = NewResourceEstimate("AWS::EC2::LaunchTemplate", 6, 5, 1)
+	Estimates["AWS::EC2::LocalGatewayRoute"] = NewResourceEstimate("AWS::EC2::LocalGatewayRoute", 2, 2, 1)
+	Estimates["AWS::EC2::LocalGatewayRouteTable"] = NewResourceEstimate("AWS::EC2::LocalGatewayRouteTable", 4, 4, 1)
+	Estimates["AWS::EC2::LocalGatewayRouteTableVPCAssociation"] = NewResourceEstimate("AWS::EC2::LocalGatewayRouteTableVPCAssociation", 4, 4, 1)
+	Estimates["AWS::EC2::LocalGatewayRouteTableVirtualInterfaceGroupAssociation"] = NewResourceEstimate("AWS::EC2::LocalGatewayRouteTableVirtualInterfaceGroupAssociation", 4, 4, 1)
+	Estimates["AWS::EC2::NatGateway"] = NewResourceEstimate("AWS::EC2::NatGateway", 106, 5, 1)
+	Estimates["AWS::EC2::NetworkAcl"] = NewResourceEstimate("AWS::EC2::NetworkAcl", 17, 16, 1)
+	Estimates["AWS::EC2::NetworkAclEntry"] = NewResourceEstimate("AWS::EC2::NetworkAclEntry", 3, 1, 1)
+	Estimates["AWS::EC2::NetworkInsightsAccessScope"] = NewResourceEstimate("AWS::EC2::NetworkInsightsAccessScope", 2, 2, 1)
+	Estimates["AWS::EC2::NetworkInsightsAccessScopeAnalysis"] = NewResourceEstimate("AWS::EC2::NetworkInsightsAccessScopeAnalysis", 63, 2, 1)
+	Estimates["AWS::EC2::NetworkInsightsAnalysis"] = NewResourceEstimate("AWS::EC2::NetworkInsightsAnalysis", 23, 2, 1)
+	Estimates["AWS::EC2::NetworkInsightsPath"] = NewResourceEstimate("AWS::EC2::NetworkInsightsPath", 1, 2, 1)
+	Estimates["AWS::EC2::NetworkInterface"] = NewResourceEstimate("AWS::EC2::NetworkInterface", 12, 2, 1)
+	Estimates["AWS::EC2::NetworkInterfaceAttachment"] = NewResourceEstimate("AWS::EC2::NetworkInterfaceAttachment", 12, 11, 1)
+	Estimates["AWS::EC2::NetworkInterfacePermission"] = NewResourceEstimate("AWS::EC2::NetworkInterfacePermission", 16, 1, 1)
+	Estimates["AWS::EC2::NetworkPerformanceMetricSubscription"] = NewResourceEstimate("AWS::EC2::NetworkPerformanceMetricSubscription", 1, 1, 1)
+	Estimates["AWS::EC2::PlacementGroup"] = NewResourceEstimate("AWS::EC2::PlacementGroup", 17, 0, 1)
+	Estimates["AWS::EC2::PrefixList"] = NewResourceEstimate("AWS::EC2::PrefixList", 6, 5, 1)
+	Estimates["AWS::EC2::Route"] = NewResourceEstimate("AWS::EC2::Route", 2, 0, 1)
+	Estimates["AWS::EC2::RouteTable"] = NewResourceEstimate("AWS::EC2::RouteTable", 12, 11, 1)
+	Estimates["AWS::EC2::SecurityGroup"] = NewResourceEstimate("AWS::EC2::SecurityGroup", 6, 2, 1)
+	Estimates["AWS::EC2::SecurityGroupEgress"] = NewResourceEstimate("AWS::EC2::SecurityGroupEgress", 3, 1, 1)
+	Estimates["AWS::EC2::SecurityGroupIngress"] = NewResourceEstimate("AWS::EC2::SecurityGroupIngress", 2, 1, 1)
+	Estimates["AWS::EC2::SpotFleet"] = NewResourceEstimate("AWS::EC2::SpotFleet", 4, 64, 1)
+	Estimates["AWS::EC2::Subnet"] = NewResourceEstimate("AWS::EC2::Subnet", 4, 10, 1)
+	Estimates["AWS::EC2::SubnetCidrBlock"] = NewResourceEstimate("AWS::EC2::SubnetCidrBlock", 2, 1, 1)
+	Estimates["AWS::EC2::SubnetNetworkAclAssociation"] = NewResourceEstimate("AWS::EC2::SubnetNetworkAclAssociation", 13, 1, 1)
+	Estimates["AWS::EC2::SubnetRouteTableAssociation"] = NewResourceEstimate("AWS::EC2::SubnetRouteTableAssociation", 2, 0, 1)
+	Estimates["AWS::EC2::TrafficMirrorFilter"] = NewResourceEstimate("AWS::EC2::TrafficMirrorFilter", 2, 5, 1)
+	Estimates["AWS::EC2::TrafficMirrorFilterRule"] = NewResourceEstimate("AWS::EC2::TrafficMirrorFilterRule", 1, 3, 1)
+	Estimates["AWS::EC2::TrafficMirrorSession"] = NewResourceEstimate("AWS::EC2::TrafficMirrorSession", 2, 3, 1)
+	Estimates["AWS::EC2::TrafficMirrorTarget"] = NewResourceEstimate("AWS::EC2::TrafficMirrorTarget", 2, 6, 1)
+	Estimates["AWS::EC2::TransitGateway"] = NewResourceEstimate("AWS::EC2::TransitGateway", 53, 2, 1)
+	Estimates["AWS::EC2::TransitGatewayAttachment"] = NewResourceEstimate("AWS::EC2::TransitGatewayAttachment", 50, 29, 1)
+	Estimates["AWS::EC2::TransitGatewayConnect"] = NewResourceEstimate("AWS::EC2::TransitGatewayConnect", 2, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayMulticastDomain"] = NewResourceEstimate("AWS::EC2::TransitGatewayMulticastDomain", 17, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayMulticastDomainAssociation"] = NewResourceEstimate("AWS::EC2::TransitGatewayMulticastDomainAssociation", 18, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayMulticastGroupMember"] = NewResourceEstimate("AWS::EC2::TransitGatewayMulticastGroupMember", 7, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayMulticastGroupSource"] = NewResourceEstimate("AWS::EC2::TransitGatewayMulticastGroupSource", 7, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayPeeringAttachment"] = NewResourceEstimate("AWS::EC2::TransitGatewayPeeringAttachment", 39, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayPolicyTable"] = NewResourceEstimate("AWS::EC2::TransitGatewayPolicyTable", 2, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayPolicyTableAssociation"] = NewResourceEstimate("AWS::EC2::TransitGatewayPolicyTableAssociation", 35, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayRoute"] = NewResourceEstimate("AWS::EC2::TransitGatewayRoute", 1, 0, 1)
+	Estimates["AWS::EC2::TransitGatewayRouteTable"] = NewResourceEstimate("AWS::EC2::TransitGatewayRouteTable", 8, 0, 1)
+	Estimates["AWS::EC2::TransitGatewayRouteTableAnnouncement"] = NewResourceEstimate("AWS::EC2::TransitGatewayRouteTableAnnouncement", 83, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayRouteTableAssociation"] = NewResourceEstimate("AWS::EC2::TransitGatewayRouteTableAssociation", 2, 0, 1)
+	Estimates["AWS::EC2::TransitGatewayRouteTablePropagation"] = NewResourceEstimate("AWS::EC2::TransitGatewayRouteTablePropagation", 1, 1, 1)
+	Estimates["AWS::EC2::TransitGatewayVpcAttachment"] = NewResourceEstimate("AWS::EC2::TransitGatewayVpcAttachment", 49, 4, 1)
+	Estimates["AWS::EC2::VPC"] = NewResourceEstimate("AWS::EC2::VPC", 12, 2, 1)
+	Estimates["AWS::EC2::VPCCidrBlock"] = NewResourceEstimate("AWS::EC2::VPCCidrBlock", 23, 1, 1)
+	Estimates["AWS::EC2::VPCDHCPOptionsAssociation"] = NewResourceEstimate("AWS::EC2::VPCDHCPOptionsAssociation", 1, 4, 1)
+	Estimates["AWS::EC2::VPCEndpoint"] = NewResourceEstimate("AWS::EC2::VPCEndpoint", 47, 11, 1)
+	Estimates["AWS::EC2::VPCEndpointConnectionNotification"] = NewResourceEstimate("AWS::EC2::VPCEndpointConnectionNotification", 3, 1, 1)
+	Estimates["AWS::EC2::VPCEndpointService"] = NewResourceEstimate("AWS::EC2::VPCEndpointService", 6, 0, 1)
+	Estimates["AWS::EC2::VPCEndpointServicePermissions"] = NewResourceEstimate("AWS::EC2::VPCEndpointServicePermissions", 3, 3, 1)
+	Estimates["AWS::EC2::VPCGatewayAttachment"] = NewResourceEstimate("AWS::EC2::VPCGatewayAttachment", 12, 11, 1)
+	Estimates["AWS::EC2::VPCPeeringConnection"] = NewResourceEstimate("AWS::EC2::VPCPeeringConnection", 10, 1, 1)
+	Estimates["AWS::EC2::VPNConnection"] = NewResourceEstimate("AWS::EC2::VPNConnection", 165, 2, 1)
+	Estimates["AWS::EC2::VPNConnectionRoute"] = NewResourceEstimate("AWS::EC2::VPNConnectionRoute", 18, 1, 1)
+	Estimates["AWS::EC2::VPNGateway"] = NewResourceEstimate("AWS::EC2::VPNGateway", 7, 2, 1)
+	Estimates["AWS::EC2::VPNGatewayRoutePropagation"] = NewResourceEstimate("AWS::EC2::VPNGatewayRoutePropagation", 18, 18, 1)
+	Estimates["AWS::EC2::VerifiedAccessEndpoint"] = NewResourceEstimate("AWS::EC2::VerifiedAccessEndpoint", 783, 303, 1)
+	Estimates["AWS::EC2::VerifiedAccessGroup"] = NewResourceEstimate("AWS::EC2::VerifiedAccessGroup", 2, 2, 1)
+	Estimates["AWS::EC2::VerifiedAccessInstance"] = NewResourceEstimate("AWS::EC2::VerifiedAccessInstance", 2, 3, 1)
+	Estimates["AWS::EC2::VerifiedAccessTrustProvider"] = NewResourceEstimate("AWS::EC2::VerifiedAccessTrustProvider", 2, 2, 1)
+	Estimates["AWS::EC2::Volume"] = NewResourceEstimate("AWS::EC2::Volume", 7, 7, 1)
+	Estimates["AWS::EC2::VolumeAttachment"] = NewResourceEstimate("AWS::EC2::VolumeAttachment", 7, 0, 1)
+	Estimates["AWS::ECR::PublicRepository"] = NewResourceEstimate("AWS::ECR::PublicRepository", 2, 2, 1)
+	Estimates["AWS::ECR::PullThroughCacheRule"] = NewResourceEstimate("AWS::ECR::PullThroughCacheRule", 1, 1, 1)
+	Estimates["AWS::ECR::RegistryPolicy"] = NewResourceEstimate("AWS::ECR::RegistryPolicy", 1, 1, 1)
+	Estimates["AWS::ECR::ReplicationConfiguration"] = NewResourceEstimate("AWS::ECR::ReplicationConfiguration", 1, 1, 1)
+	Estimates["AWS::ECR::Repository"] = NewResourceEstimate("AWS::ECR::Repository", 1, 2, 1)
+	Estimates["AWS::ECS::CapacityProvider"] = NewResourceEstimate("AWS::ECS::CapacityProvider", 2, 1, 1)
+	Estimates["AWS::ECS::Cluster"] = NewResourceEstimate("AWS::ECS::Cluster", 5, 2, 1)
+	Estimates["AWS::ECS::ClusterCapacityProviderAssociations"] = NewResourceEstimate("AWS::ECS::ClusterCapacityProviderAssociations", 13, 31, 1)
+	Estimates["AWS::ECS::PrimaryTaskSet"] = NewResourceEstimate("AWS::ECS::PrimaryTaskSet", 6, 6, 1)
+	Estimates["AWS::ECS::Service"] = NewResourceEstimate("AWS::ECS::Service", 119, 71, 1)
+	Estimates["AWS::ECS::TaskDefinition"] = NewResourceEstimate("AWS::ECS::TaskDefinition", 4, 2, 1)
+	Estimates["AWS::ECS::TaskSet"] = NewResourceEstimate("AWS::ECS::TaskSet", 62, 5, 1)
+	Estimates["AWS::EFS::AccessPoint"] = NewResourceEstimate("AWS::EFS::AccessPoint", 5, 2, 1)
+	Estimates["AWS::EFS::FileSystem"] = NewResourceEstimate("AWS::EFS::FileSystem", 5, 5, 1)
+	Estimates["AWS::EFS::MountTarget"] = NewResourceEstimate("AWS::EFS::MountTarget", 93, 0, 1)
+	Estimates["AWS::EKS::Addon"] = NewResourceEstimate("AWS::EKS::Addon", 15, 9, 1)
+	Estimates["AWS::EKS::Cluster"] = NewResourceEstimate("AWS::EKS::Cluster", 544, 285, 1)
+	Estimates["AWS::EKS::FargateProfile"] = NewResourceEstimate("AWS::EKS::FargateProfile", 18, 2, 1)
+	Estimates["AWS::EKS::IdentityProviderConfig"] = NewResourceEstimate("AWS::EKS::IdentityProviderConfig", 433, 2, 1)
+	Estimates["AWS::EKS::Nodegroup"] = NewResourceEstimate("AWS::EKS::Nodegroup", 160, 671, 1)
+	Estimates["AWS::EMR::Cluster"] = NewResourceEstimate("AWS::EMR::Cluster", 503, 11, 1)
+	Estimates["AWS::EMR::InstanceFleetConfig"] = NewResourceEstimate("AWS::EMR::InstanceFleetConfig", 308, 1, 1)
+	Estimates["AWS::EMR::InstanceGroupConfig"] = NewResourceEstimate("AWS::EMR::InstanceGroupConfig", 192, 0, 1)
+	Estimates["AWS::EMR::SecurityConfiguration"] = NewResourceEstimate("AWS::EMR::SecurityConfiguration", 1, 0, 1)
+	Estimates["AWS::EMR::Step"] = NewResourceEstimate("AWS::EMR::Step", 7, 1, 1)
+	Estimates["AWS::EMR::Studio"] = NewResourceEstimate("AWS::EMR::Studio", 2, 2, 1)
+	Estimates["AWS::EMR::StudioSessionMapping"] = NewResourceEstimate("AWS::EMR::StudioSessionMapping", 2, 2, 1)
+	Estimates["AWS::EMR::WALWorkspace"] = NewResourceEstimate("AWS::EMR::WALWorkspace", 1, 1, 1)
+	Estimates["AWS::EMRContainers::VirtualCluster"] = NewResourceEstimate("AWS::EMRContainers::VirtualCluster", 2, 2, 1)
+	Estimates["AWS::EMRServerless::Application"] = NewResourceEstimate("AWS::EMRServerless::Application", 2, 2, 1)
+	Estimates["AWS::ElastiCache::CacheCluster"] = NewResourceEstimate("AWS::ElastiCache::CacheCluster", 344, 113, 1)
+	Estimates["AWS::ElastiCache::GlobalReplicationGroup"] = NewResourceEstimate("AWS::ElastiCache::GlobalReplicationGroup", 119, 1, 1)
+	Estimates["AWS::ElastiCache::ParameterGroup"] = NewResourceEstimate("AWS::ElastiCache::ParameterGroup", 1, 2, 1)
+	Estimates["AWS::ElastiCache::ReplicationGroup"] = NewResourceEstimate("AWS::ElastiCache::ReplicationGroup", 712, 208, 1)
+	Estimates["AWS::ElastiCache::SecurityGroup"] = NewResourceEstimate("AWS::ElastiCache::SecurityGroup", 1, 1, 1)
+	Estimates["AWS::ElastiCache::SubnetGroup"] = NewResourceEstimate("AWS::ElastiCache::SubnetGroup", 2, 2, 1)
+	Estimates["AWS::ElastiCache::User"] = NewResourceEstimate("AWS::ElastiCache::User", 2, 1, 1)
+	Estimates["AWS::ElastiCache::UserGroup"] = NewResourceEstimate("AWS::ElastiCache::UserGroup", 42, 2, 1)
+	Estimates["AWS::ElasticBeanstalk::Application"] = NewResourceEstimate("AWS::ElasticBeanstalk::Application", 7, 1, 1)
+	Estimates["AWS::ElasticBeanstalk::ApplicationVersion"] = NewResourceEstimate("AWS::ElasticBeanstalk::ApplicationVersion", 7, 1, 1)
+	Estimates["AWS::ElasticBeanstalk::ConfigurationTemplate"] = NewResourceEstimate("AWS::ElasticBeanstalk::ConfigurationTemplate", 2, 1, 1)
+	Estimates["AWS::ElasticBeanstalk::Environment"] = NewResourceEstimate("AWS::ElasticBeanstalk::Environment", 252, 391, 1)
+	Estimates["AWS::ElasticLoadBalancing::LoadBalancer"] = NewResourceEstimate("AWS::ElasticLoadBalancing::LoadBalancer", 2, 0, 1)
+	Estimates["AWS::ElasticLoadBalancingV2::Listener"] = NewResourceEstimate("AWS::ElasticLoadBalancingV2::Listener", 2, 1, 1)
+	Estimates["AWS::ElasticLoadBalancingV2::ListenerCertificate"] = NewResourceEstimate("AWS::ElasticLoadBalancingV2::ListenerCertificate", 1, 1, 1)
+	Estimates["AWS::ElasticLoadBalancingV2::ListenerRule"] = NewResourceEstimate("AWS::ElasticLoadBalancingV2::ListenerRule", 2, 1, 1)
+	Estimates["AWS::ElasticLoadBalancingV2::LoadBalancer"] = NewResourceEstimate("AWS::ElasticLoadBalancingV2::LoadBalancer", 116, 2, 1)
+	Estimates["AWS::ElasticLoadBalancingV2::TargetGroup"] = NewResourceEstimate("AWS::ElasticLoadBalancingV2::TargetGroup", 18, 6, 1)
+	Estimates["AWS::Elasticsearch::Domain"] = NewResourceEstimate("AWS::Elasticsearch::Domain", 1070, 281, 1)
+	Estimates["AWS::EntityResolution::SchemaMapping"] = NewResourceEstimate("AWS::EntityResolution::SchemaMapping", 2, 1, 1)
+	Estimates["AWS::EventSchemas::Discoverer"] = NewResourceEstimate("AWS::EventSchemas::Discoverer", 2, 1, 1)
+	Estimates["AWS::EventSchemas::Registry"] = NewResourceEstimate("AWS::EventSchemas::Registry", 2, 2, 1)
+	Estimates["AWS::EventSchemas::RegistryPolicy"] = NewResourceEstimate("AWS::EventSchemas::RegistryPolicy", 3, 3, 1)
+	Estimates["AWS::EventSchemas::Schema"] = NewResourceEstimate("AWS::EventSchemas::Schema", 2, 3, 1)
+	Estimates["AWS::Events::ApiDestination"] = NewResourceEstimate("AWS::Events::ApiDestination", 1, 1, 1)
+	Estimates["AWS::Events::Archive"] = NewResourceEstimate("AWS::Events::Archive", 1, 2, 1)
+	Estimates["AWS::Events::Connection"] = NewResourceEstimate("AWS::Events::Connection", 2, 2, 1)
+	Estimates["AWS::Events::Endpoint"] = NewResourceEstimate("AWS::Events::Endpoint", 6, 11, 1)
+	Estimates["AWS::Events::EventBus"] = NewResourceEstimate("AWS::Events::EventBus", 1, 1, 1)
+	Estimates["AWS::Events::EventBusPolicy"] = NewResourceEstimate("AWS::Events::EventBusPolicy", 1, 1, 1)
+	Estimates["AWS::Events::Rule"] = NewResourceEstimate("AWS::Events::Rule", 62, 1, 1)
+	Estimates["AWS::Evidently::Experiment"] = NewResourceEstimate("AWS::Evidently::Experiment", 2, 2, 1)
+	Estimates["AWS::Evidently::Feature"] = NewResourceEstimate("AWS::Evidently::Feature", 2, 2, 1)
+	Estimates["AWS::Evidently::Launch"] = NewResourceEstimate("AWS::Evidently::Launch", 2, 2, 1)
+	Estimates["AWS::Evidently::Project"] = NewResourceEstimate("AWS::Evidently::Project", 2, 2, 1)
+	Estimates["AWS::Evidently::Segment"] = NewResourceEstimate("AWS::Evidently::Segment", 2, 1, 1)
+	Estimates["AWS::FIS::ExperimentTemplate"] = NewResourceEstimate("AWS::FIS::ExperimentTemplate", 2, 5, 1)
+	Estimates["AWS::FMS::NotificationChannel"] = NewResourceEstimate("AWS::FMS::NotificationChannel", 2, 6, 1)
+	Estimates["AWS::FMS::Policy"] = NewResourceEstimate("AWS::FMS::Policy", 2, 3, 1)
+	Estimates["AWS::FMS::ResourceSet"] = NewResourceEstimate("AWS::FMS::ResourceSet", 2, 2, 1)
+	Estimates["AWS::FSx::DataRepositoryAssociation"] = NewResourceEstimate("AWS::FSx::DataRepositoryAssociation", 73, 28, 1)
+	Estimates["AWS::FSx::FileSystem"] = NewResourceEstimate("AWS::FSx::FileSystem", 637, 331, 1)
+	Estimates["AWS::FSx::Snapshot"] = NewResourceEstimate("AWS::FSx::Snapshot", 62, 32, 1)
+	Estimates["AWS::FSx::StorageVirtualMachine"] = NewResourceEstimate("AWS::FSx::StorageVirtualMachine", 176, 32, 1)
+	Estimates["AWS::FSx::Volume"] = NewResourceEstimate("AWS::FSx::Volume", 65, 39, 1)
+	Estimates["AWS::Forecast::Dataset"] = NewResourceEstimate("AWS::Forecast::Dataset", 2, 1, 1)
+	Estimates["AWS::Forecast::DatasetGroup"] = NewResourceEstimate("AWS::Forecast::DatasetGroup", 1, 1, 1)
+	Estimates["AWS::FraudDetector::Detector"] = NewResourceEstimate("AWS::FraudDetector::Detector", 3, 1, 1)
+	Estimates["AWS::FraudDetector::EntityType"] = NewResourceEstimate("AWS::FraudDetector::EntityType", 3, 1, 1)
+	Estimates["AWS::FraudDetector::EventType"] = NewResourceEstimate("AWS::FraudDetector::EventType", 3, 1, 1)
+	Estimates["AWS::FraudDetector::Label"] = NewResourceEstimate("AWS::FraudDetector::Label", 3, 1, 1)
+	Estimates["AWS::FraudDetector::List"] = NewResourceEstimate("AWS::FraudDetector::List", 3, 1, 1)
+	Estimates["AWS::FraudDetector::Outcome"] = NewResourceEstimate("AWS::FraudDetector::Outcome", 3, 1, 1)
+	Estimates["AWS::FraudDetector::Variable"] = NewResourceEstimate("AWS::FraudDetector::Variable", 3, 1, 1)
+	Estimates["AWS::GameCast::Application"] = NewResourceEstimate("AWS::GameCast::Application", 16, 2, 1)
+	Estimates["AWS::GameCast::StreamGroup"] = NewResourceEstimate("AWS::GameCast::StreamGroup", 1542, 2, 1)
+	Estimates["AWS::GameLift::Alias"] = NewResourceEstimate("AWS::GameLift::Alias", 1, 1, 1)
+	Estimates["AWS::GameLift::Build"] = NewResourceEstimate("AWS::GameLift::Build", 1, 1, 1)
+	Estimates["AWS::GameLift::Fleet"] = NewResourceEstimate("AWS::GameLift::Fleet", 130, 1, 1)
+	Estimates["AWS::GameLift::GameServerGroup"] = NewResourceEstimate("AWS::GameLift::GameServerGroup", 18, 1, 1)
+	Estimates["AWS::GameLift::GameSessionQueue"] = NewResourceEstimate("AWS::GameLift::GameSessionQueue", 1, 1, 1)
+	Estimates["AWS::GameLift::Location"] = NewResourceEstimate("AWS::GameLift::Location", 1, 1, 1)
+	Estimates["AWS::GameLift::MatchmakingConfiguration"] = NewResourceEstimate("AWS::GameLift::MatchmakingConfiguration", 1, 1, 1)
+	Estimates["AWS::GameLift::MatchmakingRuleSet"] = NewResourceEstimate("AWS::GameLift::MatchmakingRuleSet", 1, 1, 1)
+	Estimates["AWS::GameLift::Script"] = NewResourceEstimate("AWS::GameLift::Script", 1, 1, 1)
+	Estimates["AWS::GammaDilithium::JobDefinition"] = NewResourceEstimate("AWS::GammaDilithium::JobDefinition", 8, 14, 1)
+	Estimates["AWS::GlobalAccelerator::Accelerator"] = NewResourceEstimate("AWS::GlobalAccelerator::Accelerator", 27, 29, 1)
+	Estimates["AWS::GlobalAccelerator::EndpointGroup"] = NewResourceEstimate("AWS::GlobalAccelerator::EndpointGroup", 46, 342, 1)
+	Estimates["AWS::GlobalAccelerator::Listener"] = NewResourceEstimate("AWS::GlobalAccelerator::Listener", 2, 31, 1)
+	Estimates["AWS::Glue::Classifier"] = NewResourceEstimate("AWS::Glue::Classifier", 1, 1, 1)
+	Estimates["AWS::Glue::Connection"] = NewResourceEstimate("AWS::Glue::Connection", 1, 0, 1)
+	Estimates["AWS::Glue::Crawler"] = NewResourceEstimate("AWS::Glue::Crawler", 2, 3, 1)
+	Estimates["AWS::Glue::CustomEntityType"] = NewResourceEstimate("AWS::Glue::CustomEntityType", 1, 1, 1)
+	Estimates["AWS::Glue::DataCatalogEncryptionSettings"] = NewResourceEstimate("AWS::Glue::DataCatalogEncryptionSettings", 2, 1, 1)
+	Estimates["AWS::Glue::DataQualityRuleset"] = NewResourceEstimate("AWS::Glue::DataQualityRuleset", 1, 1, 1)
+	Estimates["AWS::Glue::Database"] = NewResourceEstimate("AWS::Glue::Database", 1, 0, 1)
+	Estimates["AWS::Glue::DevEndpoint"] = NewResourceEstimate("AWS::Glue::DevEndpoint", 437, 1, 1)
+	Estimates["AWS::Glue::Job"] = NewResourceEstimate("AWS::Glue::Job", 3, 6, 1)
+	Estimates["AWS::Glue::MLTransform"] = NewResourceEstimate("AWS::Glue::MLTransform", 2, 1, 1)
+	Estimates["AWS::Glue::Partition"] = NewResourceEstimate("AWS::Glue::Partition", 1, 0, 1)
+	Estimates["AWS::Glue::Registry"] = NewResourceEstimate("AWS::Glue::Registry", 5, 1, 1)
+	Estimates["AWS::Glue::Schema"] = NewResourceEstimate("AWS::Glue::Schema", 6, 1, 1)
+	Estimates["AWS::Glue::SchemaVersion"] = NewResourceEstimate("AWS::Glue::SchemaVersion", 6, 1, 1)
+	Estimates["AWS::Glue::SecurityConfiguration"] = NewResourceEstimate("AWS::Glue::SecurityConfiguration", 1, 0, 1)
+	Estimates["AWS::Glue::Table"] = NewResourceEstimate("AWS::Glue::Table", 1, 1, 1)
+	Estimates["AWS::Glue::Trigger"] = NewResourceEstimate("AWS::Glue::Trigger", 1, 1, 1)
+	Estimates["AWS::Glue::Workflow"] = NewResourceEstimate("AWS::Glue::Workflow", 1, 1, 1)
+	Estimates["AWS::Grafana::Workspace"] = NewResourceEstimate("AWS::Grafana::Workspace", 467, 0, 1)
+	Estimates["AWS::Greengrass::ConnectorDefinition"] = NewResourceEstimate("AWS::Greengrass::ConnectorDefinition", 1, 3, 1)
+	Estimates["AWS::Greengrass::ConnectorDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::ConnectorDefinitionVersion", 1, 1, 1)
+	Estimates["AWS::Greengrass::CoreDefinition"] = NewResourceEstimate("AWS::Greengrass::CoreDefinition", 1, 2, 1)
+	Estimates["AWS::Greengrass::CoreDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::CoreDefinitionVersion", 1, 1, 1)
+	Estimates["AWS::Greengrass::DeviceDefinition"] = NewResourceEstimate("AWS::Greengrass::DeviceDefinition", 1, 2, 1)
+	Estimates["AWS::Greengrass::DeviceDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::DeviceDefinitionVersion", 1, 1, 1)
+	Estimates["AWS::Greengrass::FunctionDefinition"] = NewResourceEstimate("AWS::Greengrass::FunctionDefinition", 1, 2, 1)
+	Estimates["AWS::Greengrass::FunctionDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::FunctionDefinitionVersion", 2, 1, 1)
+	Estimates["AWS::Greengrass::Group"] = NewResourceEstimate("AWS::Greengrass::Group", 2, 2, 1)
+	Estimates["AWS::Greengrass::GroupVersion"] = NewResourceEstimate("AWS::Greengrass::GroupVersion", 1, 1, 1)
+	Estimates["AWS::Greengrass::LoggerDefinition"] = NewResourceEstimate("AWS::Greengrass::LoggerDefinition", 1, 2, 1)
+	Estimates["AWS::Greengrass::LoggerDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::LoggerDefinitionVersion", 1, 1, 1)
+	Estimates["AWS::Greengrass::ResourceDefinition"] = NewResourceEstimate("AWS::Greengrass::ResourceDefinition", 1, 2, 1)
+	Estimates["AWS::Greengrass::ResourceDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::ResourceDefinitionVersion", 1, 1, 1)
+	Estimates["AWS::Greengrass::SubscriptionDefinition"] = NewResourceEstimate("AWS::Greengrass::SubscriptionDefinition", 1, 2, 1)
+	Estimates["AWS::Greengrass::SubscriptionDefinitionVersion"] = NewResourceEstimate("AWS::Greengrass::SubscriptionDefinitionVersion", 1, 1, 1)
+	Estimates["AWS::GreengrassV2::ComponentVersion"] = NewResourceEstimate("AWS::GreengrassV2::ComponentVersion", 3, 2, 1)
+	Estimates["AWS::GreengrassV2::Deployment"] = NewResourceEstimate("AWS::GreengrassV2::Deployment", 2, 2, 1)
+	Estimates["AWS::GroundStation::Config"] = NewResourceEstimate("AWS::GroundStation::Config", 1, 1, 1)
+	Estimates["AWS::GroundStation::DataflowEndpointGroup"] = NewResourceEstimate("AWS::GroundStation::DataflowEndpointGroup", 36, 1, 1)
+	Estimates["AWS::GroundStation::MissionProfile"] = NewResourceEstimate("AWS::GroundStation::MissionProfile", 1, 1, 1)
+	Estimates["AWS::GuardDuty::Detector"] = NewResourceEstimate("AWS::GuardDuty::Detector", 5, 3, 1)
+	Estimates["AWS::GuardDuty::Filter"] = NewResourceEstimate("AWS::GuardDuty::Filter", 1, 2, 1)
+	Estimates["AWS::GuardDuty::IPSet"] = NewResourceEstimate("AWS::GuardDuty::IPSet", 7, 3, 1)
+	Estimates["AWS::GuardDuty::Master"] = NewResourceEstimate("AWS::GuardDuty::Master", 3, 1, 1)
+	Estimates["AWS::GuardDuty::ThreatIntelSet"] = NewResourceEstimate("AWS::GuardDuty::ThreatIntelSet", 6, 3, 1)
+	Estimates["AWS::Hawk::FalconSchedulerSubscription"] = NewResourceEstimate("AWS::Hawk::FalconSchedulerSubscription", 1, 0, 1)
+	Estimates["AWS::HealthLake::FHIRDatastore"] = NewResourceEstimate("AWS::HealthLake::FHIRDatastore", 2025, 2, 1)
+	Estimates["AWS::IAM::AccessKey"] = NewResourceEstimate("AWS::IAM::AccessKey", 1, 0, 1)
+	Estimates["AWS::IAM::Group"] = NewResourceEstimate("AWS::IAM::Group", 12, 2, 1)
+	Estimates["AWS::IAM::GroupPolicy"] = NewResourceEstimate("AWS::IAM::GroupPolicy", 32, 1, 1)
+	Estimates["AWS::IAM::InstanceProfile"] = NewResourceEstimate("AWS::IAM::InstanceProfile", 126, 0, 1)
+	Estimates["AWS::IAM::ManagedPolicy"] = NewResourceEstimate("AWS::IAM::ManagedPolicy", 16, 1, 1)
+	Estimates["AWS::IAM::OIDCProvider"] = NewResourceEstimate("AWS::IAM::OIDCProvider", 2, 3, 1)
+	Estimates["AWS::IAM::Policy"] = NewResourceEstimate("AWS::IAM::Policy", 17, 3, 1)
+	Estimates["AWS::IAM::Role"] = NewResourceEstimate("AWS::IAM::Role", 12, 17, 1)
+	Estimates["AWS::IAM::RolePolicy"] = NewResourceEstimate("AWS::IAM::RolePolicy", 32, 1, 1)
+	Estimates["AWS::IAM::SAMLProvider"] = NewResourceEstimate("AWS::IAM::SAMLProvider", 2, 1, 1)
+	Estimates["AWS::IAM::ServerCertificate"] = NewResourceEstimate("AWS::IAM::ServerCertificate", 122, 1, 1)
+	Estimates["AWS::IAM::ServiceLinkedRole"] = NewResourceEstimate("AWS::IAM::ServiceLinkedRole", 2, 0, 1)
+	Estimates["AWS::IAM::User"] = NewResourceEstimate("AWS::IAM::User", 37, 2, 1)
+	Estimates["AWS::IAM::UserPolicy"] = NewResourceEstimate("AWS::IAM::UserPolicy", 32, 0, 1)
+	Estimates["AWS::IAM::UserToGroupAddition"] = NewResourceEstimate("AWS::IAM::UserToGroupAddition", 0, 0, 1)
+	Estimates["AWS::IAM::VirtualMFADevice"] = NewResourceEstimate("AWS::IAM::VirtualMFADevice", 124, 1, 1)
+	Estimates["AWS::IVS::Channel"] = NewResourceEstimate("AWS::IVS::Channel", 1, 1, 1)
+	Estimates["AWS::IVS::PlaybackKeyPair"] = NewResourceEstimate("AWS::IVS::PlaybackKeyPair", 1, 1, 1)
+	Estimates["AWS::IVS::RecordingConfiguration"] = NewResourceEstimate("AWS::IVS::RecordingConfiguration", 7, 1, 1)
+	Estimates["AWS::IVS::StreamKey"] = NewResourceEstimate("AWS::IVS::StreamKey", 1, 1, 1)
+	Estimates["AWS::IVSChat::LoggingConfiguration"] = NewResourceEstimate("AWS::IVSChat::LoggingConfiguration", 1, 2, 1)
+	Estimates["AWS::IVSChat::Room"] = NewResourceEstimate("AWS::IVSChat::Room", 1, 1, 1)
+	Estimates["AWS::IdentityStore::Group"] = NewResourceEstimate("AWS::IdentityStore::Group", 1, 1, 1)
+	Estimates["AWS::IdentityStore::GroupMembership"] = NewResourceEstimate("AWS::IdentityStore::GroupMembership", 1, 1, 1)
+	Estimates["AWS::ImageBuilder::Component"] = NewResourceEstimate("AWS::ImageBuilder::Component", 2, 1, 1)
+	Estimates["AWS::ImageBuilder::ContainerRecipe"] = NewResourceEstimate("AWS::ImageBuilder::ContainerRecipe", 3, 1, 1)
+	Estimates["AWS::ImageBuilder::DistributionConfiguration"] = NewResourceEstimate("AWS::ImageBuilder::DistributionConfiguration", 2, 2, 1)
+	Estimates["AWS::ImageBuilder::Image"] = NewResourceEstimate("AWS::ImageBuilder::Image", 846, 1, 1)
+	Estimates["AWS::ImageBuilder::ImagePipeline"] = NewResourceEstimate("AWS::ImageBuilder::ImagePipeline", 2, 2, 1)
+	Estimates["AWS::ImageBuilder::ImageRecipe"] = NewResourceEstimate("AWS::ImageBuilder::ImageRecipe", 2, 1, 1)
+	Estimates["AWS::ImageBuilder::InfrastructureConfiguration"] = NewResourceEstimate("AWS::ImageBuilder::InfrastructureConfiguration", 2, 2, 1)
+	Estimates["AWS::Inspector::AssessmentTarget"] = NewResourceEstimate("AWS::Inspector::AssessmentTarget", 1, 1, 1)
+	Estimates["AWS::Inspector::AssessmentTemplate"] = NewResourceEstimate("AWS::Inspector::AssessmentTemplate", 1, 1, 1)
+	Estimates["AWS::Inspector::ResourceGroup"] = NewResourceEstimate("AWS::Inspector::ResourceGroup", 1, 1, 1)
+	Estimates["AWS::InspectorV2::Filter"] = NewResourceEstimate("AWS::InspectorV2::Filter", 2, 2, 1)
+	Estimates["AWS::Internal::Dummy"] = NewResourceEstimate("AWS::Internal::Dummy", 3, 1, 1)
+	Estimates["AWS::Internal::OneTimeRelease"] = NewResourceEstimate("AWS::Internal::OneTimeRelease", 7, 1, 1)
+	Estimates["AWS::InternetMonitor::Monitor"] = NewResourceEstimate("AWS::InternetMonitor::Monitor", 4, 1, 1)
+	Estimates["AWS::IoT1Click::Placement"] = NewResourceEstimate("AWS::IoT1Click::Placement", 2, 1, 1)
+	Estimates["AWS::IoT1Click::Project"] = NewResourceEstimate("AWS::IoT1Click::Project", 1, 1, 1)
+	Estimates["AWS::IoT::AccountAuditConfiguration"] = NewResourceEstimate("AWS::IoT::AccountAuditConfiguration", 2, 2, 1)
+	Estimates["AWS::IoT::Authorizer"] = NewResourceEstimate("AWS::IoT::Authorizer", 1, 1, 1)
+	Estimates["AWS::IoT::BillingGroup"] = NewResourceEstimate("AWS::IoT::BillingGroup", 1, 1, 1)
+	Estimates["AWS::IoT::CACertificate"] = NewResourceEstimate("AWS::IoT::CACertificate", 1, 1, 1)
+	Estimates["AWS::IoT::Certificate"] = NewResourceEstimate("AWS::IoT::Certificate", 1, 1, 1)
+	Estimates["AWS::IoT::CustomMetric"] = NewResourceEstimate("AWS::IoT::CustomMetric", 2, 2, 1)
+	Estimates["AWS::IoT::Dimension"] = NewResourceEstimate("AWS::IoT::Dimension", 2, 2, 1)
+	Estimates["AWS::IoT::DomainConfiguration"] = NewResourceEstimate("AWS::IoT::DomainConfiguration", 2, 1, 1)
+	Estimates["AWS::IoT::FleetMetric"] = NewResourceEstimate("AWS::IoT::FleetMetric", 1, 1, 1)
+	Estimates["AWS::IoT::JobTemplate"] = NewResourceEstimate("AWS::IoT::JobTemplate", 1, 1, 1)
+	Estimates["AWS::IoT::Logging"] = NewResourceEstimate("AWS::IoT::Logging", 1, 1, 1)
+	Estimates["AWS::IoT::MitigationAction"] = NewResourceEstimate("AWS::IoT::MitigationAction", 2, 2, 1)
+	Estimates["AWS::IoT::Policy"] = NewResourceEstimate("AWS::IoT::Policy", 1, 1, 1)
+	Estimates["AWS::IoT::PolicyPrincipalAttachment"] = NewResourceEstimate("AWS::IoT::PolicyPrincipalAttachment", 60, 1, 1)
+	Estimates["AWS::IoT::ProvisioningTemplate"] = NewResourceEstimate("AWS::IoT::ProvisioningTemplate", 1, 1, 1)
+	Estimates["AWS::IoT::ResourceSpecificLogging"] = NewResourceEstimate("AWS::IoT::ResourceSpecificLogging", 1, 1, 1)
+	Estimates["AWS::IoT::RoleAlias"] = NewResourceEstimate("AWS::IoT::RoleAlias", 1, 32, 1)
+	Estimates["AWS::IoT::ScheduledAudit"] = NewResourceEstimate("AWS::IoT::ScheduledAudit", 1, 2, 1)
+	Estimates["AWS::IoT::SecurityProfile"] = NewResourceEstimate("AWS::IoT::SecurityProfile", 2, 2, 1)
+	Estimates["AWS::IoT::Thing"] = NewResourceEstimate("AWS::IoT::Thing", 1, 1, 1)
+	Estimates["AWS::IoT::ThingGroup"] = NewResourceEstimate("AWS::IoT::ThingGroup", 2, 2, 1)
+	Estimates["AWS::IoT::ThingPrincipalAttachment"] = NewResourceEstimate("AWS::IoT::ThingPrincipalAttachment", 61, 1, 1)
+	Estimates["AWS::IoT::ThingType"] = NewResourceEstimate("AWS::IoT::ThingType", 1, 1, 1)
+	Estimates["AWS::IoT::TopicRule"] = NewResourceEstimate("AWS::IoT::TopicRule", 2, 1, 1)
+	Estimates["AWS::IoT::TopicRuleDestination"] = NewResourceEstimate("AWS::IoT::TopicRuleDestination", 1, 1, 1)
+	Estimates["AWS::IoTAnalytics::Channel"] = NewResourceEstimate("AWS::IoTAnalytics::Channel", 3, 2, 1)
+	Estimates["AWS::IoTAnalytics::Dataset"] = NewResourceEstimate("AWS::IoTAnalytics::Dataset", 2, 2, 1)
+	Estimates["AWS::IoTAnalytics::Datastore"] = NewResourceEstimate("AWS::IoTAnalytics::Datastore", 3, 2, 1)
+	Estimates["AWS::IoTAnalytics::Pipeline"] = NewResourceEstimate("AWS::IoTAnalytics::Pipeline", 2, 1, 1)
+	Estimates["AWS::IoTCoreDeviceAdvisor::SuiteDefinition"] = NewResourceEstimate("AWS::IoTCoreDeviceAdvisor::SuiteDefinition", 2, 1, 1)
+	Estimates["AWS::IoTEvents::AlarmModel"] = NewResourceEstimate("AWS::IoTEvents::AlarmModel", 11, 12, 1)
+	Estimates["AWS::IoTEvents::DetectorModel"] = NewResourceEstimate("AWS::IoTEvents::DetectorModel", 12, 14, 1)
+	Estimates["AWS::IoTEvents::Input"] = NewResourceEstimate("AWS::IoTEvents::Input", 1, 1, 1)
+	Estimates["AWS::IoTFleetHub::Application"] = NewResourceEstimate("AWS::IoTFleetHub::Application", 2, 2, 1)
+	Estimates["AWS::IoTSiteWise::AccessPolicy"] = NewResourceEstimate("AWS::IoTSiteWise::AccessPolicy", 1, 2, 1)
+	Estimates["AWS::IoTSiteWise::Asset"] = NewResourceEstimate("AWS::IoTSiteWise::Asset", 13, 9, 1)
+	Estimates["AWS::IoTSiteWise::AssetModel"] = NewResourceEstimate("AWS::IoTSiteWise::AssetModel", 11, 14, 1)
+	Estimates["AWS::IoTSiteWise::Dashboard"] = NewResourceEstimate("AWS::IoTSiteWise::Dashboard", 2, 2, 1)
+	Estimates["AWS::IoTSiteWise::Gateway"] = NewResourceEstimate("AWS::IoTSiteWise::Gateway", 3, 3, 1)
+	Estimates["AWS::IoTSiteWise::Portal"] = NewResourceEstimate("AWS::IoTSiteWise::Portal", 46, 7, 1)
+	Estimates["AWS::IoTSiteWise::Project"] = NewResourceEstimate("AWS::IoTSiteWise::Project", 2, 2, 1)
+	Estimates["AWS::IoTTwinMaker::ComponentType"] = NewResourceEstimate("AWS::IoTTwinMaker::ComponentType", 2, 2, 1)
+	Estimates["AWS::IoTTwinMaker::Entity"] = NewResourceEstimate("AWS::IoTTwinMaker::Entity", 7, 8, 1)
+	Estimates["AWS::IoTTwinMaker::Scene"] = NewResourceEstimate("AWS::IoTTwinMaker::Scene", 1, 1, 1)
+	Estimates["AWS::IoTTwinMaker::SyncJob"] = NewResourceEstimate("AWS::IoTTwinMaker::SyncJob", 1, 4, 1)
+	Estimates["AWS::IoTTwinMaker::Workspace"] = NewResourceEstimate("AWS::IoTTwinMaker::Workspace", 2, 2, 1)
+	Estimates["AWS::IoTWireless::Destination"] = NewResourceEstimate("AWS::IoTWireless::Destination", 1, 1, 1)
+	Estimates["AWS::IoTWireless::DeviceProfile"] = NewResourceEstimate("AWS::IoTWireless::DeviceProfile", 1, 1, 1)
+	Estimates["AWS::IoTWireless::FuotaTask"] = NewResourceEstimate("AWS::IoTWireless::FuotaTask", 1, 1, 1)
+	Estimates["AWS::IoTWireless::MulticastGroup"] = NewResourceEstimate("AWS::IoTWireless::MulticastGroup", 1, 1, 1)
+	Estimates["AWS::IoTWireless::NetworkAnalyzerConfiguration"] = NewResourceEstimate("AWS::IoTWireless::NetworkAnalyzerConfiguration", 1, 1, 1)
+	Estimates["AWS::IoTWireless::ServiceProfile"] = NewResourceEstimate("AWS::IoTWireless::ServiceProfile", 1, 1, 1)
+	Estimates["AWS::IoTWireless::TaskDefinition"] = NewResourceEstimate("AWS::IoTWireless::TaskDefinition", 1, 1, 1)
+	Estimates["AWS::IoTWireless::WirelessDevice"] = NewResourceEstimate("AWS::IoTWireless::WirelessDevice", 1, 1, 1)
+	Estimates["AWS::IoTWireless::WirelessGateway"] = NewResourceEstimate("AWS::IoTWireless::WirelessGateway", 1, 1, 1)
+	Estimates["AWS::KMS::Alias"] = NewResourceEstimate("AWS::KMS::Alias", 62, 13, 1)
+	Estimates["AWS::KMS::Key"] = NewResourceEstimate("AWS::KMS::Key", 122, 71, 1)
+	Estimates["AWS::KMS::ReplicaKey"] = NewResourceEstimate("AWS::KMS::ReplicaKey", 124, 54, 1)
+	Estimates["AWS::KMS::TestPrimaryMrk"] = NewResourceEstimate("AWS::KMS::TestPrimaryMrk", 123, 1, 1)
+	Estimates["AWS::KafkaConnect::Connector"] = NewResourceEstimate("AWS::KafkaConnect::Connector", 607, 632, 1)
+	Estimates["AWS::Kendra::DataSource"] = NewResourceEstimate("AWS::Kendra::DataSource", 16, 9, 1)
+	Estimates["AWS::Kendra::Faq"] = NewResourceEstimate("AWS::Kendra::Faq", 10, 1, 1)
+	Estimates["AWS::Kendra::Index"] = NewResourceEstimate("AWS::Kendra::Index", 1970, 290, 1)
+	Estimates["AWS::KendraRanking::ExecutionPlan"] = NewResourceEstimate("AWS::KendraRanking::ExecutionPlan", 491, 1, 1)
+	Estimates["AWS::Kinesis::Stream"] = NewResourceEstimate("AWS::Kinesis::Stream", 14, 29, 1)
+	Estimates["AWS::Kinesis::StreamConsumer"] = NewResourceEstimate("AWS::Kinesis::StreamConsumer", 12, 0, 1)
+	Estimates["AWS::KinesisAnalytics::Application"] = NewResourceEstimate("AWS::KinesisAnalytics::Application", 2, 1, 1)
+	Estimates["AWS::KinesisAnalytics::ApplicationOutput"] = NewResourceEstimate("AWS::KinesisAnalytics::ApplicationOutput", 2, 0, 1)
+	Estimates["AWS::KinesisAnalytics::ApplicationReferenceDataSource"] = NewResourceEstimate("AWS::KinesisAnalytics::ApplicationReferenceDataSource", 2, 1, 1)
+	Estimates["AWS::KinesisAnalyticsV2::Application"] = NewResourceEstimate("AWS::KinesisAnalyticsV2::Application", 7, 104, 1)
+	Estimates["AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption"] = NewResourceEstimate("AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption", 2, 1, 1)
+	Estimates["AWS::KinesisAnalyticsV2::ApplicationOutput"] = NewResourceEstimate("AWS::KinesisAnalyticsV2::ApplicationOutput", 2, 1, 1)
+	Estimates["AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource"] = NewResourceEstimate("AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource", 2, 1, 1)
+	Estimates["AWS::KinesisFirehose::DeliveryStream"] = NewResourceEstimate("AWS::KinesisFirehose::DeliveryStream", 77, 4, 1)
+	Estimates["AWS::KinesisVideo::SignalingChannel"] = NewResourceEstimate("AWS::KinesisVideo::SignalingChannel", 7, 7, 1)
+	Estimates["AWS::KinesisVideo::Stream"] = NewResourceEstimate("AWS::KinesisVideo::Stream", 6, 12, 1)
+	Estimates["AWS::LakeFormation::DataCellsFilter"] = NewResourceEstimate("AWS::LakeFormation::DataCellsFilter", 2, 5, 1)
+	Estimates["AWS::LakeFormation::DataLakeSettings"] = NewResourceEstimate("AWS::LakeFormation::DataLakeSettings", 1, 0, 1)
+	Estimates["AWS::LakeFormation::Permissions"] = NewResourceEstimate("AWS::LakeFormation::Permissions", 2, 0, 1)
+	Estimates["AWS::LakeFormation::PrincipalPermissions"] = NewResourceEstimate("AWS::LakeFormation::PrincipalPermissions", 3, 3, 1)
+	Estimates["AWS::LakeFormation::Resource"] = NewResourceEstimate("AWS::LakeFormation::Resource", 2, 2, 1)
+	Estimates["AWS::LakeFormation::Tag"] = NewResourceEstimate("AWS::LakeFormation::Tag", 2, 2, 1)
+	Estimates["AWS::LakeFormation::TagAssociation"] = NewResourceEstimate("AWS::LakeFormation::TagAssociation", 2, 5, 1)
+	Estimates["AWS::Lambda::Alias"] = NewResourceEstimate("AWS::Lambda::Alias", 51, 218, 1)
+	Estimates["AWS::Lambda::CodeSigningConfig"] = NewResourceEstimate("AWS::Lambda::CodeSigningConfig", 1, 2, 1)
+	Estimates["AWS::Lambda::EventInvokeConfig"] = NewResourceEstimate("AWS::Lambda::EventInvokeConfig", 2, 0, 1)
+	Estimates["AWS::Lambda::EventSourceMapping"] = NewResourceEstimate("AWS::Lambda::EventSourceMapping", 10, 1, 1)
+	Estimates["AWS::Lambda::Function"] = NewResourceEstimate("AWS::Lambda::Function", 25, 12, 1)
+	Estimates["AWS::Lambda::LayerVersion"] = NewResourceEstimate("AWS::Lambda::LayerVersion", 8, 0, 1)
+	Estimates["AWS::Lambda::LayerVersionPermission"] = NewResourceEstimate("AWS::Lambda::LayerVersionPermission", 1, 0, 1)
+	Estimates["AWS::Lambda::Permission"] = NewResourceEstimate("AWS::Lambda::Permission", 1, 0, 1)
+	Estimates["AWS::Lambda::Url"] = NewResourceEstimate("AWS::Lambda::Url", 1, 1, 1)
+	Estimates["AWS::Lambda::Version"] = NewResourceEstimate("AWS::Lambda::Version", 4, 1, 1)
+	Estimates["AWS::Lex::Bot"] = NewResourceEstimate("AWS::Lex::Bot", 25, 0, 1)
+	Estimates["AWS::Lex::BotAlias"] = NewResourceEstimate("AWS::Lex::BotAlias", 2, 2, 1)
+	Estimates["AWS::Lex::BotVersion"] = NewResourceEstimate("AWS::Lex::BotVersion", 51, 1, 1)
+	Estimates["AWS::Lex::ResourcePolicy"] = NewResourceEstimate("AWS::Lex::ResourcePolicy", 2, 1, 1)
+	Estimates["AWS::LicenseManager::Grant"] = NewResourceEstimate("AWS::LicenseManager::Grant", 2, 1, 1)
+	Estimates["AWS::LicenseManager::License"] = NewResourceEstimate("AWS::LicenseManager::License", 2, 1, 1)
+	Estimates["AWS::Lightsail::Alarm"] = NewResourceEstimate("AWS::Lightsail::Alarm", 3, 2, 1)
+	Estimates["AWS::Lightsail::Bucket"] = NewResourceEstimate("AWS::Lightsail::Bucket", 59, 28, 1)
+	Estimates["AWS::Lightsail::Certificate"] = NewResourceEstimate("AWS::Lightsail::Certificate", 7, 6, 1)
+	Estimates["AWS::Lightsail::Container"] = NewResourceEstimate("AWS::Lightsail::Container", 54, 526, 1)
+	Estimates["AWS::Lightsail::Database"] = NewResourceEstimate("AWS::Lightsail::Database", 793, 598, 1)
+	Estimates["AWS::Lightsail::Disk"] = NewResourceEstimate("AWS::Lightsail::Disk", 16, 13, 1)
+	Estimates["AWS::Lightsail::Instance"] = NewResourceEstimate("AWS::Lightsail::Instance", 86, 104, 1)
+	Estimates["AWS::Lightsail::LoadBalancer"] = NewResourceEstimate("AWS::Lightsail::LoadBalancer", 77, 142, 1)
+	Estimates["AWS::Lightsail::LoadBalancerTlsCertificate"] = NewResourceEstimate("AWS::Lightsail::LoadBalancerTlsCertificate", 37, 1, 1)
+	Estimates["AWS::Lightsail::StaticIp"] = NewResourceEstimate("AWS::Lightsail::StaticIp", 28, 10, 1)
+	Estimates["AWS::Location::GeofenceCollection"] = NewResourceEstimate("AWS::Location::GeofenceCollection", 1, 1, 1)
+	Estimates["AWS::Location::Map"] = NewResourceEstimate("AWS::Location::Map", 1, 1, 1)
+	Estimates["AWS::Location::PlaceIndex"] = NewResourceEstimate("AWS::Location::PlaceIndex", 1, 1, 1)
+	Estimates["AWS::Location::RouteCalculator"] = NewResourceEstimate("AWS::Location::RouteCalculator", 1, 1, 1)
+	Estimates["AWS::Location::Tracker"] = NewResourceEstimate("AWS::Location::Tracker", 1, 1, 1)
+	Estimates["AWS::Location::TrackerConsumer"] = NewResourceEstimate("AWS::Location::TrackerConsumer", 1, 1, 1)
+	Estimates["AWS::Logs::AccountPolicy"] = NewResourceEstimate("AWS::Logs::AccountPolicy", 1, 1, 1)
+	Estimates["AWS::Logs::Destination"] = NewResourceEstimate("AWS::Logs::Destination", 1, 1, 1)
+	Estimates["AWS::Logs::LogGroup"] = NewResourceEstimate("AWS::Logs::LogGroup", 1, 1, 1)
+	Estimates["AWS::Logs::LogStream"] = NewResourceEstimate("AWS::Logs::LogStream", 11, 0, 1)
+	Estimates["AWS::Logs::MetricFilter"] = NewResourceEstimate("AWS::Logs::MetricFilter", 2, 2, 1)
+	Estimates["AWS::Logs::QueryDefinition"] = NewResourceEstimate("AWS::Logs::QueryDefinition", 1, 1, 1)
+	Estimates["AWS::Logs::ResourcePolicy"] = NewResourceEstimate("AWS::Logs::ResourcePolicy", 1, 1, 1)
+	Estimates["AWS::Logs::SubscriptionFilter"] = NewResourceEstimate("AWS::Logs::SubscriptionFilter", 1, 1, 1)
+	Estimates["AWS::LookoutMetrics::Alert"] = NewResourceEstimate("AWS::LookoutMetrics::Alert", 1, 1, 1)
+	Estimates["AWS::LookoutMetrics::AnomalyDetector"] = NewResourceEstimate("AWS::LookoutMetrics::AnomalyDetector", 2, 2, 1)
+	Estimates["AWS::LookoutVision::Project"] = NewResourceEstimate("AWS::LookoutVision::Project", 1, 1, 1)
+	Estimates["AWS::Lotus::PackageMajorVersion"] = NewResourceEstimate("AWS::Lotus::PackageMajorVersion", 1, 1, 1)
+	Estimates["AWS::Lotus::PackageOwner"] = NewResourceEstimate("AWS::Lotus::PackageOwner", 1, 1, 1)
+	Estimates["AWS::Lotus::PackageVersion"] = NewResourceEstimate("AWS::Lotus::PackageVersion", 1, 1, 1)
+	Estimates["AWS::Lotus::RoutingConfiguration"] = NewResourceEstimate("AWS::Lotus::RoutingConfiguration", 1, 1, 1)
+	Estimates["AWS::Lotus::VersionAlias"] = NewResourceEstimate("AWS::Lotus::VersionAlias", 1, 2, 1)
+	Estimates["AWS::M2::Application"] = NewResourceEstimate("AWS::M2::Application", 7, 8, 1)
+	Estimates["AWS::M2::Environment"] = NewResourceEstimate("AWS::M2::Environment", 168, 321, 1)
+	Estimates["AWS::MSK::BatchScramSecret"] = NewResourceEstimate("AWS::MSK::BatchScramSecret", 3, 2, 1)
+	Estimates["AWS::MSK::Cluster"] = NewResourceEstimate("AWS::MSK::Cluster", 1833, 1481, 1)
+	Estimates["AWS::MSK::ClusterPolicy"] = NewResourceEstimate("AWS::MSK::ClusterPolicy", 9, 2, 1)
+	Estimates["AWS::MSK::Configuration"] = NewResourceEstimate("AWS::MSK::Configuration", 6, 2, 1)
+	Estimates["AWS::MSK::ServerlessCluster"] = NewResourceEstimate("AWS::MSK::ServerlessCluster", 138, 1, 1)
+	Estimates["AWS::MSK::VpcConnection"] = NewResourceEstimate("AWS::MSK::VpcConnection", 130, 1, 1)
+	Estimates["AWS::MWAA::Environment"] = NewResourceEstimate("AWS::MWAA::Environment", 111, 117, 1)
+	Estimates["AWS::Macie::AllowList"] = NewResourceEstimate("AWS::Macie::AllowList", 2, 1, 1)
+	Estimates["AWS::Macie::CustomDataIdentifier"] = NewResourceEstimate("AWS::Macie::CustomDataIdentifier", 1, 1, 1)
+	Estimates["AWS::Macie::Session"] = NewResourceEstimate("AWS::Macie::Session", 1, 1, 1)
+	Estimates["AWS::Maester::DocumentType"] = NewResourceEstimate("AWS::Maester::DocumentType", 1, 1, 1)
+	Estimates["AWS::ManagedFleets::Fleet"] = NewResourceEstimate("AWS::ManagedFleets::Fleet", 1, 2, 1)
+	Estimates["AWS::ManagedFleets::SubFleet"] = NewResourceEstimate("AWS::ManagedFleets::SubFleet", 2, 2, 1)
+	Estimates["AWS::MediaConnect::Bridge"] = NewResourceEstimate("AWS::MediaConnect::Bridge", 2, 1, 1)
+	Estimates["AWS::MediaConnect::BridgeOutput"] = NewResourceEstimate("AWS::MediaConnect::BridgeOutput", 2, 1, 1)
+	Estimates["AWS::MediaConnect::BridgeSource"] = NewResourceEstimate("AWS::MediaConnect::BridgeSource", 2, 1, 1)
+	Estimates["AWS::MediaConnect::Flow"] = NewResourceEstimate("AWS::MediaConnect::Flow", 2, 2, 1)
+	Estimates["AWS::MediaConnect::FlowEntitlement"] = NewResourceEstimate("AWS::MediaConnect::FlowEntitlement", 1, 1, 1)
+	Estimates["AWS::MediaConnect::FlowOutput"] = NewResourceEstimate("AWS::MediaConnect::FlowOutput", 1, 1, 1)
+	Estimates["AWS::MediaConnect::FlowSource"] = NewResourceEstimate("AWS::MediaConnect::FlowSource", 1, 1, 1)
+	Estimates["AWS::MediaConnect::FlowVpcInterface"] = NewResourceEstimate("AWS::MediaConnect::FlowVpcInterface", 2, 0, 1)
+	Estimates["AWS::MediaConnect::Gateway"] = NewResourceEstimate("AWS::MediaConnect::Gateway", 8, 1, 1)
+	Estimates["AWS::MediaConvert::JobTemplate"] = NewResourceEstimate("AWS::MediaConvert::JobTemplate", 2, 1, 1)
+	Estimates["AWS::MediaConvert::Preset"] = NewResourceEstimate("AWS::MediaConvert::Preset", 1, 1, 1)
+	Estimates["AWS::MediaConvert::Queue"] = NewResourceEstimate("AWS::MediaConvert::Queue", 5, 1, 1)
+	Estimates["AWS::MediaLive::Channel"] = NewResourceEstimate("AWS::MediaLive::Channel", 18, 22, 1)
+	Estimates["AWS::MediaLive::Input"] = NewResourceEstimate("AWS::MediaLive::Input", 6, 25, 1)
+	Estimates["AWS::MediaLive::InputSecurityGroup"] = NewResourceEstimate("AWS::MediaLive::InputSecurityGroup", 5, 1, 1)
+	Estimates["AWS::MediaPackage::Asset"] = NewResourceEstimate("AWS::MediaPackage::Asset", 2, 1, 1)
+	Estimates["AWS::MediaPackage::Channel"] = NewResourceEstimate("AWS::MediaPackage::Channel", 2, 1, 1)
+	Estimates["AWS::MediaPackage::OriginEndpoint"] = NewResourceEstimate("AWS::MediaPackage::OriginEndpoint", 5, 1, 1)
+	Estimates["AWS::MediaPackage::PackagingConfiguration"] = NewResourceEstimate("AWS::MediaPackage::PackagingConfiguration", 2, 1, 1)
+	Estimates["AWS::MediaPackage::PackagingGroup"] = NewResourceEstimate("AWS::MediaPackage::PackagingGroup", 2, 1, 1)
+	Estimates["AWS::MediaPackageV2::Channel"] = NewResourceEstimate("AWS::MediaPackageV2::Channel", 2, 1, 1)
+	Estimates["AWS::MediaPackageV2::ChannelGroup"] = NewResourceEstimate("AWS::MediaPackageV2::ChannelGroup", 2, 1, 1)
+	Estimates["AWS::MediaPackageV2::ChannelPolicy"] = NewResourceEstimate("AWS::MediaPackageV2::ChannelPolicy", 2, 1, 1)
+	Estimates["AWS::MediaPackageV2::OriginEndpoint"] = NewResourceEstimate("AWS::MediaPackageV2::OriginEndpoint", 2, 1, 1)
+	Estimates["AWS::MediaPackageV2::OriginEndpointPolicy"] = NewResourceEstimate("AWS::MediaPackageV2::OriginEndpointPolicy", 2, 1, 1)
+	Estimates["AWS::MediaStore::Container"] = NewResourceEstimate("AWS::MediaStore::Container", 36, 1, 1)
+	Estimates["AWS::MediaTailor::Channel"] = NewResourceEstimate("AWS::MediaTailor::Channel", 2, 2, 1)
+	Estimates["AWS::MediaTailor::ChannelPolicy"] = NewResourceEstimate("AWS::MediaTailor::ChannelPolicy", 1, 1, 1)
+	Estimates["AWS::MediaTailor::LiveSource"] = NewResourceEstimate("AWS::MediaTailor::LiveSource", 1, 2, 1)
+	Estimates["AWS::MediaTailor::PlaybackConfiguration"] = NewResourceEstimate("AWS::MediaTailor::PlaybackConfiguration", 1, 2, 1)
+	Estimates["AWS::MediaTailor::SourceLocation"] = NewResourceEstimate("AWS::MediaTailor::SourceLocation", 1, 2, 1)
+	Estimates["AWS::MediaTailor::VodSource"] = NewResourceEstimate("AWS::MediaTailor::VodSource", 1, 2, 1)
+	Estimates["AWS::MemoryDB::ACL"] = NewResourceEstimate("AWS::MemoryDB::ACL", 2, 53, 1)
+	Estimates["AWS::MemoryDB::Cluster"] = NewResourceEstimate("AWS::MemoryDB::Cluster", 1054, 236, 1)
+	Estimates["AWS::MemoryDB::ParameterGroup"] = NewResourceEstimate("AWS::MemoryDB::ParameterGroup", 1, 2, 1)
+	Estimates["AWS::MemoryDB::SubnetGroup"] = NewResourceEstimate("AWS::MemoryDB::SubnetGroup", 2, 2, 1)
+	Estimates["AWS::MemoryDB::User"] = NewResourceEstimate("AWS::MemoryDB::User", 2, 50, 1)
+	Estimates["AWS::Neptune::DBCluster"] = NewResourceEstimate("AWS::Neptune::DBCluster", 79, 2, 1)
+	Estimates["AWS::Neptune::DBClusterParameterGroup"] = NewResourceEstimate("AWS::Neptune::DBClusterParameterGroup", 2, 2, 1)
+	Estimates["AWS::Neptune::DBInstance"] = NewResourceEstimate("AWS::Neptune::DBInstance", 845, 528, 1)
+	Estimates["AWS::Neptune::DBParameterGroup"] = NewResourceEstimate("AWS::Neptune::DBParameterGroup", 2, 1, 1)
+	Estimates["AWS::Neptune::DBSubnetGroup"] = NewResourceEstimate("AWS::Neptune::DBSubnetGroup", 2, 2, 1)
+	Estimates["AWS::NetworkFirewall::Firewall"] = NewResourceEstimate("AWS::NetworkFirewall::Firewall", 312, 21, 1)
+	Estimates["AWS::NetworkFirewall::FirewallPolicy"] = NewResourceEstimate("AWS::NetworkFirewall::FirewallPolicy", 2, 2, 1)
+	Estimates["AWS::NetworkFirewall::LoggingConfiguration"] = NewResourceEstimate("AWS::NetworkFirewall::LoggingConfiguration", 10, 0, 1)
+	Estimates["AWS::NetworkFirewall::RuleGroup"] = NewResourceEstimate("AWS::NetworkFirewall::RuleGroup", 3, 3, 1)
+	Estimates["AWS::NetworkFirewall::TLSInspectionConfiguration"] = NewResourceEstimate("AWS::NetworkFirewall::TLSInspectionConfiguration", 2, 2, 1)
+	Estimates["AWS::NetworkManager::ConnectAttachment"] = NewResourceEstimate("AWS::NetworkManager::ConnectAttachment", 51, 2, 1)
+	Estimates["AWS::NetworkManager::ConnectPeer"] = NewResourceEstimate("AWS::NetworkManager::ConnectPeer", 213, 2, 1)
+	Estimates["AWS::NetworkManager::CoreNetwork"] = NewResourceEstimate("AWS::NetworkManager::CoreNetwork", 206, 4, 1)
+	Estimates["AWS::NetworkManager::CustomerGatewayAssociation"] = NewResourceEstimate("AWS::NetworkManager::CustomerGatewayAssociation", 2, 1, 1)
+	Estimates["AWS::NetworkManager::Device"] = NewResourceEstimate("AWS::NetworkManager::Device", 2, 2, 1)
+	Estimates["AWS::NetworkManager::GlobalNetwork"] = NewResourceEstimate("AWS::NetworkManager::GlobalNetwork", 2, 2, 1)
+	Estimates["AWS::NetworkManager::Link"] = NewResourceEstimate("AWS::NetworkManager::Link", 2, 2, 1)
+	Estimates["AWS::NetworkManager::LinkAssociation"] = NewResourceEstimate("AWS::NetworkManager::LinkAssociation", 2, 1, 1)
+	Estimates["AWS::NetworkManager::Site"] = NewResourceEstimate("AWS::NetworkManager::Site", 2, 5, 1)
+	Estimates["AWS::NetworkManager::SiteToSiteVpnAttachment"] = NewResourceEstimate("AWS::NetworkManager::SiteToSiteVpnAttachment", 287, 2, 1)
+	Estimates["AWS::NetworkManager::TransitGatewayPeering"] = NewResourceEstimate("AWS::NetworkManager::TransitGatewayPeering", 393, 2, 1)
+	Estimates["AWS::NetworkManager::TransitGatewayRegistration"] = NewResourceEstimate("AWS::NetworkManager::TransitGatewayRegistration", 32, 1, 1)
+	Estimates["AWS::NetworkManager::TransitGatewayRouteTableAttachment"] = NewResourceEstimate("AWS::NetworkManager::TransitGatewayRouteTableAttachment", 162, 2, 1)
+	Estimates["AWS::NetworkManager::VpcAttachment"] = NewResourceEstimate("AWS::NetworkManager::VpcAttachment", 109, 106, 1)
+	Estimates["AWS::NimbleStudio::LaunchProfile"] = NewResourceEstimate("AWS::NimbleStudio::LaunchProfile", 25, 8, 1)
+	Estimates["AWS::NimbleStudio::StreamingImage"] = NewResourceEstimate("AWS::NimbleStudio::StreamingImage", 4, 3, 1)
+	Estimates["AWS::NimbleStudio::Studio"] = NewResourceEstimate("AWS::NimbleStudio::Studio", 8, 7, 1)
+	Estimates["AWS::NimbleStudio::StudioComponent"] = NewResourceEstimate("AWS::NimbleStudio::StudioComponent", 8, 7, 1)
+	Estimates["AWS::OSIS::Pipeline"] = NewResourceEstimate("AWS::OSIS::Pipeline", 500, 539, 1)
+	Estimates["AWS::Oam::Link"] = NewResourceEstimate("AWS::Oam::Link", 2, 2, 1)
+	Estimates["AWS::Oam::Sink"] = NewResourceEstimate("AWS::Oam::Sink", 2, 1, 1)
+	Estimates["AWS::Omics::AnnotationStore"] = NewResourceEstimate("AWS::Omics::AnnotationStore", 243, 2, 1)
+	Estimates["AWS::Omics::ReferenceStore"] = NewResourceEstimate("AWS::Omics::ReferenceStore", 1, 1, 1)
+	Estimates["AWS::Omics::RunGroup"] = NewResourceEstimate("AWS::Omics::RunGroup", 1, 2, 1)
+	Estimates["AWS::Omics::SequenceStore"] = NewResourceEstimate("AWS::Omics::SequenceStore", 1, 1, 1)
+	Estimates["AWS::Omics::VariantStore"] = NewResourceEstimate("AWS::Omics::VariantStore", 240, 2, 1)
+	Estimates["AWS::Omics::Workflow"] = NewResourceEstimate("AWS::Omics::Workflow", 7, 1, 1)
+	Estimates["AWS::OpenSearchServerless::AccessPolicy"] = NewResourceEstimate("AWS::OpenSearchServerless::AccessPolicy", 1, 1, 1)
+	Estimates["AWS::OpenSearchServerless::Collection"] = NewResourceEstimate("AWS::OpenSearchServerless::Collection", 134, 0, 1)
+	Estimates["AWS::OpenSearchServerless::SecurityConfig"] = NewResourceEstimate("AWS::OpenSearchServerless::SecurityConfig", 1, 2, 1)
+	Estimates["AWS::OpenSearchServerless::SecurityPolicy"] = NewResourceEstimate("AWS::OpenSearchServerless::SecurityPolicy", 1, 1, 1)
+	Estimates["AWS::OpenSearchServerless::VpcEndpoint"] = NewResourceEstimate("AWS::OpenSearchServerless::VpcEndpoint", 76, 0, 1)
+	Estimates["AWS::OpenSearchService::Domain"] = NewResourceEstimate("AWS::OpenSearchService::Domain", 887, 347, 1)
+	Estimates["AWS::OpsWorks::App"] = NewResourceEstimate("AWS::OpsWorks::App", 1, 0, 1)
+	Estimates["AWS::OpsWorks::ElasticLoadBalancerAttachment"] = NewResourceEstimate("AWS::OpsWorks::ElasticLoadBalancerAttachment", 2, 0, 1)
+	Estimates["AWS::OpsWorks::Instance"] = NewResourceEstimate("AWS::OpsWorks::Instance", 119, 0, 1)
+	Estimates["AWS::OpsWorks::Layer"] = NewResourceEstimate("AWS::OpsWorks::Layer", 3, 0, 1)
+	Estimates["AWS::OpsWorks::Stack"] = NewResourceEstimate("AWS::OpsWorks::Stack", 5, 1, 1)
+	Estimates["AWS::OpsWorksCM::Server"] = NewResourceEstimate("AWS::OpsWorksCM::Server", 955, 6, 1)
+	Estimates["AWS::Organizations::Account"] = NewResourceEstimate("AWS::Organizations::Account", 16, 2, 1)
+	Estimates["AWS::Organizations::Organization"] = NewResourceEstimate("AWS::Organizations::Organization", 3, 1, 1)
+	Estimates["AWS::Organizations::OrganizationalUnit"] = NewResourceEstimate("AWS::Organizations::OrganizationalUnit", 3, 4, 1)
+	Estimates["AWS::Organizations::Policy"] = NewResourceEstimate("AWS::Organizations::Policy", 3, 4, 1)
+	Estimates["AWS::Organizations::ResourcePolicy"] = NewResourceEstimate("AWS::Organizations::ResourcePolicy", 2, 2, 1)
+	Estimates["AWS::PCAConnectorAD::Connector"] = NewResourceEstimate("AWS::PCAConnectorAD::Connector", 59, 2, 1)
+	Estimates["AWS::PCAConnectorAD::DirectoryRegistration"] = NewResourceEstimate("AWS::PCAConnectorAD::DirectoryRegistration", 4, 2, 1)
+	Estimates["AWS::PCAConnectorAD::ServicePrincipalName"] = NewResourceEstimate("AWS::PCAConnectorAD::ServicePrincipalName", 4, 1, 1)
+	Estimates["AWS::PCAConnectorAD::Template"] = NewResourceEstimate("AWS::PCAConnectorAD::Template", 6, 8, 1)
+	Estimates["AWS::PCAConnectorAD::TemplateGroupAccessControlEntry"] = NewResourceEstimate("AWS::PCAConnectorAD::TemplateGroupAccessControlEntry", 2, 1, 1)
+	Estimates["AWS::Panorama::ApplicationInstance"] = NewResourceEstimate("AWS::Panorama::ApplicationInstance", 61, 1, 1)
+	Estimates["AWS::Panorama::Package"] = NewResourceEstimate("AWS::Panorama::Package", 2, 1, 1)
+	Estimates["AWS::Panorama::PackageVersion"] = NewResourceEstimate("AWS::Panorama::PackageVersion", 8, 1, 1)
+	Estimates["AWS::Personalize::Dataset"] = NewResourceEstimate("AWS::Personalize::Dataset", 23, 197, 1)
+	Estimates["AWS::Personalize::DatasetGroup"] = NewResourceEstimate("AWS::Personalize::DatasetGroup", 19, 1, 1)
+	Estimates["AWS::Personalize::Schema"] = NewResourceEstimate("AWS::Personalize::Schema", 1, 1, 1)
+	Estimates["AWS::Personalize::Solution"] = NewResourceEstimate("AWS::Personalize::Solution", 2, 1, 1)
+	Estimates["AWS::Pinpoint::ADMChannel"] = NewResourceEstimate("AWS::Pinpoint::ADMChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::APNSChannel"] = NewResourceEstimate("AWS::Pinpoint::APNSChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::APNSSandboxChannel"] = NewResourceEstimate("AWS::Pinpoint::APNSSandboxChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::APNSVoipChannel"] = NewResourceEstimate("AWS::Pinpoint::APNSVoipChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::APNSVoipSandboxChannel"] = NewResourceEstimate("AWS::Pinpoint::APNSVoipSandboxChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::App"] = NewResourceEstimate("AWS::Pinpoint::App", 2, 1, 1)
+	Estimates["AWS::Pinpoint::ApplicationSettings"] = NewResourceEstimate("AWS::Pinpoint::ApplicationSettings", 2, 1, 1)
+	Estimates["AWS::Pinpoint::BaiduChannel"] = NewResourceEstimate("AWS::Pinpoint::BaiduChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::Campaign"] = NewResourceEstimate("AWS::Pinpoint::Campaign", 6, 1, 1)
+	Estimates["AWS::Pinpoint::EmailChannel"] = NewResourceEstimate("AWS::Pinpoint::EmailChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::EmailTemplate"] = NewResourceEstimate("AWS::Pinpoint::EmailTemplate", 2, 1, 1)
+	Estimates["AWS::Pinpoint::EventStream"] = NewResourceEstimate("AWS::Pinpoint::EventStream", 2, 1, 1)
+	Estimates["AWS::Pinpoint::GCMChannel"] = NewResourceEstimate("AWS::Pinpoint::GCMChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::InAppTemplate"] = NewResourceEstimate("AWS::Pinpoint::InAppTemplate", 1, 1, 1)
+	Estimates["AWS::Pinpoint::PushTemplate"] = NewResourceEstimate("AWS::Pinpoint::PushTemplate", 1, 2, 1)
+	Estimates["AWS::Pinpoint::SMSChannel"] = NewResourceEstimate("AWS::Pinpoint::SMSChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::Segment"] = NewResourceEstimate("AWS::Pinpoint::Segment", 2, 1, 1)
+	Estimates["AWS::Pinpoint::SmsTemplate"] = NewResourceEstimate("AWS::Pinpoint::SmsTemplate", 2, 1, 1)
+	Estimates["AWS::Pinpoint::VoiceChannel"] = NewResourceEstimate("AWS::Pinpoint::VoiceChannel", 2, 1, 1)
+	Estimates["AWS::Pinpoint::VoiceTemplate"] = NewResourceEstimate("AWS::Pinpoint::VoiceTemplate", 2, 1, 1)
+	Estimates["AWS::PinpointEmail::ConfigurationSet"] = NewResourceEstimate("AWS::PinpointEmail::ConfigurationSet", 1, 1, 1)
+	Estimates["AWS::PinpointEmail::ConfigurationSetEventDestination"] = NewResourceEstimate("AWS::PinpointEmail::ConfigurationSetEventDestination", 1, 1, 1)
+	Estimates["AWS::PinpointEmail::DedicatedIpPool"] = NewResourceEstimate("AWS::PinpointEmail::DedicatedIpPool", 1, 1, 1)
+	Estimates["AWS::PinpointSMSVoiceV2::ConfigurationSet"] = NewResourceEstimate("AWS::PinpointSMSVoiceV2::ConfigurationSet", 2, 2, 1)
+	Estimates["AWS::PinpointSMSVoiceV2::EventDestination"] = NewResourceEstimate("AWS::PinpointSMSVoiceV2::EventDestination", 1, 1, 1)
+	Estimates["AWS::PinpointSMSVoiceV2::OptOutList"] = NewResourceEstimate("AWS::PinpointSMSVoiceV2::OptOutList", 2, 2, 1)
+	Estimates["AWS::Pipes::Pipe"] = NewResourceEstimate("AWS::Pipes::Pipe", 14, 12, 1)
+	Estimates["AWS::Polaroid::Allowlist"] = NewResourceEstimate("AWS::Polaroid::Allowlist", 3, 1, 1)
+	Estimates["AWS::Proton::Environment"] = NewResourceEstimate("AWS::Proton::Environment", 32, 12, 1)
+	Estimates["AWS::Proton::EnvironmentAccountConnection"] = NewResourceEstimate("AWS::Proton::EnvironmentAccountConnection", 1, 1, 1)
+	Estimates["AWS::Proton::EnvironmentTemplate"] = NewResourceEstimate("AWS::Proton::EnvironmentTemplate", 1, 1, 1)
+	Estimates["AWS::Proton::EnvironmentTemplateVersion"] = NewResourceEstimate("AWS::Proton::EnvironmentTemplateVersion", 27, 2, 1)
+	Estimates["AWS::Proton::ServiceTemplate"] = NewResourceEstimate("AWS::Proton::ServiceTemplate", 1, 1, 1)
+	Estimates["AWS::QLDB::Ledger"] = NewResourceEstimate("AWS::QLDB::Ledger", 81, 1, 1)
+	Estimates["AWS::QLDB::Stream"] = NewResourceEstimate("AWS::QLDB::Stream", 4, 6, 1)
+	Estimates["AWS::QuickSight::Analysis"] = NewResourceEstimate("AWS::QuickSight::Analysis", 113, 129, 1)
+	Estimates["AWS::QuickSight::Dashboard"] = NewResourceEstimate("AWS::QuickSight::Dashboard", 102, 139, 1)
+	Estimates["AWS::QuickSight::DataSet"] = NewResourceEstimate("AWS::QuickSight::DataSet", 24, 32, 1)
+	Estimates["AWS::QuickSight::DataSource"] = NewResourceEstimate("AWS::QuickSight::DataSource", 22, 25, 1)
+	Estimates["AWS::QuickSight::RefreshSchedule"] = NewResourceEstimate("AWS::QuickSight::RefreshSchedule", 62, 1, 1)
+	Estimates["AWS::QuickSight::Template"] = NewResourceEstimate("AWS::QuickSight::Template", 113, 114, 1)
+	Estimates["AWS::QuickSight::Theme"] = NewResourceEstimate("AWS::QuickSight::Theme", 47, 47, 1)
+	Estimates["AWS::QuickSight::Topic"] = NewResourceEstimate("AWS::QuickSight::Topic", 67, 1, 1)
+	Estimates["AWS::QuickSight::VPCConnection"] = NewResourceEstimate("AWS::QuickSight::VPCConnection", 107, 1, 1)
+	Estimates["AWS::RAM::Permission"] = NewResourceEstimate("AWS::RAM::Permission", 2, 1, 1)
+	Estimates["AWS::RAM::ResourceShare"] = NewResourceEstimate("AWS::RAM::ResourceShare", 16, 9, 1)
+	Estimates["AWS::RDS::CustomDBEngineVersion"] = NewResourceEstimate("AWS::RDS::CustomDBEngineVersion", 3, 2, 1)
+	Estimates["AWS::RDS::DBCluster"] = NewResourceEstimate("AWS::RDS::DBCluster", 222, 62, 1)
+	Estimates["AWS::RDS::DBClusterParameterGroup"] = NewResourceEstimate("AWS::RDS::DBClusterParameterGroup", 2, 2, 1)
+	Estimates["AWS::RDS::DBInstance"] = NewResourceEstimate("AWS::RDS::DBInstance", 595, 171, 1)
+	Estimates["AWS::RDS::DBParameterGroup"] = NewResourceEstimate("AWS::RDS::DBParameterGroup", 2, 2, 1)
+	Estimates["AWS::RDS::DBProxy"] = NewResourceEstimate("AWS::RDS::DBProxy", 225, 63, 1)
+	Estimates["AWS::RDS::DBProxyEndpoint"] = NewResourceEstimate("AWS::RDS::DBProxyEndpoint", 163, 106, 1)
+	Estimates["AWS::RDS::DBProxyTargetGroup"] = NewResourceEstimate("AWS::RDS::DBProxyTargetGroup", 85, 4, 1)
+	Estimates["AWS::RDS::DBSecurityGroup"] = NewResourceEstimate("AWS::RDS::DBSecurityGroup", 2, 0, 1)
+	Estimates["AWS::RDS::DBSubnetGroup"] = NewResourceEstimate("AWS::RDS::DBSubnetGroup", 2, 2, 1)
+	Estimates["AWS::RDS::EventSubscription"] = NewResourceEstimate("AWS::RDS::EventSubscription", 2, 1, 1)
+	Estimates["AWS::RDS::GlobalCluster"] = NewResourceEstimate("AWS::RDS::GlobalCluster", 2, 2, 1)
+	Estimates["AWS::RDS::OptionGroup"] = NewResourceEstimate("AWS::RDS::OptionGroup", 1, 1, 1)
+	Estimates["AWS::RUM::AppMonitor"] = NewResourceEstimate("AWS::RUM::AppMonitor", 5, 3, 1)
+	Estimates["AWS::Rbin::Rule"] = NewResourceEstimate("AWS::Rbin::Rule", 6, 1, 1)
+	Estimates["AWS::Redshift::Cluster"] = NewResourceEstimate("AWS::Redshift::Cluster", 239, 90, 1)
+	Estimates["AWS::Redshift::ClusterParameterGroup"] = NewResourceEstimate("AWS::Redshift::ClusterParameterGroup", 5, 2, 1)
+	Estimates["AWS::Redshift::ClusterSubnetGroup"] = NewResourceEstimate("AWS::Redshift::ClusterSubnetGroup", 3, 3, 1)
+	Estimates["AWS::Redshift::EndpointAccess"] = NewResourceEstimate("AWS::Redshift::EndpointAccess", 180, 1, 1)
+	Estimates["AWS::Redshift::EndpointAuthorization"] = NewResourceEstimate("AWS::Redshift::EndpointAuthorization", 6, 1, 1)
+	Estimates["AWS::Redshift::EventSubscription"] = NewResourceEstimate("AWS::Redshift::EventSubscription", 6, 1, 1)
+	Estimates["AWS::Redshift::ScheduledAction"] = NewResourceEstimate("AWS::Redshift::ScheduledAction", 6, 1, 1)
+	Estimates["AWS::RedshiftServerless::Namespace"] = NewResourceEstimate("AWS::RedshiftServerless::Namespace", 3, 0, 1)
+	Estimates["AWS::RedshiftServerless::Workgroup"] = NewResourceEstimate("AWS::RedshiftServerless::Workgroup", 123, 1, 1)
+	Estimates["AWS::RefactorSpaces::Application"] = NewResourceEstimate("AWS::RefactorSpaces::Application", 3, 1, 1)
+	Estimates["AWS::RefactorSpaces::Environment"] = NewResourceEstimate("AWS::RefactorSpaces::Environment", 2, 1, 1)
+	Estimates["AWS::RefactorSpaces::Route"] = NewResourceEstimate("AWS::RefactorSpaces::Route", 2, 1, 1)
+	Estimates["AWS::RefactorSpaces::Service"] = NewResourceEstimate("AWS::RefactorSpaces::Service", 2, 1, 1)
+	Estimates["AWS::Rekognition::Collection"] = NewResourceEstimate("AWS::Rekognition::Collection", 67, 1, 1)
+	Estimates["AWS::Rekognition::Project"] = NewResourceEstimate("AWS::Rekognition::Project", 1, 1, 1)
+	Estimates["AWS::Rekognition::StreamProcessor"] = NewResourceEstimate("AWS::Rekognition::StreamProcessor", 1, 3, 1)
+	Estimates["AWS::ResilienceHub::App"] = NewResourceEstimate("AWS::ResilienceHub::App", 3, 2, 1)
+	Estimates["AWS::ResilienceHub::ResiliencyPolicy"] = NewResourceEstimate("AWS::ResilienceHub::ResiliencyPolicy", 3, 2, 1)
+	Estimates["AWS::ResourceExplorer2::DefaultViewAssociation"] = NewResourceEstimate("AWS::ResourceExplorer2::DefaultViewAssociation", 1, 0, 1)
+	Estimates["AWS::ResourceExplorer2::Index"] = NewResourceEstimate("AWS::ResourceExplorer2::Index", 32, 2, 1)
+	Estimates["AWS::ResourceExplorer2::View"] = NewResourceEstimate("AWS::ResourceExplorer2::View", 1, 2, 1)
+	Estimates["AWS::ResourceGroups::Group"] = NewResourceEstimate("AWS::ResourceGroups::Group", 2, 2, 1)
+	Estimates["AWS::RoboMaker::RobotApplication"] = NewResourceEstimate("AWS::RoboMaker::RobotApplication", 1, 1, 1)
+	Estimates["AWS::RoboMaker::RobotApplicationVersion"] = NewResourceEstimate("AWS::RoboMaker::RobotApplicationVersion", 2, 1, 1)
+	Estimates["AWS::RoboMaker::SimulationApplication"] = NewResourceEstimate("AWS::RoboMaker::SimulationApplication", 1, 1, 1)
+	Estimates["AWS::RoboMaker::SimulationApplicationVersion"] = NewResourceEstimate("AWS::RoboMaker::SimulationApplicationVersion", 2, 1, 1)
+	Estimates["AWS::RolesAnywhere::CRL"] = NewResourceEstimate("AWS::RolesAnywhere::CRL", 1, 2, 1)
+	Estimates["AWS::RolesAnywhere::Profile"] = NewResourceEstimate("AWS::RolesAnywhere::Profile", 1, 2, 1)
+	Estimates["AWS::RolesAnywhere::TrustAnchor"] = NewResourceEstimate("AWS::RolesAnywhere::TrustAnchor", 1, 2, 1)
+	Estimates["AWS::Route53::CidrCollection"] = NewResourceEstimate("AWS::Route53::CidrCollection", 1, 2, 1)
+	Estimates["AWS::Route53::DNSSEC"] = NewResourceEstimate("AWS::Route53::DNSSEC", 32, 1, 1)
+	Estimates["AWS::Route53::HealthCheck"] = NewResourceEstimate("AWS::Route53::HealthCheck", 2, 2, 1)
+	Estimates["AWS::Route53::HostedZone"] = NewResourceEstimate("AWS::Route53::HostedZone", 71, 16, 1)
+	Estimates["AWS::Route53::KeySigningKey"] = NewResourceEstimate("AWS::Route53::KeySigningKey", 32, 33, 1)
+	Estimates["AWS::Route53::RecordSet"] = NewResourceEstimate("AWS::Route53::RecordSet", 20, 2, 1)
+	Estimates["AWS::Route53::RecordSetGroup"] = NewResourceEstimate("AWS::Route53::RecordSetGroup", 33, 1, 1)
+	Estimates["AWS::Route53RecoveryControl::Cluster"] = NewResourceEstimate("AWS::Route53RecoveryControl::Cluster", 7, 1, 1)
+	Estimates["AWS::Route53RecoveryControl::ControlPanel"] = NewResourceEstimate("AWS::Route53RecoveryControl::ControlPanel", 12, 1, 1)
+	Estimates["AWS::Route53RecoveryControl::RoutingControl"] = NewResourceEstimate("AWS::Route53RecoveryControl::RoutingControl", 24, 1, 1)
+	Estimates["AWS::Route53RecoveryControl::SafetyRule"] = NewResourceEstimate("AWS::Route53RecoveryControl::SafetyRule", 14, 1, 1)
+	Estimates["AWS::Route53RecoveryReadiness::Cell"] = NewResourceEstimate("AWS::Route53RecoveryReadiness::Cell", 7, 1, 1)
+	Estimates["AWS::Route53RecoveryReadiness::ReadinessCheck"] = NewResourceEstimate("AWS::Route53RecoveryReadiness::ReadinessCheck", 7, 0, 1)
+	Estimates["AWS::Route53RecoveryReadiness::RecoveryGroup"] = NewResourceEstimate("AWS::Route53RecoveryReadiness::RecoveryGroup", 7, 1, 1)
+	Estimates["AWS::Route53RecoveryReadiness::ResourceSet"] = NewResourceEstimate("AWS::Route53RecoveryReadiness::ResourceSet", 7, 7, 1)
+	Estimates["AWS::Route53Resolver::FirewallDomainList"] = NewResourceEstimate("AWS::Route53Resolver::FirewallDomainList", 6, 1, 1)
+	Estimates["AWS::Route53Resolver::FirewallRuleGroup"] = NewResourceEstimate("AWS::Route53Resolver::FirewallRuleGroup", 43, 1, 1)
+	Estimates["AWS::Route53Resolver::FirewallRuleGroupAssociation"] = NewResourceEstimate("AWS::Route53Resolver::FirewallRuleGroupAssociation", 63, 1, 1)
+	Estimates["AWS::Route53Resolver::OutpostResolver"] = NewResourceEstimate("AWS::Route53Resolver::OutpostResolver", 4, 4, 1)
+	Estimates["AWS::Route53Resolver::Profile"] = NewResourceEstimate("AWS::Route53Resolver::Profile", 17, 1, 1)
+	Estimates["AWS::Route53Resolver::ProfileAssociation"] = NewResourceEstimate("AWS::Route53Resolver::ProfileAssociation", 187, 1, 1)
+	Estimates["AWS::Route53Resolver::ProfileResourceAssociation"] = NewResourceEstimate("AWS::Route53Resolver::ProfileResourceAssociation", 82, 1, 1)
+	Estimates["AWS::Route53Resolver::ResolverConfig"] = NewResourceEstimate("AWS::Route53Resolver::ResolverConfig", 185, 1, 1)
+	Estimates["AWS::Route53Resolver::ResolverDNSSECConfig"] = NewResourceEstimate("AWS::Route53Resolver::ResolverDNSSECConfig", 185, 1, 1)
+	Estimates["AWS::Route53Resolver::ResolverEndpoint"] = NewResourceEstimate("AWS::Route53Resolver::ResolverEndpoint", 40, 1, 1)
+	Estimates["AWS::Route53Resolver::ResolverQueryLoggingConfig"] = NewResourceEstimate("AWS::Route53Resolver::ResolverQueryLoggingConfig", 6, 0, 1)
+	Estimates["AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation"] = NewResourceEstimate("AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation", 10, 0, 1)
+	Estimates["AWS::Route53Resolver::ResolverRule"] = NewResourceEstimate("AWS::Route53Resolver::ResolverRule", 17, 16, 1)
+	Estimates["AWS::Route53Resolver::ResolverRuleAssociation"] = NewResourceEstimate("AWS::Route53Resolver::ResolverRuleAssociation", 97, 0, 1)
+	Estimates["AWS::S3::AccessPoint"] = NewResourceEstimate("AWS::S3::AccessPoint", 32, 2, 1)
+	Estimates["AWS::S3::Bucket"] = NewResourceEstimate("AWS::S3::Bucket", 30, 31, 1)
+	Estimates["AWS::S3::BucketPolicy"] = NewResourceEstimate("AWS::S3::BucketPolicy", 12, 12, 1)
+	Estimates["AWS::S3::MultiRegionAccessPoint"] = NewResourceEstimate("AWS::S3::MultiRegionAccessPoint", 220, 1, 1)
+	Estimates["AWS::S3::MultiRegionAccessPointPolicy"] = NewResourceEstimate("AWS::S3::MultiRegionAccessPointPolicy", 12, 15, 1)
+	Estimates["AWS::S3::StorageLens"] = NewResourceEstimate("AWS::S3::StorageLens", 2, 2, 1)
+	Estimates["AWS::S3ObjectLambda::AccessPoint"] = NewResourceEstimate("AWS::S3ObjectLambda::AccessPoint", 2, 2, 1)
+	Estimates["AWS::S3ObjectLambda::AccessPointPolicy"] = NewResourceEstimate("AWS::S3ObjectLambda::AccessPointPolicy", 1, 1, 1)
+	Estimates["AWS::S3Outposts::AccessPoint"] = NewResourceEstimate("AWS::S3Outposts::AccessPoint", 82, 2, 1)
+	Estimates["AWS::S3Outposts::Bucket"] = NewResourceEstimate("AWS::S3Outposts::Bucket", 42, 2, 1)
+	Estimates["AWS::S3Outposts::BucketPolicy"] = NewResourceEstimate("AWS::S3Outposts::BucketPolicy", 2, 2, 1)
+	Estimates["AWS::S3Outposts::Endpoint"] = NewResourceEstimate("AWS::S3Outposts::Endpoint", 253, 1, 1)
+	Estimates["AWS::SES::ConfigurationSet"] = NewResourceEstimate("AWS::SES::ConfigurationSet", 1, 0, 1)
+	Estimates["AWS::SES::ConfigurationSetEventDestination"] = NewResourceEstimate("AWS::SES::ConfigurationSetEventDestination", 11, 0, 1)
+	Estimates["AWS::SES::ContactList"] = NewResourceEstimate("AWS::SES::ContactList", 1, 1, 1)
+	Estimates["AWS::SES::DedicatedIpPool"] = NewResourceEstimate("AWS::SES::DedicatedIpPool", 11, 1, 1)
+	Estimates["AWS::SES::EmailIdentity"] = NewResourceEstimate("AWS::SES::EmailIdentity", 127, 2, 1)
+	Estimates["AWS::SES::ReceiptFilter"] = NewResourceEstimate("AWS::SES::ReceiptFilter", 1, 1, 1)
+	Estimates["AWS::SES::ReceiptRule"] = NewResourceEstimate("AWS::SES::ReceiptRule", 1, 0, 1)
+	Estimates["AWS::SES::ReceiptRuleSet"] = NewResourceEstimate("AWS::SES::ReceiptRuleSet", 1, 1, 1)
+	Estimates["AWS::SES::Template"] = NewResourceEstimate("AWS::SES::Template", 12, 1, 1)
+	Estimates["AWS::SES::VdmAttributes"] = NewResourceEstimate("AWS::SES::VdmAttributes", 11, 1, 1)
+	Estimates["AWS::SNS::Subscription"] = NewResourceEstimate("AWS::SNS::Subscription", 2, 2, 1)
+	Estimates["AWS::SNS::Topic"] = NewResourceEstimate("AWS::SNS::Topic", 4, 7, 1)
+	Estimates["AWS::SNS::TopicInlinePolicy"] = NewResourceEstimate("AWS::SNS::TopicInlinePolicy", 32, 32, 1)
+	Estimates["AWS::SNS::TopicPolicy"] = NewResourceEstimate("AWS::SNS::TopicPolicy", 1, 1, 1)
+	Estimates["AWS::SQS::Queue"] = NewResourceEstimate("AWS::SQS::Queue", 72, 2, 1)
+	Estimates["AWS::SQS::QueueInlinePolicy"] = NewResourceEstimate("AWS::SQS::QueueInlinePolicy", 32, 1, 1)
+	Estimates["AWS::SQS::QueuePolicy"] = NewResourceEstimate("AWS::SQS::QueuePolicy", 1, 0, 1)
+	Estimates["AWS::SSM::Association"] = NewResourceEstimate("AWS::SSM::Association", 2, 0, 1)
+	Estimates["AWS::SSM::Document"] = NewResourceEstimate("AWS::SSM::Document", 32, 2, 1)
+	Estimates["AWS::SSM::MaintenanceWindow"] = NewResourceEstimate("AWS::SSM::MaintenanceWindow", 1, 2, 1)
+	Estimates["AWS::SSM::MaintenanceWindowTarget"] = NewResourceEstimate("AWS::SSM::MaintenanceWindowTarget", 1, 0, 1)
+	Estimates["AWS::SSM::MaintenanceWindowTask"] = NewResourceEstimate("AWS::SSM::MaintenanceWindowTask", 1, 0, 1)
+	Estimates["AWS::SSM::OpsMetadata"] = NewResourceEstimate("AWS::SSM::OpsMetadata", 1, 1, 1)
+	Estimates["AWS::SSM::Parameter"] = NewResourceEstimate("AWS::SSM::Parameter", 1, 1, 1)
+	Estimates["AWS::SSM::PatchBaseline"] = NewResourceEstimate("AWS::SSM::PatchBaseline", 2, 2, 1)
+	Estimates["AWS::SSM::ResourceDataSync"] = NewResourceEstimate("AWS::SSM::ResourceDataSync", 4, 1, 1)
+	Estimates["AWS::SSM::ResourcePolicy"] = NewResourceEstimate("AWS::SSM::ResourcePolicy", 1, 2, 1)
+	Estimates["AWS::SSMContacts::Contact"] = NewResourceEstimate("AWS::SSMContacts::Contact", 2, 2, 1)
+	Estimates["AWS::SSMContacts::ContactChannel"] = NewResourceEstimate("AWS::SSMContacts::ContactChannel", 2, 2, 1)
+	Estimates["AWS::SSMContacts::Plan"] = NewResourceEstimate("AWS::SSMContacts::Plan", 6, 2, 1)
+	Estimates["AWS::SSMContacts::Rotation"] = NewResourceEstimate("AWS::SSMContacts::Rotation", 4, 2, 1)
+	Estimates["AWS::SSMIncidents::ReplicationSet"] = NewResourceEstimate("AWS::SSMIncidents::ReplicationSet", 101, 969, 1)
+	Estimates["AWS::SSMIncidents::ResponsePlan"] = NewResourceEstimate("AWS::SSMIncidents::ResponsePlan", 2, 3, 1)
+	Estimates["AWS::SSO::Assignment"] = NewResourceEstimate("AWS::SSO::Assignment", 15, 1, 1)
+	Estimates["AWS::SSO::InstanceAccessControlAttributeConfiguration"] = NewResourceEstimate("AWS::SSO::InstanceAccessControlAttributeConfiguration", 1, 1, 1)
+	Estimates["AWS::SSO::PermissionSet"] = NewResourceEstimate("AWS::SSO::PermissionSet", 2, 8, 1)
+	Estimates["AWS::SageMaker::App"] = NewResourceEstimate("AWS::SageMaker::App", 187, 1, 78)
+	Estimates["AWS::SageMaker::AppImageConfig"] = NewResourceEstimate("AWS::SageMaker::AppImageConfig", 1, 1, 1)
+	Estimates["AWS::SageMaker::CodeRepository"] = NewResourceEstimate("AWS::SageMaker::CodeRepository", 1, 1, 1)
+	Estimates["AWS::SageMaker::DataQualityJobDefinition"] = NewResourceEstimate("AWS::SageMaker::DataQualityJobDefinition", 2, 1, 1)
+	Estimates["AWS::SageMaker::Device"] = NewResourceEstimate("AWS::SageMaker::Device", 8, 8, 1)
+	Estimates["AWS::SageMaker::DeviceFleet"] = NewResourceEstimate("AWS::SageMaker::DeviceFleet", 8, 8, 1)
+	Estimates["AWS::SageMaker::Domain"] = NewResourceEstimate("AWS::SageMaker::Domain", 279, 1, 1)
+	Estimates["AWS::SageMaker::Endpoint"] = NewResourceEstimate("AWS::SageMaker::Endpoint", 242, 272, 1)
+	Estimates["AWS::SageMaker::EndpointConfig"] = NewResourceEstimate("AWS::SageMaker::EndpointConfig", 2, 0, 1)
+	Estimates["AWS::SageMaker::FeatureGroup"] = NewResourceEstimate("AWS::SageMaker::FeatureGroup", 27, 6, 1)
+	Estimates["AWS::SageMaker::Image"] = NewResourceEstimate("AWS::SageMaker::Image", 8, 8, 1)
+	Estimates["AWS::SageMaker::ImageVersion"] = NewResourceEstimate("AWS::SageMaker::ImageVersion", 7, 1, 1)
+	Estimates["AWS::SageMaker::InferenceExperiment"] = NewResourceEstimate("AWS::SageMaker::InferenceExperiment", 171, 184, 1)
+	Estimates["AWS::SageMaker::Model"] = NewResourceEstimate("AWS::SageMaker::Model", 2, 1, 1)
+	Estimates["AWS::SageMaker::ModelBiasJobDefinition"] = NewResourceEstimate("AWS::SageMaker::ModelBiasJobDefinition", 2, 1, 1)
+	Estimates["AWS::SageMaker::ModelCard"] = NewResourceEstimate("AWS::SageMaker::ModelCard", 6, 11, 1)
+	Estimates["AWS::SageMaker::ModelExplainabilityJobDefinition"] = NewResourceEstimate("AWS::SageMaker::ModelExplainabilityJobDefinition", 2, 1, 1)
+	Estimates["AWS::SageMaker::ModelPackage"] = NewResourceEstimate("AWS::SageMaker::ModelPackage", 258, 8, 1)
+	Estimates["AWS::SageMaker::ModelPackageGroup"] = NewResourceEstimate("AWS::SageMaker::ModelPackageGroup", 2, 2, 1)
+	Estimates["AWS::SageMaker::ModelQualityJobDefinition"] = NewResourceEstimate("AWS::SageMaker::ModelQualityJobDefinition", 2, 1, 1)
+	Estimates["AWS::SageMaker::MonitoringSchedule"] = NewResourceEstimate("AWS::SageMaker::MonitoringSchedule", 12, 12, 1)
+	Estimates["AWS::SageMaker::NotebookInstance"] = NewResourceEstimate("AWS::SageMaker::NotebookInstance", 234, 155, 1)
+	Estimates["AWS::SageMaker::NotebookInstanceLifecycleConfig"] = NewResourceEstimate("AWS::SageMaker::NotebookInstanceLifecycleConfig", 1, 1, 1)
+	Estimates["AWS::SageMaker::Pipeline"] = NewResourceEstimate("AWS::SageMaker::Pipeline", 2, 2, 1)
+	Estimates["AWS::SageMaker::Project"] = NewResourceEstimate("AWS::SageMaker::Project", 29, 1, 1)
+	Estimates["AWS::SageMaker::Space"] = NewResourceEstimate("AWS::SageMaker::Space", 7, 1, 1)
+	Estimates["AWS::SageMaker::UserProfile"] = NewResourceEstimate("AWS::SageMaker::UserProfile", 7, 1, 1)
+	Estimates["AWS::SageMaker::Workteam"] = NewResourceEstimate("AWS::SageMaker::Workteam", 2, 1, 1)
+	Estimates["AWS::Scheduler::Schedule"] = NewResourceEstimate("AWS::Scheduler::Schedule", 5, 5, 1)
+	Estimates["AWS::Scheduler::ScheduleGroup"] = NewResourceEstimate("AWS::Scheduler::ScheduleGroup", 1, 1, 1)
+	Estimates["AWS::SecretsManager::ResourcePolicy"] = NewResourceEstimate("AWS::SecretsManager::ResourcePolicy", 1, 1, 1)
+	Estimates["AWS::SecretsManager::RotationSchedule"] = NewResourceEstimate("AWS::SecretsManager::RotationSchedule", 17, 1, 1)
+	Estimates["AWS::SecretsManager::Secret"] = NewResourceEstimate("AWS::SecretsManager::Secret", 1, 2, 1)
+	Estimates["AWS::SecretsManager::SecretTargetAttachment"] = NewResourceEstimate("AWS::SecretsManager::SecretTargetAttachment", 1, 0, 1)
+	Estimates["AWS::SecurityHub::AutomationRule"] = NewResourceEstimate("AWS::SecurityHub::AutomationRule", 3, 1, 1)
+	Estimates["AWS::SecurityHub::Hub"] = NewResourceEstimate("AWS::SecurityHub::Hub", 13, 1, 1)
+	Estimates["AWS::SecurityHub::Standard"] = NewResourceEstimate("AWS::SecurityHub::Standard", 57, 8, 1)
+	Estimates["AWS::SelfServiceTest::LambdaBasedResource"] = NewResourceEstimate("AWS::SelfServiceTest::LambdaBasedResource", 1, 1, 1)
+	Estimates["AWS::ServiceCatalog::AcceptedPortfolioShare"] = NewResourceEstimate("AWS::ServiceCatalog::AcceptedPortfolioShare", 4, 1, 1)
+	Estimates["AWS::ServiceCatalog::CloudFormationProduct"] = NewResourceEstimate("AWS::ServiceCatalog::CloudFormationProduct", 11, 10, 1)
+	Estimates["AWS::ServiceCatalog::CloudFormationProvisionedProduct"] = NewResourceEstimate("AWS::ServiceCatalog::CloudFormationProvisionedProduct", 133, 73, 1)
+	Estimates["AWS::ServiceCatalog::LaunchNotificationConstraint"] = NewResourceEstimate("AWS::ServiceCatalog::LaunchNotificationConstraint", 3, 0, 1)
+	Estimates["AWS::ServiceCatalog::LaunchRoleConstraint"] = NewResourceEstimate("AWS::ServiceCatalog::LaunchRoleConstraint", 3, 0, 1)
+	Estimates["AWS::ServiceCatalog::LaunchTemplateConstraint"] = NewResourceEstimate("AWS::ServiceCatalog::LaunchTemplateConstraint", 2, 2, 1)
+	Estimates["AWS::ServiceCatalog::Portfolio"] = NewResourceEstimate("AWS::ServiceCatalog::Portfolio", 2, 2, 1)
+	Estimates["AWS::ServiceCatalog::PortfolioPrincipalAssociation"] = NewResourceEstimate("AWS::ServiceCatalog::PortfolioPrincipalAssociation", 3, 0, 1)
+	Estimates["AWS::ServiceCatalog::PortfolioProductAssociation"] = NewResourceEstimate("AWS::ServiceCatalog::PortfolioProductAssociation", 2, 0, 1)
+	Estimates["AWS::ServiceCatalog::PortfolioShare"] = NewResourceEstimate("AWS::ServiceCatalog::PortfolioShare", 2, 1, 1)
+	Estimates["AWS::ServiceCatalog::ResourceUpdateConstraint"] = NewResourceEstimate("AWS::ServiceCatalog::ResourceUpdateConstraint", 3, 0, 1)
+	Estimates["AWS::ServiceCatalog::ServiceAction"] = NewResourceEstimate("AWS::ServiceCatalog::ServiceAction", 1, 1, 1)
+	Estimates["AWS::ServiceCatalog::ServiceActionAssociation"] = NewResourceEstimate("AWS::ServiceCatalog::ServiceActionAssociation", 7, 1, 1)
+	Estimates["AWS::ServiceCatalog::StackSetConstraint"] = NewResourceEstimate("AWS::ServiceCatalog::StackSetConstraint", 1, 0, 1)
+	Estimates["AWS::ServiceCatalog::TagOption"] = NewResourceEstimate("AWS::ServiceCatalog::TagOption", 2, 0, 1)
+	Estimates["AWS::ServiceCatalog::TagOptionAssociation"] = NewResourceEstimate("AWS::ServiceCatalog::TagOptionAssociation", 3, 1, 1)
+	Estimates["AWS::ServiceCatalogAppRegistry::Application"] = NewResourceEstimate("AWS::ServiceCatalogAppRegistry::Application", 1, 2, 1)
+	Estimates["AWS::ServiceCatalogAppRegistry::AttributeGroup"] = NewResourceEstimate("AWS::ServiceCatalogAppRegistry::AttributeGroup", 2, 2, 1)
+	Estimates["AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation"] = NewResourceEstimate("AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation", 1, 1, 1)
+	Estimates["AWS::ServiceCatalogAppRegistry::ResourceAssociation"] = NewResourceEstimate("AWS::ServiceCatalogAppRegistry::ResourceAssociation", 2, 0, 1)
+	Estimates["AWS::ServiceDiscovery::HttpNamespace"] = NewResourceEstimate("AWS::ServiceDiscovery::HttpNamespace", 46, 1, 1)
+	Estimates["AWS::ServiceDiscovery::Instance"] = NewResourceEstimate("AWS::ServiceDiscovery::Instance", 10, 1, 1)
+	Estimates["AWS::ServiceDiscovery::PrivateDnsNamespace"] = NewResourceEstimate("AWS::ServiceDiscovery::PrivateDnsNamespace", 46, 12, 1)
+	Estimates["AWS::ServiceDiscovery::PublicDnsNamespace"] = NewResourceEstimate("AWS::ServiceDiscovery::PublicDnsNamespace", 46, 1, 1)
+	Estimates["AWS::ServiceDiscovery::Service"] = NewResourceEstimate("AWS::ServiceDiscovery::Service", 1, 22, 1)
+	Estimates["AWS::Shield::DRTAccess"] = NewResourceEstimate("AWS::Shield::DRTAccess", 10, 1, 1)
+	Estimates["AWS::Shield::ProactiveEngagement"] = NewResourceEstimate("AWS::Shield::ProactiveEngagement", 10, 1, 1)
+	Estimates["AWS::Shield::Protection"] = NewResourceEstimate("AWS::Shield::Protection", 7, 19, 1)
+	Estimates["AWS::Shield::ProtectionGroup"] = NewResourceEstimate("AWS::Shield::ProtectionGroup", 7, 1, 1)
+	Estimates["AWS::Signer::ProfilePermission"] = NewResourceEstimate("AWS::Signer::ProfilePermission", 1, 1, 1)
+	Estimates["AWS::Signer::SigningProfile"] = NewResourceEstimate("AWS::Signer::SigningProfile", 1, 2, 1)
+	Estimates["AWS::SimSpaceWeaver::Simulation"] = NewResourceEstimate("AWS::SimSpaceWeaver::Simulation", 221, 1, 1)
+	Estimates["AWS::StepFunctions::Activity"] = NewResourceEstimate("AWS::StepFunctions::Activity", 1, 2, 1)
+	Estimates["AWS::StepFunctions::StateMachine"] = NewResourceEstimate("AWS::StepFunctions::StateMachine", 1, 1, 1)
+	Estimates["AWS::StepFunctions::StateMachineAlias"] = NewResourceEstimate("AWS::StepFunctions::StateMachineAlias", 1, 1, 1)
+	Estimates["AWS::StepFunctions::StateMachineVersion"] = NewResourceEstimate("AWS::StepFunctions::StateMachineVersion", 1, 0, 1)
+	Estimates["AWS::Sungkkim::Test"] = NewResourceEstimate("AWS::Sungkkim::Test", 2, 1, 1)
+	Estimates["AWS::SupportApp::AccountAlias"] = NewResourceEstimate("AWS::SupportApp::AccountAlias", 7, 7, 1)
+	Estimates["AWS::SupportApp::SlackChannelConfiguration"] = NewResourceEstimate("AWS::SupportApp::SlackChannelConfiguration", 7, 7, 1)
+	Estimates["AWS::SupportApp::SlackWorkspaceConfiguration"] = NewResourceEstimate("AWS::SupportApp::SlackWorkspaceConfiguration", 7, 7, 1)
+	Estimates["AWS::Synthetics::Canary"] = NewResourceEstimate("AWS::Synthetics::Canary", 25, 28, 1)
+	Estimates["AWS::Synthetics::Group"] = NewResourceEstimate("AWS::Synthetics::Group", 1, 1, 1)
+	Estimates["AWS::SystemsManagerSAP::Application"] = NewResourceEstimate("AWS::SystemsManagerSAP::Application", 12, 1, 1)
+	Estimates["AWS::TangerineBox::Asset"] = NewResourceEstimate("AWS::TangerineBox::Asset", 3, 1, 1)
+	Estimates["AWS::TangerineBox::Console"] = NewResourceEstimate("AWS::TangerineBox::Console", 62, 113, 1)
+	Estimates["AWS::Timestream::Database"] = NewResourceEstimate("AWS::Timestream::Database", 2, 2, 1)
+	Estimates["AWS::Timestream::ScheduledQuery"] = NewResourceEstimate("AWS::Timestream::ScheduledQuery", 3, 2, 1)
+	Estimates["AWS::Timestream::Table"] = NewResourceEstimate("AWS::Timestream::Table", 2, 1, 1)
+	Estimates["AWS::Transfer::Agreement"] = NewResourceEstimate("AWS::Transfer::Agreement", 1, 1, 1)
+	Estimates["AWS::Transfer::Certificate"] = NewResourceEstimate("AWS::Transfer::Certificate", 1, 1, 1)
+	Estimates["AWS::Transfer::Connector"] = NewResourceEstimate("AWS::Transfer::Connector", 1, 1, 1)
+	Estimates["AWS::Transfer::Profile"] = NewResourceEstimate("AWS::Transfer::Profile", 1, 1, 1)
+	Estimates["AWS::Transfer::Server"] = NewResourceEstimate("AWS::Transfer::Server", 204, 5, 1)
+	Estimates["AWS::Transfer::User"] = NewResourceEstimate("AWS::Transfer::User", 10, 7, 1)
+	Estimates["AWS::Transfer::Workflow"] = NewResourceEstimate("AWS::Transfer::Workflow", 1, 1, 1)
+	Estimates["AWS::VerifiedPermissions::IdentitySource"] = NewResourceEstimate("AWS::VerifiedPermissions::IdentitySource", 1, 2, 1)
+	Estimates["AWS::VerifiedPermissions::Policy"] = NewResourceEstimate("AWS::VerifiedPermissions::Policy", 1, 1, 1)
+	Estimates["AWS::VerifiedPermissions::PolicyStore"] = NewResourceEstimate("AWS::VerifiedPermissions::PolicyStore", 1, 1, 1)
+	Estimates["AWS::VerifiedPermissions::PolicyTemplate"] = NewResourceEstimate("AWS::VerifiedPermissions::PolicyTemplate", 1, 1, 1)
+	Estimates["AWS::VoiceID::Domain"] = NewResourceEstimate("AWS::VoiceID::Domain", 2, 62, 1)
+	Estimates["AWS::VpcLattice::AccessLogSubscription"] = NewResourceEstimate("AWS::VpcLattice::AccessLogSubscription", 4, 4, 1)
+	Estimates["AWS::VpcLattice::AuthPolicy"] = NewResourceEstimate("AWS::VpcLattice::AuthPolicy", 1, 1, 1)
+	Estimates["AWS::VpcLattice::Listener"] = NewResourceEstimate("AWS::VpcLattice::Listener", 2, 2, 1)
+	Estimates["AWS::VpcLattice::ResourcePolicy"] = NewResourceEstimate("AWS::VpcLattice::ResourcePolicy", 2, 2, 1)
+	Estimates["AWS::VpcLattice::Rule"] = NewResourceEstimate("AWS::VpcLattice::Rule", 2, 1, 1)
+	Estimates["AWS::VpcLattice::Service"] = NewResourceEstimate("AWS::VpcLattice::Service", 7, 2, 1)
+	Estimates["AWS::VpcLattice::ServiceNetwork"] = NewResourceEstimate("AWS::VpcLattice::ServiceNetwork", 2, 2, 1)
+	Estimates["AWS::VpcLattice::ServiceNetworkServiceAssociation"] = NewResourceEstimate("AWS::VpcLattice::ServiceNetworkServiceAssociation", 8, 2, 1)
+	Estimates["AWS::VpcLattice::ServiceNetworkVpcAssociation"] = NewResourceEstimate("AWS::VpcLattice::ServiceNetworkVpcAssociation", 31, 131, 1)
+	Estimates["AWS::VpcLattice::TargetGroup"] = NewResourceEstimate("AWS::VpcLattice::TargetGroup", 7, 2, 1)
+	Estimates["AWS::WAF::IPSet"] = NewResourceEstimate("AWS::WAF::IPSet", 1, 1, 1)
+	Estimates["AWS::WAF::Rule"] = NewResourceEstimate("AWS::WAF::Rule", 1, 1, 1)
+	Estimates["AWS::WAF::WebACL"] = NewResourceEstimate("AWS::WAF::WebACL", 1, 1, 1)
+	Estimates["AWS::WAFRegional::ByteMatchSet"] = NewResourceEstimate("AWS::WAFRegional::ByteMatchSet", 72, 1, 1)
+	Estimates["AWS::WAFRegional::GeoMatchSet"] = NewResourceEstimate("AWS::WAFRegional::GeoMatchSet", 70, 1, 1)
+	Estimates["AWS::WAFRegional::IPSet"] = NewResourceEstimate("AWS::WAFRegional::IPSet", 74, 0, 1)
+	Estimates["AWS::WAFRegional::RateBasedRule"] = NewResourceEstimate("AWS::WAFRegional::RateBasedRule", 61, 1, 1)
+	Estimates["AWS::WAFRegional::RegexPatternSet"] = NewResourceEstimate("AWS::WAFRegional::RegexPatternSet", 72, 1, 1)
+	Estimates["AWS::WAFRegional::Rule"] = NewResourceEstimate("AWS::WAFRegional::Rule", 51, 0, 1)
+	Estimates["AWS::WAFRegional::SizeConstraintSet"] = NewResourceEstimate("AWS::WAFRegional::SizeConstraintSet", 71, 1, 1)
+	Estimates["AWS::WAFRegional::SqlInjectionMatchSet"] = NewResourceEstimate("AWS::WAFRegional::SqlInjectionMatchSet", 71, 0, 1)
+	Estimates["AWS::WAFRegional::WebACL"] = NewResourceEstimate("AWS::WAFRegional::WebACL", 59, 0, 1)
+	Estimates["AWS::WAFRegional::WebACLAssociation"] = NewResourceEstimate("AWS::WAFRegional::WebACLAssociation", 5, 0, 1)
+	Estimates["AWS::WAFRegional::XssMatchSet"] = NewResourceEstimate("AWS::WAFRegional::XssMatchSet", 74, 0, 1)
+	Estimates["AWS::WAFv2::IPSet"] = NewResourceEstimate("AWS::WAFv2::IPSet", 2, 2, 1)
+	Estimates["AWS::WAFv2::LoggingConfiguration"] = NewResourceEstimate("AWS::WAFv2::LoggingConfiguration", 2, 1, 1)
+	Estimates["AWS::WAFv2::RegexPatternSet"] = NewResourceEstimate("AWS::WAFv2::RegexPatternSet", 2, 2, 1)
+	Estimates["AWS::WAFv2::RuleGroup"] = NewResourceEstimate("AWS::WAFv2::RuleGroup", 7, 8, 1)
+	Estimates["AWS::WAFv2::WebACL"] = NewResourceEstimate("AWS::WAFv2::WebACL", 7, 9, 1)
+	Estimates["AWS::WAFv2::WebACLAssociation"] = NewResourceEstimate("AWS::WAFv2::WebACLAssociation", 5, 1, 1)
+	Estimates["AWS::Wisdom::Assistant"] = NewResourceEstimate("AWS::Wisdom::Assistant", 2, 1, 1)
+	Estimates["AWS::Wisdom::AssistantAssociation"] = NewResourceEstimate("AWS::Wisdom::AssistantAssociation", 1, 1, 1)
+	Estimates["AWS::Wisdom::KnowledgeBase"] = NewResourceEstimate("AWS::Wisdom::KnowledgeBase", 1, 1, 1)
+	Estimates["AWS::WorkSpaces::ConnectionAlias"] = NewResourceEstimate("AWS::WorkSpaces::ConnectionAlias", 2, 1, 1)
+	Estimates["AWS::WorkSpaces::Workspace"] = NewResourceEstimate("AWS::WorkSpaces::Workspace", 1619, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::BrowserSettings"] = NewResourceEstimate("AWS::WorkSpacesWeb::BrowserSettings", 2, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::IdentityProvider"] = NewResourceEstimate("AWS::WorkSpacesWeb::IdentityProvider", 3, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::IpAccessSettings"] = NewResourceEstimate("AWS::WorkSpacesWeb::IpAccessSettings", 2, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::NetworkSettings"] = NewResourceEstimate("AWS::WorkSpacesWeb::NetworkSettings", 2, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::Portal"] = NewResourceEstimate("AWS::WorkSpacesWeb::Portal", 7, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::TrustStore"] = NewResourceEstimate("AWS::WorkSpacesWeb::TrustStore", 5, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::UserAccessLoggingSettings"] = NewResourceEstimate("AWS::WorkSpacesWeb::UserAccessLoggingSettings", 2, 1, 1)
+	Estimates["AWS::WorkSpacesWeb::UserSettings"] = NewResourceEstimate("AWS::WorkSpacesWeb::UserSettings", 2, 1, 1)
+	Estimates["AWS::XRay::Group"] = NewResourceEstimate("AWS::XRay::Group", 1, 1, 1)
+	Estimates["AWS::XRay::ResourcePolicy"] = NewResourceEstimate("AWS::XRay::ResourcePolicy", 1, 1, 1)
+	Estimates["AWS::XRay::SamplingRule"] = NewResourceEstimate("AWS::XRay::SamplingRule", 1, 1, 1)
+
+}
diff --git a/internal/cmd/forecast/forecast.go b/internal/cmd/forecast/forecast.go
index ffede7be..a6af43cc 100644
--- a/internal/cmd/forecast/forecast.go
+++ b/internal/cmd/forecast/forecast.go
@@ -135,6 +135,22 @@ func forecastForType(input PredictionInput) Forecast {
 		return forecast
 	}
 
+	// Estimate how long the action will take
+	// (This is only for spinner output, we calculate total time separately)
+	var action StackAction
+	if input.stackExists {
+		action = Update
+	} else {
+		action = Create
+	}
+	est, esterr := GetResourceEstimate(input.typeName, action)
+	if esterr != nil {
+		config.Debugf("could not get estimate: %v", esterr)
+		est = 1
+	}
+	config.Debugf("Got resource estimate for %v: %v", input.logicalId, est)
+	spin(input.typeName, input.logicalId, fmt.Sprintf("estimate: %v seconds", est))
+
 	// Call generic prediction functions that we can run against
 	// all resources, even if there is not a predictor.
 
@@ -250,6 +266,9 @@ func predict(source cft.Template, stackName string, stack types.Stack, stackExis
 
 	spinner.Stop()
 
+	// Figure out how long we thing the stack will take to execute
+	totalSeconds := PredictTotalEstimate(source, stackExists)
+
 	if forecast.GetNumFailed() > 0 {
 		fmt.Println("Stormy weather ahead! 🌪") // 🌩️⛈
 		fmt.Println(forecast.GetNumFailed(), "checks failed out of", forecast.GetNumChecked(), "total checks")
@@ -259,7 +278,8 @@ func predict(source cft.Template, stackName string, stack types.Stack, stackExis
 		}
 		return false
 	} else {
-		fmt.Println("Clear skies! 🌞 All", forecast.GetNumChecked(), "checks passed.")
+		fmt.Println("Clear skies! 🌞 All", forecast.GetNumChecked(), "checks passed. Estimated time:",
+			FormatEstimate(totalSeconds))
 		return true
 	}
 
@@ -384,4 +404,7 @@ func init() {
 	forecasters["AWS::EC2::Instance"] = checkEC2Instance
 	forecasters["AWS::EC2::SecurityGroup"] = checkEC2SecurityGroup
 
+	// Initialize estimates map
+	InitEstimates()
+
 }
diff --git a/internal/cmd/forecast/permissions.go b/internal/cmd/forecast/permissions.go
index b4a74109..3c7b9ece 100644
--- a/internal/cmd/forecast/permissions.go
+++ b/internal/cmd/forecast/permissions.go
@@ -46,6 +46,7 @@ func checkTypePermissions(input PredictionInput, resourceArn string, verb string
 	// other circumstances, and it's not easy to know when they are relevant.
 	if svcLower == "lambda" {
 		actionsToRemove = append(actionsToRemove, "lambda:GetCodeSigningConfig")
+		actionsToRemove = append(actionsToRemove, "lambda:GetLayerVersion")
 	}
 	if input.typeName == "AWS::IAM::Policy" {
 		actionsToRemove = append(actionsToRemove, "iam:PutUserPolicy")
diff --git a/internal/cmd/logs/chart-template.html b/internal/cmd/logs/chart-template.html
index b88d2415..d12d5c84 100644
--- a/internal/cmd/logs/chart-template.html
+++ b/internal/cmd/logs/chart-template.html
@@ -7,7 +7,7 @@
                   border: 2px solid rgb(200,200,200);
                   letter-spacing: 1px;
                   font-size: 0.8rem;
-                  width:90%;
+                  width:95%;
             }
 
             td, th {
@@ -24,15 +24,19 @@
             }
 
             thead th:nth-child(1) {
-                width: 16%;
+                width: 15%;
             }
 
             thead th:nth-child(2) {
-                width: 7%;
+                width: 5%;
             }
 
-            thead th:nth-child(3) {
-                width: 77%;
+            thead th:nth-child(2) {
+                width: 5%;
+            }
+
+            thead th:nth-child(4) {
+                width: 75%;
             }
 
             tr:nth-child(even) td {
@@ -69,6 +73,11 @@
                 width: 8%;
                 text-align: right;
             }
+
+            .resource-type {
+                font-weight: normal;
+                font-size: small;
+            }
         </style>
     </head>
     <body>
@@ -82,6 +91,7 @@
                 <thead>
                     <tr>
                         <th scope="col">Resource</th>
+                        <th scope="col">Type</th>
                         <th scope="col">Elapsed</th>
                         <th scope="col">Time</th>
                     </tr>
@@ -93,6 +103,7 @@
                 <tfoot>
                     <tr>
                         <th scope="row">Total</th>
+                        <th>&nbsp;</th>
                         <td><span id="total-elapsed-time"></span></td>
                         <td>
                             <div class="histo">
@@ -184,6 +195,7 @@
 
             const template = `
                         <th scope="row">RESOURCE</td>
+                        <td><span class="resource-type">RESOURCE_TYPE</span></td>
                         <td>ELAPSED</td>
                         <td>
                             <div class="histo">
@@ -200,6 +212,7 @@
                 r.post = ((latest - r.endts)/total)*100
 
                 let rendered = template.replace("RESOURCE", r.id)
+                rendered = rendered.replace("RESOURCE_TYPE", r.type)
                 rendered = rendered.replace("PRE", r.pre)
                 rendered = rendered.replace("ACTIVE", r.active)
                 rendered = rendered.replace("POST", r.post)


Test patch:
diff --git a/cft/graph/graph_test.go b/cft/graph/graph_test.go
index a8831cae..e21d9534 100644
--- a/cft/graph/graph_test.go
+++ b/cft/graph/graph_test.go
@@ -17,11 +17,14 @@ Parameters:
 Resources:
   Bucket:
     Type: AWS::S3::Bucket
+    DependsOn: LogBucket
     Properties:
       BucketName: !Ref Name
       Tags:
         - Key: Account
         - Value: !Ref AWS::AccountId
+  LogBucket:
+    Type: AWS::S3::Bucket
 Outputs:
   BucketName:
     Value: !Ref Bucket
@@ -52,6 +55,7 @@ func Example_nodes() {
 	// Output:
 	// Parameters/AWS::AccountId
 	// Parameters/Name
+	// Resources/LogBucket
 	// Resources/Bucket
 	// Outputs/BucketArn
 	// Outputs/BucketName
@@ -63,7 +67,7 @@ func Example_get() {
 	fmt.Println(g.Get(graph.Node{"Outputs", "BucketName"}))
 	// Output:
 	// []
-	// [Parameters/AWS::AccountId Parameters/Name]
+	// [Parameters/AWS::AccountId Parameters/Name Resources/LogBucket]
 	// [Resources/Bucket]
 }
 
diff --git a/internal/cmd/forecast/estimate_test.go b/internal/cmd/forecast/estimate_test.go
new file mode 100644
index 00000000..93543b41
--- /dev/null
+++ b/internal/cmd/forecast/estimate_test.go
@@ -0,0 +1,89 @@
+package forecast
+
+import (
+	"testing"
+
+	"github.com/aws-cloudformation/rain/cft/parse"
+)
+
+func TestResourceEstimate(t *testing.T) {
+	resourceName := "AWS::ACMPCA::Certificate"
+	action := Create
+	est, err := GetResourceEstimate(resourceName, action)
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	if est != 3 {
+		t.Errorf("expected AWS::ACMPCA::Certificate create to return 1")
+	}
+}
+
+func TestDependencyEstimate(t *testing.T) {
+	template := `
+Parameters:
+
+  N:
+    Type: String
+    Default: "A"
+
+Resources:
+
+  # 30s
+  A:
+    Type: AWS::S3::Bucket
+    DependsOn: B
+    Properties:
+      BucketName: !Ref N
+
+  # 12
+  B: 
+    Type: AWS::S3::BucketPolicy
+    DependsOn: E
+
+  # 16 
+  C:
+    Type: AWS::EC2::Instance
+    DependsOn: [B, D, F, G]
+
+  # 6s 
+  D:
+    Type: AWS::EC2::LaunchTemplate
+    DependsOn: E
+
+  # 30s 
+  E: 
+    Type: AWS::S3::Bucket
+
+  # 30s
+  F:
+    Type: AWS::S3::Bucket
+
+  # 30s
+  G:
+    Type: AWS::S3::Bucket
+
+`
+	/*
+			       A   C
+				    \ / \ \ \
+					 B   D F G
+					  \ /
+					   E
+
+		    Longest is C-D-E = 72
+	*/
+	// Parse the template
+	tt, err := parse.String(string(template))
+	if err != nil {
+		t.Error(err)
+		return
+	}
+	// config.Debug = true
+	total := PredictTotalEstimate(tt, false)
+	expected := 72 // will need to adjust this when we modify the database of estimates
+	if total != expected {
+		t.Errorf("expected total to be %v, got %v", expected, total)
+	}
+
+}
diff --git a/test/templates/graph.yaml b/test/templates/graph.yaml
new file mode 100644
index 00000000..970d18a7
--- /dev/null
+++ b/test/templates/graph.yaml
@@ -0,0 +1,27 @@
+Parameters:
+
+  N:
+    Type: String
+    Default: "A"
+
+Resources:
+
+  A:
+    Type: AWS::S3::Bucket
+    DependsOn: B
+    Properties:
+      BucketName: !Ref N
+
+  B: 
+    Type: AWS::S3::Bucket
+
+  C:
+    Type: AWS::S3::Bucket
+    DependsOn: [B, D]
+
+  D:
+    Type: AWS::S3::Bucket
+    DependsOn: E
+
+  E: 
+    Type: AWS::S3::Bucket