{
  "$ref": "#/definitions/SamTemplateSchema",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "CommonTypeCombinatorFields": {
      "additionalProperties": false,
      "description": "Type combinator fields we commonly see at the resource level\n\n(They can be nested)",
      "properties": {
        "allOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "anyOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "oneOf": {
          "items": {
            "$ref": "#/definitions/CommonTypeCombinatorFields"
          },
          "type": "array"
        },
        "required": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "type": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "SamTemplateSchema": {
      "$ref": "#/definitions/jsonschema.SchemaFile",
      "description": "The SAM schema is just JSON schema with no frills"
    },
    "jsonschema.AllOf<Schema>": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "allOf": {
          "items": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "allOf"
      ],
      "type": "object"
    },
    "jsonschema.AnyOf<Schema>": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "anyOf": {
          "items": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "anyOf"
      ],
      "type": "object"
    },
    "jsonschema.AnyType": {
      "anyOf": [
        {
          "const": true,
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/jsonschema.EmptyObject"
        }
      ]
    },
    "jsonschema.Boolean": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "default": {
          "type": "boolean"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "boolean",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.ConcreteSingletonSchema": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.Object"
        },
        {
          "$ref": "#/definitions/jsonschema.String"
        },
        {
          "$ref": "#/definitions/jsonschema.SchemaArray"
        },
        {
          "$ref": "#/definitions/jsonschema.Boolean"
        },
        {
          "$ref": "#/definitions/jsonschema.Number"
        },
        {
          "$ref": "#/definitions/jsonschema.Null"
        },
        {
          "$ref": "#/definitions/jsonschema.AnyType"
        }
      ]
    },
    "jsonschema.EmptyObject": {
      "additionalProperties": {
        "not": {}
      },
      "type": "object"
    },
    "jsonschema.MapLikeObject": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "additionalProperties": {
          "anyOf": [
            {
              "const": false,
              "type": "boolean"
            },
            {
              "$ref": "#/definitions/jsonschema.Schema"
            }
          ],
          "default": true,
          "description": "additionalProperties validates all keys that aren't otherwise validated by properties or patternProperties"
        },
        "description": {
          "type": "string"
        },
        "maxProperties": {
          "type": "number"
        },
        "minProperties": {
          "type": "number"
        },
        "patternProperties": {
          "additionalProperties": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "object"
        },
        "required": {
          "description": "Required keys in a map\n\nDoesn't really make a whole lot of sense, but this is used to support mixed map/record types.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.Null": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "null",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.Number": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "default": {
          "type": "number"
        },
        "description": {
          "type": "string"
        },
        "enum": {
          "items": {
            "type": "number"
          },
          "type": "array"
        },
        "format": {
          "enum": [
            "int64",
            "double"
          ],
          "type": "string"
        },
        "maximum": {
          "type": "number"
        },
        "minimum": {
          "type": "number"
        },
        "multipleOf": {
          "type": "number"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "enum": [
            "number",
            "integer"
          ],
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.Object": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.MapLikeObject"
        },
        {
          "$ref": "#/definitions/jsonschema.RecordLikeObject"
        }
      ]
    },
    "jsonschema.ObjectProperties": {
      "additionalProperties": {
        "$ref": "#/definitions/jsonschema.Schema"
      },
      "type": "object"
    },
    "jsonschema.OneOf<Schema>": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "oneOf": {
          "items": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        }
      },
      "required": [
        "oneOf"
      ],
      "type": "object"
    },
    "jsonschema.RecordLikeObject": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "additionalProperties": {
          "const": false,
          "description": "FIXME: should be required but some service teams have omitted it.",
          "type": "boolean"
        },
        "anyOf": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/CommonTypeCombinatorFields"
              },
              {
                "$ref": "#/definitions/jsonschema.RecordLikeObject"
              }
            ]
          },
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "maxProperties": {
          "type": "number"
        },
        "minProperties": {
          "description": "FIXME: these are weird but oh hey?",
          "type": "number"
        },
        "oneOf": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/CommonTypeCombinatorFields"
              },
              {
                "$ref": "#/definitions/jsonschema.RecordLikeObject"
              }
            ]
          },
          "type": "array"
        },
        "properties": {
          "$ref": "#/definitions/jsonschema.ObjectProperties"
        },
        "required": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "type",
        "properties"
      ],
      "type": "object"
    },
    "jsonschema.Reference": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "$ref": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "$ref"
      ],
      "type": "object"
    },
    "jsonschema.RelationshipRefSchema": {
      "additionalProperties": false,
      "description": "Relationship as defined in the CloudFormation Registry Schema. Represents how resource property relationships are specified in the source schema files.",
      "properties": {
        "propertyPath": {
          "description": "The property path (e.g. '/properties/BucketName')",
          "type": "string"
        },
        "typeName": {
          "description": "The cloudFormationType (e.g. 'AWS::S3::Bucket')",
          "type": "string"
        }
      },
      "required": [
        "typeName",
        "propertyPath"
      ],
      "type": "object"
    },
    "jsonschema.Schema": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.SingletonSchema"
        },
        {
          "$ref": "#/definitions/jsonschema.OneOf%3CSchema%3E"
        },
        {
          "$ref": "#/definitions/jsonschema.AnyOf%3CSchema%3E"
        },
        {
          "$ref": "#/definitions/jsonschema.AllOf%3CSchema%3E"
        }
      ]
    },
    "jsonschema.SchemaArray": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "arrayType": {
          "description": "Does this array describe full reality?\n\n- If `Standard`, real elements must be exactly equal to the given array.\n- If `AttributeList`, the real array may be a superset of the given array.",
          "enum": [
            "AttributeList",
            "Standard"
          ],
          "type": "string"
        },
        "default": {
          "items": {},
          "type": "array"
        },
        "description": {
          "type": "string"
        },
        "examples": {
          "items": {},
          "type": "array"
        },
        "insertionOrder": {
          "description": "Whether to treat the order as significant\n\nIn other words, does this array model a \"sequence\" or a \"multiset\".\n\n- `true` (default): order is significant, the array is a sequence.\n- `false`: order is insignificant, the array is a set.",
          "type": "boolean"
        },
        "items": {
          "$ref": "#/definitions/jsonschema.Schema"
        },
        "maxItems": {
          "type": "number"
        },
        "minItems": {
          "type": "number"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "array",
          "type": "string"
        },
        "uniqueItems": {
          "type": "boolean"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    },
    "jsonschema.SchemaFile": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "$id": {
          "type": "string"
        },
        "additionalProperties": {
          "const": false,
          "description": "FIXME: should be required but some service teams have omitted it.",
          "type": "boolean"
        },
        "anyOf": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/CommonTypeCombinatorFields"
              },
              {
                "$ref": "#/definitions/jsonschema.RecordLikeObject"
              }
            ]
          },
          "type": "array"
        },
        "definitions": {
          "additionalProperties": {
            "$ref": "#/definitions/jsonschema.Schema"
          },
          "description": "Reusable schema type definitions used in this schema.",
          "type": "object"
        },
        "description": {
          "type": "string"
        },
        "maxProperties": {
          "type": "number"
        },
        "minProperties": {
          "description": "FIXME: these are weird but oh hey?",
          "type": "number"
        },
        "oneOf": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/CommonTypeCombinatorFields"
              },
              {
                "$ref": "#/definitions/jsonschema.RecordLikeObject"
              }
            ]
          },
          "type": "array"
        },
        "properties": {
          "$ref": "#/definitions/jsonschema.ObjectProperties"
        },
        "required": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "object",
          "type": "string"
        }
      },
      "required": [
        "properties",
        "type"
      ],
      "type": "object"
    },
    "jsonschema.SingletonSchema": {
      "anyOf": [
        {
          "$ref": "#/definitions/jsonschema.Reference"
        },
        {
          "$ref": "#/definitions/jsonschema.ConcreteSingletonSchema"
        }
      ]
    },
    "jsonschema.String": {
      "additionalProperties": false,
      "properties": {
        "$comment": {
          "type": "string"
        },
        "const": {
          "type": "string"
        },
        "default": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "enum": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "examples": {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "format": {
          "enum": [
            "date-time",
            "uri",
            "timestamp"
          ],
          "type": "string"
        },
        "maxLength": {
          "type": "number"
        },
        "minLength": {
          "type": "number"
        },
        "pattern": {
          "type": "string"
        },
        "relationshipRef": {
          "$ref": "#/definitions/jsonschema.RelationshipRefSchema"
        },
        "title": {
          "type": "string"
        },
        "type": {
          "const": "string",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "type": "object"
    }
  }
}