{
	"$schema": "http://json-schema.org/draft-04/schema#",
	"allOf": [
		{
			"$ref": "#/definitions/job"
		},
		{
			"type": "object",
			"properties": {
				"notifications": {
					"type": "object",
					"properties": {
						"webhooks": {
							"oneOf": [
								{
									"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/webhooks"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/webhooks"
									}
								}
							]
						},
						"slack": {
							"oneOf": [
								{
									"$ref": "#/definitions/slackRoom"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/slack"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/slack"
									}
								}
							]
						},
						"email": {
							"oneOf": [
								{
									"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/email"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/email"
									}
								}
							]
						},
						"irc": {
							"oneOf": [
								{
									"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/irc"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/irc"
									}
								}
							]
						},
						"pushover": {
							"oneOf": [
								{
									"$ref": "#/definitions/nonEmptyStringOrArrayOfNonEmptyStrings"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/pushover"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/pushover"
									}
								}
							]
						},
						"campfire": {
							"oneOf": [
								{
									"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/campfire"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/campfire"
									}
								}
							]
						},
						"flowdock": {
							"oneOf": [
								{
									"$ref": "#/definitions/possiblySecretString"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/flowdock"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/flowdock"
									}
								}
							]
						},
						"hipchat": {
							"oneOf": [
								{
									"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
								},
								{
									"type": "boolean"
								},
								{
									"$ref": "#/definitions/notificationObject/hipchat"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"$ref": "#/definitions/notificationObject/hipchat"
									}
								}
							]
						}
					},
					"additionalProperties": false
				},
				"matrix": {
					"type": "object",
					"properties": {
						"exclude": {
							"type": "array",
							"items": {
								"$ref": "#/definitions/job"
							}
						},
						"include": {
							"type": "array",
							"items": {
								"$ref": "#/definitions/job"
							}
						},
						"allow_failures": {
							"type": "array",
							"items": {
								"$ref": "#/definitions/job"
							}
						},
						"fast_finish": {
							"type": "boolean",
							"description": "If some rows in the build matrix are allowed to fail, the build won't be marked as finished until they have completed. To mark the build as finished as soon as possible, add fast_finish: true"
						}
					},
					"additionalProperties": false
				},
				"jobs": {
					"type": "object",
					"additionalProperties": false,
					"properties": {
						"include": {
							"type": "array",
							"items": {
								"allOf": [
									{
										"$ref": "#/definitions/job"
									},
									{
										"type": "object",
										"properties": {
											"stage": {
												"type": "string",
												"description": "The name of the build stage",
												"default": "test"
											}
										}
									}
								]
							}
						},
						"exclude": {
							"type": "array",
							"items": {
								"allOf": [
									{
										"$ref": "#/definitions/job"
									},
									{
										"type": "object",
										"properties": {
											"stage": {
												"type": "string",
												"description": "The name of the build stage",
												"default": "test"
											}
										}
									}
								]
							}
						},
						"allow_failures": {
							"type": "array",
							"items": {
								"$ref": "#/definitions/job"
							}
						},
						"fast_finish": {
							"type": "boolean",
							"description": "If some rows in the build matrix are allowed to fail, the build won't be marked as finished until they have completed. To mark the build as finished as soon as possible, add fast_finish: true"
						}
					}
				},
				"stages": {
					"type": "array",
					"description": "Specifies the order of build stages",
					"items": {
						"oneOf": [
							{
								"type": "string"
							},
							{
								"type": "object",
								"additionalProperties": false,
								"properties": {
									"name": {
										"type": "string"
									},
									"if": {
										"description": "Specifies a condition for the stage",
										"type": "string"
									}
								}
							}
						]
					}
				},
				"version": {
					"type": "string",
					"description": "Build config specification version",
					"pattern": "^(~>|>|>=|=|<=|<) (\\d+(?:\\.\\d+)?(?:\\.\\d+)?)$"
				},
				"import": {
					"description": "Import YAML config snippets that can be shared across repositories.",
					"oneOf": [
						{
							"type": "array",
							"uniqueItems": true,
							"items": {
								"$ref": "#/definitions/import"
							}
						},
						{
							"$ref": "#/definitions/import"
						}
					]
				}
			}
		}
	],
	"definitions": {
		"nonEmptyString": {
			"type": "string",
			"minLength": 1
		},
		"notRequiredNonEmptyString": {
			"oneOf": [
				{
					"$ref": "#/definitions/nonEmptyString"
				},
				{
					"type": "null"
				}
			]
		},
		"arrayOfNonEmptyStrings": {
			"type": "array",
			"items": {
				"$ref": "#/definitions/nonEmptyString"
			}
		},
		"nonEmptyStringOrArrayOfNonEmptyStrings": {
			"oneOf": [
				{
					"$ref": "#/definitions/nonEmptyString"
				},
				{
					"$ref": "#/definitions/arrayOfNonEmptyStrings"
				}
			]
		},
		"notRequiredNonEmptyStringOrArrayOfNonEmptyStrings": {
			"oneOf": [
				{
					"$ref": "#/definitions/nonEmptyStringOrArrayOfNonEmptyStrings"
				},
				{
					"type": "null"
				}
			]
		},
		"stringArrayUnique": {
			"type": "array",
			"uniqueItems": true,
			"minItems": 1,
			"items": {
				"$ref": "#/definitions/nonEmptyString"
			}
		},
		"stringOrStringArrayUnique": {
			"oneOf": [
				{
					"$ref": "#/definitions/nonEmptyString"
				},
				{
					"$ref": "#/definitions/stringArrayUnique"
				}
			]
		},
		"stringOrNumber": {
			"oneOf": [
				{
					"$ref": "#/definitions/nonEmptyString"
				},
				{
					"type": "number"
				}
			]
		},
		"stringOrNumberAndBothAreTypeArrayUnique": {
			"type": "array",
			"uniqueItems": true,
			"minItems": 1,
			"items": {
				"$ref": "#/definitions/stringOrNumber"
			}
		},
		"stringOrNumberOrAcceptBothTypeAsArrayUnique": {
			"oneOf": [
				{
					"$ref": "#/definitions/stringOrNumber"
				},
				{
					"$ref": "#/definitions/stringOrNumberAndBothAreTypeArrayUnique"
				}
			]
		},
		"secretString": {
			"type": "object",
			"additionalProperties": false,
			"properties": {
				"secure": {
					"$ref": "#/definitions/nonEmptyString"
				}
			}
		},
		"possiblySecretString": {
			"oneOf": [
				{
					"type": "string"
				},
				{
					"type": "object",
					"additionalProperties": false,
					"properties": {
						"secure": {
							"type": "string"
						}
					}
				}
			]
		},
		"possiblySecretStringOrPossiblySecretStringTypeArrayUnique": {
			"oneOf": [
				{
					"$ref": "#/definitions/possiblySecretString"
				},
				{
					"type": "array",
					"uniqueItems": true,
					"minItems": 1,
					"items": {
						"$ref": "#/definitions/possiblySecretString"
					}
				}
			]
		},
		"slackRoom": {
			"description": "Your account name, token and optional channel",
			"oneOf": [
				{
					"type": "string",
					"pattern": ".+:.+(#.+)?"
				},
				{
					"$ref": "#/definitions/secretString"
				}
			]
		},
		"notificationFrequency": {
			"enum": [
				"always",
				"never",
				"change"
			]
		},
		"step": {
			"anyOf": [
				{
					"type": "boolean"
				},
				{
					"enum": [
						"skip",
						"ignore"
					]
				},
				{
					"type": "string"
				},
				{
					"type": "array",
					"items": {
						"type": "string"
					}
				}
			]
		},
		"service": {
			"enum": [
				"cassandra",
				"couchdb",
				"docker",
				"elasticsearch",
				"mariadb",
				"memcached",
				"mongodb",
				"mysql",
				"neo4j",
				"postgresql",
				"rabbitmq",
				"redis",
				"redis-server",
				"rethinkdb",
				"riak",
				"xvfb"
			]
		},
		"cache": {
			"enum": [
				"apt",
				"bundler",
				"cargo",
				"ccache",
				"cocoapods",
				"packages",
				"pip",
				"yarn",
				"npm"
			]
		},
		"xcodeVersions": {
			"enum": [
				"xcode6.4",
				"xcode7.3",
				"xcode8",
				"xcode8.3",
				"xcode9",
				"xcode9.1",
				"xcode9.2",
				"xcode9.3",
				"xcode9.4",
				"xcode10",
				"xcode10.1",
				"xcode10.2",
				"xcode10.3",
				"xcode11",
				"xcode11.1",
				"xcode11.2",
				"xcode11.3",
				"xcode11.4",
				"xcode11.4.1",
				"xcode11.5",
				"xcode11.6",
				"xcode12u",
				"xcode12",
				"xcode12.2",
				"xcode12.3",
				"xcode12.4",
				"xcode12.5",
				"xcode13.1",
				"xcode13.2",
				"xcode13.3",
				"xcode13.4",
				"xcode14",
				"xcode14.1",
				"xcode14.2"
			]
		},
		"envVars": {
			"oneOf": [
				{
					"$ref": "#/definitions/envVar"
				},
				{
					"type": "array",
					"items": {
						"$ref": "#/definitions/envVar"
					}
				}
			]
		},
		"envVar": {
			"oneOf": [
				{
					"type": "string",
					"pattern": "[^=]+=.*"
				},
				{
					"type": "object",
					"additionalProperties": false,
					"properties": {
						"secure": {
							"type": "string",
							"pattern": "[^=]+=.*"
						}
					}
				}
			]
		},
		"job": {
			"type": "object",
			"properties": {
				"language": {
					"enum": [
						"android",
						"bash",
						"c",
						"c++",
						"clojure",
						"cpp",
						"crystal",
						"csharp",
						"d",
						"dart",
						"dartlang",
						"elixir",
						"elm",
						"erlang",
						"generic",
						"go",
						"golang",
						"groovy",
						"haskell",
						"haxe",
						"java",
						"javascript",
						"julia",
						"jvm",
						"matlab",
						"minimal",
						"nix",
						"node",
						"node.js",
						"node_js",
						"nodejs",
						"obj-c",
						"obj_c",
						"objective-c",
						"objective_c",
						"perl",
						"perl6",
						"php",
						"python",
						"r",
						"ruby",
						"rust",
						"scala",
						"sh",
						"shell",
						"smalltalk"
					]
				},
				"matlab": {
					"$ref": "#/definitions/stringOrStringArrayUnique"
				},
				"elm": {
					"$ref": "#/definitions/stringOrStringArrayUnique"
				},
				"elm-test": {
					"$ref": "#/definitions/nonEmptyString"
				},
				"elm-format": {
					"$ref": "#/definitions/nonEmptyString"
				},
				"haxe": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"scala": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"sbt_args": {
					"type": "string"
				},
				"crystal": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"neko": {
					"type": "string"
				},
				"hxml": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"smalltalk": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"perl": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"perl6": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"d": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"dart": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"dart_task": {
					"type": "array",
					"items": {
						"type": "object",
						"properties": {
							"test": {
								"type": "string"
							},
							"install_dartium": {
								"type": "boolean"
							},
							"xvfb": {
								"type": "boolean"
							},
							"dartanalyzer": {
								"type": "boolean"
							},
							"dartfmt": {
								"type": "boolean"
							}
						}
					}
				},
				"ghc": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"lein": {
					"type": "string"
				},
				"android": {
					"type": "object",
					"properties": {
						"components": {
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"licenses": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					"additionalProperties": false
				},
				"node_js": {
					"$ref": "#/definitions/stringOrNumberOrAcceptBothTypeAsArrayUnique"
				},
				"compiler": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"enum": [
									"clang",
									"gcc"
								]
							}
						},
						{
							"enum": [
								"clang",
								"gcc"
							]
						}
					]
				},
				"php": {
					"$ref": "#/definitions/stringOrNumberOrAcceptBothTypeAsArrayUnique"
				},
				"go": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						{
							"type": "string"
						}
					]
				},
				"jdk": {
					"oneOf": [
						{
							"type": "string"
						},
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					]
				},
				"solution": {
					"type": "string",
					"description": "When the optional solution key is present, Travis will run NuGet package restore and build the given solution."
				},
				"mono": {
					"oneOf": [
						{
							"enum": [
								"none"
							]
						},
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					]
				},
				"xcode_project": {
					"type": "string"
				},
				"xcode_workspace": {
					"type": "string"
				},
				"xcode_scheme": {
					"type": "string"
				},
				"xcode_sdk": {
					"type": "string"
				},
				"podfile": {
					"type": "string",
					"description": "By default, Travis CI will assume that your Podfile is in the root of the repository. If this is not the case, you can specify where the Podfile is"
				},
				"python": {
					"$ref": "#/definitions/stringOrNumberOrAcceptBothTypeAsArrayUnique"
				},
				"elixir": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						{
							"type": "string"
						}
					]
				},
				"rust": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						{
							"type": "string"
						},
						{
							"type": "number"
						}
					]
				},
				"erlang": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						{
							"type": "string"
						}
					]
				},
				"julia": {
					"$ref": "#/definitions/stringOrNumberOrAcceptBothTypeAsArrayUnique"
				},
				"opt_release": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						{
							"type": "string"
						}
					]
				},
				"rvm": {
					"$ref": "#/definitions/stringOrNumberOrAcceptBothTypeAsArrayUnique"
				},
				"gemfile": {
					"oneOf": [
						{
							"type": "string"
						},
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					]
				},
				"bundler_args": {
					"type": "string"
				},
				"r": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						{
							"type": "string"
						}
					]
				},
				"pandoc_version": {
					"type": "string"
				},
				"brew_packages": {
					"type": "array",
					"description": "A list of packages to install via brew. This option is ignored on non-OS X builds.",
					"items": {
						"type": "string"
					}
				},
				"r_binary_packages": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"r_packages": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"bioc_packages": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"r_github_packages": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"apt_packages": {
					"type": "array",
					"items": {
						"type": "string"
					}
				},
				"cran": {
					"type": "string",
					"description": "CRAN mirror to use for fetching packages"
				},
				"repos": {
					"type": "object",
					"additionalProperties": {
						"type": "string"
					},
					"description": "Dictionary of repositories to pass to options(repos)"
				},
				"arch": {
					"description": "The CPU Architecture to run the job on",
					"oneOf": [
						{
							"enum": [
								"amd64",
								"x86_64",
								"arm64",
								"ppc64le",
								"s390x",
								"arm64-graviton2"
							]
						},
						{
							"type": "array",
							"uniqueItems": true,
							"minItems": 1,
							"items": {
								"enum": [
									"amd64",
									"arm64",
									"ppc64le",
									"s390x",
									"arm64-graviton2"
								]
							}
						}
					]
				},
				"os": {
					"description": "The operating system to run the job on",
					"oneOf": [
						{
							"enum": [
								"osx",
								"linux",
								"linux-ppc64le",
								"windows"
							]
						},
						{
							"type": "array",
							"uniqueItems": true,
							"minItems": 1,
							"items": {
								"enum": [
									"osx",
									"linux",
									"linux-ppc64le",
									"windows"
								]
							}
						}
					]
				},
				"osx_image": {
					"oneOf": [
						{
							"$ref": "#/definitions/xcodeVersions"
						},
						{
							"type": "array",
							"uniqueItems": true,
							"minItems": 1,
							"items": {
								"$ref": "#/definitions/xcodeVersions"
							}
						}
					],
					"default": "xcode9.4"
				},
				"dist": {
					"description": "The Ubuntu distribution to use",
					"enum": [
						"precise",
						"trusty",
						"xenial",
						"bionic",
						"focal",
						"jammy",
						"noble"
					]
				},
				"sudo": {
					"enum": [
						true,
						false,
						"",
						"required",
						"enabled"
					],
					"description": "sudo is deprecated"
				},
				"addons": {
					"type": "object",
					"properties": {
						"apt": {
							"type": "object",
							"description": "To install packages not included in the default container-based-infrastructure you need to use the APT addon, as sudo apt-get is not available",
							"properties": {
								"update": {
									"type": "boolean",
									"description": "To update the list of available packages"
								},
								"sources": {
									"type": "array",
									"items": {
										"oneOf": [
											{
												"type": "object",
												"properties": {
													"sourceline": {
														"type": "string",
														"description": "Key-value pairs which will be added to /etc/apt/sources.list"
													},
													"key_url": {
														"type": "string",
														"description": "When APT sources require GPG keys, you can specify this with key_url"
													}
												},
												"required": [
													"sourceline"
												],
												"additionalProperties": false
											},
											{
												"type": "string",
												"description": "Alias defined in source whitelist"
											}
										]
									}
								},
								"packages": {
									"type": "array",
									"description": "To install packages from the package whitelist before your custom build steps",
									"items": {
										"type": "string"
									}
								}
							},
							"additionalProperties": false
						},
						"hosts": {
							"description": "If your build requires setting up custom hostnames, you can specify a single host or a list of them. Travis CI will automatically setup the hostnames in /etc/hosts for both IPv4 and IPv6.",
							"oneOf": [
								{
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								{
									"type": "string"
								}
							]
						},
						"ssh_known_hosts": {
							"$ref": "#/definitions/stringOrStringArrayUnique",
							"description": "Travis CI can add entries to ~/.ssh/known_hosts prior to cloning your git repository, which is necessary if there are git submodules from domains other than github.com, gist.github.com, or ssh.github.com."
						},
						"artifacts": {
							"oneOf": [
								{
									"enum": [
										true
									]
								},
								{
									"type": "object",
									"properties": {
										"s3_region": {
											"type": "string"
										},
										"paths": {
											"type": "array",
											"items": {
												"type": "string"
											}
										},
										"working_dir": {
											"type": "string",
											"description": "If you'd like to upload file from a specific directory, you can change your working directory "
										},
										"debug": {
											"type": "boolean",
											"description": "If you'd like to see more detail about what the artifacts addon is doing"
										}
									}
								}
							]
						},
						"firefox": {
							"description": "Firefox addon",
							"anyOf": [
								{
									"type": "string",
									"enum": [
										"latest",
										"latest-esr",
										"latest-beta",
										"latest-dev",
										"latest-nightly",
										"latest-unsigned"
									]
								},
								{
									"$ref": "#/definitions/nonEmptyString"
								}
							]
						},
						"chrome": {
							"description": "Chrome addon",
							"type": "string",
							"enum": [
								"stable",
								"beta"
							]
						},
						"rethinkdb": {
							"description": "RethinkDB addon",
							"type": "string"
						},
						"postgresql": {
							"description": "PostgreSQL addon",
							"type": "string"
						},
						"mariadb": {
							"description": "MariaDB addon",
							"type": "string"
						},
						"sauce_connect": {
							"description": "Sauce Connect addon",
							"oneOf": [
								{
									"type": "object",
									"properties": {
										"username": {
											"type": "string"
										},
										"access_key": {
											"type": "string"
										}
									}
								},
								{
									"type": "boolean"
								}
							]
						},
						"sonarcloud": {
							"description": "SonarCloud addon",
							"type": "object",
							"properties": {
								"organization": {
									"type": "string"
								},
								"token": {
									"$ref": "#/definitions/secretString"
								}
							}
						},
						"coverity_scan": {
							"description": "Coverity Scan addon",
							"type": "object",
							"properties": {
								"project": {
									"description": "GitHub project metadata",
									"type": "object",
									"properties": {
										"name": {
											"type": "string"
										},
										"version": {
											"type": "number"
										},
										"description": {
											"type": "string"
										}
									},
									"required": [
										"name"
									]
								},
								"notification_email": {
									"description": "Where email notification of build analysis results will be sent",
									"type": "string"
								},
								"build_command_prepend": {
									"description": "Commands to prepare for build_command",
									"type": "string"
								},
								"build_command": {
									"description": "The command that will be added as an argument to 'cov-build' to compile your project for analysis",
									"type": "string"
								},
								"branch_pattern": {
									"description": "Pattern to match selecting branches that will run analysis. We recommend leaving this set to 'coverity_scan'",
									"type": "string"
								}
							}
						},
						"homebrew": {
							"description": "Homebrew addon",
							"type": "object",
							"additionalProperties": false,
							"properties": {
								"taps": {
									"$ref": "#/definitions/stringOrStringArrayUnique"
								},
								"packages": {
									"$ref": "#/definitions/stringOrStringArrayUnique"
								},
								"casks": {
									"$ref": "#/definitions/stringOrStringArrayUnique"
								},
								"brewfile": {
									"oneOf": [
										{
											"$ref": "#/definitions/nonEmptyString"
										},
										{
											"type": "boolean",
											"default": true
										}
									]
								},
								"update": {
									"type": "boolean",
									"default": true
								}
							}
						},
						"srcclr": {
							"description": "SourceClear addon",
							"oneOf": [
								{
									"type": "boolean",
									"default": true
								},
								{
									"type": "object",
									"additionalProperties": false,
									"properties": {
										"debug": {
											"type": "boolean",
											"default": true
										}
									}
								}
							]
						},
						"snaps": {
							"description": "Snaps addon",
							"oneOf": [
								{
									"$ref": "#/definitions/nonEmptyString"
								},
								{
									"type": "array",
									"uniqueItems": true,
									"minItems": 1,
									"items": {
										"oneOf": [
											{
												"$ref": "#/definitions/nonEmptyString"
											},
											{
												"type": "object",
												"additionalProperties": false,
												"required": [
													"name"
												],
												"properties": {
													"name": {
														"$ref": "#/definitions/nonEmptyString"
													},
													"channel": {
														"$ref": "#/definitions/nonEmptyString"
													},
													"classic": {
														"type": "boolean",
														"description": "'classic:' is deprecated, use 'confinement:'"
													},
													"confinement": {
														"enum": [
															"classic",
															"devmode"
														]
													}
												}
											}
										]
									}
								}
							]
						},
						"browserstack": {
							"description": "BrowserStack addon",
							"type": "object",
							"properties": {
								"username": {
									"$ref": "#/definitions/nonEmptyString"
								},
								"access_key": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"app_path": {
									"$ref": "#/definitions/nonEmptyString"
								},
								"proxyHost": {
									"$ref": "#/definitions/nonEmptyString"
								},
								"proxyPort": {
									"$ref": "#/definitions/nonEmptyString"
								},
								"proxyUser": {
									"$ref": "#/definitions/nonEmptyString"
								},
								"proxyPass": {
									"$ref": "#/definitions/nonEmptyString"
								},
								"forcelocal": {
									"type": "boolean"
								},
								"only": {
									"$ref": "#/definitions/nonEmptyString"
								}
							}
						}
					},
					"additionalProperties": false
				},
				"cache": {
					"oneOf": [
						{
							"enum": [
								false
							]
						},
						{
							"$ref": "#/definitions/cache"
						},
						{
							"type": "array",
							"items": {
								"oneOf": [
									{
										"$ref": "#/definitions/cache"
									},
									{
										"type": "object",
										"additionalProperties": false,
										"properties": {
											"directories": {
												"type": "array",
												"items": {
													"type": "string"
												}
											}
										}
									}
								]
							}
						},
						{
							"type": "object",
							"properties": {
								"directories": {
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"timeout": {
									"type": "number",
									"description": "Upload timeout in seconds",
									"default": 1800
								},
								"apt": {
									"type": "boolean"
								},
								"bundler": {
									"type": "boolean"
								},
								"cocoapods": {
									"type": "boolean"
								},
								"pip": {
									"type": "boolean"
								},
								"yarn": {
									"type": "boolean"
								},
								"ccache": {
									"type": "boolean"
								},
								"packages": {
									"type": "boolean"
								},
								"cargo": {
									"type": "boolean"
								},
								"npm": {
									"type": "boolean"
								}
							},
							"additionalProperties": false
						}
					]
				},
				"services": {
					"oneOf": [
						{
							"$ref": "#/definitions/service"
						},
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/service"
							}
						}
					]
				},
				"git": {
					"type": "object",
					"properties": {
						"depth": {
							"oneOf": [
								{
									"type": "integer",
									"description": "Set the git clone depth",
									"default": 50
								},
								{
									"enum": [
										false
									]
								}
							]
						},
						"quiet": {
							"type": "boolean",
							"description": "Travis CI clones repositories without the quiet flag (-q) by default. Enabling the quiet flag can be useful if you're trying to avoid log file size limits or even if you just don't need to include it."
						},
						"submodules": {
							"type": "boolean",
							"description": "Control whether submodules should be cloned"
						},
						"lfs_skip_smudge": {
							"type": "boolean",
							"description": "Skip fetching the git-lfs files during the initial git clone (equivalent to git lfs smudge --skip),"
						},
						"clone": {
							"type": "boolean",
							"description": "In some work flows, like build stages, it might be beneficial to skip the automatic git clone step."
						},
						"sparse_checkout": {
							"$ref": "#/definitions/nonEmptyString",
							"description": "Is a path to the existing file in the current repository with data you'd like to put into $GIT_DIR/info/sparse-checkout file of format described in Git documentation."
						},
						"autocrlf": {
							"oneOf": [
								{
									"type": "boolean"
								},
								{
									"type": "string",
									"enum": [
										"input"
									]
								}
							],
							"description": "Specify handling of line endings when cloning repository"
						}
					},
					"additionalProperties": false
				},
				"branches": {
					"type": "object",
					"description": "Specify which branches to build",
					"properties": {
						"except": {
							"type": "array",
							"items": {
								"type": "string"
							}
						},
						"only": {
							"type": "array",
							"items": {
								"type": "string"
							}
						}
					},
					"additionalProperties": false
				},
				"env": {
					"oneOf": [
						{
							"$ref": "#/definitions/envVars"
						},
						{
							"type": "object",
							"properties": {
								"global": {
									"$ref": "#/definitions/envVars"
								},
								"matrix": {
									"$ref": "#/definitions/envVars"
								},
								"jobs": {
									"$ref": "#/definitions/envVars"
								}
							},
							"additionalProperties": false
						}
					]
				},
				"before_install": {
					"$ref": "#/definitions/step"
				},
				"install": {
					"$ref": "#/definitions/step"
				},
				"before_script": {
					"$ref": "#/definitions/step"
				},
				"script": {
					"$ref": "#/definitions/step"
				},
				"before_cache": {
					"$ref": "#/definitions/step"
				},
				"after_success": {
					"$ref": "#/definitions/step"
				},
				"after_failure": {
					"$ref": "#/definitions/step"
				},
				"before_deploy": {
					"$ref": "#/definitions/step"
				},
				"deploy": {
					"oneOf": [
						{
							"type": "array",
							"items": {
								"$ref": "#/definitions/deployment"
							}
						},
						{
							"$ref": "#/definitions/deployment"
						}
					]
				},
				"after_deploy": {
					"$ref": "#/definitions/step"
				},
				"after_script": {
					"$ref": "#/definitions/step"
				}
			}
		},
		"deployment": {
			"allOf": [
				{
					"type": "object",
					"properties": {
						"on": {
							"type": "object",
							"properties": {
								"tags": {
									"description": "Tell Travis CI to only deploy on tagged commits",
									"oneOf": [
										{
											"type": "boolean"
										},
										{
											"type": "string"
										}
									]
								},
								"branch": {
									"type": "string"
								},
								"all_branches": {
									"type": "boolean"
								},
								"skip_cleanup": {
									"type": "boolean",
									"description": "After your tests ran and before the release, Travis CI will clean up any additional files and changes you made. Maybe that is not what you want, as you might generate some artifacts that are supposed to be released, too."
								},
								"repo": {
									"type": "string"
								},
								"condition": {
									"type": "string",
									"description": "if [[ <condition> ]]; then <deploy>; fi"
								}
							}
						}
					}
				},
				{
					"oneOf": [
						{
							"type": "object",
							"properties": {
								"provider": {
									"enum": [
										"script"
									]
								},
								"script": {
									"type": "string"
								}
							},
							"required": [
								"provider",
								"script"
							]
						},
						{
							"type": "object",
							"properties": {
								"provider": {
									"enum": [
										"npm"
									]
								},
								"email": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"api_key": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"api_token": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"tag": {
									"type": "string"
								}
							},
							"oneOf": [
								{
									"required": [
										"provider",
										"email",
										"api_key"
									]
								},
								{
									"required": [
										"provider",
										"email",
										"api_token"
									]
								}
							]
						},
						{
							"type": "object",
							"properties": {
								"provider": {
									"enum": [
										"surge"
									]
								},
								"project": {
									"type": "string"
								},
								"domain": {
									"type": "string"
								}
							},
							"required": [
								"provider"
							]
						},
						{
							"type": "object",
							"properties": {
								"provider": {
									"enum": [
										"releases"
									]
								},
								"api_key": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"user": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"password": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"file": {
									"oneOf": [
										{
											"type": "string"
										},
										{
											"type": "array",
											"items": {
												"type": "string"
											}
										}
									]
								},
								"file_glob": {
									"type": "boolean"
								},
								"overwrite": {
									"type": "boolean",
									"description": "If you need to overwrite existing files"
								}
							},
							"required": [
								"provider"
							]
						},
						{
							"type": "object",
							"description": "deploy to heroku, to see https://docs.travis-ci.com/user/deployment/heroku/",
							"properties": {
								"provider": {
									"enum": [
										"heroku"
									]
								},
								"api_key": {
									"description": "heroku auth token",
									"anyOf": [
										{
											"$ref": "#/definitions/possiblySecretString"
										},
										{
											"type": "object",
											"additionalProperties": {
												"$ref": "#/definitions/possiblySecretString"
											}
										}
									]
								},
								"app": {
									"oneOf": [
										{
											"type": "string",
											"description": "Deploy master branch to heroku app"
										},
										{
											"type": "object",
											"description": "Deploy the different branch to the different heroku app",
											"additionalProperties": {
												"type": "string"
											}
										}
									]
								},
								"run": {
									"description": "to run a command on Heroku after a successful deploy",
									"oneOf": [
										{
											"type": "string"
										},
										{
											"type": "array",
											"items": {
												"type": "string"
											}
										}
									]
								},
								"skip_cleanup": {
									"type": "boolean",
									"description": "Travis CI default will clean up any additional files and changes you made, you can by it to skip the clean up"
								},
								"strategy": {
									"enum": [
										"api",
										"git"
									],
									"description": "Travis CI supports different mechanisms for deploying to Heroku: api is default"
								}
							},
							"required": [
								"provider",
								"api_key"
							]
						},
						{
							"type": "object",
							"properties": {
								"provider": {
									"enum": [
										"s3"
									]
								},
								"access_key_id": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"secret_access_key": {
									"$ref": "#/definitions/possiblySecretString"
								},
								"bucket": {
									"type": "string"
								},
								"region": {
									"type": "string"
								},
								"skip_cleanup": {
									"type": "boolean",
									"default": false
								},
								"acl": {
									"enum": [
										"private",
										"public_read",
										"public_read_write",
										"authenticated_read",
										"bucket_owner_read",
										"bucket_owner_full_control"
									]
								},
								"local_dir": {
									"type": "string"
								},
								"upload-dir": {
									"type": "string"
								},
								"detect_encoding": {
									"type": "boolean",
									"default": false
								},
								"default_text_charset": {
									"type": "string"
								},
								"cache_control": {
									"type": "string"
								},
								"expires": {
									"type": "string"
								},
								"endpoint": {
									"type": "string"
								}
							},
							"required": [
								"provider",
								"access_key_id",
								"secret_access_key",
								"bucket"
							]
						},
						{
							"type": "object",
							"properties": {
								"provider": {
									"type": "string",
									"not": {
										"enum": [
											"script",
											"npm",
											"surge",
											"releases",
											"heroku",
											"s3"
										]
									}
								}
							},
							"required": [
								"provider"
							]
						}
					]
				}
			]
		},
		"notificationObject": {
			"webhooks": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"urls": {
						"oneOf": [
							{
								"type": "string",
								"format": "uri"
							},
							{
								"$ref": "#/definitions/secretString"
							},
							{
								"type": "array",
								"uniqueItems": true,
								"minItems": 1,
								"items": {
									"oneOf": [
										{
											"type": "string",
											"format": "uri"
										},
										{
											"$ref": "#/definitions/secretString"
										}
									]
								}
							}
						]
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			},
			"slack": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"rooms": {
						"type": "array",
						"uniqueItems": true,
						"minItems": 1,
						"items": {
							"$ref": "#/definitions/slackRoom"
						}
					},
					"on_pull_requests": {
						"type": "boolean"
					},
					"template": {
						"$ref": "#/definitions/notRequiredNonEmptyStringOrArrayOfNonEmptyStrings"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			},
			"email": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"recipients": {
						"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "change"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			},
			"irc": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"channels": {
						"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
					},
					"channel_key": {
						"$ref": "#/definitions/possiblySecretString"
					},
					"nick": {
						"$ref": "#/definitions/nonEmptyString"
					},
					"password": {
						"$ref": "#/definitions/possiblySecretString"
					},
					"template": {
						"$ref": "#/definitions/notRequiredNonEmptyStringOrArrayOfNonEmptyStrings"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"skip_join": {
						"type": "boolean"
					},
					"use_notice": {
						"type": "boolean"
					}
				}
			},
			"pushover": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"api_key": {
						"$ref": "#/definitions/possiblySecretString"
					},
					"users": {
						"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
					},
					"template": {
						"$ref": "#/definitions/notRequiredNonEmptyStringOrArrayOfNonEmptyStrings"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			},
			"campfire": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"rooms": {
						"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
					},
					"template": {
						"$ref": "#/definitions/nonEmptyStringOrArrayOfNonEmptyStrings"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			},
			"flowdock": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"api_token": {
						"$ref": "#/definitions/nonEmptyString"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			},
			"hipchat": {
				"type": "object",
				"additionalProperties": false,
				"properties": {
					"disabled": {
						"type": "boolean"
					},
					"enabled": {
						"type": "boolean"
					},
					"notify": {
						"type": "boolean"
					},
					"on_pull_requests": {
						"type": "boolean"
					},
					"rooms": {
						"$ref": "#/definitions/possiblySecretStringOrPossiblySecretStringTypeArrayUnique"
					},
					"format": {
						"enum": [
							"html",
							"text"
						]
					},
					"template": {
						"$ref": "#/definitions/nonEmptyStringOrArrayOfNonEmptyStrings"
					},
					"on_success": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_failure": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_start": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "never"
					},
					"on_cancel": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					},
					"on_error": {
						"$ref": "#/definitions/notificationFrequency",
						"default": "always"
					}
				}
			}
		},
		"import": {
			"anyOf": [
				{
					"type": "object",
					"additionalProperties": false,
					"required": [
						"source"
					],
					"properties": {
						"source": {
							"$ref": "#/definitions/nonEmptyString",
							"description": "The source to import build config from"
						},
						"mode": {
							"type": "string",
							"enum": [
								"merge",
								"deep_merge",
								"deep_merge_append",
								"deep_merge_prepend"
							],
							"description": "How to merge the imported config into the target config (defaults to deep_merge_append)"
						},
						"if": {
							"$ref": "#/definitions/nonEmptyString",
							"description": "Specifies a condition for the import"
						}
					}
				},
				{
					"$ref": "#/definitions/nonEmptyString"
				}
			]
		}
	},
	"id": "https://json.schemastore.org/travis.json",
	"title": "JSON schema for Travis CI configuration files"
}
