{
  "openapi": "3.1.1",
  "info": {
    "title": "Tilemap Converter (TMX, Tiled JSON, PNG, collisions) API",
    "version": "1.0.0",
    "summary": "Convert Tiled TMX and JSON maps, render a PNG and merge collision rectangles.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://fliplinetilemapconverter.usefulweb.app"
    }
  ],
  "paths": {
    "/api/v1/calculate": {
      "post": {
        "operationId": "calculate",
        "summary": "Convert Tiled TMX and JSON maps, render a PNG and merge collision rectangles.",
        "description": "Convert tile maps between Tiled TMX (CSV, base64, zlib or gzip layers), Tiled JSON, engine-neutral JSON and Flipline Tilemap Desk projects. Render a flattened PNG with flip flags and export solid tiles as merged collision rectangles for physics engines.\n\nMethodology:\n- Reads TMX and Tiled JSON (format 1.10) with embedded single-image tilesets, tile properties, collision objects, animations and Wang sets; tile layers in CSV or base64 (uncompressed, zlib or gzip; zstd is reported). Infinite maps are read from chunks and written as 16 × 16 chunks.\n- Global tile ids keep Tiled’s flip flags (bit 31 horizontal, 30 vertical, 29 anti-diagonal). Tilesets are renumbered consecutively from firstgid 1. The 120° hexagonal flag, layer groups (flattened), text objects and object templates are not supported and are reported.\n- The PNG render draws visible tile and image layers in order, bottom-left aligned like Tiled (isometric: centred on the diamond), applying flips in Tiled’s order (anti-diagonal, then horizontal, then vertical) and layer opacity. Missing images become placeholder colours; animated tiles show their first frame; objects are not drawn.\n- Collision export: solid cells (non-one-way rectangles covering the whole tile) are merged by greedy meshing — the widest run in a row extended downwards — so rectangles cover exactly the solid cells without overlap. Full-tile one-way tiles become horizontal runs; other shapes become polygons in map pixels with flips applied.\n- The same import, export, render and collision code runs in Flipline’s Tilemap Desk, so a map exported there converts to identical bytes here.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "flipline_tilemap_converter",
        "x-owner-app": "flipline",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FliplineTilemapConverterInput"
              },
              "examples": {
                "example1": {
                  "summary": "TMX with zlib layers and its tileset image → Tiled JSON",
                  "value": {
                    "map": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<map version=\"1.10\" orientation=\"orthogonal\" renderorder=\"right-down\" width=\"20\" height=\"12\" tilewidth=\"16\" tileheight=\"16\" infinite=\"0\" nextlayerid=\"4\" nextobjectid=\"4\">\n <properties>\n  <property name=\"gravity\" type=\"float\" value=\"9.81\"/>\n  <property name=\"music\" type=\"file\" value=\"meadow.ogg\"/>\n </properties>\n <tileset firstgid=\"1\" name=\"Meadow\" tilewidth=\"16\" tileheight=\"16\" tilecount=\"47\" columns=\"8\">\n  <image source=\"meadow.png\" width=\"128\" height=\"96\"/>\n  <tile id=\"0\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"0\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"1\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"1\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"2\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"4\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"3\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"5\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"4\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"7\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"5\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"16\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"6\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"17\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"7\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"20\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"8\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"21\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"9\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"23\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"10\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"28\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"11\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"29\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"12\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"31\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"13\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"64\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"14\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"65\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"15\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"68\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"16\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"69\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"17\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"71\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"18\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"80\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"19\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"81\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"20\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"84\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"21\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"85\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"22\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"87\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"23\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"92\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"24\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"93\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"25\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"95\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"26\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"112\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"27\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"113\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"28\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"116\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"29\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"117\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"30\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"119\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"31\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"124\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"32\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"125\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"33\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"127\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"34\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"193\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"35\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"197\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"36\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"199\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"37\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"209\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"38\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"213\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"39\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"215\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"40\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"221\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"41\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"223\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"42\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"241\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"43\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"245\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"44\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"247\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"45\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"253\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <tile id=\"46\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"255\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"16\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <wangsets>\n   <wangset name=\"Meadow\" type=\"mixed\" tile=\"-1\">\n    <wangcolor name=\"Meadow\" color=\"#5d9c47\" tile=\"-1\" probability=\"1\"/>\n    <wangtile tileid=\"0\" wangid=\"0,0,0,0,0,0,0,0\"/>\n    <wangtile tileid=\"1\" wangid=\"1,0,0,0,0,0,0,0\"/>\n    <wangtile tileid=\"2\" wangid=\"0,0,1,0,0,0,0,0\"/>\n    <wangtile tileid=\"3\" wangid=\"1,0,1,0,0,0,0,0\"/>\n    <wangtile tileid=\"4\" wangid=\"1,1,1,0,0,0,0,0\"/>\n    <wangtile tileid=\"5\" wangid=\"0,0,0,0,1,0,0,0\"/>\n    <wangtile tileid=\"6\" wangid=\"1,0,0,0,1,0,0,0\"/>\n    <wangtile tileid=\"7\" wangid=\"0,0,1,0,1,0,0,0\"/>\n    <wangtile tileid=\"8\" wangid=\"1,0,1,0,1,0,0,0\"/>\n    <wangtile tileid=\"9\" wangid=\"1,1,1,0,1,0,0,0\"/>\n    <wangtile tileid=\"10\" wangid=\"0,0,1,1,1,0,0,0\"/>\n    <wangtile tileid=\"11\" wangid=\"1,0,1,1,1,0,0,0\"/>\n    <wangtile tileid=\"12\" wangid=\"1,1,1,1,1,0,0,0\"/>\n    <wangtile tileid=\"13\" wangid=\"0,0,0,0,0,0,1,0\"/>\n    <wangtile tileid=\"14\" wangid=\"1,0,0,0,0,0,1,0\"/>\n    <wangtile tileid=\"15\" wangid=\"0,0,1,0,0,0,1,0\"/>\n    <wangtile tileid=\"16\" wangid=\"1,0,1,0,0,0,1,0\"/>\n    <wangtile tileid=\"17\" wangid=\"1,1,1,0,0,0,1,0\"/>\n    <wangtile tileid=\"18\" wangid=\"0,0,0,0,1,0,1,0\"/>\n    <wangtile tileid=\"19\" wangid=\"1,0,0,0,1,0,1,0\"/>\n    <wangtile tileid=\"20\" wangid=\"0,0,1,0,1,0,1,0\"/>\n    <wangtile tileid=\"21\" wangid=\"1,0,1,0,1,0,1,0\"/>\n    <wangtile tileid=\"22\" wangid=\"1,1,1,0,1,0,1,0\"/>\n    <wangtile tileid=\"23\" wangid=\"0,0,1,1,1,0,1,0\"/>\n    <wangtile tileid=\"24\" wangid=\"1,0,1,1,1,0,1,0\"/>\n    <wangtile tileid=\"25\" wangid=\"1,1,1,1,1,0,1,0\"/>\n    <wangtile tileid=\"26\" wangid=\"0,0,0,0,1,1,1,0\"/>\n    <wangtile tileid=\"27\" wangid=\"1,0,0,0,1,1,1,0\"/>\n    <wangtile tileid=\"28\" wangid=\"0,0,1,0,1,1,1,0\"/>\n    <wangtile tileid=\"29\" wangid=\"1,0,1,0,1,1,1,0\"/>\n    <wangtile tileid=\"30\" wangid=\"1,1,1,0,1,1,1,0\"/>\n    <wangtile tileid=\"31\" wangid=\"0,0,1,1,1,1,1,0\"/>\n    <wangtile tileid=\"32\" wangid=\"1,0,1,1,1,1,1,0\"/>\n    <wangtile tileid=\"33\" wangid=\"1,1,1,1,1,1,1,0\"/>\n    <wangtile tileid=\"34\" wangid=\"1,0,0,0,0,0,1,1\"/>\n    <wangtile tileid=\"35\" wangid=\"1,0,1,0,0,0,1,1\"/>\n    <wangtile tileid=\"36\" wangid=\"1,1,1,0,0,0,1,1\"/>\n    <wangtile tileid=\"37\" wangid=\"1,0,0,0,1,0,1,1\"/>\n    <wangtile tileid=\"38\" wangid=\"1,0,1,0,1,0,1,1\"/>\n    <wangtile tileid=\"39\" wangid=\"1,1,1,0,1,0,1,1\"/>\n    <wangtile tileid=\"40\" wangid=\"1,0,1,1,1,0,1,1\"/>\n    <wangtile tileid=\"41\" wangid=\"1,1,1,1,1,0,1,1\"/>\n    <wangtile tileid=\"42\" wangid=\"1,0,0,0,1,1,1,1\"/>\n    <wangtile tileid=\"43\" wangid=\"1,0,1,0,1,1,1,1\"/>\n    <wangtile tileid=\"44\" wangid=\"1,1,1,0,1,1,1,1\"/>\n    <wangtile tileid=\"45\" wangid=\"1,0,1,1,1,1,1,1\"/>\n    <wangtile tileid=\"46\" wangid=\"1,1,1,1,1,1,1,1\"/>\n   </wangset>\n  </wangsets>\n </tileset>\n <layer id=\"1\" name=\"Terrain\" width=\"20\" height=\"12\">\n  <data encoding=\"base64\" compression=\"zlib\">\neAFjoBHgBmIFNCxNhHpsakBySkCsC8SqUKwFxHp41MtD1WliUcMLxPpArE1ADAZYgVgNyuYCYmUs8jD3gPwAwjD3oquFARYgFgBifhzyIDNh/oT5G5dZpACQP7H5EQSwxRkI44s3kDtxuQsUVrD4QsawsCQFMAOxCA45djQ+uj9wuR8WB+gYPU5gcQHD1IgHagEAABQJZQ==\n</data>\n </layer>\n <objectgroup id=\"3\" name=\"Objects\">\n  <object id=\"1\" name=\"Spawn\" type=\"spawn\" x=\"56\" y=\"40\">\n   <properties>\n    <property name=\"facing\" value=\"right\"/>\n   </properties>\n   <point/>\n  </object>\n  <object id=\"2\" name=\"Goal\" type=\"trigger\" x=\"192\" y=\"112\" width=\"32\" height=\"16\">\n   <properties>\n    <property name=\"nextLevel\" value=\"meadow-2\"/>\n   </properties>\n  </object>\n  <object id=\"3\" name=\"Pond\" type=\"water\" x=\"232\" y=\"48\">\n   <properties>\n    <property name=\"depth\" type=\"float\" value=\"0.5\"/>\n   </properties>\n   <polygon points=\"0,0 16,-6 24,8 6,14\"/>\n  </object>\n </objectgroup>\n</map>\n",
                    "images": {
                      "filename": "meadow.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAAIAAAABgCAYAAADVenpJAAAFnklEQVR4AWPUjzf9z0AFoGcrhFNOU02c4fqtlyhilw6/o4a1WO3HZh86QLcfpJ8Yfeh2UMsf+MIP2T4YoJa9TFQxBQmAHIoOiA1UagFc9mFzG7n6aOknetrHAmMQSoEwQCjl4wtEfJ7AZT8hfbjcgU0fMh9mH7p+QvrQ1cL0hydrklR6rJx7Hac8OWFIagkMA3hLAHJTIj30UTM3k6sPWS21Sw96hSE8AQzlwMcFhoo+bIBeYQhPAEM1BVOqDxugtz5cgB5hiFIFDMUUTKk+XGCkVH8oCWAopmBy9Q22UmCgEjBGI3AkNuBwgZHQhsBIACMp8EfbEDi6gSOpFUypPlxgqCR8rAlgJLWCydU3XNoQOAeCRgOfPLcNFX0wtTgTwGjgk+a2oZqAqTYbONIBqXMZ2GYjidFHSD+xM5ow/VSfDRzJYKg1gkEAXgLQOwXC1OKbFSMFEDObiew2QjkQlz50QIv1AMSEIc3XAwyWupxcMBgao+QCetqHswSAWUhsSiQ1BWPTT2rpAVKLzX5i9OFzPzH6iAWE2gCUroMgteRGVzs6HTzE9I1OB+NQOzoRRJ4+sqeDB1tgjNShXErjjOzp4NGidOD0UTPhUzQdPBxGwvCBkZDwKZoOHupFMDUS8FBP+AM2HTxcitKhnvAHbDp4tCGGHYyo6eDhEohDuRQYNEPBo20I0vRhA+SE4ejOIAr0DfU2BEgtfC6A0r1tAz0bN9BzGUMVjA4FYwHk6huKAO9sIDYAyx2k5GBkfeiAVvvrCeViaudcepegMECpPwZVG4CagN65eLCUoKQCxtg57uASgJR6D1ktufpIAfhS/kC1HUi1D5/agQpDEKC4DTDadiBP32AJQ6pMB48O4pCnbzCMI1BlOnikDgFjA0NtHGHAp4OH+mzaQOmjVhgO+HTwaBuCPH3UCsNBMR082oYgTx81wpBppLeCydU3XEoBppHeCiZX33BJwOAqYCS3ginRNxwSMDgBjHbjyNM3HBIwxTuDRrtx5OkbLKXAoDkfgNz97TAw1NYzEKMfX1jg009sGILAoDsfYCSVAuTqo2ZYkL07mFopkF7n7cMAzG20vK8Am33ogNITQnCZQyoYVLuDqQ3IzY2DwT56hSF8PQAuQEpupqc+9Pl8UuxDbgOQ2nYYjGFBib7R6eARPo4wOh1Mor7hNo4wOh1Mor7hNo4wOh1Mhr7hNBcxOh1Mhr7h1IYYnQ4mU99wKQVGp4PJ1DdcEvDodDAF+oZDAh6dDqZA33BIwKPTwQOkb7CUAqM7g0Z4G4IJNKYOG1cnJzCQ9ZOiDxcYKoGPy9/EhiG6flLDHqZ/UAwF4wKjbQja6KPJUDA+B6JrRE6B+AA2fcSAwawPphY0C4ltDp9YO8jVR20/DekTQsjVN9qIRQCU9QAgjcRYgK6WXH2kAHR9A3XOP7X0UbqegVphP2Kng4dLKUC1NgCpGtHVjnbD6KuPWmE4oqeDRxPwCJ8OHk3Ao9PBZOsbLgl4dDqYTH3DJQGPTgdToG84JODR6WAK9A2HBDw6HTzE9FE7LEang0d4Ah7dGTTCEzDBvYEwjcSON5Oqb6iftw8DpM5JEHu+AK4wpHR3MUz/oLw3cKgDepce2ACxYU/27mBKb78m1T5C9pNiH0jtQO8OpvS0cxhYnLKTkWQHIQGy2wDk6httA1Cuj5olKNnTwcgrYoZiIIJyPnLpQaw+aiVE9BVF1A5DYsHodDAF+nCBoVQKjE4HD5A+bGAgSoHR6eAB0ocL0LsUGJ0OJlPfcCkFRqeDydQ3GBMwOWB0OpgCfYMtAZMDRqeDKdA3GBMwqWB0OniA9A2WUmB0OngYtiFIAaPTwUO8DUEpGN0ZRIE+bGColQIo5wOQaiFILaX71Acq8EGzgTB/kxP4+HZHjw4F00EfLjA6CEQaAADFzMkIoaNybQAAAABJRU5ErkJggg=="
                    },
                    "target": "tiled-json",
                    "encoding": "csv",
                    "render": true,
                    "scale": 2
                  }
                },
                "example2": {
                  "summary": "Tiled JSON with flipped slopes and one-way ledges → TMX",
                  "value": {
                    "map": "{\"type\":\"map\",\"version\":\"1.10\",\"orientation\":\"orthogonal\",\"renderorder\":\"right-down\",\"width\":12,\"height\":6,\"tilewidth\":16,\"tileheight\":16,\"infinite\":false,\"compressionlevel\":-1,\"nextlayerid\":2,\"nextobjectid\":1,\"tilesets\":[{\"firstgid\":1,\"name\":\"Platforms\",\"tilewidth\":16,\"tileheight\":16,\"spacing\":0,\"margin\":0,\"tilecount\":3,\"columns\":3,\"image\":\"platforms.png\",\"imagewidth\":48,\"imageheight\":16,\"tiles\":[{\"id\":0,\"type\":\"solid\",\"objectgroup\":{\"type\":\"objectgroup\",\"draworder\":\"index\",\"id\":2,\"name\":\"\",\"opacity\":1,\"visible\":true,\"x\":0,\"y\":0,\"objects\":[{\"id\":1,\"name\":\"\",\"type\":\"\",\"visible\":true,\"rotation\":0,\"x\":0,\"y\":0,\"width\":16,\"height\":16}]}},{\"id\":1,\"type\":\"ledge\",\"properties\":[{\"name\":\"material\",\"type\":\"string\",\"value\":\"wood\"}],\"objectgroup\":{\"type\":\"objectgroup\",\"draworder\":\"index\",\"id\":2,\"name\":\"\",\"opacity\":1,\"visible\":true,\"x\":0,\"y\":0,\"objects\":[{\"id\":1,\"name\":\"\",\"type\":\"\",\"visible\":true,\"rotation\":0,\"x\":0,\"y\":0,\"width\":16,\"height\":4,\"properties\":[{\"name\":\"oneWay\",\"type\":\"bool\",\"value\":true}]}]}},{\"id\":2,\"type\":\"slope\",\"objectgroup\":{\"type\":\"objectgroup\",\"draworder\":\"index\",\"id\":2,\"name\":\"\",\"opacity\":1,\"visible\":true,\"x\":0,\"y\":0,\"objects\":[{\"id\":1,\"name\":\"\",\"type\":\"\",\"visible\":true,\"rotation\":0,\"x\":0,\"y\":0,\"width\":0,\"height\":0,\"polygon\":[{\"x\":0,\"y\":16},{\"x\":16,\"y\":0},{\"x\":16,\"y\":16}]}]}}]}],\"layers\":[{\"id\":1,\"name\":\"Ground\",\"opacity\":1,\"visible\":true,\"x\":0,\"y\":0,\"type\":\"tilelayer\",\"width\":12,\"height\":6,\"data\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,3,1,1,2147483651,0,0,0,0,2,2,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]}]}",
                    "target": "tmx",
                    "encoding": "base64-gzip",
                    "render": true,
                    "scale": 2
                  }
                },
                "example3": {
                  "summary": "Isometric autotiled map → engine-neutral JSON",
                  "value": {
                    "map": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<map version=\"1.10\" orientation=\"isometric\" renderorder=\"right-down\" width=\"7\" height=\"7\" tilewidth=\"32\" tileheight=\"16\" infinite=\"0\" nextlayerid=\"2\" nextobjectid=\"1\">\n <tileset firstgid=\"1\" name=\"Meadow\" tilewidth=\"32\" tileheight=\"16\" tilecount=\"16\" columns=\"8\">\n  <image source=\"meadow.png\" width=\"256\" height=\"32\"/>\n  <tile id=\"0\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"0\"/>\n   </properties>\n  </tile>\n  <tile id=\"1\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"1\"/>\n   </properties>\n  </tile>\n  <tile id=\"2\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"2\"/>\n   </properties>\n  </tile>\n  <tile id=\"3\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"3\"/>\n   </properties>\n  </tile>\n  <tile id=\"4\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"4\"/>\n   </properties>\n  </tile>\n  <tile id=\"5\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"5\"/>\n   </properties>\n  </tile>\n  <tile id=\"6\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"6\"/>\n   </properties>\n  </tile>\n  <tile id=\"7\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"7\"/>\n   </properties>\n  </tile>\n  <tile id=\"8\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"8\"/>\n   </properties>\n  </tile>\n  <tile id=\"9\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"9\"/>\n   </properties>\n  </tile>\n  <tile id=\"10\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"10\"/>\n   </properties>\n  </tile>\n  <tile id=\"11\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"11\"/>\n   </properties>\n  </tile>\n  <tile id=\"12\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"12\"/>\n   </properties>\n  </tile>\n  <tile id=\"13\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"13\"/>\n   </properties>\n  </tile>\n  <tile id=\"14\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"14\"/>\n   </properties>\n  </tile>\n  <tile id=\"15\" type=\"terrain\">\n   <properties>\n    <property name=\"mask\" type=\"int\" value=\"15\"/>\n   </properties>\n   <objectgroup draworder=\"index\" id=\"2\">\n    <object id=\"1\" x=\"0\" y=\"0\" width=\"32\" height=\"16\"/>\n   </objectgroup>\n  </tile>\n  <wangsets>\n   <wangset name=\"Meadow\" type=\"corner\" tile=\"-1\">\n    <wangcolor name=\"Meadow\" color=\"#5d9c47\" tile=\"-1\" probability=\"1\"/>\n    <wangtile tileid=\"0\" wangid=\"0,0,0,0,0,0,0,0\"/>\n    <wangtile tileid=\"1\" wangid=\"0,1,0,0,0,0,0,0\"/>\n    <wangtile tileid=\"2\" wangid=\"0,0,0,1,0,0,0,0\"/>\n    <wangtile tileid=\"3\" wangid=\"0,1,0,1,0,0,0,0\"/>\n    <wangtile tileid=\"4\" wangid=\"0,0,0,0,0,1,0,0\"/>\n    <wangtile tileid=\"5\" wangid=\"0,1,0,0,0,1,0,0\"/>\n    <wangtile tileid=\"6\" wangid=\"0,0,0,1,0,1,0,0\"/>\n    <wangtile tileid=\"7\" wangid=\"0,1,0,1,0,1,0,0\"/>\n    <wangtile tileid=\"8\" wangid=\"0,0,0,0,0,0,0,1\"/>\n    <wangtile tileid=\"9\" wangid=\"0,1,0,0,0,0,0,1\"/>\n    <wangtile tileid=\"10\" wangid=\"0,0,0,1,0,0,0,1\"/>\n    <wangtile tileid=\"11\" wangid=\"0,1,0,1,0,0,0,1\"/>\n    <wangtile tileid=\"12\" wangid=\"0,0,0,0,0,1,0,1\"/>\n    <wangtile tileid=\"13\" wangid=\"0,1,0,0,0,1,0,1\"/>\n    <wangtile tileid=\"14\" wangid=\"0,0,0,1,0,1,0,1\"/>\n    <wangtile tileid=\"15\" wangid=\"0,1,0,1,0,1,0,1\"/>\n   </wangset>\n  </wangsets>\n </tileset>\n <layer id=\"1\" name=\"Terrain\" width=\"7\" height=\"7\">\n  <data encoding=\"csv\">\n8,16,16,16,16,16,15,\n16,16,16,16,16,16,16,\n16,16,14,10,12,16,16,\n16,16,13,0,4,16,16,\n16,16,15,7,8,16,16,\n16,16,16,16,16,16,16,\n12,16,16,16,16,16,14\n</data>\n </layer>\n</map>\n",
                    "images": {
                      "filename": "meadow.png",
                      "contentType": "image/png",
                      "contentBase64": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAAgCAYAAAD9qabkAAAEVklEQVR4AWMYBaNgFIyCUTAKRsEoGAWjYBSMglEwCkbBKBjqQD/e9D8ID7xLBgZQ6v+BDr+Bdv9I8D8juYYPZoDuaT1bITC9OGXnsPQvOqDU/7Fz3MH6Lx1+hyJ+ceFpuoQfpfaP+p94/w+rDIHL4+hguBYElPoflvBAQFNNnOH6rZdgNr0yArL9yIBY+9H9H56sCfcDMiDG/yAAC4Oh6n9Q/CPHIwwg+39YZAR8CR9bAMDAcCkICGV8XGEA8z+uhIeun1YZAVfBgw5w2U9MwYcvIxDyP0z/yrnXsdpPKcBV8KADSvyPzVyQ/5nIdfRQAcgeBgUANcFg6yOCIh5b5BMKA0LhgitD0gLQKr6oEQbo4Uur+MflVnT7QQUHcuEBavHgyvy4zB3tAlDBHhigVx+R3BYPDOBrAmPTP5SbwNgAoS4AMWFIiruIBcS2xIgBxLZ8RwcBqWAuvTIIsQkcBrA1+YixZ3QQkLguCQzQuyAg1l3oaof9ICA6gCUESiOE2IxHqwyDy35iEwG5BR+1wo9cQKn9lOontm8OAwNREBDjLnzxPyKmxSgFsISEa1QVHcASArULAHw1PqHR3lFAPsCWEYkZrKRW/LcdivtPTtOfmPgfTSAkAGJrBFplPGJrhNGMTxuAK/zJ7WqRYz8lYzzYwGhCIQPgqhGq7BbRJTxx1QijGZ8+AFdBQK/wxzVYORr/dAbo0zADYT+oMBgo+0c6GAzxT6n9FK0DGA4BMNQBPefo0cFIj39qrysZCEDR6OhANUEGSxMMBEgddKG2/chgoOzHN81ED/thYCDtH6pdQJI04Ctt6ZERiF2oMVCDcLTOCMTOTw/kICQtM8JIH4QldjaC6oOAxExDIQN6ToPRIyPA7Me1uQQd0HsakNYZgdyFMbRaK48N0HIalNz1APT0PzZ3UW0akNhdVvReCIMOaJURiN1lNdD+BwFqZgRSl6bSciEMJctgaeV/dLtovRCI3DCg2kIgXBmBVrukiLEfF6BFjTDSlgIPtzXxo0uBqbQUeDBvhsEGqD1YOdT8DwLEZARix3hggFYJn1qbXnCpJcf/2OwarC0eQmqRx2iokhEGeq04DFArI5Bq/0D7n9glyjCAnhGIXWEGA/Ss8fAVPOgtMGLHaGDmwjICuQUPrOU7VHYBogOKzwMAeXygEj82+0EJAT1xooOBnDenJSBlHz22MCBGP3r40iP+0WtcZPtBCRi5EAdlSJg8rcIAn35yASl2UVMtCAzr8wBIPRKKXHtgYDB2AUgZC8E1zUSvMR5c89uUngdAbBeQ2LX+pLqLWEBqS4waYyEj5jwAasxPD8ZBQFKbfMSoGwznAVBS8FDzPAB0MJTHQkbPA6DQHBgYKdOgo+cBDP9p0NHdQ0QAUhci0WohELmDXKOAMkDuegB6HxqKDkbPA6AyGOlLgUc6GLFLgUcBKhjpm3FGOhjo8xgGOv2NAigY3Q49ssFAn8dAjfgHABenDwpH5WukAAAAAElFTkSuQmCC"
                    },
                    "target": "neutral-json",
                    "encoding": "csv",
                    "render": true,
                    "scale": 1
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FliplineTilemapConverterResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tool": {
      "get": {
        "operationId": "getToolDefinition",
        "summary": "Inputs, output schema and examples for this tool",
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "FliplineTilemapConverterInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "map": {
            "title": "Map text (TMX, Tiled JSON, engine-neutral JSON or Flipline tilemap project)",
            "type": "string",
            "maxLength": 4000000,
            "default": ""
          },
          "file": {
            "title": "Or: map file",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 7813 KiB. Accepts .tmx,.tmj,.json,.xml.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "images": {
            "title": "Tileset and image-layer PNGs (one PNG or a ZIP of PNGs, matched by file name)",
            "type": "object",
            "description": "Upload as {filename, contentType?, contentBase64}. Max 23438 KiB. Accepts .png,.zip.",
            "additionalProperties": false,
            "required": [
              "filename",
              "contentBase64"
            ],
            "properties": {
              "filename": {
                "type": "string"
              },
              "contentType": {
                "type": "string"
              },
              "contentBase64": {
                "type": "string"
              }
            }
          },
          "target": {
            "title": "Convert to",
            "type": "string",
            "enum": [
              "tmx",
              "tiled-json",
              "neutral-json",
              "flipline",
              "collision-json",
              "png",
              "zip"
            ],
            "default": "tiled-json"
          },
          "encoding": {
            "title": "Tile layer encoding (TMX and Tiled JSON)",
            "type": "string",
            "enum": [
              "csv",
              "base64",
              "base64-zlib",
              "base64-gzip"
            ],
            "default": "csv"
          },
          "render": {
            "title": "Also render a PNG preview",
            "type": "boolean",
            "default": true
          },
          "scale": {
            "title": "PNG scale",
            "type": "integer",
            "minimum": 1,
            "maximum": 8,
            "default": 2
          }
        },
        "required": []
      },
      "FliplineTilemapConverterResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "source",
              "target",
              "encoding",
              "file",
              "text",
              "png",
              "collision"
            ],
            "properties": {
              "source": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "format",
                  "orientation",
                  "width",
                  "height",
                  "infinite",
                  "tileWidth",
                  "tileHeight",
                  "tilesets",
                  "layers",
                  "placedTiles",
                  "objects",
                  "missingImages"
                ],
                "properties": {
                  "format": {
                    "type": "string"
                  },
                  "orientation": {
                    "type": "string"
                  },
                  "width": {
                    "type": "integer"
                  },
                  "height": {
                    "type": "integer"
                  },
                  "infinite": {
                    "type": "boolean"
                  },
                  "tileWidth": {
                    "type": "integer"
                  },
                  "tileHeight": {
                    "type": "integer"
                  },
                  "tilesets": {
                    "type": "integer"
                  },
                  "layers": {
                    "type": "integer"
                  },
                  "placedTiles": {
                    "type": "integer"
                  },
                  "objects": {
                    "type": "integer"
                  },
                  "missingImages": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                }
              },
              "target": {
                "type": "string"
              },
              "encoding": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "file": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              },
              "text": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "png": {
                "type": [
                  "object",
                  "null"
                ],
                "additionalProperties": false,
                "required": [
                  "artifactId",
                  "filename",
                  "mime",
                  "bytes",
                  "sha256",
                  "path"
                ],
                "properties": {
                  "artifactId": {
                    "type": "string"
                  },
                  "filename": {
                    "type": "string"
                  },
                  "mime": {
                    "type": "string"
                  },
                  "bytes": {
                    "type": "integer"
                  },
                  "sha256": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string",
                    "description": "Download path on the same site (valid for about 2 hours)."
                  }
                }
              },
              "collision": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "solidCells",
                  "mergedRects",
                  "oneWayRuns",
                  "shapes",
                  "skippedShapes",
                  "rects"
                ],
                "properties": {
                  "solidCells": {
                    "type": "integer"
                  },
                  "mergedRects": {
                    "type": "integer"
                  },
                  "oneWayRuns": {
                    "type": "integer"
                  },
                  "shapes": {
                    "type": "integer"
                  },
                  "skippedShapes": {
                    "type": "integer"
                  },
                  "rects": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "x",
                        "y",
                        "width",
                        "height"
                      ],
                      "properties": {
                        "x": {
                          "type": "number"
                        },
                        "y": {
                          "type": "number"
                        },
                        "width": {
                          "type": "number"
                        },
                        "height": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}