{
    "$schema": "http://json-schema.org/draft-07/schema",
    "title": "TopoJSON object",
    "description": "Schema for a TopoJSON object",
    "type": "object",
    "required": ["type"],
    "properties": {
        "bbox": {
            "$ref": "#/definitions/bbox"
        }
    },
    "oneOf": [
        {
            "$ref": "#/definitions/topology"
        },
        {
            "$ref": "#/definitions/geometry"
        }
    ],
    "definitions": {
        "bbox": {
            "title": "TopoJSON bounding box",
            "description": "A bounding box as defined by TopoJSON",
            "type": "array",
            "items": {
                "$ref": "#/definitions/bbox/definitions/dimension"
            },
            "minItems": 2,
            "maxItems": 2,
            "definitions": {
                "dimension": {
                    "type": "array",
                    "description": "This array should have an entry per dimension in the geometries",
                    "items": {
                        "type": "number"
                    }
                }
            }
        },
        "geometry": {
            "title": "Geometry objects",
            "description": "A Geometry object as defined by TopoJSON",
            "type": "object",
            "required": ["type"],
            "properties": {
                "id": {
                    "type": ["string", "integer"]
                },
                "properties": {
                    "type": "object"
                }
            },
            "oneOf": [
                {
                    "title": "Point",
                    "description": "A Point Geometry object as defined by TopoJSON",
                    "required": ["type", "coordinates"],
                    "properties": {
                        "type": {
                            "enum": ["Point"]
                        },
                        "coordinates": {
                            "$ref": "#/definitions/geometry/definitions/position"
                        }
                    }
                },
                {
                    "title": "MultiPoint",
                    "description": "A MultiPoint Geometry object as defined by TopoJSON",
                    "required": ["type", "coordinates"],
                    "properties": {
                        "type": {
                            "enum": ["MultiPoint"]
                        },
                        "coordinates": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/geometry/definitions/position"
                            }
                        }
                    }
                },
                {
                    "title": "LineString",
                    "description": "A LineString Geometry object as defined by TopoJSON",
                    "required": ["type", "arcs"],
                    "properties": {
                        "type": {
                            "enum": ["LineString"]
                        },
                        "arcs": {
                            "type": "array",
                            "items": {
                                "type": "integer"
                            }
                        }
                    }
                },
                {
                    "title": "MultiLineString",
                    "description": "A MultiLineString Geometry object as defined by TopoJSON",
                    "required": ["type", "arcs"],
                    "properties": {
                        "type": {
                            "enum": ["MultiLineString"]
                        },
                        "arcs": {
                            "type": "array",
                            "items": {
                                "type": "array",
                                "items": {
                                    "type": "integer"
                                }
                            }
                        }
                    }
                },
                {
                    "title": "Polygon",
                    "description": "A Polygon Geometry object as defined by TopoJSON",
                    "required": ["type", "arcs"],
                    "properties": {
                        "type": {
                            "enum": ["Polygon"]
                        },
                        "arcs": {
                            "type": "array",
                            "items": {
                                "type": "array",
                                "items": {
                                    "type": "integer"
                                }
                            }
                        }
                    }
                },
                {
                    "title": "MultiPolygon",
                    "description": "A MultiPolygon Geometry object as defined by TopoJSON",
                    "required": ["type", "arcs"],
                    "properties": {
                        "type": {
                            "enum": ["MultiPolygon"]
                        },
                        "arcs": {
                            "type": "array",
                            "items": {
                                "type": "array",
                                "items": {
                                    "type": "array",
                                    "items": {
                                        "type": "integer"
                                    }
                                }
                            }
                        }
                    }
                },
                {
                    "title": "GeometryCollection",
                    "description": "A MultiPolygon Geometry object as defined by TopoJSON",
                    "required": ["type", "geometries"],
                    "properties": {
                        "type": {
                            "enum": ["GeometryCollection"]
                        },
                        "geometries": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/geometry"
                            }
                        }
                    }
                }
            ],
            "definitions": {
                "position": {
                    "type": "array",
                    "items": {
                        "type": "number"
                    },
                    "minItems": 2
                }
            }
        },
        "topology": {
            "title": "Topology",
            "description": "A Topology object as defined by TopoJSON",
            "type": "object",
            "required": ["objects", "arcs"],
            "properties": {
                "type": {
                    "enum": ["Topology"]
                },
                "objects": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/geometry"
                    }
                },
                "arcs": {
                    "$ref": "#/definitions/topology/definitions/arcs"
                },
                "transform": {
                    "$ref": "#/definitions/topology/definitions/transform"
                },
                "bbox": {
                    "$ref": "#/definitions/bbox"
                }
            },
            "definitions": {
                "transform": {
                    "type": "object",
                    "required": ["scale", "translate"],
                    "properties": {
                        "scale": {
                            "type": "array",
                            "items": {
                                "type": "number"
                            },
                            "minItems": 2
                        },
                        "translate": {
                            "type": "array",
                            "items": {
                                "type": "number"
                            },
                            "minItems": 2
                        }
                    }
                },
                "arcs": {
                    "type": "array",
                    "items": {
                        "type": "array",
                        "items": {
                            "oneOf": [
                                {
                                    "$ref": "#/definitions/topology/definitions/position"
                                },
                                {
                                    "type": "null"
                                }
                            ]
                        },
                        "minItems": 2
                    }
                },
                "position": {
                    "type": "array",
                    "items": {
                        "type": "number"
                    },
                    "minItems": 2
                }
            }
        }
    }
}
