From f77a5c667f6568a93bc16466f312686d32d7e41f Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Thu, 27 Aug 2026 16:00:50 -0600 Subject: [PATCH 1/6] Optimize repeated template validation --- src/cel-engine/src/engine.rs | 30 +- src/cel-engine/src/rules/best_practices.rs | 9 +- src/cel-engine/src/rules/mod.rs | 58 +-- src/cel-engine/src/rules/resources_extra.rs | 116 +++-- src/data-source/src/types.rs | 287 +++++++++++- src/rego-engine/src/builtins.rs | 143 ++---- src/rego-engine/src/engine.rs | 37 +- src/schema-validator/src/catalog.rs | 331 +++++++------- src/schema-validator/src/lib.rs | 142 +++++- src/schema-validator/src/validate.rs | 2 +- src/template-model/src/model.rs | 480 +++++++++++++++++++- 11 files changed, 1233 insertions(+), 402 deletions(-) diff --git a/src/cel-engine/src/engine.rs b/src/cel-engine/src/engine.rs index a818ec11..3b6d9ae0 100644 --- a/src/cel-engine/src/engine.rs +++ b/src/cel-engine/src/engine.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use diagnostics::{Diagnostic, Entity, PhaseMetric, phase_metric}; use guard_translator::{ensure_translatable, pack_name_from_path, parse_guard}; use rules::{RuleInfo, RuleMetadataEntry, RuleOrigin, Severity, build_rule_metadata_map, is_valid_custom_rule_id}; -use schema_validator::{OverlayCatalog, SchemaValidator}; +use schema_validator::{OverlayCatalog, SchemaMetadataCatalog, SchemaValidator, schema_metadata_catalog_with_overlays}; use template_model::{SemanticModel, UNKNOWN_SPAN}; use validation_engine::{ EngineConfig, ValidateConfig, ValidationEngine, ValidationError, build_rule_list, semantic_model_to_input_json, @@ -67,7 +67,9 @@ impl CelEngine { pub fn new(config: EngineConfig) -> anyhow::Result { let catalog = config.build_overlay_catalog().map_err(|e| anyhow::anyhow!("Failed to build overlay catalog: {e}"))?; - Self::new_from_catalog(config, &catalog) + let start = web_time::Instant::now(); + let schema_metadata = schema_metadata_catalog_with_overlays(&catalog)?; + Self::new_from_parts(config, &catalog, schema_metadata, start) } /// Constructs the engine reusing metadata from an already-built @@ -75,16 +77,25 @@ impl CelEngine { /// authoritative - the engine does not re-resolve overlay schemas. /// /// This entry point is intended for language bindings and the CLI, which - /// construct a `SchemaValidator` once and share it with the engine. + /// construct a `SchemaValidator` once and share it with the engine. The + /// validator's shared schema-metadata catalog is reused rather than rebuilt, + /// so every engine built from the same validator shares one catalog rather + /// than rebuilding it. #[doc(hidden)] pub fn new_with_schema_validator(config: EngineConfig, validator: &SchemaValidator) -> anyhow::Result { - Self::new_from_catalog(config, validator.overlay_catalog()) - } - - /// Internal constructor that accepts a pre-built overlay catalog. - fn new_from_catalog(config: EngineConfig, overlay_catalog: &OverlayCatalog) -> anyhow::Result { let start = web_time::Instant::now(); - + let schema_metadata = validator.schema_metadata_catalog()?; + Self::new_from_parts(config, validator.overlay_catalog(), schema_metadata, start) + } + + /// Internal constructor that accepts a pre-built overlay catalog and the + /// shared schema-metadata catalog resolved for it. + fn new_from_parts( + config: EngineConfig, + overlay_catalog: &OverlayCatalog, + schema_metadata: Arc, + start: web_time::Instant, + ) -> anyhow::Result { let native_rules = NativeRuleRegistry::new(); let generated_rules = GeneratedRuleRegistry::new()?; @@ -158,6 +169,7 @@ impl CelEngine { if !overlay_catalog.is_empty() { cached_data.merge_overlay_catalog(overlay_catalog)?; } + cached_data.set_schema_metadata(schema_metadata); let init_metric = phase_metric(start); Ok(CelEngine { native_rules, diff --git a/src/cel-engine/src/rules/best_practices.rs b/src/cel-engine/src/rules/best_practices.rs index 526d8cea..a56caca3 100644 --- a/src/cel-engine/src/rules/best_practices.rs +++ b/src/cel-engine/src/rules/best_practices.rs @@ -510,16 +510,15 @@ None, } } - if let Some(sm) = ctx.cached_data.schema_metadata().get("schema_metadata") { + { + let schema_metadata = ctx.cached_data.schema_metadata_catalog(); for (name, res) in &m.resources { if res.resource_type.ends_with("::MODULE") { continue; } - let supports_tags = sm + let supports_tags = schema_metadata .get(&res.resource_type) - .and_then(|entry| entry.get("properties")) - .and_then(|p| p.as_array()) - .map(|arr| arr.iter().any(|v| v.as_str() == Some("Tags"))) + .map(|entry| entry.properties.iter().any(|p| p == "Tags")) .unwrap_or(false); let tags_missing = m.resolve_properties_scenarios(name).iter().any(|(properties, conditions)| { scenario_is_reachable(m, name, conditions) && !scenario_has_effective_property(properties, "Tags") diff --git a/src/cel-engine/src/rules/mod.rs b/src/cel-engine/src/rules/mod.rs index 49f0d072..208d6bb7 100644 --- a/src/cel-engine/src/rules/mod.rs +++ b/src/cel-engine/src/rules/mod.rs @@ -2,14 +2,14 @@ use data_source::embedded; use data_source::rule_data::{NormalizedRuleTablesDocument, RuleData, RuleTables}; use data_source::types::{ ArtifactCountEntry, CodepipelineArtifactCounts, DeprecatedResourceTypes, GetattData, IamActionResourcePatterns, - KnownResourceTypes, PrimaryIdentifiers, RetentionPeriodRequirements, SecretsManagerArnFields, SensitivePorts, - StatefulResourceTypes, + KnownResourceTypes, PrimaryIdentifiers, RetentionPeriodRequirements, SchemaMetadataCatalog, + SecretsManagerArnFields, SensitivePorts, StatefulResourceTypes, }; use diagnostics::Diagnostic; use rules::Category; use schema_validator::OverlayCatalog; use std::collections::{HashMap, HashSet}; -use std::sync::{Arc, LazyLock, OnceLock}; +use std::sync::{Arc, LazyLock}; use template_model::SemanticModel; pub mod best_practices; @@ -26,7 +26,7 @@ pub struct CachedData { pub known_types: HashSet, pub getatt_attrs: HashMap>, pub getatt_attr_types: HashMap>, - schema_metadata_lazy: OnceLock, + schema_metadata: Arc, pub iam_action_resource_patterns: HashMap>, pub enum_data: HashMap, pub stateful_resource_types: HashSet, @@ -263,7 +263,7 @@ impl CachedData { known_types, getatt_attrs, getatt_attr_types, - schema_metadata_lazy: OnceLock::new(), + schema_metadata: Arc::new(SchemaMetadataCatalog::new()), iam_action_resource_patterns, enum_data, stateful_resource_types, @@ -286,8 +286,10 @@ impl CachedData { /// Merges overlay catalog data into this cached data instance. /// - /// Called when overlays are non-empty so GetAtt attributes, attribute types, - /// primary identifiers, and schema metadata from overlays are visible to rules. + /// Called when overlays are non-empty so their resource types, GetAtt + /// attributes, attribute types, and primary identifiers are visible to rules. + /// Overlay-aware schema metadata is installed separately through + /// [`Self::set_schema_metadata`]. pub fn merge_overlay_catalog(&mut self, catalog: &OverlayCatalog) -> anyhow::Result<()> { if catalog.is_empty() { return Ok(()); @@ -320,40 +322,20 @@ impl CachedData { self.primary_identifiers.insert(type_name.clone(), pids.clone()); } - // Eagerly initialize schema metadata with merged overlay data. - let base_metadata: serde_json::Value = serde_json::from_slice(&embedded::SCHEMA_METADATA_BYTES) - .map_err(|e| anyhow::anyhow!("Failed to parse schema_metadata JSON: {}", e))?; - let mut metadata_obj = base_metadata - .as_object() - .cloned() - .ok_or_else(|| anyhow::anyhow!("Embedded schema_metadata data must be an object"))?; - let inner_map = metadata_obj - .get_mut("schema_metadata") - .and_then(|value| value.as_object_mut()) - .ok_or_else(|| anyhow::anyhow!("Embedded schema_metadata data must contain a schema_metadata object"))?; - anyhow::ensure!(!inner_map.is_empty(), "Embedded schema_metadata data must not be empty"); - for (type_name, entry) in &catalog.schema_metadata { - inner_map.insert( - type_name.clone(), - serde_json::to_value(entry) - .map_err(|e| anyhow::anyhow!("Failed to serialize SchemaMetadataEntry: {}", e))?, - ); - } - let merged = serde_json::Value::Object(metadata_obj); - // Construct the OnceLock with the merged value. The OnceLock is freshly - // created in `load()`, so this is the first and only set call. - self.schema_metadata_lazy = OnceLock::new(); - self.schema_metadata_lazy - .set(merged) - .map_err(|_| anyhow::anyhow!("schema_metadata OnceLock was unexpectedly already initialized"))?; Ok(()) } - /// Lazy accessor - parses the 14MB `schema_metadata` JSON on first call. - pub fn schema_metadata(&self) -> &serde_json::Value { - self.schema_metadata_lazy.get_or_init(|| { - serde_json::from_slice(&embedded::SCHEMA_METADATA_BYTES).expect("Failed to parse schema_metadata JSON") - }) + /// Installs the shared, overlay-aware schema-metadata catalog the engine + /// resolved. The same [`Arc`] is shared across engines and validators, so no + /// catalog is parsed or copied per engine. + pub fn set_schema_metadata(&mut self, catalog: Arc) { + self.schema_metadata = catalog; + } + + /// The shared, overlay-aware schema-metadata catalog: resource type name to + /// its typed metadata entry. + pub fn schema_metadata_catalog(&self) -> &SchemaMetadataCatalog { + &self.schema_metadata } } diff --git a/src/cel-engine/src/rules/resources_extra.rs b/src/cel-engine/src/rules/resources_extra.rs index b1abbf4b..ec69ebb4 100644 --- a/src/cel-engine/src/rules/resources_extra.rs +++ b/src/cel-engine/src/rules/resources_extra.rs @@ -1414,13 +1414,12 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { // list whose schema requires uniqueItems is covered by the Fatal uniqueItems // check instead, so it is excluded here. The `Command` property of // run-command resources legitimately repeats values and is exempt. - if let Some(sm) = ctx.cached_data.schema_metadata().get("schema_metadata").and_then(|s| s.as_object()) { + { + let schema_metadata = ctx.cached_data.schema_metadata_catalog(); for (name, res) in &m.resources { - let Some(type_meta) = sm.get(&res.resource_type).and_then(|t| t.as_object()) else { + let Some(type_meta) = schema_metadata.get(&res.resource_type) else { continue; }; - let known_props = type_meta.get("property_types").and_then(|p| p.as_object()); - let constraints = type_meta.get("property_constraints").and_then(|p| p.as_object()); for prop in res.properties.keys() { if prop == "Command" { continue; @@ -1428,13 +1427,13 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { // Only a property the schema actually defines can be a "list that // permits duplicates"; an unknown property is a structural error // handled elsewhere. - if !known_props.is_some_and(|p| p.contains_key(prop)) { + if !type_meta.property_types.contains_key(prop) { continue; } - let requires_unique = constraints - .and_then(|c| c.get(prop)) - .and_then(|meta| meta.get("uniqueItems")) - .and_then(|v| v.as_bool()) + let requires_unique = type_meta + .property_constraints + .get(prop) + .and_then(|constraints| constraints.unique_items) .unwrap_or(false); if requires_unique { continue; @@ -2485,63 +2484,52 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { } } - if let Some(sm) = ctx.cached_data.schema_metadata().get("schema_metadata").and_then(|s| s.as_object()) { + { + let schema_metadata = ctx.cached_data.schema_metadata_catalog(); for (name, res) in &m.resources { - if let Some(type_meta) = sm.get(&res.resource_type).and_then(|t| t.as_object()) { - let prop_types = type_meta.get("property_types").and_then(|p| p.as_object()); - if let Some(props_meta) = type_meta.get("property_constraints").and_then(|p| p.as_object()) { - for (prop, meta) in props_meta { - let is_string = - prop_types.and_then(|pt| pt.get(prop)).and_then(|v| v.as_str()) == Some("string"); - let max_len = meta - .get("maxLength") - .and_then(|v| v.as_u64()) - .or_else(|| if is_string { meta.get("maximum").and_then(|v| v.as_u64()) } else { None }); - let min_len = meta - .get("minLength") - .and_then(|v| v.as_u64()) - .or_else(|| if is_string { meta.get("minimum").and_then(|v| v.as_u64()) } else { None }); - if max_len.is_none() && min_len.is_none() { - continue; + if let Some(type_meta) = schema_metadata.get(&res.resource_type) { + for (prop, constraints) in &type_meta.property_constraints { + let is_string = type_meta.property_types.get(prop).map(|t| t == "string").unwrap_or(false); + let max_len = constraints.max_length.or_else(|| { + if is_string { constraints.maximum.as_ref().and_then(|v| v.as_u64()) } else { None } + }); + let min_len = constraints.min_length.or_else(|| { + if is_string { constraints.minimum.as_ref().and_then(|v| v.as_u64()) } else { None } + }); + if max_len.is_none() && min_len.is_none() { + continue; + } + let path = format!("Properties.{}", prop); + // Only reported when the constraint is broken whichever + // value the deployment picks: the shortest possibility + // still too long, or the longest still too short. A value + // the template states literally is checked against the + // constraint by schema validation instead, and a value with + // any unknown possibility yields no bounds at all. + if let Some((shortest, longest)) = m.estimated_string_length_bounds(name, &path) { + if let Some(max) = max_len + && shortest as u64 > max + { + out.push(make_resource_diagnostic( + "W9006", + &format!("String length {} exceeds maximum {} for property '{}'", shortest, max, prop), + m, + name, + &path, + None, + )); } - let path = format!("Properties.{}", prop); - // Only reported when the constraint is broken whichever - // value the deployment picks: the shortest possibility - // still too long, or the longest still too short. A value - // the template states literally is checked against the - // constraint by schema validation instead, and a value with - // any unknown possibility yields no bounds at all. - if let Some((shortest, longest)) = m.estimated_string_length_bounds(name, &path) { - if let Some(max) = max_len - && shortest as u64 > max - { - out.push(make_resource_diagnostic( - "W9006", - &format!( - "String length {} exceeds maximum {} for property '{}'", - shortest, max, prop - ), - m, - name, - &path, - None, - )); - } - if let Some(min) = min_len - && (longest as u64) < min - { - out.push(make_resource_diagnostic( - "W9006", - &format!( - "String length {} is below minimum {} for property '{}'", - longest, min, prop - ), - m, - name, - &path, - None, - )); - } + if let Some(min) = min_len + && (longest as u64) < min + { + out.push(make_resource_diagnostic( + "W9006", + &format!("String length {} is below minimum {} for property '{}'", longest, min, prop), + m, + name, + &path, + None, + )); } } } diff --git a/src/data-source/src/types.rs b/src/data-source/src/types.rs index 631276f8..15235b95 100644 --- a/src/data-source/src/types.rs +++ b/src/data-source/src/types.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use std::collections::{HashMap, HashSet}; +use std::collections::{BTreeMap, HashMap, HashSet}; #[derive(Debug, Default, Serialize, Deserialize)] pub struct KnownResourceTypes { @@ -61,6 +61,112 @@ pub struct SecretsManagerArnFields { pub secretsmanager_arn_fields: Vec, } +/// The committed `schema_metadata` artifact: a wrapper whose single +/// `schema_metadata` field maps each resource type name to its metadata. +/// +/// This is the authoritative, recursively typed model consumed by the schema +/// validator and both rule engines. It is lossless: every field the artifact +/// carries has a typed home, and any field the current code does not model is +/// preserved verbatim in the per-level `additional` extension maps, so a future +/// artifact deserializes and reserializes without code changes. +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct SchemaMetadataDocument { + pub schema_metadata: SchemaMetadataCatalog, +} + +/// Resource type name to its typed schema metadata. +pub type SchemaMetadataCatalog = HashMap; + +/// Per-resource-type schema metadata, also used for every nested object level. +/// +/// The model is recursive: a nested object reappears as a `SchemaMetadataEntry` +/// under [`SchemaPropertyConstraints::sub_properties`], and an array element +/// object reappears under [`SchemaItemsMetadata::schema`]. +/// +/// `properties`, `required`, `property_types`, and `property_enums` always +/// serialize, even when empty, because the generator emits them at every level; +/// preserving that presence is required for lossless round-tripping. Fields the +/// current code does not model are retained in [`Self::additional`]. +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct SchemaMetadataEntry { + #[serde(default)] + pub properties: Vec, + #[serde(default)] + pub required: Vec, + #[serde(default)] + pub property_types: HashMap, + #[serde(default)] + pub property_enums: HashMap>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub property_constraints: HashMap, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub dependent_required: HashMap>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub dependent_excluded: HashMap>, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub required_or: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub required_xor: Vec, + #[serde(flatten, default)] + pub additional: BTreeMap, +} + +/// The constraints attached to a single property: scalar bounds, format, nested +/// object sub-properties, array item schema, and inter-property dependencies. +/// +/// `minimum`/`maximum` keep the authored JSON number verbatim as a +/// [`serde_json::Number`], so an integer bound stays an integer and a decimal or +/// exponent bound keeps its precision. Length and item bounds are non-negative +/// integers and use `u64`. Unknown fields are preserved in [`Self::additional`]. +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct SchemaPropertyConstraints { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pattern: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub minimum: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub maximum: Option, + #[serde(rename = "minLength", default, skip_serializing_if = "Option::is_none")] + pub min_length: Option, + #[serde(rename = "maxLength", default, skip_serializing_if = "Option::is_none")] + pub max_length: Option, + #[serde(rename = "minItems", default, skip_serializing_if = "Option::is_none")] + pub min_items: Option, + #[serde(rename = "maxItems", default, skip_serializing_if = "Option::is_none")] + pub max_items: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub format: Option, + #[serde(rename = "uniqueItems", default, skip_serializing_if = "Option::is_none")] + pub unique_items: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sub_properties: Option>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub items: Option>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub dependent_required: HashMap>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub dependent_excluded: HashMap>, + #[serde(flatten, default)] + pub additional: BTreeMap, +} + +/// Array element metadata: the element type, a nested object schema when the +/// elements are objects, and any element-level dependencies. Recursive through +/// [`Self::schema`]. Unknown fields are preserved in [`Self::additional`]. +#[derive(Debug, Default, Clone, Serialize, Deserialize)] +pub struct SchemaItemsMetadata { + #[serde(rename = "type", default, skip_serializing_if = "Option::is_none")] + pub item_type: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub schema: Option>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub dependent_required: HashMap>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub dependent_excluded: HashMap>, + #[serde(flatten, default)] + pub additional: BTreeMap, +} + #[cfg(test)] mod tests { use super::*; @@ -77,6 +183,7 @@ mod tests { assert!(serde_json::from_str::("{}").is_err()); assert!(serde_json::from_str::("{}").is_err()); assert!(serde_json::from_str::("{}").is_err()); + assert!(serde_json::from_str::("{}").is_err()); } #[test] @@ -121,4 +228,182 @@ mod tests { let restored: RetentionPeriodRequirements = postcard::from_bytes(&bytes).unwrap(); assert_eq!(restored.retention_period_requirements["AWS::SQS::Queue"], vec!["MessageRetentionPeriod"]); } + + /// The whole committed `schema_metadata` artifact must survive a typed + /// round-trip with no loss: parse it as an untyped value, parse it through + /// the typed model, serialize the typed model back, and require the two + /// values to be equal. `serde_json::Value` equality is order-insensitive, so + /// only content is compared, not key order or whitespace. + #[test] + fn committed_schema_metadata_typed_round_trip_is_lossless() { + let bytes = &crate::embedded::SCHEMA_METADATA_BYTES; + let original: serde_json::Value = + serde_json::from_slice(bytes).expect("committed schema_metadata must be valid JSON"); + let document: SchemaMetadataDocument = + serde_json::from_slice(bytes).expect("committed schema_metadata must parse through the typed model"); + assert!(!document.schema_metadata.is_empty(), "committed schema_metadata must not be empty"); + let reserialized = serde_json::to_value(&document).expect("typed model must reserialize"); + assert_eq!( + original, reserialized, + "typed round-trip of the committed schema_metadata artifact dropped or changed a field" + ); + } + + /// Every entry in the committed artifact must parse through the typed model + /// without any value landing in an `additional` extension map - if it does, + /// the model is missing a typed field for a value the generator emits today. + #[test] + fn committed_schema_metadata_has_no_unmodeled_fields() { + let document: SchemaMetadataDocument = + serde_json::from_slice(&crate::embedded::SCHEMA_METADATA_BYTES).expect("typed parse"); + for (type_name, entry) in &document.schema_metadata { + assert!( + entry.additional.is_empty(), + "{type_name}: entry carries unmodeled fields {:?}", + entry.additional.keys().collect::>() + ); + for (prop, constraints) in &entry.property_constraints { + assert_constraints_fully_modeled(type_name, prop, constraints); + } + } + } + + fn assert_constraints_fully_modeled(type_name: &str, prop: &str, constraints: &SchemaPropertyConstraints) { + assert!( + constraints.additional.is_empty(), + "{type_name}.{prop}: constraint carries unmodeled fields {:?}", + constraints.additional.keys().collect::>() + ); + if let Some(sub) = &constraints.sub_properties { + assert!( + sub.additional.is_empty(), + "{type_name}.{prop}: sub_properties carries unmodeled fields {:?}", + sub.additional.keys().collect::>() + ); + for (nested_prop, nested) in &sub.property_constraints { + assert_constraints_fully_modeled(type_name, &format!("{prop}.{nested_prop}"), nested); + } + } + if let Some(items) = &constraints.items { + assert!( + items.additional.is_empty(), + "{type_name}.{prop}: items carries unmodeled fields {:?}", + items.additional.keys().collect::>() + ); + if let Some(schema) = &items.schema { + for (nested_prop, nested) in &schema.property_constraints { + assert_constraints_fully_modeled(type_name, &format!("{prop}[].{nested_prop}"), nested); + } + } + } + } + + /// Unknown fields at the entry, constraint, and item levels are preserved + /// verbatim, and numbers keep their integer, decimal, and exponent JSON + /// semantics through the flattened extension maps. + #[test] + fn unknown_fields_and_number_forms_survive_round_trip() { + let synthetic = serde_json::json!({ + "schema_metadata": { + "AWS::Test::Synthetic": { + "properties": ["A", "B"], + "required": ["A"], + "property_types": {"A": "string", "B": "array"}, + "property_enums": {}, + "property_constraints": { + "A": { + "minLength": 1, + "maxLength": 64, + "minimum": 0, + "maximum": 3.5, + "pattern": "^x$", + "future_int": 42, + "future_decimal": 1.25, + "future_exponent": 1e10 + }, + "B": { + "items": { + "type": "object", + "schema": { + "properties": ["K"], + "required": [], + "property_types": {"K": "string"}, + "property_enums": {}, + "future_item_field": 7 + }, + "future_items_int": 99 + } + } + }, + "future_entry_field": {"nested": [1, 2, 3]}, + "future_entry_int": 123 + } + } + }); + + let document: SchemaMetadataDocument = + serde_json::from_value(synthetic.clone()).expect("synthetic document parses"); + let reserialized = serde_json::to_value(&document).expect("synthetic document reserializes"); + assert_eq!(synthetic, reserialized, "an unknown field or number form was not preserved through the model"); + + // The integer forms must remain integers, not be widened to floats. + let entry = &document.schema_metadata["AWS::Test::Synthetic"]; + assert_eq!(entry.additional["future_entry_int"], serde_json::json!(123)); + let a = &entry.property_constraints["A"]; + assert_eq!(a.additional["future_int"], serde_json::json!(42)); + assert_eq!(a.additional["future_exponent"], serde_json::json!(1e10)); + assert_eq!(a.minimum, Some(serde_json::Number::from(0))); + } + + /// The four always-present entry fields serialize even when empty, at the + /// top level and at every nested level (`sub_properties`, `items.schema`). + #[test] + fn present_empty_base_fields_are_retained_at_every_level() { + let source = serde_json::json!({ + "schema_metadata": { + "AWS::Test::Empty": { + "properties": [], + "required": [], + "property_types": {}, + "property_enums": {}, + "property_constraints": { + "Nested": { + "sub_properties": { + "properties": [], + "required": [], + "property_types": {}, + "property_enums": {} + } + }, + "Arr": { + "items": { + "type": "array", + "schema": { + "properties": [], + "required": [], + "property_types": {}, + "property_enums": {} + } + } + } + } + } + } + }); + + let document: SchemaMetadataDocument = serde_json::from_value(source.clone()).expect("parses"); + let reserialized = serde_json::to_value(&document).expect("reserializes"); + assert_eq!(source, reserialized, "a present-empty base field was dropped during round-trip"); + + let entry = &reserialized["schema_metadata"]["AWS::Test::Empty"]; + for level in [ + entry, + &entry["property_constraints"]["Nested"]["sub_properties"], + &entry["property_constraints"]["Arr"]["items"]["schema"], + ] { + for field in ["properties", "required", "property_types", "property_enums"] { + assert!(level.get(field).is_some(), "expected present-empty '{field}' at this level: {level}"); + } + } + } } diff --git a/src/rego-engine/src/builtins.rs b/src/rego-engine/src/builtins.rs index d8e39d16..a665ac22 100644 --- a/src/rego-engine/src/builtins.rs +++ b/src/rego-engine/src/builtins.rs @@ -1,6 +1,6 @@ use crate::engine::{SharedModel, SharedRegion}; -use data_source::embedded::{GETATT_ATTRIBUTES_BYTES, SCHEMA_METADATA_BYTES}; -use data_source::types::{ArtifactCountEntry, CodepipelineArtifactCounts, GetattData}; +use data_source::embedded::GETATT_ATTRIBUTES_BYTES; +use data_source::types::{ArtifactCountEntry, CodepipelineArtifactCounts, GetattData, SchemaMetadataCatalog}; use regorus::Value; use schema_validator::OverlayCatalog; use std::collections::{BTreeSet, HashMap, HashSet}; @@ -38,6 +38,7 @@ pub(crate) fn register_all( holder: SharedModel, region_holder: SharedRegion, overlay_catalog: &OverlayCatalog, + schema_metadata: Arc, ) -> anyhow::Result<()> { register_resolve(rego, holder.clone()); register_resolve_preserving_conditionals(rego, holder.clone()); @@ -87,13 +88,12 @@ pub(crate) fn register_all( register_pipeline_artifacts(rego, holder.clone()); register_pipeline_artifact_count_issues(rego, holder.clone())?; register_resolve_type(rego, holder.clone()); - let schema_registry: LazySchemaRegistry = build_schema_registry(overlay_catalog); let getatt_registry: LazyGetattRegistry = build_getatt_registry(overlay_catalog); - register_schema_properties(rego, schema_registry.clone()); - register_schema_required(rego, schema_registry.clone()); - register_schema_type(rego, schema_registry.clone()); - register_schema_enum(rego, schema_registry.clone()); - register_attribute_type(rego, schema_registry.clone()); + register_schema_properties(rego, schema_metadata.clone()); + register_schema_required(rego, schema_metadata.clone()); + register_schema_type(rego, schema_metadata.clone()); + register_schema_enum(rego, schema_metadata.clone()); + register_attribute_type(rego, schema_metadata.clone()); register_getatt_return_type(rego, getatt_registry); register_edges_from(rego, holder.clone()); register_edges_to(rego, holder.clone()); @@ -118,8 +118,8 @@ pub(crate) fn register_all( register_fargate_task_size_is_offered(rego); register_cfn_type_compatible(rego); register_estimated_string_length_bounds(rego, holder.clone()); - register_schema_string_length(rego, schema_registry.clone()); - register_schema_requires_unique_items(rego, schema_registry); + register_schema_string_length(rego, schema_metadata.clone()); + register_schema_requires_unique_items(rego, schema_metadata); register_unreachable_if_branches(rego, holder.clone()); register_iam_identity_policy_findings(rego, holder.clone()); register_iam_inline_policy_document_paths(rego, holder.clone()); @@ -1851,63 +1851,11 @@ fn register_resolve_type(rego: &mut regorus::Engine, holder: SharedModel) { }), ); } -#[derive(Debug, Clone, Default, serde::Deserialize)] -struct SchemaInfo { - #[serde(default)] - properties: Vec, - #[serde(default)] - required: Vec, - #[serde(default)] - property_types: HashMap, - #[serde(default)] - property_enums: HashMap>, - #[serde(default)] - property_constraints: HashMap, -} - -fn load_schema_registry() -> HashMap { - #[derive(serde::Deserialize)] - struct Wrapper { - schema_metadata: HashMap, - } - let wrapper: Wrapper = - serde_json::from_slice(&SCHEMA_METADATA_BYTES).expect("Failed to parse schema_metadata JSON"); - assert!(!wrapper.schema_metadata.is_empty(), "Embedded schema_metadata must not be empty"); - wrapper.schema_metadata -} - -type LazySchemaRegistry = Arc>>; -fn schema_reg(reg: &LazySchemaRegistry) -> &HashMap { - reg.get_or_init(load_schema_registry) -} - type LazyGetattRegistry = Arc>>>; fn getatt_reg(reg: &LazyGetattRegistry) -> &HashMap> { reg.get_or_init(load_getatt_type_registry) } -/// Build a schema registry, eagerly merging overlay entries if present. -fn build_schema_registry(catalog: &OverlayCatalog) -> LazySchemaRegistry { - if catalog.is_empty() { - return Arc::new(OnceLock::new()); - } - let mut base = load_schema_registry(); - for (type_name, entry) in &catalog.schema_metadata { - let info = SchemaInfo { - properties: entry.properties.clone(), - required: entry.required.clone(), - property_types: entry.property_types.clone(), - property_enums: entry.property_enums.clone(), - property_constraints: entry.property_constraints.iter().map(|(k, v)| (k.clone(), v.clone())).collect(), - }; - base.insert(type_name.clone(), info); - } - let lock = Arc::new(OnceLock::new()); - // The lock is freshly constructed above so this set cannot fail. - lock.get_or_init(|| base); - lock -} - /// Build a getatt type registry, eagerly merging overlay entries if present. fn build_getatt_registry(catalog: &OverlayCatalog) -> LazyGetattRegistry { if catalog.is_empty() { @@ -1926,15 +1874,15 @@ fn build_getatt_registry(catalog: &OverlayCatalog) -> LazyGetattRegistry { lock } -fn register_schema_properties(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_schema_properties(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "schema_properties".into(), 1, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; - match schema_reg(®istry).get(rtype.as_ref()) { - Some(info) => { - let vals: Vec = info.properties.iter().map(|s| Value::from(s.as_str())).collect(); + match catalog.get(rtype.as_ref()) { + Some(entry) => { + let vals: Vec = entry.properties.iter().map(|s| Value::from(s.as_str())).collect(); Ok(Value::from(vals)) } None => Ok(Value::from(Vec::::new())), @@ -1943,15 +1891,15 @@ fn register_schema_properties(rego: &mut regorus::Engine, registry: LazySchemaRe ); } -fn register_schema_required(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_schema_required(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "schema_required".into(), 1, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; - match schema_reg(®istry).get(rtype.as_ref()) { - Some(info) => { - let vals: Vec = info.required.iter().map(|s| Value::from(s.as_str())).collect(); + match catalog.get(rtype.as_ref()) { + Some(entry) => { + let vals: Vec = entry.required.iter().map(|s| Value::from(s.as_str())).collect(); Ok(Value::from(vals)) } None => Ok(Value::from(Vec::::new())), @@ -1960,14 +1908,14 @@ fn register_schema_required(rego: &mut regorus::Engine, registry: LazySchemaRegi ); } -fn register_schema_type(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_schema_type(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "schema_type".into(), 2, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; let prop = params[1].as_string()?; - match schema_reg(®istry).get(rtype.as_ref()).and_then(|i| i.property_types.get(prop.as_ref())) { + match catalog.get(rtype.as_ref()).and_then(|entry| entry.property_types.get(prop.as_ref())) { Some(s) => Ok(Value::from(s.as_str())), None => Ok(Value::Undefined), } @@ -1975,14 +1923,14 @@ fn register_schema_type(rego: &mut regorus::Engine, registry: LazySchemaRegistry ); } -fn register_schema_enum(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_schema_enum(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "schema_enum".into(), 2, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; let prop = params[1].as_string()?; - match schema_reg(®istry).get(rtype.as_ref()).and_then(|i| i.property_enums.get(prop.as_ref())) { + match catalog.get(rtype.as_ref()).and_then(|entry| entry.property_enums.get(prop.as_ref())) { Some(vals) => { let v: Vec = vals.iter().map(json_to_value).collect(); Ok(Value::from(v)) @@ -1993,14 +1941,14 @@ fn register_schema_enum(rego: &mut regorus::Engine, registry: LazySchemaRegistry ); } -fn register_attribute_type(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_attribute_type(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "attribute_type".into(), 2, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; let attr = params[1].as_string()?; - match schema_reg(®istry).get(rtype.as_ref()).and_then(|i| i.property_types.get(attr.as_ref())) { + match catalog.get(rtype.as_ref()).and_then(|entry| entry.property_types.get(attr.as_ref())) { Some(s) => Ok(Value::from(s.as_str())), None => Ok(Value::Undefined), } @@ -2321,32 +2269,32 @@ fn register_estimated_string_length_bounds(rego: &mut regorus::Engine, holder: S ); } -fn register_schema_string_length(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_schema_string_length(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "schema_string_length".into(), 2, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; let prop = params[1].as_string()?; - let info = match schema_reg(®istry).get(rtype.as_ref()) { - Some(i) => i, + let entry = match catalog.get(rtype.as_ref()) { + Some(entry) => entry, None => return Ok(Value::Undefined), }; - let constraints = match info.property_constraints.get(prop.as_ref()) { - Some(c) => c, + let constraints = match entry.property_constraints.get(prop.as_ref()) { + Some(constraints) => constraints, None => return Ok(Value::Undefined), }; - let is_string = info.property_types.get(prop.as_ref()).map(|t| t == "string").unwrap_or(false); + let is_string = entry.property_types.get(prop.as_ref()).map(|t| t == "string").unwrap_or(false); let mut map = serde_json::Map::new(); - if let Some(v) = constraints.get("minLength") { - map.insert("minLength".into(), v.clone()); - } else if is_string && let Some(v) = constraints.get("minimum") { - map.insert("minLength".into(), v.clone()); + if let Some(v) = constraints.min_length { + map.insert("minLength".into(), serde_json::json!(v)); + } else if is_string && let Some(v) = &constraints.minimum { + map.insert("minLength".into(), serde_json::Value::Number(v.clone())); } - if let Some(v) = constraints.get("maxLength") { - map.insert("maxLength".into(), v.clone()); - } else if is_string && let Some(v) = constraints.get("maximum") { - map.insert("maxLength".into(), v.clone()); + if let Some(v) = constraints.max_length { + map.insert("maxLength".into(), serde_json::json!(v)); + } else if is_string && let Some(v) = &constraints.maximum { + map.insert("maxLength".into(), serde_json::Value::Number(v.clone())); } if map.is_empty() { return Ok(Value::Undefined); @@ -2358,18 +2306,17 @@ fn register_schema_string_length(rego: &mut regorus::Engine, registry: LazySchem /// `schema_requires_unique_items(resource_type, property) -> bool` - true when /// the property's schema constraint sets `uniqueItems: true`. -fn register_schema_requires_unique_items(rego: &mut regorus::Engine, registry: LazySchemaRegistry) { +fn register_schema_requires_unique_items(rego: &mut regorus::Engine, catalog: Arc) { let _ = rego.add_extension( "schema_requires_unique_items".into(), 2, Box::new(move |params: Vec| { let rtype = params[0].as_string()?; let prop = params[1].as_string()?; - let requires_unique = schema_reg(®istry) + let requires_unique = catalog .get(rtype.as_ref()) - .and_then(|info| info.property_constraints.get(prop.as_ref())) - .and_then(|c| c.get("uniqueItems")) - .and_then(|v| v.as_bool()) + .and_then(|entry| entry.property_constraints.get(prop.as_ref())) + .and_then(|constraints| constraints.unique_items) .unwrap_or(false); Ok(Value::from(requires_unique)) }), @@ -2986,7 +2933,8 @@ mod tests { let region: SharedRegion = Arc::new(Mutex::new(None)); let mut rego = regorus::Engine::new(); rego.set_strict_builtin_errors(false); - register_all(&mut rego, holder, region, &OverlayCatalog::default()).expect("register builtins"); + register_all(&mut rego, holder, region, &OverlayCatalog::default(), Arc::new(SchemaMetadataCatalog::new())) + .expect("register builtins"); let policy = format!("package test\nimport rego.v1\nresult := {}", expr); rego.add_policy("test.rego".into(), policy).unwrap(); rego.set_input(Value::new_object()); @@ -3190,7 +3138,8 @@ mod tests { let region: SharedRegion = Arc::new(Mutex::new(Some("us-west-2".to_string()))); let mut rego = regorus::Engine::new(); rego.set_strict_builtin_errors(false); - register_all(&mut rego, holder, region, &OverlayCatalog::default()).expect("register builtins"); + register_all(&mut rego, holder, region, &OverlayCatalog::default(), Arc::new(SchemaMetadataCatalog::new())) + .expect("register builtins"); rego.add_policy("test.rego".into(), "package test\nimport rego.v1\nresult := input_region()".into()).unwrap(); rego.set_input(Value::new_object()); let v = rego.eval_rule("data.test.result".into()).unwrap(); diff --git a/src/rego-engine/src/engine.rs b/src/rego-engine/src/engine.rs index 898e784f..b91639f8 100644 --- a/src/rego-engine/src/engine.rs +++ b/src/rego-engine/src/engine.rs @@ -4,7 +4,7 @@ use diagnostics::{Diagnostic, PhaseMetric, phase_metric}; use guard_translator::{ensure_translatable, pack_name_from_path, parse_guard}; use log::{debug, info, warn}; use rules::{Category, RuleInfo, RuleMetadataEntry, RuleOrigin, Severity, build_rule_metadata_map}; -use schema_validator::{OverlayCatalog, SchemaValidator}; +use schema_validator::{OverlayCatalog, SchemaMetadataCatalog, SchemaValidator, schema_metadata_catalog_with_overlays}; use std::collections::HashMap; use std::str::from_utf8; use std::sync::{Arc, LazyLock, Mutex}; @@ -211,7 +211,9 @@ impl RegoEngine { pub fn new(config: EngineConfig) -> anyhow::Result { let overlay_catalog = config.build_overlay_catalog().map_err(|e| anyhow::anyhow!("Failed to build overlay catalog: {e}"))?; - Self::new_from_catalog(config, &overlay_catalog) + let start = web_time::Instant::now(); + let schema_metadata = schema_metadata_catalog_with_overlays(&overlay_catalog)?; + Self::new_from_parts(config, &overlay_catalog, schema_metadata, start) } /// Constructs the engine reusing metadata from an already-built @@ -220,16 +222,25 @@ impl RegoEngine { /// re-resolve overlay schemas. /// /// This entry point is intended for language bindings and the CLI, which - /// construct a `SchemaValidator` once and share it with the engine. + /// construct a `SchemaValidator` once and share it with the engine. The + /// validator's shared schema-metadata catalog is reused rather than rebuilt, + /// so every engine built from the same validator shares one catalog rather + /// than rebuilding it. #[doc(hidden)] pub fn new_with_schema_validator(config: EngineConfig, validator: &SchemaValidator) -> anyhow::Result { - Self::new_from_catalog(config, validator.overlay_catalog()) - } - - /// Internal constructor that accepts a pre-built overlay catalog. - fn new_from_catalog(config: EngineConfig, overlay_catalog: &OverlayCatalog) -> anyhow::Result { let start = web_time::Instant::now(); - + let schema_metadata = validator.schema_metadata_catalog()?; + Self::new_from_parts(config, validator.overlay_catalog(), schema_metadata, start) + } + + /// Internal constructor that accepts a pre-built overlay catalog and the + /// shared schema-metadata catalog resolved for it. + fn new_from_parts( + config: EngineConfig, + overlay_catalog: &OverlayCatalog, + schema_metadata: Arc, + start: web_time::Instant, + ) -> anyhow::Result { let mut rego = regorus::Engine::new(); rego.set_strict_builtin_errors(false); @@ -339,7 +350,13 @@ impl RegoEngine { let model_holder: SharedModel = Arc::new(Mutex::new(None)); let region_holder: SharedRegion = Arc::new(Mutex::new(None)); - crate::builtins::register_all(&mut rego, model_holder.clone(), region_holder.clone(), overlay_catalog)?; + crate::builtins::register_all( + &mut rego, + model_holder.clone(), + region_holder.clone(), + overlay_catalog, + schema_metadata, + )?; let registry_metadata = build_rule_metadata_map(); let mut external_rule_metadata: HashMap = HashMap::new(); diff --git a/src/schema-validator/src/catalog.rs b/src/schema-validator/src/catalog.rs index 4ba87324..43ce0eb3 100644 --- a/src/schema-validator/src/catalog.rs +++ b/src/schema-validator/src/catalog.rs @@ -8,7 +8,7 @@ //! into the engines by reference. use crate::compiled::{CompiledSchema, PropSchema}; -use serde::{Deserialize, Serialize}; +use data_source::types::{SchemaItemsMetadata, SchemaMetadataCatalog, SchemaMetadataEntry, SchemaPropertyConstraints}; use std::collections::{HashMap, HashSet}; use std::sync::LazyLock; @@ -67,46 +67,10 @@ pub struct OverlayCatalog { /// No entry when primaryIdentifier is empty; "string" when multiple, readOnly, /// or unresolvable; otherwise the resolved single property type. pub ref_returns: HashMap, - /// Schema metadata matching the shape the Rego/CEL engines expect: top-level - /// keys are resource type names, values mirror the `schema_metadata` JSON - /// structure consumed by `schema_properties`, `schema_required`, - /// `schema_type`, `schema_enum`, and `schema_string_length`. - pub schema_metadata: HashMap, -} - -/// Per-resource-type schema metadata matching the JSON structure the engines -/// consume from the build-time `schema_metadata` artifact. -#[derive(Debug, Clone, Default, Serialize, Deserialize)] -pub struct SchemaMetadataEntry { - /// Top-level property names. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub properties: Vec, - /// Top-level required property names. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub required: Vec, - /// Maps property name → type string (e.g. "string", "integer", "object"). - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub property_types: HashMap, - /// Maps property name → list of allowed enum values. - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub property_enums: HashMap>, - /// Maps property name → constraint object (scalar constraints like - /// minLength, maxLength, pattern, min/max items, format, nested - /// sub_properties, array items type/schema, etc.). - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub property_constraints: HashMap, - /// Maps trigger property → list of properties that must also be present. - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub dependent_required: HashMap>, - /// Maps trigger property → list of properties that must NOT be present. - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub dependent_excluded: HashMap>, - /// At-least-one-of group (logical OR of required properties). - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub required_or: Vec, - /// Exactly-one-of group (logical XOR of required properties). - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub required_xor: Vec, + /// Per-type schema metadata for the overlaid resource types, in the same + /// typed model the schema validator and both rule engines share. An overlay + /// entry replaces the base catalog entry for the type it touches. + pub schema_metadata: SchemaMetadataCatalog, } impl OverlayCatalog { @@ -325,18 +289,16 @@ fn resolve_nested_property_type( resolve_nested_property_type(schema, &remaining_parts[1..], &resolved.properties, visited_refs) } -/// Build the schema metadata entry for a resource type matching the JSON shape -/// consumed by the rule engines. Recursively processes nested sub-properties -/// and array items to match the build-time `process.rs` output. +/// Build the schema metadata entry for a resource type in the shared typed +/// model. Recursively processes nested sub-properties and array items to match +/// the build-time `process.rs` output. fn derive_schema_metadata(schema: &CompiledSchema) -> SchemaMetadataEntry { let mut properties: Vec = schema.properties.keys().cloned().collect(); properties.sort(); - let required = schema.required.clone(); - let mut property_types: HashMap = HashMap::new(); let mut property_enums: HashMap> = HashMap::new(); - let mut property_constraints: HashMap = HashMap::new(); + let mut property_constraints: HashMap = HashMap::new(); let mut visiting: HashSet = HashSet::new(); @@ -362,8 +324,7 @@ fn derive_schema_metadata(schema: &CompiledSchema) -> SchemaMetadataEntry { property_enums.insert(name.clone(), resolved.enum_case_insensitive.clone()); } // Constraints (scalar/format/nested/items) - let constraint = build_property_constraint(&resolved, &schema.definitions, &mut visiting); - if !constraint.is_null() { + if let Some(constraint) = build_property_constraint(&resolved, &schema.definitions, &mut visiting) { property_constraints.insert(name.clone(), constraint); } @@ -374,7 +335,7 @@ fn derive_schema_metadata(schema: &CompiledSchema) -> SchemaMetadataEntry { SchemaMetadataEntry { properties, - required, + required: schema.required.clone(), property_types, property_enums, property_constraints, @@ -382,133 +343,144 @@ fn derive_schema_metadata(schema: &CompiledSchema) -> SchemaMetadataEntry { dependent_excluded: schema.dependent_excluded.clone(), required_or: schema.required_or.clone(), required_xor: schema.required_xor.clone(), + ..Default::default() } } -fn string_list_map_to_value(values: &HashMap>) -> serde_json::Value { - let mut keys: Vec<&String> = values.keys().collect(); - keys.sort(); - let mut object = serde_json::Map::new(); - for key in keys { - object.insert( - key.clone(), - serde_json::Value::Array(values[key].iter().cloned().map(serde_json::Value::String).collect()), - ); +/// Convert a schema `minimum`/`maximum` (stored as `f64`) into the JSON number +/// form the build-time artifact records: a whole value becomes an integer, and +/// any other finite value keeps its decimal form. Returns `None` only for a +/// non-finite value, which a JSON-sourced bound can never be. +fn f64_to_number(value: f64) -> Option { + if value.fract() == 0.0 && value.abs() < (i64::MAX as f64) { + Some(serde_json::Number::from(value as i64)) + } else { + serde_json::Number::from_f64(value) } - serde_json::Value::Object(object) } -/// Serialize an f64 as a JSON integer when it represents a whole number, -/// matching the JSON representation that process.rs produces from raw schema -/// values (which are always parsed as serde_json::Number, not f64). -fn f64_to_json(v: f64) -> serde_json::Value { - if v.fract() == 0.0 && v.abs() < (i64::MAX as f64) { serde_json::json!(v as i64) } else { serde_json::json!(v) } -} - -/// Build the constraint JSON object for a resolved property schema. -/// Matches the build-time `extract_property_constraints` in process.rs. +/// Build the typed constraints for a resolved property schema, or `None` when +/// the property carries no constraints. Matches the build-time +/// `extract_property_constraints` in process.rs. fn build_property_constraint( prop: &PropSchema, definitions: &HashMap, visiting: &mut HashSet, -) -> serde_json::Value { - let mut obj = serde_json::Map::new(); +) -> Option { + let mut constraints = SchemaPropertyConstraints::default(); + let mut any = false; - if let Some(ref v) = prop.pattern { - obj.insert("pattern".into(), serde_json::json!(v)); + if let Some(pattern) = &prop.pattern { + constraints.pattern = Some(pattern.clone()); + any = true; } - if let Some(v) = prop.minimum { - obj.insert("minimum".into(), f64_to_json(v)); + if let Some(minimum) = prop.minimum.and_then(f64_to_number) { + constraints.minimum = Some(minimum); + any = true; } - if let Some(v) = prop.maximum { - obj.insert("maximum".into(), f64_to_json(v)); + if let Some(maximum) = prop.maximum.and_then(f64_to_number) { + constraints.maximum = Some(maximum); + any = true; } - if let Some(v) = prop.min_length { - obj.insert("minLength".into(), serde_json::json!(v)); + if let Some(min_length) = prop.min_length { + constraints.min_length = Some(min_length); + any = true; } - if let Some(v) = prop.max_length { - obj.insert("maxLength".into(), serde_json::json!(v)); + if let Some(max_length) = prop.max_length { + constraints.max_length = Some(max_length); + any = true; } - if let Some(v) = prop.min_items { - obj.insert("minItems".into(), serde_json::json!(v)); + if let Some(min_items) = prop.min_items { + constraints.min_items = Some(min_items); + any = true; } - if let Some(v) = prop.max_items { - obj.insert("maxItems".into(), serde_json::json!(v)); + if let Some(max_items) = prop.max_items { + constraints.max_items = Some(max_items); + any = true; } - if let Some(ref v) = prop.format { - obj.insert("format".into(), serde_json::json!(v)); + if let Some(format) = &prop.format { + constraints.format = Some(format.clone()); + any = true; } - if let Some(true) = prop.unique_items { - obj.insert("uniqueItems".into(), serde_json::json!(true)); + if prop.unique_items == Some(true) { + constraints.unique_items = Some(true); + any = true; } // Nested sub-properties (object type with properties) if !prop.properties.is_empty() { - let sub = build_nested_metadata(&prop.properties, &prop.required, definitions, visiting); - obj.insert("sub_properties".into(), sub); + constraints.sub_properties = + Some(Box::new(build_nested_metadata(&prop.properties, &prop.required, definitions, visiting))); + any = true; if !prop.dependent_required.is_empty() { - obj.insert("dependent_required".into(), string_list_map_to_value(&prop.dependent_required)); + constraints.dependent_required = prop.dependent_required.clone(); } if !prop.dependent_excluded.is_empty() { - obj.insert("dependent_excluded".into(), string_list_map_to_value(&prop.dependent_excluded)); + constraints.dependent_excluded = prop.dependent_excluded.clone(); } } // Array items - if let Some(ref items_schema) = prop.items { + if let Some(items_schema) = &prop.items { let item_ref_name = items_schema.ref_name.clone(); let skip_items = item_ref_name.as_ref().map(|n| visiting.contains(n)).unwrap_or(false); if !skip_items { - if let Some(ref rn) = item_ref_name { + if let Some(rn) = &item_ref_name { visiting.insert(rn.clone()); } let resolved_items = items_schema.resolve(definitions); - let mut item_obj = serde_json::Map::new(); - if let Some(pt) = resolved_items.prop_type.as_ref().and_then(|p| p.primary()) { - item_obj.insert("type".into(), serde_json::Value::String(pt.to_string())); + let mut items_metadata = SchemaItemsMetadata::default(); + let mut items_any = false; + if let Some(item_type) = resolved_items.prop_type.as_ref().and_then(|p| p.primary()) { + items_metadata.item_type = Some(item_type.to_string()); + items_any = true; } if !resolved_items.properties.is_empty() { - let nested = - build_nested_metadata(&resolved_items.properties, &resolved_items.required, definitions, visiting); - item_obj.insert("schema".into(), nested); + items_metadata.schema = Some(Box::new(build_nested_metadata( + &resolved_items.properties, + &resolved_items.required, + definitions, + visiting, + ))); + items_any = true; } if !resolved_items.dependent_required.is_empty() { - item_obj - .insert("dependent_required".into(), string_list_map_to_value(&resolved_items.dependent_required)); + items_metadata.dependent_required = resolved_items.dependent_required.clone(); + items_any = true; } if !resolved_items.dependent_excluded.is_empty() { - item_obj - .insert("dependent_excluded".into(), string_list_map_to_value(&resolved_items.dependent_excluded)); + items_metadata.dependent_excluded = resolved_items.dependent_excluded.clone(); + items_any = true; } - if !item_obj.is_empty() { - obj.insert("items".into(), serde_json::Value::Object(item_obj)); + if items_any { + constraints.items = Some(Box::new(items_metadata)); + any = true; } - if let Some(ref rn) = item_ref_name { + if let Some(rn) = &item_ref_name { visiting.remove(rn); } } } - if obj.is_empty() { serde_json::Value::Null } else { serde_json::Value::Object(obj) } + if any { Some(constraints) } else { None } } -/// Builds a nested metadata object for sub-properties, matching the recursive +/// Builds a nested metadata entry for sub-properties, matching the recursive /// `build_property_schema_obj` shape from process.rs. fn build_nested_metadata( properties: &HashMap, required: &[String], definitions: &HashMap, visiting: &mut HashSet, -) -> serde_json::Value { - let mut props: Vec = properties.keys().cloned().collect(); - props.sort(); - let req: Vec = required.to_vec(); - let mut pt: serde_json::Map = serde_json::Map::new(); - let mut pe: serde_json::Map = serde_json::Map::new(); - let mut pc: serde_json::Map = serde_json::Map::new(); - - for (pn, ps) in properties { - let ref_name = ps.ref_name.clone(); +) -> SchemaMetadataEntry { + let mut property_names: Vec = properties.keys().cloned().collect(); + property_names.sort(); + let mut property_types: HashMap = HashMap::new(); + let mut property_enums: HashMap> = HashMap::new(); + let mut property_constraints: HashMap = HashMap::new(); + + for (name, prop) in properties { + let ref_name = prop.ref_name.clone(); if let Some(ref rn) = ref_name { if visiting.contains(rn) { continue; @@ -516,18 +488,17 @@ fn build_nested_metadata( visiting.insert(rn.clone()); } - let resolved = ps.resolve(definitions); - if let Some(t) = resolved.prop_type.as_ref().and_then(|p| p.primary()) { - pt.insert(pn.clone(), serde_json::Value::String(t.to_string())); + let resolved = prop.resolve(definitions); + if let Some(pt) = resolved.prop_type.as_ref().and_then(|p| p.primary()) { + property_types.insert(name.clone(), pt.to_string()); } if !resolved.enum_values.is_empty() { - pe.insert(pn.clone(), serde_json::json!(resolved.enum_values)); + property_enums.insert(name.clone(), resolved.enum_values.clone()); } else if !resolved.enum_case_insensitive.is_empty() { - pe.insert(pn.clone(), serde_json::json!(resolved.enum_case_insensitive)); + property_enums.insert(name.clone(), resolved.enum_case_insensitive.clone()); } - let constraints = build_property_constraint(&resolved, definitions, visiting); - if !constraints.is_null() { - pc.insert(pn.clone(), constraints); + if let Some(constraint) = build_property_constraint(&resolved, definitions, visiting) { + property_constraints.insert(name.clone(), constraint); } if let Some(ref rn) = ref_name { @@ -535,16 +506,14 @@ fn build_nested_metadata( } } - let mut obj = serde_json::json!({ - "properties": props, - "required": req, - "property_types": pt, - "property_enums": pe, - }); - if !pc.is_empty() { - obj["property_constraints"] = serde_json::Value::Object(pc); + SchemaMetadataEntry { + properties: property_names, + required: required.to_vec(), + property_types, + property_enums, + property_constraints, + ..Default::default() } - obj } #[cfg(test)] @@ -673,8 +642,8 @@ mod tests { // Constraints for Name let name_constraints = meta.property_constraints.get("Name").expect("Name constraints"); - assert_eq!(name_constraints.get("minLength"), Some(&json!(1))); - assert_eq!(name_constraints.get("maxLength"), Some(&json!(64))); + assert_eq!(name_constraints.min_length, Some(1)); + assert_eq!(name_constraints.max_length, Some(64)); } #[test] @@ -798,24 +767,24 @@ mod tests { // Config has sub_properties let config_c = meta.property_constraints.get("Config").expect("Config constraints"); - let sub = config_c.get("sub_properties").expect("sub_properties for Config"); - assert!(sub["properties"].as_array().unwrap().contains(&json!("Name"))); - assert!(sub["properties"].as_array().unwrap().contains(&json!("Port"))); - assert!(sub["required"].as_array().unwrap().contains(&json!("Name"))); - assert_eq!(sub["property_types"]["Name"], json!("string")); - assert_eq!(sub["property_types"]["Port"], json!("integer")); - let name_c = sub["property_constraints"]["Name"].as_object().expect("Name constraints in sub"); - assert_eq!(name_c.get("maxLength"), Some(&json!(32))); - let port_c = sub["property_constraints"]["Port"].as_object().expect("Port constraints in sub"); - assert_eq!(port_c.get("minimum"), Some(&json!(1))); + let sub = config_c.sub_properties.as_ref().expect("sub_properties for Config"); + assert!(sub.properties.contains(&"Name".to_string())); + assert!(sub.properties.contains(&"Port".to_string())); + assert!(sub.required.contains(&"Name".to_string())); + assert_eq!(sub.property_types.get("Name"), Some(&"string".to_string())); + assert_eq!(sub.property_types.get("Port"), Some(&"integer".to_string())); + let name_c = sub.property_constraints.get("Name").expect("Name constraints in sub"); + assert_eq!(name_c.max_length, Some(32)); + let port_c = sub.property_constraints.get("Port").expect("Port constraints in sub"); + assert_eq!(port_c.minimum, Some(serde_json::Number::from(1))); // Items has items schema let items_c = meta.property_constraints.get("Items").expect("Items constraints"); - let items = items_c.get("items").expect("items sub-schema"); - assert_eq!(items["type"], json!("object")); - let items_schema = items.get("schema").expect("items.schema"); - assert!(items_schema["properties"].as_array().unwrap().contains(&json!("Key"))); - assert!(items_schema["required"].as_array().unwrap().contains(&json!("Key"))); + let items = items_c.items.as_ref().expect("items sub-schema"); + assert_eq!(items.item_type.as_deref(), Some("object")); + let items_schema = items.schema.as_ref().expect("items.schema"); + assert!(items_schema.properties.contains(&"Key".to_string())); + assert!(items_schema.required.contains(&"Key".to_string())); } #[test] @@ -939,9 +908,9 @@ mod tests { let catalog = OverlayCatalog::from_store(&store, &["AWS::Test::Format".to_string()]); let meta = catalog.schema_metadata.get("AWS::Test::Format").expect("metadata"); let email_c = meta.property_constraints.get("Email").expect("Email constraints"); - assert_eq!(email_c.get("format"), Some(&json!("email"))); + assert_eq!(email_c.format.as_deref(), Some("email")); let arn_c = meta.property_constraints.get("Arn").expect("Arn constraints"); - assert_eq!(arn_c.get("format"), Some(&json!("AWS::EC2::VPC.Id"))); + assert_eq!(arn_c.format.as_deref(), Some("AWS::EC2::VPC.Id")); } #[test] @@ -993,4 +962,54 @@ mod tests { assert_eq!(meta.required_or, vec!["A".to_string(), "B".to_string()]); assert_eq!(meta.required_xor, vec!["B".to_string(), "C".to_string()]); } + + /// The runtime derivation (from `CompiledSchema`) and the committed artifact + /// (built from the raw provider schemas) are produced by two separate + /// build-time paths, so they agree on the structural shape of every bundled + /// type - property names, required lists, and dependency groups - which is + /// what the overlay path relies on staying faithful to. Each derived entry is + /// also losslessly representable in the shared typed model. + /// + /// Per-property value fields (types, enums, scalar constraints) are resolved + /// through the compiled definitions rather than the raw schema, so they can + /// differ from the raw-schema artifact; that difference predates and is + /// independent of the typed model, whose fidelity against the artifact is + /// proven by the round-trip test in `data-source`. + #[test] + fn full_catalog_derivation_matches_committed_artifact_structure() { + let document: data_source::types::SchemaMetadataDocument = + serde_json::from_slice(&data_source::embedded::SCHEMA_METADATA_BYTES).expect("committed artifact parses"); + let store = CompiledSchemaStore::new(); + let mut checked = 0usize; + for (type_name, artifact_entry) in &document.schema_metadata { + let Some(schema) = store.get(type_name) else { + continue; + }; + let derived = derive_schema_metadata(schema); + + assert_eq!(derived.properties, artifact_entry.properties, "{type_name}: property names diverge"); + assert_eq!(derived.required, artifact_entry.required, "{type_name}: required lists diverge"); + assert_eq!( + derived.dependent_required, artifact_entry.dependent_required, + "{type_name}: dependent_required diverges" + ); + assert_eq!( + derived.dependent_excluded, artifact_entry.dependent_excluded, + "{type_name}: dependent_excluded diverges" + ); + assert_eq!(derived.required_or, artifact_entry.required_or, "{type_name}: required_or diverges"); + assert_eq!(derived.required_xor, artifact_entry.required_xor, "{type_name}: required_xor diverges"); + + let serialized = serde_json::to_value(&derived).expect("derived entry serializes"); + let reparsed: data_source::types::SchemaMetadataEntry = + serde_json::from_value(serialized.clone()).expect("derived entry reparses through the shared model"); + assert_eq!( + serde_json::to_value(&reparsed).expect("reparsed serializes"), + serialized, + "{type_name}: derived entry is not losslessly representable in the shared model" + ); + checked += 1; + } + assert!(checked > 100, "expected to check many bundled types, only checked {checked}"); + } } diff --git a/src/schema-validator/src/lib.rs b/src/schema-validator/src/lib.rs index 62c0ac80..f352d5bc 100644 --- a/src/schema-validator/src/lib.rs +++ b/src/schema-validator/src/lib.rs @@ -19,11 +19,13 @@ pub fn prewarm_embedded_data() { data_source::embedded::warm_all(); } +pub use data_source::types::SchemaMetadataCatalog; +use data_source::types::SchemaMetadataDocument; use diagnostics::{Diagnostic, PhaseMetric, phase_metric}; use log::{info, warn}; use rules::{RuleInfo, lookup_rule}; use serde::{Deserialize, Serialize}; -use std::sync::Arc; +use std::sync::{Arc, OnceLock}; use template_model::SemanticModel; pub struct SchemaValidationResult { @@ -142,10 +144,85 @@ fn build_validated_overlay_catalog( Ok(OverlayCatalog::from_store(store, type_names)) } +/// Error reported when the shared schema-metadata catalog cannot be produced. +#[derive(Debug)] +pub enum SchemaMetadataError { + /// The embedded `schema_metadata` artifact is not valid JSON for the model. + Parse(serde_json::Error), + /// The embedded `schema_metadata` artifact is present but empty. + Empty, +} + +impl std::fmt::Display for SchemaMetadataError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + SchemaMetadataError::Parse(e) => write!(f, "Failed to parse embedded schema_metadata: {e}"), + SchemaMetadataError::Empty => write!(f, "Embedded schema_metadata must not be empty"), + } + } +} + +impl std::error::Error for SchemaMetadataError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + SchemaMetadataError::Parse(e) => Some(e), + SchemaMetadataError::Empty => None, + } + } +} + +/// The process-wide base schema-metadata catalog: the bundled artifact parsed +/// once into the shared typed model and handed out by reference. +/// +/// Parsing is lazy and fallible - schema-only construction never triggers it, a +/// caller that needs the catalog gets the same [`Arc`] every other default +/// caller shares, and a corrupt embedded artifact surfaces as an error rather +/// than a panic or a plausible-looking empty catalog. +pub fn shared_base_schema_metadata() -> Result, SchemaMetadataError> { + static BASE: OnceLock> = OnceLock::new(); + if let Some(existing) = BASE.get() { + return Ok(existing.clone()); + } + let document: SchemaMetadataDocument = + serde_json::from_slice(&data_source::embedded::SCHEMA_METADATA_BYTES).map_err(SchemaMetadataError::Parse)?; + if document.schema_metadata.is_empty() { + return Err(SchemaMetadataError::Empty); + } + // On a construction race the redundant parse is discarded and every caller + // still observes the single shared value the winner installed. + Ok(BASE.get_or_init(|| Arc::new(document.schema_metadata)).clone()) +} + +/// Produce the schema-metadata catalog an engine should use for a given overlay. +/// +/// With no overlaid metadata this returns the shared global base [`Arc`] itself, +/// so every default engine and validator in the process shares one parsed +/// catalog. With overlays it clones the base once and replaces the entry for +/// each overlaid type, preserving the base for every untouched type. +#[doc(hidden)] +pub fn schema_metadata_catalog_with_overlays( + overlay: &OverlayCatalog, +) -> Result, SchemaMetadataError> { + let base = shared_base_schema_metadata()?; + if overlay.schema_metadata.is_empty() { + return Ok(base); + } + let mut merged = (*base).clone(); + for (type_name, entry) in &overlay.schema_metadata { + merged.insert(type_name.clone(), entry.clone()); + } + Ok(Arc::new(merged)) +} + pub struct SchemaValidator { store: CompiledSchemaStore, catalog: OverlayCatalog, init_metric: PhaseMetric, + /// The shared schema-metadata catalog for this validator, resolved lazily on + /// first request. A default validator resolves to the global base [`Arc`]; an + /// overlay validator clones the base and replaces its overlaid entries once, + /// then hands the same [`Arc`] to every engine built from it. + metadata_catalog: OnceLock>, } impl Default for SchemaValidator { @@ -237,6 +314,27 @@ impl SchemaValidator { &self.catalog } + /// The shared schema-metadata catalog for this validator, resolved on first + /// call and cached thereafter. + /// + /// A default validator hands back the process-wide base [`Arc`], so every + /// default consumer shares one parsed catalog. An overlay validator clones + /// the base once, replaces its overlaid entries, and returns the same [`Arc`] + /// to every later caller - so a Rego and a CEL engine built from one + /// validator share the identical catalog rather than each rebuilding it. + /// + /// Fallible: a corrupt embedded artifact surfaces as an error instead of a + /// panic. Construction never calls this, so a validator that is only used for + /// schema validation never parses the metadata. + #[doc(hidden)] + pub fn schema_metadata_catalog(&self) -> Result, SchemaMetadataError> { + if let Some(existing) = self.metadata_catalog.get() { + return Ok(existing.clone()); + } + let catalog = schema_metadata_catalog_with_overlays(&self.catalog)?; + Ok(self.metadata_catalog.get_or_init(|| catalog).clone()) + } + fn finish( store: CompiledSchemaStore, catalog: OverlayCatalog, @@ -252,7 +350,7 @@ impl SchemaValidator { } else { info!("SchemaValidator initialized: {} schemas loaded", store.len()); } - SchemaValidator { store, catalog, init_metric } + SchemaValidator { store, catalog, init_metric, metadata_catalog: OnceLock::new() } } pub fn init_metric(&self) -> &PhaseMetric { @@ -384,6 +482,46 @@ Resources: assert!(validator.overlay_catalog().is_empty()); } + #[test] + fn schema_metadata_is_lazy_and_shared_by_default_validators() { + let first = SchemaValidator::default(); + let second = SchemaValidator::default(); + assert!(first.metadata_catalog.get().is_none(), "construction must not parse rule metadata"); + assert!(second.metadata_catalog.get().is_none(), "construction must not parse rule metadata"); + + let first_catalog = first.schema_metadata_catalog().expect("embedded metadata parses"); + let first_again = first.schema_metadata_catalog().expect("cached metadata remains available"); + let second_catalog = second.schema_metadata_catalog().expect("embedded metadata is shared"); + + assert!(Arc::ptr_eq(&first_catalog, &first_again), "one validator must reuse its cached Arc"); + assert!(Arc::ptr_eq(&first_catalog, &second_catalog), "default validators must share the process-wide Arc"); + } + + #[test] + fn overlay_schema_metadata_is_merged_once_per_validator() { + let validator = SchemaValidator::try_with_additional_schemas([( + "AWS::S3::Bucket", + serde_json::json!({"properties": {"OverlayProperty": {"type": "string"}}}), + )]) + .expect("overlay applies"); + assert!(validator.metadata_catalog.get().is_none(), "overlay construction must leave rule metadata lazy"); + + let base = shared_base_schema_metadata().expect("base metadata parses"); + let merged = validator.schema_metadata_catalog().expect("overlay metadata merges"); + let merged_again = validator.schema_metadata_catalog().expect("merged metadata remains available"); + + assert!(!Arc::ptr_eq(&base, &merged), "an overlay must not mutate the shared base catalog"); + assert!(Arc::ptr_eq(&merged, &merged_again), "an overlay validator must cache one merged Arc"); + assert!( + merged["AWS::S3::Bucket"].properties.contains(&"OverlayProperty".to_string()), + "the shared engine catalog must contain the overlay-derived property" + ); + assert!( + !base["AWS::S3::Bucket"].properties.contains(&"OverlayProperty".to_string()), + "the process-wide base catalog must remain unchanged" + ); + } + #[test] fn should_warn_for_aws_types_but_not_private_providers() { assert!( diff --git a/src/schema-validator/src/validate.rs b/src/schema-validator/src/validate.rs index aa913224..1c6e867d 100644 --- a/src/schema-validator/src/validate.rs +++ b/src/schema-validator/src/validate.rs @@ -152,7 +152,7 @@ pub fn validate_all_resources( ) -> Vec { reset_schema_budget_exhaustions(); let mut out = Vec::new(); - let relevant: HashSet<&str> = model.resources.values().map(|r| r.resource_type.as_str()).collect(); + let relevant: HashSet<&str> = model.resources_by_type.keys().map(String::as_str).collect(); validate_lifecycle(&mut out, store, model); diff --git a/src/template-model/src/model.rs b/src/template-model/src/model.rs index 68cfed41..7852581c 100644 --- a/src/template-model/src/model.rs +++ b/src/template-model/src/model.rs @@ -13,7 +13,8 @@ use crate::sam; use crate::span::SpanProvider; use log::{debug, info, warn}; use serde::Serialize; -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::cmp::Reverse; +use std::collections::{BTreeMap, BTreeSet, BinaryHeap, HashMap, HashSet}; use std::sync::Arc; use std::sync::Mutex; use std::sync::atomic::{AtomicBool, AtomicU64, Ordering}; @@ -127,6 +128,87 @@ struct PrimaryIdentifierScenario { assumptions: Vec<(String, bool)>, } +/// Where a candidate comparison sits in the original all-pairs traversal: left +/// resource, then right resource, then left scenario, then right scenario. Merging +/// every identity group by this key replays comparisons - and therefore the +/// satisfiability queries they issue - in the identical order and count the +/// all-pairs traversal produced, so the model's shared, cumulative satisfiability +/// budget is drawn down exactly as before. +type PrimaryIdentifierComparisonOrder = (usize, usize, usize, usize); + +/// Yields the resource/scenario comparisons within one primary-identifier identity +/// group in [`PrimaryIdentifierComparisonOrder`]. Grouping by identity first skips +/// the cross-identity pairs the all-pairs traversal built only to discard, while +/// this cursor preserves the surviving comparisons' original order so results and +/// satisfiability accounting are unchanged. +struct IdentityGroupPairCursor { + /// Distinct resources in the group in ascending `per_resource` index, each with + /// its matching scenario indices in ascending order. + resources: Vec<(usize, Vec)>, + left_resource: usize, + right_resource: usize, + left_scenario: usize, + right_scenario: usize, +} + +impl IdentityGroupPairCursor { + /// A cursor over one identity group's comparisons, or `None` when the group + /// spans fewer than two resources and so has nothing to compare. `candidates` + /// are `(per_resource index, scenario index)` pairs in ascending order, so + /// consecutive entries that share a resource index belong to that resource. + fn new(candidates: &[(usize, usize)]) -> Option { + let mut resources: Vec<(usize, Vec)> = Vec::new(); + for &(resource_index, scenario_index) in candidates { + match resources.last_mut() { + Some((last_resource_index, scenario_indices)) if *last_resource_index == resource_index => { + scenario_indices.push(scenario_index); + } + _ => resources.push((resource_index, vec![scenario_index])), + } + } + if resources.len() < 2 { + return None; + } + Some(Self { resources, left_resource: 0, right_resource: 1, left_scenario: 0, right_scenario: 0 }) + } +} + +impl Iterator for IdentityGroupPairCursor { + type Item = PrimaryIdentifierComparisonOrder; + + fn next(&mut self) -> Option { + while self.left_resource + 1 < self.resources.len() { + if self.right_resource >= self.resources.len() { + self.left_resource += 1; + self.right_resource = self.left_resource + 1; + self.left_scenario = 0; + self.right_scenario = 0; + continue; + } + if self.left_scenario >= self.resources[self.left_resource].1.len() { + self.right_resource += 1; + self.left_scenario = 0; + self.right_scenario = 0; + continue; + } + if self.right_scenario >= self.resources[self.right_resource].1.len() { + self.left_scenario += 1; + self.right_scenario = 0; + continue; + } + let comparison = ( + self.resources[self.left_resource].0, + self.resources[self.right_resource].0, + self.resources[self.left_resource].1[self.left_scenario], + self.resources[self.right_resource].1[self.right_scenario], + ); + self.right_scenario += 1; + return Some(comparison); + } + None + } +} + /// An Fn::ForEach loop within a resource that expands a property over a collection. #[derive(Debug, Clone, Serialize)] #[cfg_attr(feature = "wasm-bindings", derive(tsify::Tsify))] @@ -1184,28 +1266,109 @@ impl SemanticModel { } } - let mut conflicts: BTreeMap, (Vec, BTreeSet)> = BTreeMap::new(); - for left_index in 0..per_resource.len() { - for right_index in (left_index + 1)..per_resource.len() { - let (left_resource, left_scenarios) = &per_resource[left_index]; - let (right_resource, right_scenarios) = &per_resource[right_index]; - for left in left_scenarios { - for right in right_scenarios { - if left.identity_tuple != right.identity_tuple { - continue; - } - let mut assumptions = left.assumptions.clone(); - assumptions.extend(right.assumptions.iter().cloned()); - if assumptions.is_empty() || self.conditions.is_satisfiable(&assumptions) { - let (_, resources) = conflicts - .entry(left.identity_tuple.clone()) - .or_insert_with(|| (left.display_tuple.clone(), BTreeSet::new())); - resources.insert((*left_resource).clone()); - resources.insert((*right_resource).clone()); + // When every scenario has one comparison identity, grouping cannot skip + // any work. Keep the original tight traversal for that dense case so the + // optimization adds no cursor or heap overhead where it has nothing to + // prune. The preliminary linear scan is negligible beside the pairwise + // traversal and establishes that this is exactly one identity group. + let first_identity = per_resource + .first() + .and_then(|(_, scenarios)| scenarios.first()) + .map(|scenario| scenario.identity_tuple.as_slice()); + let has_one_identity = first_identity.is_some_and(|identity| { + per_resource + .iter() + .flat_map(|(_, scenarios)| scenarios) + .all(|scenario| scenario.identity_tuple.as_slice() == identity) + }); + if has_one_identity { + let mut conflicts: BTreeMap, (Vec, BTreeSet)> = BTreeMap::new(); + for left_index in 0..per_resource.len() { + for right_index in (left_index + 1)..per_resource.len() { + let (left_resource, left_scenarios) = &per_resource[left_index]; + let (right_resource, right_scenarios) = &per_resource[right_index]; + for left in left_scenarios { + for right in right_scenarios { + let mut assumptions = left.assumptions.clone(); + assumptions.extend(right.assumptions.iter().cloned()); + if assumptions.is_empty() || self.conditions.is_satisfiable(&assumptions) { + let (_, resources) = conflicts + .entry(left.identity_tuple.clone()) + .or_insert_with(|| (left.display_tuple.clone(), BTreeSet::new())); + resources.insert((*left_resource).clone()); + resources.insert((*right_resource).clone()); + } } } } } + return conflicts.into_values().collect(); + } + + // Two resources can only collide when their identifier tuples are equal, so + // group scenarios by comparison identity and confine every comparison to a + // group. A resource with a unique tuple forms a singleton group and does no + // cross-resource or satisfiability work - the common case the earlier + // all-pairs traversal paid for on every template. + let mut candidates_by_identity: HashMap<&[String], Vec<(usize, usize)>> = HashMap::new(); + for (resource_index, (_, scenarios)) in per_resource.iter().enumerate() { + for (scenario_index, scenario) in scenarios.iter().enumerate() { + candidates_by_identity + .entry(scenario.identity_tuple.as_slice()) + .or_default() + .push((resource_index, scenario_index)); + } + } + let mut cursors: Vec = candidates_by_identity + .into_values() + .filter_map(|candidates| IdentityGroupPairCursor::new(&candidates)) + .collect(); + + let mut conflicts: BTreeMap, (Vec, BTreeSet)> = BTreeMap::new(); + { + let mut record_conflict = |comparison: PrimaryIdentifierComparisonOrder| { + let (left_resource_index, right_resource_index, left_scenario_index, right_scenario_index) = comparison; + let (left_resource, left_scenarios) = &per_resource[left_resource_index]; + let (right_resource, right_scenarios) = &per_resource[right_resource_index]; + let left = &left_scenarios[left_scenario_index]; + let right = &right_scenarios[right_scenario_index]; + let mut assumptions = left.assumptions.clone(); + assumptions.extend(right.assumptions.iter().cloned()); + if assumptions.is_empty() || self.conditions.is_satisfiable(&assumptions) { + let (_, resources) = conflicts + .entry(left.identity_tuple.clone()) + .or_insert_with(|| (left.display_tuple.clone(), BTreeSet::new())); + resources.insert((*left_resource).clone()); + resources.insert((*right_resource).clone()); + } + }; + + // Visit the surviving comparisons in the exact order the all-pairs + // traversal reached them by merging the groups on comparison order. Every + // satisfiability query then runs in the identical sequence and count, + // leaving the model's shared, cumulative budget drawn down exactly as + // before. A single group is already ordered, so it needs no merge and + // keeps the all-duplicate case as cheap as the traversal it replaces. + if cursors.len() <= 1 { + if let Some(cursor) = cursors.pop() { + for comparison in cursor { + record_conflict(comparison); + } + } + } else { + let mut frontier = BinaryHeap::with_capacity(cursors.len()); + for (cursor_index, cursor) in cursors.iter_mut().enumerate() { + if let Some(comparison) = cursor.next() { + frontier.push(Reverse((comparison, cursor_index))); + } + } + while let Some(Reverse((comparison, cursor_index))) = frontier.pop() { + record_conflict(comparison); + if let Some(next_comparison) = cursors[cursor_index].next() { + frontier.push(Reverse((next_comparison, cursor_index))); + } + } + } } conflicts.into_values().collect() } @@ -3701,6 +3864,285 @@ Resources: assert!(!value.contains("expr:"), "tuple value must not contain expr: prefix"); } + /// The pre-grouping all-pairs traversal, kept verbatim so tests can prove the + /// grouped implementation is byte-for-byte equivalent - including how the shared + /// satisfiability budget is spent. + fn primary_identifier_conflicts_all_pairs_reference( + model: &SemanticModel, + resource_type: &str, + identifier_properties: &[String], + ) -> Vec<(Vec, BTreeSet)> { + let mut per_resource = Vec::new(); + for resource_id in model.resources_of_type(resource_type) { + let scenarios = model.primary_identifier_scenarios(resource_id, identifier_properties); + if !scenarios.is_empty() { + per_resource.push((resource_id, scenarios)); + } + } + let mut conflicts: BTreeMap, (Vec, BTreeSet)> = BTreeMap::new(); + for left_index in 0..per_resource.len() { + for right_index in (left_index + 1)..per_resource.len() { + let (left_resource, left_scenarios) = &per_resource[left_index]; + let (right_resource, right_scenarios) = &per_resource[right_index]; + for left in left_scenarios { + for right in right_scenarios { + if left.identity_tuple != right.identity_tuple { + continue; + } + let mut assumptions = left.assumptions.clone(); + assumptions.extend(right.assumptions.iter().cloned()); + if assumptions.is_empty() || model.conditions.is_satisfiable(&assumptions) { + let (_, resources) = conflicts + .entry(left.identity_tuple.clone()) + .or_insert_with(|| (left.display_tuple.clone(), BTreeSet::new())); + resources.insert((*left_resource).clone()); + resources.insert((*right_resource).clone()); + } + } + } + } + } + conflicts.into_values().collect() + } + + #[test] + fn primary_id_unconditional_resource_collides_with_every_conditional_duplicate() { + let template = r#" +Parameters: + Env: {Type: String} +Conditions: + IsAlpha: !Equals [!Ref Env, alpha] + IsBeta: !Equals [!Ref Env, beta] +Resources: + Always: + Type: AWS::S3::Bucket + Properties: {BucketName: shared} + WhenAlpha: + Type: AWS::S3::Bucket + Condition: IsAlpha + Properties: {BucketName: shared} + WhenBeta: + Type: AWS::S3::Bucket + Condition: IsBeta + Properties: {BucketName: shared} +"#; + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let conflicts = model.primary_identifier_conflicts("AWS::S3::Bucket", &["BucketName".to_string()]); + assert_eq!(conflicts.len(), 1, "the single shared name is one collision group: {conflicts:?}"); + let (display, resources) = conflicts.into_iter().next().unwrap(); + assert_eq!(display, vec!["shared".to_string()]); + assert_eq!( + resources, + BTreeSet::from(["Always".to_string(), "WhenAlpha".to_string(), "WhenBeta".to_string()]), + "the unconditional resource collides with each conditional duplicate, joining all three even though the two conditions are themselves mutually exclusive" + ); + } + + #[test] + fn primary_id_mutually_exclusive_conditions_across_identities_never_collide() { + let template = r#" +Parameters: + Env: {Type: String} + Left: {Type: String} + Right: {Type: String} +Conditions: + IsProd: !Equals [!Ref Env, prod] + IsNotProd: !Not [!Condition IsProd] +Resources: + LeftProd: + Type: AWS::S3::Bucket + Condition: IsProd + Properties: {BucketName: !Ref Left} + LeftDev: + Type: AWS::S3::Bucket + Condition: IsNotProd + Properties: {BucketName: !Ref Left} + RightProd: + Type: AWS::S3::Bucket + Condition: IsProd + Properties: {BucketName: !Ref Right} + RightDev: + Type: AWS::S3::Bucket + Condition: IsNotProd + Properties: {BucketName: !Ref Right} +"#; + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let conflicts = model.primary_identifier_conflicts("AWS::S3::Bucket", &["BucketName".to_string()]); + assert!( + conflicts.is_empty(), + "each identity's two resources are guarded by mutually exclusive conditions, so neither identity group yields a collision: {conflicts:?}" + ); + } + + #[test] + fn primary_id_duplicate_scenarios_of_one_resource_do_not_self_collide() { + let template = r#" +Parameters: + Env: {Type: String} +Conditions: + IsProd: !Equals [!Ref Env, prod] +Resources: + Lonely: + Type: AWS::S3::Bucket + Properties: + BucketName: !If [IsProd, shared, shared] +"#; + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let scenarios = model.primary_identifier_scenarios("Lonely", &["BucketName".to_string()]); + assert!( + scenarios.len() >= 2, + "the Fn::If must expand into multiple scenarios so self-comparison is actually exercised: {}", + scenarios.len() + ); + let identities: BTreeSet> = + scenarios.iter().map(|scenario| scenario.identity_tuple.clone()).collect(); + assert_eq!(identities.len(), 1, "the branches must share one comparison identity so they land in one group"); + + let conflicts = model.primary_identifier_conflicts("AWS::S3::Bucket", &["BucketName".to_string()]); + assert!( + conflicts.is_empty(), + "a single resource whose branches produce the same identifier must not be reported as colliding with itself: {conflicts:?}" + ); + } + + #[test] + fn primary_id_overlapping_conditions_collide() { + let template = r#" +Parameters: + Env: {Type: String} + Name: {Type: String} +Conditions: + NotAlpha: !Not [!Equals [!Ref Env, alpha]] + NotBeta: !Not [!Equals [!Ref Env, beta]] +Resources: + One: + Type: AWS::S3::Bucket + Condition: NotAlpha + Properties: {BucketName: !Ref Name} + Two: + Type: AWS::S3::Bucket + Condition: NotBeta + Properties: {BucketName: !Ref Name} +"#; + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let conflicts = model.primary_identifier_conflicts("AWS::S3::Bucket", &["BucketName".to_string()]); + assert_eq!( + conflicts.len(), + 1, + "the two resources share one identity and their conditions can both hold: {conflicts:?}" + ); + let (_, resources) = conflicts.into_iter().next().unwrap(); + assert_eq!(resources, BTreeSet::from(["One".to_string(), "Two".to_string()])); + } + + #[test] + fn primary_id_display_tuple_comes_from_first_compatible_pair_not_first_candidate() { + let template = r#" +Parameters: + Env: {Type: String} +Conditions: + IsProd: !Equals [!Ref Env, prod] + IsDev: !Not [!Condition IsProd] +Resources: + ProdKeyed: + Type: AWS::S3::Bucket + Condition: IsProd + Properties: + BucketName: {alpha: one, beta: two} + DevKeyedFirst: + Type: AWS::S3::Bucket + Condition: IsDev + Properties: + BucketName: {beta: two, alpha: one} + DevKeyedSecond: + Type: AWS::S3::Bucket + Condition: IsDev + Properties: + BucketName: {beta: two, alpha: one} +"#; + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let conflicts = model.primary_identifier_conflicts("AWS::S3::Bucket", &["BucketName".to_string()]); + assert_eq!(conflicts.len(), 1, "all three author the same key-sorted identity: {conflicts:?}"); + let (display, resources) = conflicts.into_iter().next().unwrap(); + assert_eq!( + resources, + BTreeSet::from(["DevKeyedFirst".to_string(), "DevKeyedSecond".to_string()]), + "the earlier-declared prod resource is mutually exclusive with both dev resources, so it never forms a compatible pair and is absent from the group" + ); + assert!( + display[0].starts_with("{\"beta\""), + "display must come from the left scenario of the first compatible pair (a dev resource, authored beta-first), not the earlier incompatible prod candidate authored alpha-first: {display:?}" + ); + } + + #[test] + fn primary_id_grouped_traversal_matches_all_pairs_reference_and_sat_budget() { + let template = r#" +Parameters: + Env: {Type: String} + Shared: {Type: String} +Conditions: + IsProd: !Equals [!Ref Env, prod] + IsStaging: !Equals [!Ref Env, staging] + IsProdAlias: !Equals [!Ref Env, prod] +Resources: + AlphaAlways: + Type: AWS::S3::Bucket + Properties: {BucketName: alpha} + AlphaProd: + Type: AWS::S3::Bucket + Condition: IsProd + Properties: {BucketName: alpha} + AlphaStaging: + Type: AWS::S3::Bucket + Condition: IsStaging + Properties: {BucketName: alpha} + BetaProd: + Type: AWS::S3::Bucket + Condition: IsProd + Properties: {BucketName: beta} + BetaProdAlias: + Type: AWS::S3::Bucket + Condition: IsProdAlias + Properties: {BucketName: beta} + SharedOne: + Type: AWS::S3::Bucket + Properties: {BucketName: !Ref Shared} + SharedTwo: + Type: AWS::S3::Bucket + Properties: {BucketName: !Ref Shared} + Unique: + Type: AWS::S3::Bucket + Properties: {BucketName: unique} +"#; + let identifier_properties = ["BucketName".to_string()]; + + let reference_model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let reference = primary_identifier_conflicts_all_pairs_reference( + &reference_model, + "AWS::S3::Bucket", + &identifier_properties, + ); + let reference_budget = reference_model.conditions.sat_iterations_used(); + + let model = SemanticModel::from_bytes(template.as_bytes()).unwrap(); + let grouped = model.primary_identifier_conflicts("AWS::S3::Bucket", &identifier_properties); + let grouped_budget = model.conditions.sat_iterations_used(); + + assert_eq!( + grouped, reference, + "grouped traversal must produce the identical conflicts as the all-pairs reference" + ); + assert!( + reference_budget > 0, + "the fixture must drive the satisfiability solver so the budget comparison is meaningful" + ); + assert_eq!( + grouped_budget, reference_budget, + "grouped traversal must issue satisfiability queries in the same order and count, spending the shared budget identically across multiple identities" + ); + } + #[test] fn output_invalid_ref_has_canonical_path() { let template = "Resources:\n R:\n Type: T\nOutputs:\n Bad:\n Value: !Ref Missing\n"; From e72b861248cd083c89d63a5c18def42eb09ae452 Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Fri, 28 Aug 2026 07:40:06 -0600 Subject: [PATCH 2/6] more perf --- src/cel-engine/src/rules/resources_extra.rs | 102 ++++++++++-------- .../rego/resources/ec2/vpc_subnet_cidr.rego | 7 +- .../properties/primary_identifiers.rego | 4 +- src/rego-engine/src/builtins.rs | 2 +- src/schema-validator/src/validate.rs | 21 ++-- src/template-model/src/model.rs | 80 +++++++++++--- src/template-model/src/region_enums.rs | 14 ++- 7 files changed, 155 insertions(+), 75 deletions(-) diff --git a/src/cel-engine/src/rules/resources_extra.rs b/src/cel-engine/src/rules/resources_extra.rs index ec69ebb4..5900b2fc 100644 --- a/src/cel-engine/src/rules/resources_extra.rs +++ b/src/cel-engine/src/rules/resources_extra.rs @@ -2409,42 +2409,47 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { check_iam_action_resources(&mut out, m, name, &doc, &ctx.cached_data.iam_action_resource_patterns); } + let mut vpc_cidrs: HashMap<&str, (String, Ipv4Cidr)> = HashMap::new(); for vpc_name in m.resources_of_type("AWS::EC2::VPC") { - let vpc_cidr_str = match resolve_concrete(m, vpc_name, "Properties.CidrBlock") - .and_then(|v| if let serde_json::Value::String(s) = v { Some(s) } else { None }) - { - Some(s) => s, - None => continue, + let Some(serde_json::Value::String(vpc_cidr)) = resolve_concrete(m, vpc_name, "Properties.CidrBlock") else { + continue; }; - let vpc_net = match parse_ipv4_cidr(&vpc_cidr_str) { - Some(n) => n, - None => continue, + if let Some(vpc_network) = parse_ipv4_cidr(&vpc_cidr) { + vpc_cidrs.insert(vpc_name, (vpc_cidr, vpc_network)); + } + } + for subnet_name in m.resources_of_type("AWS::EC2::Subnet") { + let subnet_vpc = resolve_concrete(m, subnet_name, "Properties.VpcId"); + let referenced_vpc = m + .follow_ref(subnet_name, "Properties.VpcId") + .or_else(|| subnet_vpc.as_ref().and_then(|value| value.as_str())); + let Some((vpc_cidr, vpc_network)) = referenced_vpc.and_then(|vpc_name| vpc_cidrs.get(vpc_name)) else { + continue; }; - for subnet_name in m.resources_of_type("AWS::EC2::Subnet") { - let subnet_vpc = resolve_concrete(m, subnet_name, "Properties.VpcId"); - let refs_this_vpc = m.follow_ref(subnet_name, "Properties.VpcId").map(|t| t == vpc_name).unwrap_or(false) - || subnet_vpc.as_ref().and_then(|v| v.as_str()) == Some(vpc_name); - if !refs_this_vpc { - continue; - } - if let Some(serde_json::Value::String(sub_cidr)) = resolve_concrete(m, subnet_name, "Properties.CidrBlock") - && let Some(sub_net) = parse_ipv4_cidr(&sub_cidr) - && !is_subnet_of(sub_net, vpc_net) - { - out.push(make_resource_diagnostic( - "E3059", - &format!("Subnet CIDR '{}' is not within VPC CIDR '{}'", sub_cidr, vpc_cidr_str), - m, - subnet_name, - "Properties.CidrBlock", - None, - )); - } + if let Some(serde_json::Value::String(subnet_cidr)) = resolve_concrete(m, subnet_name, "Properties.CidrBlock") + && let Some(subnet_network) = parse_ipv4_cidr(&subnet_cidr) + && !is_subnet_of(subnet_network, *vpc_network) + { + out.push(make_resource_diagnostic( + "E3059", + &format!("Subnet CIDR '{}' is not within VPC CIDR '{}'", subnet_cidr, vpc_cidr), + m, + subnet_name, + "Properties.CidrBlock", + None, + )); } } { - for (resource_type, identifier_properties) in &ctx.cached_data.primary_identifiers { + let mut resource_types: Vec<&String> = m + .resources_by_type + .keys() + .filter(|resource_type| ctx.cached_data.primary_identifiers.contains_key(*resource_type)) + .collect(); + resource_types.sort_unstable(); + for resource_type in resource_types { + let identifier_properties = &ctx.cached_data.primary_identifiers[resource_type]; let conflicts = m.primary_identifier_conflicts(resource_type, identifier_properties); for (tuple, resources) in &conflicts { let instance_repr = render_primary_id_dict(identifier_properties, tuple); @@ -3038,10 +3043,14 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { ), ]; for &(rule_id, rtype, prop_path, enum_key) in enum_checks { + let resources = m.resources_of_type(rtype); + if resources.is_empty() { + continue; + } let Some(allowed) = region_flat_allowed(&ctx.cached_data.enum_data, enum_key, region) else { continue; }; - for name in m.resources_of_type(rtype) { + for name in resources { if let Some(val) = resolve_enum_string(m, name, prop_path) && !allowed.contains(val.as_str()) { @@ -3088,10 +3097,14 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { ), ]; for &(rule_id, rtype, wildcard_path, report_path, enum_key) in wildcard_enum_checks { + let resources = m.resources_of_type(rtype); + if resources.is_empty() { + continue; + } let Some(allowed) = region_flat_allowed(&ctx.cached_data.enum_data, enum_key, region) else { continue; }; - for name in m.resources_of_type(rtype) { + for name in resources { let mut reported = HashSet::new(); for val in resolve_concrete_strings(m, name, wildcard_path) { if allowed.contains(val.as_str()) || !reported.insert(val.clone()) { @@ -3172,10 +3185,12 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { } } - if let Some(allowed) = - region_flat_allowed(&ctx.cached_data.enum_data, "data/aws_amazonmq_broker_instancetype_enum", region) + let amazonmq_brokers = m.resources_of_type("AWS::AmazonMQ::Broker"); + if !amazonmq_brokers.is_empty() + && let Some(allowed) = + region_flat_allowed(&ctx.cached_data.enum_data, "data/aws_amazonmq_broker_instancetype_enum", region) { - for name in m.resources_of_type("AWS::AmazonMQ::Broker") { + for name in amazonmq_brokers { if let Some(val) = resolve_enum_string(m, name, "Properties.HostInstanceType") && !allowed.contains(val.as_str()) { @@ -3191,12 +3206,15 @@ pub fn eval_extra_resources(ctx: &EvalContext) -> Vec { } } - if let Some(allowed) = region_flat_allowed( - &ctx.cached_data.enum_data, - "data/aws_emr_cluster_instancetypeconfig_instancetype_enum", - region, - ) { - for name in m.resources_of_type("AWS::EMR::InstanceFleetConfig") { + let emr_instance_fleets = m.resources_of_type("AWS::EMR::InstanceFleetConfig"); + if !emr_instance_fleets.is_empty() + && let Some(allowed) = region_flat_allowed( + &ctx.cached_data.enum_data, + "data/aws_emr_cluster_instancetypeconfig_instancetype_enum", + region, + ) + { + for name in emr_instance_fleets { if let Some(val) = resolve_enum_string(m, name, "Properties.InstanceType") && !allowed.contains(val.as_str()) { @@ -4124,8 +4142,8 @@ fn region_flat_allowed<'a>( enum_data: &'a HashMap, enum_key: &str, region: Option<&str>, -) -> Option> { - region_enums::flat_allowed_values(region_map_for_key(enum_data, enum_key)?, region) +) -> Option> { + region_enums::flat_allowed_value_set(region_map_for_key(enum_data, enum_key)?, region) } /// A scalar string property value, collapsing an `Fn::If`-wrapped value to its diff --git a/src/rego-engine/handwritten/rego/resources/ec2/vpc_subnet_cidr.rego b/src/rego-engine/handwritten/rego/resources/ec2/vpc_subnet_cidr.rego index 090e2e4c..85964b17 100644 --- a/src/rego-engine/handwritten/rego/resources/ec2/vpc_subnet_cidr.rego +++ b/src/rego-engine/handwritten/rego/resources/ec2/vpc_subnet_cidr.rego @@ -6,12 +6,11 @@ import rego.v1 violation contains make_diag_at("E3059", "ERROR", subnet_name, "Properties.CidrBlock", sprintf("Subnet CIDR '%s' is not within VPC CIDR '%s'", [sub_cidr, vpc_cidr])) if { - some vpc_name in resources_of_type("AWS::EC2::VPC") + some subnet_name in resources_of_type("AWS::EC2::Subnet") + vpc_name := follow_ref(subnet_name, "Properties.VpcId") + input.resources[vpc_name].resourceType == "AWS::EC2::VPC" vpc_cidr := resolve(vpc_name, "Properties.CidrBlock") is_string(vpc_cidr) - some subnet_name in resources_of_type("AWS::EC2::Subnet") - sub_vpc := follow_ref(subnet_name, "Properties.VpcId") - sub_vpc == vpc_name sub_cidr := resolve(subnet_name, "Properties.CidrBlock") is_string(sub_cidr) not ip_subnet_of(sub_cidr, vpc_cidr) diff --git a/src/rego-engine/handwritten/rego/resources/properties/primary_identifiers.rego b/src/rego-engine/handwritten/rego/resources/properties/primary_identifiers.rego index 08d822d9..4b33e931 100644 --- a/src/rego-engine/handwritten/rego/resources/properties/primary_identifiers.rego +++ b/src/rego-engine/handwritten/rego/resources/properties/primary_identifiers.rego @@ -9,7 +9,9 @@ violation contains make_diag_at("E3019", "ERROR", resource_id, _e3019_path(identifier_properties), sprintf("Primary identifiers %s should have unique values across the resources %s", [_fmt_dict(identifier_properties, conflict.tuple), _fmt_set(conflict.resources)])) if { - some resource_type, identifier_properties in data.primary_identifiers + resource_types := {resource.resourceType | some _, resource in input.resources} + some resource_type in resource_types + identifier_properties := data.primary_identifiers[resource_type] some conflict in primary_identifier_conflicts(resource_type, identifier_properties) some resource_id in conflict.resources } diff --git a/src/rego-engine/src/builtins.rs b/src/rego-engine/src/builtins.rs index a665ac22..40ca25df 100644 --- a/src/rego-engine/src/builtins.rs +++ b/src/rego-engine/src/builtins.rs @@ -1477,7 +1477,7 @@ fn register_region_flat_invalid(rego: &mut regorus::Engine, holder: SharedRegion let Some(map) = region_map.as_object() else { return Ok(Value::Undefined); }; - match region_enums::flat_allowed_values(map, region.as_deref()) { + match region_enums::flat_allowed_value_set(map, region.as_deref()) { Some(allowed) if !allowed.contains(value.as_ref()) => { Ok(Value::from(region_enums::flat_invalid_message(value.as_ref(), region.as_deref()))) } diff --git a/src/schema-validator/src/validate.rs b/src/schema-validator/src/validate.rs index 1c6e867d..6809bf13 100644 --- a/src/schema-validator/src/validate.rs +++ b/src/schema-validator/src/validate.rs @@ -614,7 +614,10 @@ fn validate_resource( ); } - for (prop_name, prop_schema) in &schema.properties { + for prop_name in res.properties.keys() { + let Some(prop_schema) = schema.properties.get(prop_name) else { + continue; + }; let resolved = prop_schema.resolve(defs); let prop_path = format!("{}.{}", base, prop_name); validate_prop(out, store, m, rid, &res.resource_type, &prop_path, &resolved, defs, region); @@ -2094,11 +2097,9 @@ fn validate_sub_value_constraints( // Only scenarios consistent with the active group assignment (if any) // participate: a value from a mutually exclusive `Fn::If` branch must // not decide this assignment's branch match. - let scenarios: Vec<(serde_json::Value, HashMap)> = m - .resolve_scenarios_json(rid, &prop_path) - .into_iter() - .filter(|(_, conds)| scenario_consistent_with_filter(m, conds)) - .collect(); + let shared_scenarios = m.resolve_scenarios_json_shared(rid, &prop_path); + let scenarios: Vec<_> = + shared_scenarios.iter().filter(|(_, conds)| scenario_consistent_with_filter(m, conds)).collect(); // When the property is absent from the template and not required, it // does not contribute a mismatch - the constraint is vacuously true. @@ -2149,11 +2150,9 @@ fn validate_sub_value_constraints( // validation above already enforces them. if sub_self_constrains_value(sub) { let self_schema = schema_for_self_value_constraints(sub); - let scenarios: Vec<(serde_json::Value, HashMap)> = m - .resolve_scenarios_json(rid, base_path) - .into_iter() - .filter(|(_, conds)| scenario_consistent_with_filter(m, conds)) - .collect(); + let shared_scenarios = m.resolve_scenarios_json_shared(rid, base_path); + let scenarios: Vec<_> = + shared_scenarios.iter().filter(|(_, conds)| scenario_consistent_with_filter(m, conds)).collect(); if !scenarios.is_empty() { let any_scenario_matches = scenarios.iter().any(|(val, conds)| { if !is_satisfiable(m, conds) || val.is_null() || defer_value_constraints(m, rid, base_path, val, conds) diff --git a/src/template-model/src/model.rs b/src/template-model/src/model.rs index 7852581c..84624e1c 100644 --- a/src/template-model/src/model.rs +++ b/src/template-model/src/model.rs @@ -312,7 +312,7 @@ pub struct SemanticModel { resolve_memo: Mutex>>, raw_scenario_memo: Mutex)>>>, properties_scenario_cache: Mutex)>>>, - scenario_memo: Mutex)>>>, + scenario_memo: Mutex)>>>>, lifecycle_policy_scenario_cache: Mutex)>>>, /// Cumulative count of scenarios materialized by `resolve_scenarios` across /// the whole validation, charged against `MAX_TOTAL_SCENARIO_COMBINATIONS`. @@ -1824,20 +1824,12 @@ impl SemanticModel { resolved_value_at_path(conditional, prop_path) } - pub fn resolve_scenarios_json( + fn resolve_scenarios_json_uncached( &self, resource_id: &str, path: &str, ) -> Vec<(serde_json::Value, HashMap)> { - let memo_key = (resource_id.to_string(), path.to_string()); - { - let memo = self.scenario_memo.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); - if let Some(memoized) = memo.get(&memo_key) { - return memoized.clone(); - } - } - let scenarios = self.resolve_scenarios(resource_id, path); - let json_scenarios: Vec<_> = scenarios + self.resolve_scenarios(resource_id, path) .into_iter() .filter_map(|(val, conds)| { if contains_dynamic_resolved(&val) { @@ -1855,9 +1847,49 @@ impl SemanticModel { } Some((json, conds)) }) - .collect(); + .collect() + } + + fn cache_json_scenarios( + &self, + memo_key: (String, String), + scenarios: Vec<(serde_json::Value, HashMap)>, + ) -> Arc)>> { let mut memo = self.scenario_memo.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); - memo.entry(memo_key).or_insert_with(|| json_scenarios).clone() + Arc::clone(memo.entry(memo_key).or_insert_with(|| Arc::new(scenarios))) + } + + /// Returns one immutable scenario allocation shared across read-only callers. + pub fn resolve_scenarios_json_shared( + &self, + resource_id: &str, + path: &str, + ) -> Arc)>> { + let memo_key = (resource_id.to_string(), path.to_string()); + { + let memo = self.scenario_memo.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + if let Some(memoized) = memo.get(&memo_key) { + return Arc::clone(memoized); + } + } + let scenarios = self.resolve_scenarios_json_uncached(resource_id, path); + self.cache_json_scenarios(memo_key, scenarios) + } + + pub fn resolve_scenarios_json( + &self, + resource_id: &str, + path: &str, + ) -> Vec<(serde_json::Value, HashMap)> { + let memo_key = (resource_id.to_string(), path.to_string()); + { + let memo = self.scenario_memo.lock().unwrap_or_else(|poisoned| poisoned.into_inner()); + if let Some(memoized) = memo.get(&memo_key) { + return memoized.as_ref().clone(); + } + } + let scenarios = self.resolve_scenarios_json_uncached(resource_id, path); + self.cache_json_scenarios(memo_key, scenarios).as_ref().clone() } pub fn follow_ref(&self, resource_id: &str, path: &str) -> Option<&str> { @@ -3098,6 +3130,28 @@ Resources: assert_eq!(s1, s2); } + #[test] + fn resolve_scenarios_json_shared_reuses_allocation_and_matches_owned() { + let input = br#"{ + "Parameters": {"Mode": {"Type": "String"}}, + "Conditions": {"ChooseFirst": {"Fn::Equals": [{"Ref": "Mode"}, "first"]}}, + "Resources": {"R": {"Type": "T", "Properties": { + "V": {"Fn::If": ["ChooseFirst", "a", "b"]} + }}} + }"#; + let model = SemanticModel::from_bytes(input).unwrap(); + + let first = model.resolve_scenarios_json_shared("R", "Properties.V"); + let combinations_after_first = model.scenario_combinations_used(); + let second = model.resolve_scenarios_json_shared("R", "Properties.V"); + let owned = model.resolve_scenarios_json("R", "Properties.V"); + + assert!(Arc::ptr_eq(&first, &second)); + assert_eq!(first.as_ref(), owned.as_slice()); + assert!(combinations_after_first > 0); + assert_eq!(model.scenario_combinations_used(), combinations_after_first); + } + #[test] fn default_scenario_queries_are_memoized_and_global_budget_halts_uncached_expansion() { let input = br#"{ diff --git a/src/template-model/src/region_enums.rs b/src/template-model/src/region_enums.rs index df41d8b3..c079a4a5 100644 --- a/src/template-model/src/region_enums.rs +++ b/src/template-model/src/region_enums.rs @@ -161,17 +161,17 @@ pub fn conditional_invalid_message(value: &str, allowed_sorted: &[String], regio /// caller skips validation - a dynamic or unknown configured region is not /// validated, matching today's per-region lookup that returns `None` for a /// missing region. -pub fn flat_allowed_values<'a>( +pub fn flat_allowed_value_set<'a>( doc: &'a serde_json::Map, region: Option<&str>, -) -> Option> { +) -> Option> { match region { Some(region) => { let values = doc.get(region)?.get("enum")?.as_array()?; Some(values.iter().filter_map(|v| v.as_str()).collect()) } None => { - let mut union = BTreeSet::new(); + let mut union = HashSet::new(); for region in AWS_REGIONS { if let Some(values) = doc.get(*region).and_then(|r| r.get("enum")).and_then(|e| e.as_array()) { union.extend(values.iter().filter_map(|v| v.as_str())); @@ -186,6 +186,14 @@ pub fn flat_allowed_values<'a>( } } +/// Returns the same allowed values in deterministic order for callers that iterate them. +pub fn flat_allowed_values<'a>( + doc: &'a serde_json::Map, + region: Option<&str>, +) -> Option> { + flat_allowed_value_set(doc, region).map(|allowed| allowed.into_iter().collect()) +} + /// For a conditional RDS document (`{ "": { "allOf": [...] } }`), returns /// the sorted enum to render when `value` is invalid for the effective scope, or /// `None` when the value is valid or the document does not apply. `resolve_prop` From 4011622b8bf1d15e1a9826b526e1e3aa1ed282f4 Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Fri, 28 Aug 2026 12:57:22 -0600 Subject: [PATCH 3/6] add security tempalte --- src/cfn-validate/tests/security_tests.rs | 31 + .../expected/validation_reports7.json | 18 + .../security/cross_reference_fanout.yaml | 15055 ++++++++++++++++ src/resources/security/generate.py | 58 + 4 files changed, 15162 insertions(+) create mode 100644 src/resources/security/cross_reference_fanout.yaml diff --git a/src/cfn-validate/tests/security_tests.rs b/src/cfn-validate/tests/security_tests.rs index 93afc694..434aba3a 100644 --- a/src/cfn-validate/tests/security_tests.rs +++ b/src/cfn-validate/tests/security_tests.rs @@ -481,6 +481,37 @@ fn large_resource_count_validates_to_a_bounded_result_on_both_engines() { } } +#[test] +fn dense_cross_resource_fanout_validates_to_a_bounded_result() { + const SCALE_RESOURCES: usize = 500; + const RESOURCE_REFERENCE_EDGES: usize = 11_875; + let bytes = common::load_security("cross_reference_fanout.yaml"); + + let model = SemanticModel::from_bytes(&bytes).expect("the cross-reference fixture must parse to a semantic model"); + assert_eq!(model.resources.len(), SCALE_RESOURCES); + let resource_edges = model + .graph + .edges + .iter() + .filter(|edge| { + model.resources.contains_key(&edge.source_resource) && model.resources.contains_key(&edge.target) + }) + .count(); + assert_eq!(resource_edges, RESOURCE_REFERENCE_EDGES); + + for engine_name in ["rego", "cel"] { + let finished = validate_report_within(COMPLETION_BUDGET, engine_name, bytes.clone()).unwrap_or_else(|| { + panic!( + "{engine_name}: {RESOURCE_REFERENCE_EDGES} resource references must validate within \ + {COMPLETION_BUDGET:?}" + ) + }); + let _ = finished.unwrap_or_else(|error| { + panic!("{engine_name}: dense cross-resource validation must return a structured report: {error}") + }); + } +} + #[test] fn condition_chain_boundary_resolves_within_budget() { // 20 parameters, 40 acyclic chained conditions matching the public CDK repro diff --git a/src/resources/expected/validation_reports7.json b/src/resources/expected/validation_reports7.json index 8a8ca656..76a74c4c 100644 --- a/src/resources/expected/validation_reports7.json +++ b/src/resources/expected/validation_reports7.json @@ -50435,6 +50435,24 @@ } ] }, + "security/cross_reference_fanout.yaml": { + "filePath": "security/cross_reference_fanout.yaml", + "status": "OK", + "metadata": { + "resourcesScanned": 500, + "counts": { + "fatal": 0, + "errors": 0, + "warnings": 0, + "informational": 0, + "debug": 0 + }, + "suppressed": 0, + "strict": false, + "severityLevel": "DEBUG" + }, + "diagnostics": [] + }, "security/cross_resource_scale.yaml": { "filePath": "security/cross_resource_scale.yaml", "status": "OK", diff --git a/src/resources/security/cross_reference_fanout.yaml b/src/resources/security/cross_reference_fanout.yaml new file mode 100644 index 00000000..0a106f3e --- /dev/null +++ b/src/resources/security/cross_reference_fanout.yaml @@ -0,0 +1,15055 @@ +# Generated by resources/security/generate.py - do not edit by hand. + +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Fixture: dense cross-resource reference fan-out. Generated; no sensitive data.' +Resources: + Topic0000: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0001: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0002: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0003: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0004: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0005: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0006: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0007: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0008: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0009: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0010: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0011: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0012: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0013: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0014: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0015: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0016: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0017: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0018: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0019: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0020: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0021: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0022: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0023: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0024: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0025: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0026: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0027: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0028: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0029: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0030: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0031: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0032: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0033: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0034: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0035: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0036: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0037: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0038: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0039: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0040: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0041: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0042: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0043: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0044: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0045: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0046: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0047: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0048: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0049: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0050: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0051: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0052: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0053: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0054: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0055: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0056: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0057: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0058: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0059: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0060: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0061: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0062: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0063: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0064: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0065: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0066: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0067: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0068: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0069: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0070: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0071: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0072: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0073: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0074: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0075: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0076: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0077: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0078: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0079: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0080: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0081: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0082: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0083: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0084: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0085: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0086: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0087: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0088: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0089: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0090: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0091: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0092: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0093: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0094: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0095: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0096: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0097: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0098: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0099: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0100: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0101: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0102: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0103: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0104: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0105: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0106: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0107: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0108: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0109: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0110: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0111: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0112: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0113: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0114: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0115: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0116: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0117: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0118: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0119: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0120: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0121: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0122: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0123: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0124: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0125: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0126: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0127: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0128: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0129: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0130: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0131: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0132: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0133: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0134: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0135: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0136: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0137: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0138: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0139: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0140: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0141: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0142: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0143: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0144: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0145: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0146: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0147: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0148: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0149: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0150: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0151: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0152: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0153: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0154: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0155: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0156: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0157: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0158: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0159: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0160: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0161: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0162: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0163: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0164: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0165: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0166: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0167: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0168: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0169: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0170: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0171: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0172: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0173: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0174: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0175: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0176: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0177: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0178: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0179: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0180: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0181: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0182: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0183: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0184: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0185: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0186: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0187: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0188: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0189: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0190: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0191: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0192: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0193: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0194: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0195: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0196: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0197: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0198: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0199: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0200: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0201: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0202: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0203: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0204: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0205: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0206: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0207: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0208: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0209: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0210: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0211: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0212: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0213: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0214: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0215: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0216: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0217: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0218: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0219: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0220: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0221: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0222: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0223: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0224: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0225: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0226: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0227: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0228: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0229: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0230: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0231: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0232: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0233: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0234: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0235: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0236: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0237: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0238: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0239: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0240: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0241: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0242: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0243: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0244: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0245: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0246: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0247: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0248: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0249: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0250: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0251: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0252: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0253: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0254: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0255: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0256: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0257: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0258: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0259: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0260: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0261: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0262: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0263: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0264: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0265: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0266: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0267: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0268: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0269: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0270: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0271: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0272: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0273: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0274: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0275: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0276: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0277: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0278: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0279: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0280: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0281: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0282: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0283: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0284: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0285: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0286: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0287: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0288: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0289: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0290: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0291: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0292: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0293: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0294: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0295: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0296: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0297: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0298: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0299: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0300: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0301: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0302: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0303: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0304: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0305: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0306: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0307: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0308: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0309: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0310: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0311: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0312: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0313: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0314: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0315: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0316: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0317: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0318: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0319: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0320: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0321: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0322: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0323: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0324: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0325: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0326: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0327: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0328: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0329: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0330: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0331: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0332: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0333: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0334: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0335: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0336: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0337: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0338: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0339: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0340: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0341: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0342: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0343: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0344: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0345: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0346: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0347: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0348: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0349: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0350: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0351: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0352: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0353: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0354: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0355: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0356: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0357: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0358: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0359: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0360: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0361: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0362: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0363: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0364: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0365: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0366: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0367: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0368: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0369: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0370: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0371: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0372: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0373: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0374: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0375: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0376: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0377: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0378: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0379: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0380: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0381: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0382: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0383: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0384: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0385: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0386: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0387: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0388: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0389: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0390: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0391: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0392: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0393: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0394: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0395: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0396: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0397: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0398: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0399: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0400: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0401: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0402: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0403: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0404: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0405: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0406: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0407: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0408: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0409: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0410: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0411: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0412: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0413: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0414: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0415: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0416: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0417: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0418: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0419: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0420: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0421: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0422: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0423: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0424: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0425: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0426: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0427: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0428: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0429: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0430: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0431: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0432: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0433: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0434: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0435: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0436: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0437: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0438: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0439: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0440: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0441: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0442: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0443: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0444: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0445: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0446: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0447: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0448: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0449: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0450: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0451: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0452: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0453: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0454: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0455: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0456: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0457: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0458: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0459: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0460: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0461: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0462: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0463: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0464: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0465: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0466: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0467: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0468: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0469: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0470: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0471: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0472: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0473: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Topic0474: + Type: AWS::SNS::Topic + Properties: + Tags: + - Key: Purpose + Value: cross-reference-security-fixture + Policy0000: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0000 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0001: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0001 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0002: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0002 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0003: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0003 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0004: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0004 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0005: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0005 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0006: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0006 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0007: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0007 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0008: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0008 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0009: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0009 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0010: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0010 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0011: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0011 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0012: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0012 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0013: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0013 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0014: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0014 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0015: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0015 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0016: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0016 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0017: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0017 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0018: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0018 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0019: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0019 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0020: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0020 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0021: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0021 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0022: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0022 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0023: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0023 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 + Policy0024: + Type: AWS::SNS::TopicPolicy + Properties: + PolicyDocument: + Version: '2012-10-17' + Statement: + - Sid: AllowEventsPublish0024 + Effect: Allow + Principal: + Service: events.amazonaws.com + Action: 'sns:Publish' + Resource: '*' + Topics: + - !Ref Topic0000 + - !Ref Topic0001 + - !Ref Topic0002 + - !Ref Topic0003 + - !Ref Topic0004 + - !Ref Topic0005 + - !Ref Topic0006 + - !Ref Topic0007 + - !Ref Topic0008 + - !Ref Topic0009 + - !Ref Topic0010 + - !Ref Topic0011 + - !Ref Topic0012 + - !Ref Topic0013 + - !Ref Topic0014 + - !Ref Topic0015 + - !Ref Topic0016 + - !Ref Topic0017 + - !Ref Topic0018 + - !Ref Topic0019 + - !Ref Topic0020 + - !Ref Topic0021 + - !Ref Topic0022 + - !Ref Topic0023 + - !Ref Topic0024 + - !Ref Topic0025 + - !Ref Topic0026 + - !Ref Topic0027 + - !Ref Topic0028 + - !Ref Topic0029 + - !Ref Topic0030 + - !Ref Topic0031 + - !Ref Topic0032 + - !Ref Topic0033 + - !Ref Topic0034 + - !Ref Topic0035 + - !Ref Topic0036 + - !Ref Topic0037 + - !Ref Topic0038 + - !Ref Topic0039 + - !Ref Topic0040 + - !Ref Topic0041 + - !Ref Topic0042 + - !Ref Topic0043 + - !Ref Topic0044 + - !Ref Topic0045 + - !Ref Topic0046 + - !Ref Topic0047 + - !Ref Topic0048 + - !Ref Topic0049 + - !Ref Topic0050 + - !Ref Topic0051 + - !Ref Topic0052 + - !Ref Topic0053 + - !Ref Topic0054 + - !Ref Topic0055 + - !Ref Topic0056 + - !Ref Topic0057 + - !Ref Topic0058 + - !Ref Topic0059 + - !Ref Topic0060 + - !Ref Topic0061 + - !Ref Topic0062 + - !Ref Topic0063 + - !Ref Topic0064 + - !Ref Topic0065 + - !Ref Topic0066 + - !Ref Topic0067 + - !Ref Topic0068 + - !Ref Topic0069 + - !Ref Topic0070 + - !Ref Topic0071 + - !Ref Topic0072 + - !Ref Topic0073 + - !Ref Topic0074 + - !Ref Topic0075 + - !Ref Topic0076 + - !Ref Topic0077 + - !Ref Topic0078 + - !Ref Topic0079 + - !Ref Topic0080 + - !Ref Topic0081 + - !Ref Topic0082 + - !Ref Topic0083 + - !Ref Topic0084 + - !Ref Topic0085 + - !Ref Topic0086 + - !Ref Topic0087 + - !Ref Topic0088 + - !Ref Topic0089 + - !Ref Topic0090 + - !Ref Topic0091 + - !Ref Topic0092 + - !Ref Topic0093 + - !Ref Topic0094 + - !Ref Topic0095 + - !Ref Topic0096 + - !Ref Topic0097 + - !Ref Topic0098 + - !Ref Topic0099 + - !Ref Topic0100 + - !Ref Topic0101 + - !Ref Topic0102 + - !Ref Topic0103 + - !Ref Topic0104 + - !Ref Topic0105 + - !Ref Topic0106 + - !Ref Topic0107 + - !Ref Topic0108 + - !Ref Topic0109 + - !Ref Topic0110 + - !Ref Topic0111 + - !Ref Topic0112 + - !Ref Topic0113 + - !Ref Topic0114 + - !Ref Topic0115 + - !Ref Topic0116 + - !Ref Topic0117 + - !Ref Topic0118 + - !Ref Topic0119 + - !Ref Topic0120 + - !Ref Topic0121 + - !Ref Topic0122 + - !Ref Topic0123 + - !Ref Topic0124 + - !Ref Topic0125 + - !Ref Topic0126 + - !Ref Topic0127 + - !Ref Topic0128 + - !Ref Topic0129 + - !Ref Topic0130 + - !Ref Topic0131 + - !Ref Topic0132 + - !Ref Topic0133 + - !Ref Topic0134 + - !Ref Topic0135 + - !Ref Topic0136 + - !Ref Topic0137 + - !Ref Topic0138 + - !Ref Topic0139 + - !Ref Topic0140 + - !Ref Topic0141 + - !Ref Topic0142 + - !Ref Topic0143 + - !Ref Topic0144 + - !Ref Topic0145 + - !Ref Topic0146 + - !Ref Topic0147 + - !Ref Topic0148 + - !Ref Topic0149 + - !Ref Topic0150 + - !Ref Topic0151 + - !Ref Topic0152 + - !Ref Topic0153 + - !Ref Topic0154 + - !Ref Topic0155 + - !Ref Topic0156 + - !Ref Topic0157 + - !Ref Topic0158 + - !Ref Topic0159 + - !Ref Topic0160 + - !Ref Topic0161 + - !Ref Topic0162 + - !Ref Topic0163 + - !Ref Topic0164 + - !Ref Topic0165 + - !Ref Topic0166 + - !Ref Topic0167 + - !Ref Topic0168 + - !Ref Topic0169 + - !Ref Topic0170 + - !Ref Topic0171 + - !Ref Topic0172 + - !Ref Topic0173 + - !Ref Topic0174 + - !Ref Topic0175 + - !Ref Topic0176 + - !Ref Topic0177 + - !Ref Topic0178 + - !Ref Topic0179 + - !Ref Topic0180 + - !Ref Topic0181 + - !Ref Topic0182 + - !Ref Topic0183 + - !Ref Topic0184 + - !Ref Topic0185 + - !Ref Topic0186 + - !Ref Topic0187 + - !Ref Topic0188 + - !Ref Topic0189 + - !Ref Topic0190 + - !Ref Topic0191 + - !Ref Topic0192 + - !Ref Topic0193 + - !Ref Topic0194 + - !Ref Topic0195 + - !Ref Topic0196 + - !Ref Topic0197 + - !Ref Topic0198 + - !Ref Topic0199 + - !Ref Topic0200 + - !Ref Topic0201 + - !Ref Topic0202 + - !Ref Topic0203 + - !Ref Topic0204 + - !Ref Topic0205 + - !Ref Topic0206 + - !Ref Topic0207 + - !Ref Topic0208 + - !Ref Topic0209 + - !Ref Topic0210 + - !Ref Topic0211 + - !Ref Topic0212 + - !Ref Topic0213 + - !Ref Topic0214 + - !Ref Topic0215 + - !Ref Topic0216 + - !Ref Topic0217 + - !Ref Topic0218 + - !Ref Topic0219 + - !Ref Topic0220 + - !Ref Topic0221 + - !Ref Topic0222 + - !Ref Topic0223 + - !Ref Topic0224 + - !Ref Topic0225 + - !Ref Topic0226 + - !Ref Topic0227 + - !Ref Topic0228 + - !Ref Topic0229 + - !Ref Topic0230 + - !Ref Topic0231 + - !Ref Topic0232 + - !Ref Topic0233 + - !Ref Topic0234 + - !Ref Topic0235 + - !Ref Topic0236 + - !Ref Topic0237 + - !Ref Topic0238 + - !Ref Topic0239 + - !Ref Topic0240 + - !Ref Topic0241 + - !Ref Topic0242 + - !Ref Topic0243 + - !Ref Topic0244 + - !Ref Topic0245 + - !Ref Topic0246 + - !Ref Topic0247 + - !Ref Topic0248 + - !Ref Topic0249 + - !Ref Topic0250 + - !Ref Topic0251 + - !Ref Topic0252 + - !Ref Topic0253 + - !Ref Topic0254 + - !Ref Topic0255 + - !Ref Topic0256 + - !Ref Topic0257 + - !Ref Topic0258 + - !Ref Topic0259 + - !Ref Topic0260 + - !Ref Topic0261 + - !Ref Topic0262 + - !Ref Topic0263 + - !Ref Topic0264 + - !Ref Topic0265 + - !Ref Topic0266 + - !Ref Topic0267 + - !Ref Topic0268 + - !Ref Topic0269 + - !Ref Topic0270 + - !Ref Topic0271 + - !Ref Topic0272 + - !Ref Topic0273 + - !Ref Topic0274 + - !Ref Topic0275 + - !Ref Topic0276 + - !Ref Topic0277 + - !Ref Topic0278 + - !Ref Topic0279 + - !Ref Topic0280 + - !Ref Topic0281 + - !Ref Topic0282 + - !Ref Topic0283 + - !Ref Topic0284 + - !Ref Topic0285 + - !Ref Topic0286 + - !Ref Topic0287 + - !Ref Topic0288 + - !Ref Topic0289 + - !Ref Topic0290 + - !Ref Topic0291 + - !Ref Topic0292 + - !Ref Topic0293 + - !Ref Topic0294 + - !Ref Topic0295 + - !Ref Topic0296 + - !Ref Topic0297 + - !Ref Topic0298 + - !Ref Topic0299 + - !Ref Topic0300 + - !Ref Topic0301 + - !Ref Topic0302 + - !Ref Topic0303 + - !Ref Topic0304 + - !Ref Topic0305 + - !Ref Topic0306 + - !Ref Topic0307 + - !Ref Topic0308 + - !Ref Topic0309 + - !Ref Topic0310 + - !Ref Topic0311 + - !Ref Topic0312 + - !Ref Topic0313 + - !Ref Topic0314 + - !Ref Topic0315 + - !Ref Topic0316 + - !Ref Topic0317 + - !Ref Topic0318 + - !Ref Topic0319 + - !Ref Topic0320 + - !Ref Topic0321 + - !Ref Topic0322 + - !Ref Topic0323 + - !Ref Topic0324 + - !Ref Topic0325 + - !Ref Topic0326 + - !Ref Topic0327 + - !Ref Topic0328 + - !Ref Topic0329 + - !Ref Topic0330 + - !Ref Topic0331 + - !Ref Topic0332 + - !Ref Topic0333 + - !Ref Topic0334 + - !Ref Topic0335 + - !Ref Topic0336 + - !Ref Topic0337 + - !Ref Topic0338 + - !Ref Topic0339 + - !Ref Topic0340 + - !Ref Topic0341 + - !Ref Topic0342 + - !Ref Topic0343 + - !Ref Topic0344 + - !Ref Topic0345 + - !Ref Topic0346 + - !Ref Topic0347 + - !Ref Topic0348 + - !Ref Topic0349 + - !Ref Topic0350 + - !Ref Topic0351 + - !Ref Topic0352 + - !Ref Topic0353 + - !Ref Topic0354 + - !Ref Topic0355 + - !Ref Topic0356 + - !Ref Topic0357 + - !Ref Topic0358 + - !Ref Topic0359 + - !Ref Topic0360 + - !Ref Topic0361 + - !Ref Topic0362 + - !Ref Topic0363 + - !Ref Topic0364 + - !Ref Topic0365 + - !Ref Topic0366 + - !Ref Topic0367 + - !Ref Topic0368 + - !Ref Topic0369 + - !Ref Topic0370 + - !Ref Topic0371 + - !Ref Topic0372 + - !Ref Topic0373 + - !Ref Topic0374 + - !Ref Topic0375 + - !Ref Topic0376 + - !Ref Topic0377 + - !Ref Topic0378 + - !Ref Topic0379 + - !Ref Topic0380 + - !Ref Topic0381 + - !Ref Topic0382 + - !Ref Topic0383 + - !Ref Topic0384 + - !Ref Topic0385 + - !Ref Topic0386 + - !Ref Topic0387 + - !Ref Topic0388 + - !Ref Topic0389 + - !Ref Topic0390 + - !Ref Topic0391 + - !Ref Topic0392 + - !Ref Topic0393 + - !Ref Topic0394 + - !Ref Topic0395 + - !Ref Topic0396 + - !Ref Topic0397 + - !Ref Topic0398 + - !Ref Topic0399 + - !Ref Topic0400 + - !Ref Topic0401 + - !Ref Topic0402 + - !Ref Topic0403 + - !Ref Topic0404 + - !Ref Topic0405 + - !Ref Topic0406 + - !Ref Topic0407 + - !Ref Topic0408 + - !Ref Topic0409 + - !Ref Topic0410 + - !Ref Topic0411 + - !Ref Topic0412 + - !Ref Topic0413 + - !Ref Topic0414 + - !Ref Topic0415 + - !Ref Topic0416 + - !Ref Topic0417 + - !Ref Topic0418 + - !Ref Topic0419 + - !Ref Topic0420 + - !Ref Topic0421 + - !Ref Topic0422 + - !Ref Topic0423 + - !Ref Topic0424 + - !Ref Topic0425 + - !Ref Topic0426 + - !Ref Topic0427 + - !Ref Topic0428 + - !Ref Topic0429 + - !Ref Topic0430 + - !Ref Topic0431 + - !Ref Topic0432 + - !Ref Topic0433 + - !Ref Topic0434 + - !Ref Topic0435 + - !Ref Topic0436 + - !Ref Topic0437 + - !Ref Topic0438 + - !Ref Topic0439 + - !Ref Topic0440 + - !Ref Topic0441 + - !Ref Topic0442 + - !Ref Topic0443 + - !Ref Topic0444 + - !Ref Topic0445 + - !Ref Topic0446 + - !Ref Topic0447 + - !Ref Topic0448 + - !Ref Topic0449 + - !Ref Topic0450 + - !Ref Topic0451 + - !Ref Topic0452 + - !Ref Topic0453 + - !Ref Topic0454 + - !Ref Topic0455 + - !Ref Topic0456 + - !Ref Topic0457 + - !Ref Topic0458 + - !Ref Topic0459 + - !Ref Topic0460 + - !Ref Topic0461 + - !Ref Topic0462 + - !Ref Topic0463 + - !Ref Topic0464 + - !Ref Topic0465 + - !Ref Topic0466 + - !Ref Topic0467 + - !Ref Topic0468 + - !Ref Topic0469 + - !Ref Topic0470 + - !Ref Topic0471 + - !Ref Topic0472 + - !Ref Topic0473 + - !Ref Topic0474 diff --git a/src/resources/security/generate.py b/src/resources/security/generate.py index 45ea7ded..b1f1f473 100644 --- a/src/resources/security/generate.py +++ b/src/resources/security/generate.py @@ -14,6 +14,9 @@ bundled-schema composition at the exact 256-world assignment boundary and one condition beyond it many_resources.yaml a large number of independent resources + cross_reference_fanout.yaml + 500 resources with a dense resource-to-resource + reference graph cross_resource_scale.yaml many resources sharing one primary identifier value (worst case for pair-comparison rules) pathological_conditions.yaml conditions with large dependency closures over @@ -68,6 +71,12 @@ CONDITION_TOTAL = 200 # Number of resources in the scale fixtures. RESOURCE_COUNT = 500 +# Dense cross-resource graph: every policy references every topic. The split +# reaches the 500-resource template limit while keeping the generated file and +# repeated security-gate runtime bounded. +CROSS_REFERENCE_TOPIC_COUNT = 475 +CROSS_REFERENCE_POLICY_COUNT = RESOURCE_COUNT - CROSS_REFERENCE_TOPIC_COUNT +CROSS_REFERENCE_EDGE_COUNT = CROSS_REFERENCE_TOPIC_COUNT * CROSS_REFERENCE_POLICY_COUNT # Schema scenario-assignment fixture. The selected provider schema has a # nine-way object composition. Eight independently conditional properties @@ -301,6 +310,54 @@ def gen_many_resources() -> None: write("many_resources.yaml", "\n".join(lines) + "\n") +def gen_cross_reference_fanout() -> None: + """A dense resource-to-resource graph with CROSS_REFERENCE_EDGE_COUNT edges. + + Every topic policy references every topic. This produces many distinct Ref + edges without cycles or invalid targets, exercising graph construction, + serialization, authored-reference rules, and repeated engine evaluation at + the 500-resource CloudFormation limit. + """ + lines = [ + HEADER, + "AWSTemplateFormatVersion: '2010-09-09'", + "Description: 'Fixture: dense cross-resource reference fan-out. Generated; no sensitive data.'", + "Resources:", + ] + for index in range(CROSS_REFERENCE_TOPIC_COUNT): + lines.extend( + [ + f" Topic{index:04d}:", + " Type: AWS::SNS::Topic", + " Properties:", + " Tags:", + " - Key: Purpose", + " Value: cross-reference-security-fixture", + ] + ) + for policy_index in range(CROSS_REFERENCE_POLICY_COUNT): + lines.extend( + [ + f" Policy{policy_index:04d}:", + " Type: AWS::SNS::TopicPolicy", + " Properties:", + " PolicyDocument:", + " Version: '2012-10-17'", + " Statement:", + f" - Sid: AllowEventsPublish{policy_index:04d}", + " Effect: Allow", + " Principal:", + " Service: events.amazonaws.com", + " Action: 'sns:Publish'", + " Resource: '*'", + " Topics:", + ] + ) + for topic_index in range(CROSS_REFERENCE_TOPIC_COUNT): + lines.append(f" - !Ref Topic{topic_index:04d}") + write("cross_reference_fanout.yaml", "\n".join(lines) + "\n") + + def gen_cross_resource_scale() -> None: """RESOURCE_COUNT resources of one type that all share the same primary identifier value. @@ -825,6 +882,7 @@ def main() -> None: gen_many_conditions() gen_scenario_assignment_budget() gen_many_resources() + gen_cross_reference_fanout() gen_cross_resource_scale() gen_pathological_conditions() gen_condition_fusion() From 50ba50a17179d8a98fa3f07c1905502bfdba4fd8 Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Fri, 28 Aug 2026 13:26:58 -0600 Subject: [PATCH 4/6] perf check workflow --- .github/workflows/build-artifacts.yml | 36 +- .github/workflows/performance-regression.yml | 91 +++ .github/workflows/pr.yml | 16 + .github/workflows/relevant-source-changes.yml | 64 ++ scripts/check_performance_regression.py | 743 ++++++++++++++++++ 5 files changed, 929 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/performance-regression.yml create mode 100644 .github/workflows/relevant-source-changes.yml create mode 100644 scripts/check_performance_regression.py diff --git a/.github/workflows/build-artifacts.yml b/.github/workflows/build-artifacts.yml index cbf7c372..d2ae89eb 100644 --- a/.github/workflows/build-artifacts.yml +++ b/.github/workflows/build-artifacts.yml @@ -4,27 +4,6 @@ run-name: Build Artifacts ${{ github.actor }} ${{ github.event_name }} (${{ inpu on: push: branches: [ main ] - paths-ignore: - - '.github/**' - - 'scripts/**' - - '.gitattributes' - - '.gitignore' - - '**/*.md' - - '**/*.txt' - - '**/*.jar' - - 'LICENSE' - - 'NOTICE' - - 'gradlew' - - 'gradlew.bat' - - 'src/bindings-*/**/bench/**' - - 'src/bindings-*/examples/**' - - 'src/bindings-*/tests/**' - - 'src/bindings-jvm/version.properties' - - 'src/bindings-wasm/dist/*' - - 'src/bindings-python/generated/**' - - 'src/bindings-go/go/internal/**' - - 'src/bindings-go/go/libs/**' - - 'release-bin/*' workflow_dispatch: inputs: branch: @@ -41,10 +20,25 @@ permissions: contents: read jobs: + relevant-changes: + uses: ./.github/workflows/relevant-source-changes.yml + permissions: + contents: read + pull-requests: read + + build-required: + needs: [ relevant-changes ] + if: ${{ needs.relevant-changes.outputs.relevant == 'true' }} + runs-on: ubuntu-latest + steps: + - run: echo "Artifact build required" + get-configs: + needs: [ build-required ] uses: ./.github/workflows/configs.yml resolve-ref: + needs: [ build-required ] runs-on: ubuntu-latest outputs: sha: ${{ steps.head.outputs.sha }} diff --git a/.github/workflows/performance-regression.yml b/.github/workflows/performance-regression.yml new file mode 100644 index 00000000..a1aebb9c --- /dev/null +++ b/.github/workflows/performance-regression.yml @@ -0,0 +1,91 @@ +name: Performance Regression + +on: + workflow_call: + inputs: + base_ref: + description: Git ref to use as the performance baseline + required: false + default: origin/main + type: string + head_ref: + description: Git ref to test + required: false + default: '' + type: string + workflow_dispatch: + inputs: + base_ref: + description: Git ref to use as the performance baseline + required: false + default: origin/main + type: string + head_ref: + description: Git ref to test + required: false + default: '' + type: string + +permissions: + contents: read + +concurrency: + group: performance-regression-${{ github.ref }} + cancel-in-progress: true + +jobs: + get-configs: + uses: ./.github/workflows/configs.yml + + compare: + name: Compare base and head + needs: [get-configs] + runs-on: ubuntu-latest + timeout-minutes: 35 + env: + BASE_REF: ${{ inputs.base_ref || 'origin/main' }} + HEAD_REF: ${{ inputs.head_ref || github.sha }} + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Install Rust ${{ needs.get-configs.outputs.rust-toolchain }} + uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c + with: + toolchain: ${{ needs.get-configs.outputs.rust-toolchain }} + + - name: Setup Python ${{ needs.get-configs.outputs.python-version }} + uses: actions/setup-python@v6 + with: + python-version: ${{ needs.get-configs.outputs.python-version }} + + - name: Test comparison logic + run: python3 scripts/check_performance_regression.py --self-test + + - name: Compare performance + run: | + set -euo pipefail + python3 scripts/check_performance_regression.py \ + --base-ref "$BASE_REF" \ + --head-ref "$HEAD_REF" \ + --output-dir "$RUNNER_TEMP/performance-regression" + + - name: Add comparison to job summary + if: always() + run: | + if [[ -f "$RUNNER_TEMP/performance-regression/performance-comparison.md" ]]; then + cat "$RUNNER_TEMP/performance-regression/performance-comparison.md" >> "$GITHUB_STEP_SUMMARY" + fi + + - name: Upload performance evidence + if: always() + uses: actions/upload-artifact@v7 + with: + name: performance-regression-${{ github.event.pull_request.number || github.run_id }} + path: | + ${{ runner.temp }}/performance-regression/performance-comparison.json + ${{ runner.temp }}/performance-regression/performance-comparison.md + if-no-files-found: warn + retention-days: 7 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index ea1bdc6a..d7b9e737 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -13,6 +13,12 @@ concurrency: cancel-in-progress: true jobs: + relevant-changes: + uses: ./.github/workflows/relevant-source-changes.yml + permissions: + contents: read + pull-requests: read + validate: uses: ./.github/workflows/validate.yml permissions: @@ -21,3 +27,13 @@ jobs: with: ref: ${{ github.sha }} release-run: false + + performance-regression: + needs: [relevant-changes] + if: ${{ needs.relevant-changes.outputs.relevant == 'true' }} + uses: ./.github/workflows/performance-regression.yml + permissions: + contents: read + with: + base_ref: ${{ github.event.pull_request.base.sha }} + head_ref: ${{ github.event.pull_request.head.sha }} diff --git a/.github/workflows/relevant-source-changes.yml b/.github/workflows/relevant-source-changes.yml new file mode 100644 index 00000000..3bb9080d --- /dev/null +++ b/.github/workflows/relevant-source-changes.yml @@ -0,0 +1,64 @@ +name: Relevant Source Changes + +on: + workflow_call: + outputs: + relevant: + description: Whether at least one changed path requires artifact or performance validation + value: ${{ jobs.changes.outputs.relevant }} + +permissions: + contents: read + pull-requests: read + +jobs: + changes: + runs-on: ubuntu-latest + outputs: + relevant: ${{ steps.decision.outputs.relevant }} + steps: + - name: Checkout push history + if: ${{ github.event_name == 'push' }} + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Detect relevant paths + if: ${{ github.event_name != 'workflow_dispatch' }} + id: filter + uses: dorny/paths-filter@v4.0.3 + with: + filters: | + relevant: + - '**' + - '!.github/**' + - '!scripts/**' + - '!.gitattributes' + - '!.gitignore' + - '!**/*.md' + - '!**/*.txt' + - '!**/*.jar' + - '!LICENSE' + - '!NOTICE' + - '!gradlew' + - '!gradlew.bat' + - '!src/bindings-*/**/bench/**' + - '!src/bindings-*/examples/**' + - '!src/bindings-*/tests/**' + - '!src/bindings-jvm/version.properties' + - '!src/bindings-wasm/dist/*' + - '!src/bindings-python/generated/**' + - '!src/bindings-go/go/internal/**' + - '!src/bindings-go/go/libs/**' + - '!release-bin/*' + + - name: Export decision + id: decision + env: + FILTER_RELEVANT: ${{ steps.filter.outputs.relevant }} + run: | + if [[ "$GITHUB_EVENT_NAME" == "workflow_dispatch" || "$FILTER_RELEVANT" == "true" ]]; then + echo "relevant=true" >> "$GITHUB_OUTPUT" + else + echo "relevant=false" >> "$GITHUB_OUTPUT" + fi diff --git a/scripts/check_performance_regression.py b/scripts/check_performance_regression.py new file mode 100644 index 00000000..b13d8bfe --- /dev/null +++ b/scripts/check_performance_regression.py @@ -0,0 +1,743 @@ +#!/usr/bin/env python3 +"""Detect meaningful PR performance regressions with paired base/head runs. + +The gate builds one identical Rust harness against each revision, alternates run +order on one runner, and confirms apparent regressions before failing. Absolute +milliseconds are never compared across machines. +""" + +from __future__ import annotations + +import argparse +import json +import math +import os +import platform +import re +import shutil +import subprocess +import sys +import tomllib +from dataclasses import dataclass +from pathlib import Path +from statistics import median +from typing import Any, Callable + +SCRIPT_DIR = Path(__file__).resolve().parent +PROJECT_ROOT = SCRIPT_DIR.parent +HARNESS_SOURCE = PROJECT_ROOT / "src" / "performance-harness" +DEFAULT_OUTPUT_DIR = PROJECT_ROOT / "tmp" / "performance-regression" + + +@dataclass(frozen=True) +class Workload: + name: str + templates: tuple[Path, ...] + iterations: int + gate_process_lifecycle: bool = True + + +@dataclass(frozen=True) +class MetricGate: + name: str + accessor: Callable[[dict[str, Any]], float] + threshold: float + floor: float + minimum_delta: float + + +@dataclass(frozen=True) +class MetricEvaluation: + metric: str + ratio: float + median_delta: float + slower_pairs: int + pair_count: int + regression: bool + enforced: bool = True + + +METRIC_GATES = ( + MetricGate("initialization", lambda sample: sample["initTotalMs"], math.inf, 1.0, math.inf), + MetricGate( + "init + first", + lambda sample: sample["initTotalMs"] + sample["firstValidation"]["wallMs"], + 1.10, + 1.0, + 5.0, + ), + MetricGate("first validation", lambda sample: sample["firstValidation"]["wallMs"], 1.12, 0.5, 5.0), + MetricGate("warm total", lambda sample: sample["warm"]["perCallTotalMs"], 1.10, 0.2, 1.0), + MetricGate("warm model", lambda sample: sample["warm"]["modelMedianMs"], 1.15, 0.2, 1.0), + MetricGate("warm schema", lambda sample: sample["warm"]["schemaMedianMs"], 1.15, 0.2, 1.0), + MetricGate("warm rules", lambda sample: sample["warm"]["ruleMedianMs"], 1.15, 0.2, 1.0), + MetricGate("peak RSS", lambda sample: sample["peakRssBytes"], 1.15, 1024.0, 16 * 1024 * 1024), +) +AGGREGATE_WARM_THRESHOLD = 1.07 +CONSISTENT_SLOWER_FRACTION = 2 / 3 + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--base-ref", default="origin/main", help="Git ref for the comparison baseline") + parser.add_argument("--head-ref", default="HEAD", help="Git ref for the candidate revision") + parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR) + parser.add_argument("--initial-pairs", type=int, default=3) + parser.add_argument("--confirmation-pairs", type=int, default=3) + parser.add_argument("--quick", action="store_true", help="Use one pair and reduced iterations for local smoke tests") + parser.add_argument("--keep-worktrees", action="store_true") + parser.add_argument("--self-test", action="store_true", help="Test comparison logic without building Rust") + arguments = parser.parse_args() + if arguments.initial_pairs < 1 or arguments.confirmation_pairs < 1: + parser.error("pair counts must be positive") + return arguments + + +def run_command( + command: list[str], + *, + cwd: Path, + environment: dict[str, str] | None = None, + capture: bool = False, +) -> subprocess.CompletedProcess[str]: + print(f" $ {' '.join(command)}", file=sys.stderr) + completed = subprocess.run( + command, + cwd=cwd, + env=environment, + text=True, + stdout=subprocess.PIPE if capture else None, + stderr=subprocess.PIPE if capture else None, + ) + if completed.returncode != 0: + if capture: + print(completed.stdout, file=sys.stderr) + print(completed.stderr, file=sys.stderr) + raise RuntimeError(f"command failed with exit {completed.returncode}: {' '.join(command)}") + return completed + + +def resolve_ref(reference: str) -> str: + completed = run_command(["git", "rev-parse", reference], cwd=PROJECT_ROOT, capture=True) + return completed.stdout.strip() + + +def remove_worktree(path: Path) -> None: + if not path.exists(): + return + subprocess.run( + ["git", "worktree", "remove", "--force", str(path)], + cwd=PROJECT_ROOT, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + if path.exists(): + shutil.rmtree(path) + + +def configure_harness_dependencies(workspace_dir: Path) -> None: + harness_manifest_path = workspace_dir / "performance-harness" / "Cargo.toml" + harness_manifest = harness_manifest_path.read_text() + dependency_directories = { + "cel-engine": "cel-engine", + "diagnostics": "diagnostics", + "rego-engine": "rego-engine", + "rules": "rules", + "schema-validator": "schema-validator", + "validation-engine": "validation-engine", + } + for dependency_alias, directory_name in dependency_directories.items(): + crate_manifest_path = workspace_dir / directory_name / "Cargo.toml" + with crate_manifest_path.open("rb") as crate_manifest_file: + package_name = tomllib.load(crate_manifest_file)["package"]["name"] + original = f'{dependency_alias} = {{ path = "../{directory_name}" }}' + replacement = ( + f'{dependency_alias} = {{ package = "{package_name}", path = "../{directory_name}" }}' + ) + if original not in harness_manifest: + raise RuntimeError(f"harness dependency marker not found: {original}") + harness_manifest = harness_manifest.replace(original, replacement, 1) + harness_manifest_path.write_text(harness_manifest) + + +def prepare_worktree(reference: str, destination: Path, target_dir: Path) -> Path: + remove_worktree(destination) + run_command(["git", "worktree", "add", "--detach", str(destination), reference], cwd=PROJECT_ROOT) + + workspace_dir = destination / "src" + run_command(["cargo", "fetch", "--locked"], cwd=workspace_dir) + harness_destination = workspace_dir / "performance-harness" + if harness_destination.exists(): + shutil.rmtree(harness_destination) + shutil.copytree(HARNESS_SOURCE, harness_destination) + configure_harness_dependencies(workspace_dir) + + manifest_path = workspace_dir / "Cargo.toml" + manifest = manifest_path.read_text() + if '"performance-harness"' not in manifest: + marker = ' "validation-engine",\n]' + if marker not in manifest: + raise RuntimeError(f"workspace member marker not found in {manifest_path}") + manifest = manifest.replace(marker, ' "validation-engine",\n "performance-harness",\n]', 1) + manifest_path.write_text(manifest) + + build_environment = os.environ.copy() + build_environment["CARGO_TARGET_DIR"] = str(target_dir) + run_command( + ["cargo", "build", "--release", "--offline", "-p", "performance-harness"], + cwd=workspace_dir, + environment=build_environment, + ) + binary_name = "performance-harness.exe" if platform.system() == "Windows" else "performance-harness" + binary = target_dir / "release" / binary_name + if not binary.is_file(): + raise RuntimeError(f"benchmark binary was not produced: {binary}") + return binary + + +def generate_fixtures(directory: Path) -> dict[str, Path]: + directory.mkdir(parents=True, exist_ok=True) + tiny = directory / "tiny.yaml" + tiny.write_text( + "AWSTemplateFormatVersion: '2010-09-09'\n" + "Resources:\n" + " Bucket:\n" + " Type: AWS::S3::Bucket\n" + " Properties:\n" + " BucketName: performance-regression-bucket\n" + ) + + def write_buckets(path: Path, count: int, duplicate: bool) -> None: + lines = ["AWSTemplateFormatVersion: '2010-09-09'", "Resources:"] + for index in range(count): + bucket_name = "shared-performance-id" if duplicate else f"unique-performance-id-{index}" + lines.extend( + [ + f" Bucket{index}:", + " Type: AWS::S3::Bucket", + " Properties:", + f" BucketName: {bucket_name}", + ] + ) + path.write_text("\n".join(lines) + "\n") + + unique = directory / "unique-500.yaml" + duplicate = directory / "duplicate-500.yaml" + write_buckets(unique, 500, False) + write_buckets(duplicate, 500, True) + + conditional = directory / "conditional-100.yaml" + conditional_lines = [ + "AWSTemplateFormatVersion: '2010-09-09'", + "Parameters:", + " Environment:", + " Type: String", + " AllowedValues: [a, b]", + "Conditions:", + " IsA: !Equals [!Ref Environment, a]", + " IsB: !Equals [!Ref Environment, b]", + "Resources:", + ] + for index in range(100): + condition = "IsA" if index % 2 == 0 else "IsB" + conditional_lines.extend( + [ + f" Bucket{index}:", + " Type: AWS::S3::Bucket", + f" Condition: {condition}", + " Properties:", + " BucketName: shared-conditional-id", + ] + ) + conditional.write_text("\n".join(conditional_lines) + "\n") + return {"tiny": tiny, "unique": unique, "duplicate": duplicate, "conditional": conditional} + + +def security_workloads(directory: Path, iteration_divisor: int) -> tuple[Workload, ...]: + iteration_counts = { + "condition_fusion.yaml": 2, + "cross_reference_fanout.yaml": 1, + "cross_resource_scale.yaml": 3, + "deep_intrinsic_resolution.yaml": 2, + "deep_nesting.json": 1, + "deep_yaml_nesting.yaml": 1, + "many_resources.yaml": 5, + "pathological_conditions.yaml": 3, + "scenario_assignment_budget.yaml": 2, + } + templates = sorted( + path + for path in directory.rglob("*") + if path.is_file() and path.suffix.lower() in {".json", ".yaml", ".yml"} + ) + workloads = [] + for template in templates: + relative = template.relative_to(directory).with_suffix("") + label = "-".join(relative.parts).replace("_", "-") + normal_iterations = iteration_counts.get(template.name, 2) + workloads.append( + Workload( + f"security-{label}", + (template,), + max(1, normal_iterations // iteration_divisor), + gate_process_lifecycle=template.name not in {"deep_nesting.json", "deep_yaml_nesting.yaml"}, + ) + ) + return tuple(workloads) + + +def workload_matrix(fixtures: dict[str, Path], quick: bool) -> tuple[Workload, ...]: + divisor = 5 if quick else 1 + + def iterations(normal: int) -> int: + return max(1, normal // divisor) + + templates = PROJECT_ROOT / "src" / "resources" / "templates" + security = PROJECT_ROOT / "src" / "resources" / "security" + return ( + Workload("tiny", (fixtures["tiny"],), iterations(151)), + Workload("unique-500", (fixtures["unique"],), iterations(9)), + Workload("duplicate-500", (fixtures["duplicate"],), iterations(7)), + Workload("conditional-100", (fixtures["conditional"],), iterations(15)), + Workload( + "mixed-real", + ( + templates / "cdk" / "codepipeline-build-deploy--CodepipelineBuildDeployStack.template.json", + templates / "quickstart" / "vpc.json", + ), + iterations(7), + ), + *security_workloads(security, divisor), + ) + + +def time_prefix() -> list[str]: + time_binary = Path("/usr/bin/time") + if not time_binary.exists(): + raise RuntimeError("/usr/bin/time is required for peak RSS measurement") + return [str(time_binary), "-v"] if platform.system() == "Linux" else [str(time_binary), "-l"] + + +def cpu_pin_prefix() -> list[str]: + taskset = shutil.which("taskset") + if taskset is None or not hasattr(os, "sched_getaffinity"): + return [] + allowed_cpus = os.sched_getaffinity(0) + return [taskset, "-c", str(min(allowed_cpus))] if allowed_cpus else [] + + +def parse_peak_rss(stderr: str) -> int: + linux_match = re.search(r"Maximum resident set size \(kbytes\):\s*(\d+)", stderr) + if linux_match: + return int(linux_match.group(1)) * 1024 + darwin_match = re.search(r"(\d+)\s+maximum resident set size", stderr) + if darwin_match: + return int(darwin_match.group(1)) + raise RuntimeError("maximum resident set size was not present in /usr/bin/time output") + + +def run_measurement( + binary: Path, + engine: str, + workload: Workload, + variant: str, + pair_index: int, +) -> dict[str, Any]: + command = [ + *time_prefix(), + *cpu_pin_prefix(), + str(binary), + engine, + str(workload.iterations), + "2", + workload.name, + *(str(path) for path in workload.templates), + ] + completed = run_command(command, cwd=PROJECT_ROOT, capture=True) + output_lines = [line for line in completed.stdout.splitlines() if line.strip()] + if not output_lines: + raise RuntimeError(f"benchmark emitted no JSON for {engine}/{workload.name}/{variant}") + measurement = json.loads(output_lines[-1]) + measurement["peakRssBytes"] = parse_peak_rss(completed.stderr) + measurement["variant"] = variant + measurement["pair"] = pair_index + measurement["gateProcessLifecycle"] = workload.gate_process_lifecycle + return measurement + + +def diagnostic_signature(measurement: dict[str, Any]) -> tuple[Any, ...]: + fingerprints = tuple( + (Path(item["path"]).name, item["fingerprint"], item["diagnostics"], item["status"]) + for item in measurement["fingerprints"] + ) + return (measurement["firstValidation"]["fingerprint"], fingerprints) + + +def metric_evaluation( + pairs: list[dict[str, dict[str, Any]]], + gate: MetricGate, +) -> MetricEvaluation: + ratios = [] + deltas = [] + for pair in pairs: + baseline = gate.accessor(pair["base"]) + candidate = gate.accessor(pair["head"]) + if baseline >= gate.floor: + ratios.append(candidate / baseline) + deltas.append(candidate - baseline) + if not ratios: + return MetricEvaluation(gate.name, 1.0, 0.0, 0, 0, False) + ratio = math.exp(sum(math.log(value) for value in ratios) / len(ratios)) + median_delta = median(deltas) + slower_pairs = sum(value > 1.0 for value in ratios) + required_slower = math.ceil(len(ratios) * CONSISTENT_SLOWER_FRACTION) + regression = ( + ratio > gate.threshold + and median_delta > gate.minimum_delta + and slower_pairs >= required_slower + ) + return MetricEvaluation(gate.name, ratio, median_delta, slower_pairs, len(ratios), regression) + + +def evaluate_cases( + measurements: dict[tuple[str, str], list[dict[str, dict[str, Any]]]], +) -> tuple[dict[tuple[str, str], list[MetricEvaluation]], list[str], bool]: + evaluations: dict[tuple[str, str], list[MetricEvaluation]] = {} + failures: list[str] = [] + diagnostic_mismatch = False + for case, pairs in sorted(measurements.items()): + engine, workload = case + for pair in pairs: + if diagnostic_signature(pair["base"]) != diagnostic_signature(pair["head"]): + diagnostic_mismatch = True + failures.append(f"{engine}/{workload}: diagnostics differ between base and head") + break + gate_process_lifecycle = all( + pair["base"].get("gateProcessLifecycle", True) + and pair["head"].get("gateProcessLifecycle", True) + for pair in pairs + ) + case_evaluations = [] + for gate in METRIC_GATES: + evaluation = metric_evaluation(pairs, gate) + if not gate_process_lifecycle and gate.name in {"init + first", "peak RSS"}: + evaluation = MetricEvaluation( + evaluation.metric, + evaluation.ratio, + evaluation.median_delta, + evaluation.slower_pairs, + evaluation.pair_count, + False, + False, + ) + case_evaluations.append(evaluation) + evaluations[case] = case_evaluations + for evaluation in case_evaluations: + if evaluation.regression: + failures.append( + f"{engine}/{workload}: {evaluation.metric} regressed by " + f"{(evaluation.ratio - 1) * 100:.1f}% " + f"(median delta {evaluation.median_delta:.3f}; " + f"{evaluation.slower_pairs}/{evaluation.pair_count} paired runs slower)" + ) + + warm_ratios = [] + for pairs in measurements.values(): + for pair in pairs: + baseline = pair["base"]["warm"]["perCallTotalMs"] + candidate = pair["head"]["warm"]["perCallTotalMs"] + if baseline >= 0.2: + warm_ratios.append(candidate / baseline) + aggregate_regression = False + if warm_ratios: + aggregate_ratio = math.exp(sum(math.log(value) for value in warm_ratios) / len(warm_ratios)) + slower_pairs = sum(value > 1 for value in warm_ratios) + required_slower = math.ceil(len(warm_ratios) * CONSISTENT_SLOWER_FRACTION) + aggregate_regression = aggregate_ratio > AGGREGATE_WARM_THRESHOLD and slower_pairs >= required_slower + if aggregate_regression: + failures.append( + f"aggregate warm validation regressed by {(aggregate_ratio - 1) * 100:.1f}% " + f"({slower_pairs}/{len(warm_ratios)} paired runs slower)" + ) + return evaluations, failures, diagnostic_mismatch + + +def collect_pairs( + base_binary: Path, + head_binary: Path, + workloads: tuple[Workload, ...], + engines: tuple[str, ...], + pair_start: int, + pair_count: int, + selected_cases: set[tuple[str, str]] | None, + measurements: dict[tuple[str, str], list[dict[str, dict[str, Any]]]], +) -> None: + for engine in engines: + for workload_index, workload in enumerate(workloads): + case = (engine, workload.name) + if selected_cases is not None and case not in selected_cases: + continue + case_pairs = measurements.setdefault(case, []) + for pair_index in range(pair_start, pair_start + pair_count): + base_first = (pair_index + workload_index + (0 if engine == "rego" else 1)) % 2 == 0 + order = (("base", base_binary), ("head", head_binary)) + if not base_first: + order = tuple(reversed(order)) + paired_measurement: dict[str, dict[str, Any]] = {} + for variant, binary in order: + paired_measurement[variant] = run_measurement(binary, engine, workload, variant, pair_index) + case_pairs.append(paired_measurement) + + +def render_markdown( + evaluations: dict[tuple[str, str], list[MetricEvaluation]], + failures: list[str], + base_sha: str, + head_sha: str, +) -> str: + lines = [ + "# PR performance regression check", + "", + f"Base: `{base_sha[:12]}` ", + f"Head: `{head_sha[:12]}`", + "", + "Ratios are paired head/base geometric means. Values below 1.0 are faster/smaller.", + "Ratios marked `(info)` are reported but not gated for parser-only robustness fixtures.", + "", + "| Engine | Workload | Init | Init + first | First validate | Warm total | Model | Schema | Rules | Peak RSS | Status |", + "|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---|", + ] + metric_order = [ + "initialization", + "init + first", + "first validation", + "warm total", + "warm model", + "warm schema", + "warm rules", + "peak RSS", + ] + for (engine, workload), case_evaluations in sorted(evaluations.items()): + by_name = {evaluation.metric: evaluation for evaluation in case_evaluations} + values = [by_name[name] for name in metric_order] + status = "FAIL" if any(value.regression for value in values) else "pass" + ratios = [f"{value.ratio:.3f}×" + (" (info)" if not value.enforced else "") for value in values] + lines.append(f"| {engine} | {workload} | {' | '.join(ratios)} | {status} |") + lines.extend(["", "## Result", ""]) + if failures: + lines.extend([f"* ❌ {failure}" for failure in failures]) + else: + lines.append("✅ No meaningful performance or diagnostic regression detected.") + return "\n".join(lines) + "\n" + + +def run_self_test() -> None: + gate = MetricGate("test", lambda sample: sample["value"], 1.10, 0.1, 1.0) + + def pairs(ratios: list[float]) -> list[dict[str, dict[str, float]]]: + return [{"base": {"value": 10.0}, "head": {"value": 10.0 * ratio}} for ratio in ratios] + + assert not metric_evaluation(pairs([1.01, 0.99, 1.02]), gate).regression + assert not metric_evaluation(pairs([1.0, 1.0, 1.30]), gate).regression + assert metric_evaluation(pairs([1.15, 1.14, 1.16]), gate).regression + tiny_delta_pairs = [{"base": {"value": 1.0}, "head": {"value": 1.2}} for _ in range(3)] + assert not metric_evaluation(tiny_delta_pairs, gate).regression + assert not metric_evaluation([{"base": {"value": 0.01}, "head": {"value": 1.0}}], gate).regression + + memory_gate = MetricGate("memory", lambda sample: sample["value"], 1.15, 1.0, 1.0) + assert metric_evaluation(pairs([1.20, 1.19, 1.21]), memory_gate).regression + + def synthetic_sample(multiplier: float, fingerprint_value: str = "same") -> dict[str, Any]: + return { + "initTotalMs": 10.0 * multiplier, + "firstValidation": {"wallMs": 10.0 * multiplier, "fingerprint": fingerprint_value}, + "warm": { + "perCallTotalMs": 10.0 * multiplier, + "modelMedianMs": 2.0 * multiplier, + "schemaMedianMs": 2.0 * multiplier, + "ruleMedianMs": 5.0 * multiplier, + }, + "peakRssBytes": 100_000_000 * multiplier, + "fingerprints": [ + {"path": "fixture.yaml", "fingerprint": fingerprint_value, "diagnostics": 1, "status": "OK"} + ], + } + + stable_measurements = { + ("rego", "fixture"): [ + {"base": synthetic_sample(1.0), "head": synthetic_sample(1.02)} for _ in range(3) + ] + } + _, stable_failures, stable_diagnostic_mismatch = evaluate_cases(stable_measurements) + assert not stable_failures and not stable_diagnostic_mismatch + + tradeoff_base = synthetic_sample(1.0) + tradeoff_head = synthetic_sample(1.0) + tradeoff_head["initTotalMs"] = 15.0 + tradeoff_head["firstValidation"]["wallMs"] = 5.0 + tradeoff_measurements = { + ("rego", "tradeoff"): [{"base": tradeoff_base, "head": tradeoff_head} for _ in range(3)] + } + _, tradeoff_failures, _ = evaluate_cases(tradeoff_measurements) + assert not tradeoff_failures + + aggregate_measurements = { + (engine, workload): [ + {"base": synthetic_sample(1.0), "head": synthetic_sample(1.08)} for _ in range(3) + ] + for engine, workload in [("rego", "one"), ("cel", "two")] + } + _, aggregate_failures, aggregate_diagnostic_mismatch = evaluate_cases(aggregate_measurements) + assert any(failure.startswith("aggregate warm") for failure in aggregate_failures) + assert not aggregate_diagnostic_mismatch + + model_only_head = synthetic_sample(1.0) + model_only_head["warm"]["modelMedianMs"] = 4.0 + model_only_measurements = { + ("rego", "model-only"): [ + {"base": synthetic_sample(1.0), "head": model_only_head} for _ in range(3) + ] + } + model_only_evaluations, model_only_failures, _ = evaluate_cases(model_only_measurements) + model_only_markdown = render_markdown(model_only_evaluations, model_only_failures, "base", "head") + assert "| Model |" in model_only_markdown + assert "| rego | model-only |" in model_only_markdown and "| FAIL |" in model_only_markdown + + parser_only_base = synthetic_sample(1.0) + parser_only_head = synthetic_sample(1.0) + parser_only_head["initTotalMs"] = 25.0 + parser_only_head["peakRssBytes"] = 200_000_000 + parser_only_measurements = { + ("rego", "parser-only"): [ + { + "base": {**parser_only_base, "gateProcessLifecycle": False}, + "head": {**parser_only_head, "gateProcessLifecycle": False}, + } + for _ in range(3) + ] + } + parser_evaluations, parser_failures, _ = evaluate_cases(parser_only_measurements) + assert not parser_failures + parser_by_name = {evaluation.metric: evaluation for evaluation in parser_evaluations[("rego", "parser-only")]} + assert not parser_by_name["init + first"].enforced + assert not parser_by_name["peak RSS"].enforced + assert parser_by_name["first validation"].enforced + assert parser_by_name["warm total"].enforced + + mismatch_measurements = { + ("rego", "fixture"): [ + {"base": synthetic_sample(1.0, "base"), "head": synthetic_sample(1.0, "head")} + ] + } + _, mismatch_failures, mismatch_detected = evaluate_cases(mismatch_measurements) + assert mismatch_detected and any("diagnostics differ" in failure for failure in mismatch_failures) + security_directory = PROJECT_ROOT / "src" / "resources" / "security" + expected_security_templates = { + path.resolve() + for path in security_directory.rglob("*") + if path.is_file() and path.suffix.lower() in {".json", ".yaml", ".yml"} + } + discovered_security_workloads = security_workloads(security_directory, 5) + discovered_security_templates = { + workload.templates[0].resolve() for workload in discovered_security_workloads + } + assert expected_security_templates + assert discovered_security_templates == expected_security_templates + assert len({workload.name for workload in discovered_security_workloads}) == len(discovered_security_workloads) + + print("performance comparison self-tests passed") + + +def main() -> int: + arguments = parse_args() + if arguments.self_test: + run_self_test() + return 0 + + time_prefix() + base_sha = resolve_ref(arguments.base_ref) + head_sha = resolve_ref(arguments.head_ref) + if base_sha == head_sha: + raise RuntimeError("base and head resolve to the same commit") + + output_dir = arguments.output_dir.resolve() + output_dir.mkdir(parents=True, exist_ok=True) + worktree_root = output_dir / "worktrees" + target_root = output_dir / "targets" + fixtures = generate_fixtures(output_dir / "fixtures") + workloads = workload_matrix(fixtures, arguments.quick) + engines = ("rego", "cel") + initial_pairs = 1 if arguments.quick else arguments.initial_pairs + confirmation_pairs = 1 if arguments.quick else arguments.confirmation_pairs + + base_tree = worktree_root / "base" + head_tree = worktree_root / "head" + measurements: dict[tuple[str, str], list[dict[str, dict[str, Any]]]] = {} + try: + print(f"Building base {base_sha}", file=sys.stderr) + base_binary = prepare_worktree(base_sha, base_tree, target_root / "base") + print(f"Building head {head_sha}", file=sys.stderr) + head_binary = prepare_worktree(head_sha, head_tree, target_root / "head") + + collect_pairs(base_binary, head_binary, workloads, engines, 0, initial_pairs, None, measurements) + evaluations, failures, diagnostic_mismatch = evaluate_cases(measurements) + if failures and not diagnostic_mismatch: + failing_cases = { + case + for case, case_evaluations in evaluations.items() + if any(evaluation.regression for evaluation in case_evaluations) + } + if any(failure.startswith("aggregate ") for failure in failures): + failing_cases = set(evaluations) + print(f"Confirming {len(failing_cases)} apparent regression(s)", file=sys.stderr) + collect_pairs( + base_binary, + head_binary, + workloads, + engines, + initial_pairs, + confirmation_pairs, + failing_cases, + measurements, + ) + evaluations, failures, diagnostic_mismatch = evaluate_cases(measurements) + + serialized_measurements = { + f"{engine}/{workload}": pairs for (engine, workload), pairs in sorted(measurements.items()) + } + json_path = output_dir / "performance-comparison.json" + json_path.write_text( + json.dumps( + { + "base": base_sha, + "head": head_sha, + "measurements": serialized_measurements, + "failures": failures, + }, + indent=2, + sort_keys=True, + ) + + "\n" + ) + markdown = render_markdown(evaluations, failures, base_sha, head_sha) + markdown_path = output_dir / "performance-comparison.md" + markdown_path.write_text(markdown) + print(markdown) + if failures: + for failure in failures: + print(f"::error::{failure}") + return 1 + return 0 + finally: + if not arguments.keep_worktrees: + remove_worktree(base_tree) + remove_worktree(head_tree) + subprocess.run(["git", "worktree", "prune"], cwd=PROJECT_ROOT, check=False) + + +if __name__ == "__main__": + try: + raise SystemExit(main()) + except (OSError, RuntimeError, ValueError, json.JSONDecodeError) as error: + print(f"performance regression check failed: {error}", file=sys.stderr) + raise SystemExit(2) from error From 5e847e2fd0e41163a5639ed7425b422327b7b8b5 Mon Sep 17 00:00:00 2001 From: Satyaki Ghosh Date: Fri, 28 Aug 2026 13:31:06 -0600 Subject: [PATCH 5/6] Add performance harness --- src/Cargo.lock | 13 ++ src/Cargo.toml | 1 + src/performance-harness/Cargo.toml | 22 +++ src/performance-harness/src/main.rs | 199 ++++++++++++++++++++++++++++ 4 files changed, 235 insertions(+) create mode 100644 src/performance-harness/Cargo.toml create mode 100644 src/performance-harness/src/main.rs diff --git a/src/Cargo.lock b/src/Cargo.lock index bd7528a3..aec154cd 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -1480,6 +1480,19 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "performance-harness" +version = "1.9.0" +dependencies = [ + "cloudformation-validate-cel-engine", + "cloudformation-validate-diagnostics", + "cloudformation-validate-rego-engine", + "cloudformation-validate-rules", + "cloudformation-validate-schema-validator", + "cloudformation-validate-validation-engine", + "serde_json", +] + [[package]] name = "pin-project-lite" version = "0.2.17" diff --git a/src/Cargo.toml b/src/Cargo.toml index 4255a0f8..f14d9e6d 100644 --- a/src/Cargo.toml +++ b/src/Cargo.toml @@ -10,6 +10,7 @@ members = [ "data-source", "diagnostics", "guard-translator", + "performance-harness", "rego-engine", "resources", "rules", diff --git a/src/performance-harness/Cargo.toml b/src/performance-harness/Cargo.toml new file mode 100644 index 00000000..f76b98f7 --- /dev/null +++ b/src/performance-harness/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "performance-harness" +publish = false +version.workspace = true +edition.workspace = true +license.workspace = true +description.workspace = true +repository.workspace = true +keywords.workspace = true +categories.workspace = true + +[dependencies] +cel-engine = { workspace = true } +diagnostics = { workspace = true } +rego-engine = { workspace = true } +rules = { workspace = true } +schema-validator = { workspace = true } +validation-engine = { workspace = true } +serde_json = "1" + +[lints] +workspace = true diff --git a/src/performance-harness/src/main.rs b/src/performance-harness/src/main.rs new file mode 100644 index 00000000..2d9b5148 --- /dev/null +++ b/src/performance-harness/src/main.rs @@ -0,0 +1,199 @@ +use cel_engine::CelEngine; +use diagnostics::{DetailLevel, ValidationReport}; +use rego_engine::RegoEngine; +use rules::Severity; +use schema_validator::SchemaValidator; +use std::env; +use std::fs; +use std::hint::black_box; +use std::time::Instant; +use validation_engine::{EngineConfig, ValidateConfig, ValidationEngine, validate_bytes_with_path}; + +fn percentile(samples: &[f64], fraction: f64) -> f64 { + let mut sorted = samples.to_vec(); + sorted.sort_by(f64::total_cmp); + sorted[((sorted.len() - 1) as f64 * fraction).round() as usize] +} + +fn fingerprint_bytes(bytes: &[u8]) -> u64 { + bytes.iter().fold(0xcbf29ce484222325_u64, |hash, byte| (hash ^ u64::from(*byte)).wrapping_mul(0x100000001b3)) +} + +fn fingerprint(report: &ValidationReport) -> u64 { + let value = serde_json::json!({ + "status": &report.status, + "diagnostics": &report.diagnostics, + "counts": &report.metadata.counts, + "budgetExhaustions": &report.metadata.budget_exhaustions, + }); + let bytes = serde_json::to_vec(&value).expect("report fingerprint input must serialize"); + fingerprint_bytes(&bytes) +} + +fn error_fingerprint(error: &impl std::fmt::Display) -> u64 { + fingerprint_bytes(format!("validation-error:{error}").as_bytes()) +} + +fn main() { + let args: Vec = env::args().collect(); + if args.len() < 6 { + eprintln!("usage: performance-harness