{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://github.com/isocialPractice/napkin-sketch/docs/api/schema/instructions.schema.json",
  "title": "napkin script 1, the object form",
  "description": "A script as JSON: an array of instructions, each an object naming its verb. Generated from the verb table by npm run api-docs; validateScript is the full check.",
  "$ref": "#/definitions/body",
  "definitions": {
    "body": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "$ref": "#/definitions/verbs/napkin"
          },
          {
            "$ref": "#/definitions/verbs/page"
          },
          {
            "$ref": "#/definitions/verbs/background"
          },
          {
            "$ref": "#/definitions/verbs/name"
          },
          {
            "$ref": "#/definitions/verbs/units"
          },
          {
            "$ref": "#/definitions/verbs/seed"
          },
          {
            "$ref": "#/definitions/verbs/newpage"
          },
          {
            "$ref": "#/definitions/verbs/layer"
          },
          {
            "$ref": "#/definitions/verbs/group"
          },
          {
            "$ref": "#/definitions/verbs/clip"
          },
          {
            "$ref": "#/definitions/verbs/tool"
          },
          {
            "$ref": "#/definitions/verbs/color"
          },
          {
            "$ref": "#/definitions/verbs/width"
          },
          {
            "$ref": "#/definitions/verbs/opacity"
          },
          {
            "$ref": "#/definitions/verbs/fill"
          },
          {
            "$ref": "#/definitions/verbs/gradient"
          },
          {
            "$ref": "#/definitions/verbs/stroke"
          },
          {
            "$ref": "#/definitions/verbs/style"
          },
          {
            "$ref": "#/definitions/verbs/profile"
          },
          {
            "$ref": "#/definitions/verbs/nib"
          },
          {
            "$ref": "#/definitions/verbs/pencil"
          },
          {
            "$ref": "#/definitions/verbs/rough"
          },
          {
            "$ref": "#/definitions/verbs/font"
          },
          {
            "$ref": "#/definitions/verbs/character"
          },
          {
            "$ref": "#/definitions/verbs/paragraph"
          },
          {
            "$ref": "#/definitions/verbs/textconfig"
          },
          {
            "$ref": "#/definitions/verbs/accent"
          },
          {
            "$ref": "#/definitions/verbs/rect"
          },
          {
            "$ref": "#/definitions/verbs/circle"
          },
          {
            "$ref": "#/definitions/verbs/ellipse"
          },
          {
            "$ref": "#/definitions/verbs/line"
          },
          {
            "$ref": "#/definitions/verbs/polygon"
          },
          {
            "$ref": "#/definitions/verbs/polyline"
          },
          {
            "$ref": "#/definitions/verbs/star"
          },
          {
            "$ref": "#/definitions/verbs/arc"
          },
          {
            "$ref": "#/definitions/verbs/spiral"
          },
          {
            "$ref": "#/definitions/verbs/shape"
          },
          {
            "$ref": "#/definitions/verbs/wipe"
          },
          {
            "$ref": "#/definitions/verbs/stack"
          },
          {
            "$ref": "#/definitions/verbs/path"
          },
          {
            "$ref": "#/definitions/verbs/through"
          },
          {
            "$ref": "#/definitions/verbs/split"
          },
          {
            "$ref": "#/definitions/verbs/smear"
          },
          {
            "$ref": "#/definitions/verbs/warp"
          },
          {
            "$ref": "#/definitions/verbs/twirl"
          },
          {
            "$ref": "#/definitions/verbs/pucker"
          },
          {
            "$ref": "#/definitions/verbs/bloat"
          },
          {
            "$ref": "#/definitions/verbs/push"
          },
          {
            "$ref": "#/definitions/verbs/pop"
          },
          {
            "$ref": "#/definitions/verbs/translate"
          },
          {
            "$ref": "#/definitions/verbs/rotate"
          },
          {
            "$ref": "#/definitions/verbs/scale"
          },
          {
            "$ref": "#/definitions/verbs/mirror"
          },
          {
            "$ref": "#/definitions/verbs/let"
          },
          {
            "$ref": "#/definitions/verbs/define"
          },
          {
            "$ref": "#/definitions/verbs/place"
          },
          {
            "$ref": "#/definitions/verbs/repeat"
          },
          {
            "$ref": "#/definitions/verbs/text"
          },
          {
            "$ref": "#/definitions/verbs/image"
          },
          {
            "$ref": "#/definitions/verbs/link"
          },
          {
            "$ref": "#/definitions/verbs/use"
          },
          {
            "$ref": "#/definitions/verbs/effect"
          },
          {
            "$ref": "#/definitions/verbs/blend"
          },
          {
            "$ref": "#/definitions/verbs/crop"
          },
          {
            "$ref": "#/definitions/verbs/registration"
          }
        ]
      }
    },
    "pathBody": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "$ref": "#/definitions/verbs/move"
          },
          {
            "$ref": "#/definitions/verbs/to"
          },
          {
            "$ref": "#/definitions/verbs/by"
          },
          {
            "$ref": "#/definitions/verbs/curve"
          },
          {
            "$ref": "#/definitions/verbs/smooth"
          },
          {
            "$ref": "#/definitions/verbs/through"
          },
          {
            "$ref": "#/definitions/verbs/close"
          }
        ]
      }
    },
    "expression": {
      "type": "object",
      "description": "An expression, its source without the parentheses: { \"expr\": \"20 + i * 40\" }.",
      "properties": {
        "expr": {
          "type": "string"
        }
      },
      "required": [
        "expr"
      ],
      "additionalProperties": false
    },
    "point": {
      "type": "object",
      "properties": {
        "x": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string",
              "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "y": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string",
              "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        }
      },
      "required": [
        "x",
        "y"
      ],
      "additionalProperties": false
    },
    "stop": {
      "type": "object",
      "properties": {
        "color": {
          "type": "string",
          "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
        },
        "offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        }
      },
      "required": [
        "color",
        "offset"
      ],
      "additionalProperties": false
    },
    "run": {
      "type": "object",
      "description": "A run of a text: from start to end (not included), and the character attributes it has.",
      "properties": {
        "start": {
          "type": "integer",
          "minimum": 0
        },
        "end": {
          "type": "integer",
          "minimum": 1
        },
        "config": {
          "type": "string"
        },
        "face": {
          "type": "string"
        },
        "tracking": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "kern": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "kerning": {
          "type": "string",
          "enum": [
            "auto",
            "none"
          ]
        },
        "leading": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string",
              "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "spacing": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "caps": {
          "type": "string",
          "enum": [
            "normal",
            "all",
            "small"
          ]
        },
        "hscale": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "vscale": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "shift": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string",
              "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "rotate": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "highlight": {
          "type": "string",
          "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
        },
        "position": {
          "anyOf": [
            {
              "const": "superscript"
            },
            {
              "const": "subscript"
            }
          ]
        },
        "underline": {
          "type": "boolean"
        },
        "strike": {
          "type": "boolean"
        },
        "size": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string",
              "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
            },
            {
              "$ref": "#/definitions/expression"
            }
          ]
        },
        "family": {
          "type": "string"
        },
        "color": {
          "type": "string",
          "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
        }
      },
      "required": [
        "start",
        "end"
      ],
      "additionalProperties": false
    },
    "position": {
      "type": "object",
      "description": "Where a parsed instruction came from. A program building JSON leaves it out.",
      "properties": {
        "line": {
          "type": "integer"
        },
        "column": {
          "type": "integer"
        }
      },
      "additionalProperties": false
    },
    "verbs": {
      "napkin": {
        "type": "object",
        "title": "napkin",
        "description": "The language version the script was written for. The first line of a script; without it version 1 is assumed, with a warning.",
        "properties": {
          "verb": {
            "const": "napkin"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "version": {
            "type": "integer"
          }
        },
        "required": [
          "verb",
          "version"
        ],
        "additionalProperties": false
      },
      "page": {
        "type": "object",
        "title": "page",
        "description": "The page size: a named size (a3, a4, a5, letter, legal, tabloid, square, slide, napkin) or a width and a height, turned portrait or landscape.",
        "properties": {
          "verb": {
            "const": "page"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "paper": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "a3",
                  "a4",
                  "a5",
                  "letter",
                  "legal",
                  "tabloid",
                  "square",
                  "slide",
                  "napkin"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "orientation": {
            "anyOf": [
              {
                "const": "portrait"
              },
              {
                "const": "landscape"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "background": {
        "type": "object",
        "title": "background",
        "description": "The page color, or none for a transparent page.",
        "properties": {
          "verb": {
            "const": "background"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "color": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "color"
        ],
        "additionalProperties": false
      },
      "name": {
        "type": "object",
        "title": "name",
        "description": "The page's name, and the file stem it is written under.",
        "properties": {
          "verb": {
            "const": "name"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "verb",
          "name"
        ],
        "additionalProperties": false
      },
      "units": {
        "type": "object",
        "title": "units",
        "description": "The unit bare numbers are read in from here on: px, in, mm or pt. Pixels until changed.",
        "properties": {
          "verb": {
            "const": "units"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "units": {
            "type": "string",
            "enum": [
              "px",
              "in",
              "mm",
              "pt"
            ]
          }
        },
        "required": [
          "verb",
          "units"
        ],
        "additionalProperties": false
      },
      "seed": {
        "type": "object",
        "title": "seed",
        "description": "The seed for the hand-drawn pass. One script and one seed draw the same bytes every run.",
        "properties": {
          "verb": {
            "const": "seed"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "seed": {
            "type": "integer"
          }
        },
        "required": [
          "verb",
          "seed"
        ],
        "additionalProperties": false
      },
      "newpage": {
        "type": "object",
        "title": "newpage",
        "description": "Starts another page the same size, carrying the paint state across.",
        "properties": {
          "verb": {
            "const": "newpage"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "layer": {
        "type": "object",
        "title": "layer",
        "description": "A drawing layer. Marks after it go on it until the next layer.",
        "properties": {
          "verb": {
            "const": "layer"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "opacity": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hidden": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "locked": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "name"
        ],
        "additionalProperties": false
      },
      "group": {
        "type": "object",
        "title": "group",
        "description": "A group layer. The layer and group lines in its block become its children.",
        "properties": {
          "verb": {
            "const": "group"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "opacity": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hidden": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "locked": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "$ref": "#/definitions/body"
          }
        },
        "required": [
          "verb",
          "name",
          "body"
        ],
        "additionalProperties": false
      },
      "clip": {
        "type": "object",
        "title": "clip",
        "description": "A clip group: everything its block draws shows only inside the block's last closed shape, in paint order, which paints nothing while it clips - the app's Make Clipping Mask. Without a closed shape in it, the block is a plain group.",
        "properties": {
          "verb": {
            "const": "clip"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "$ref": "#/definitions/body"
          }
        },
        "required": [
          "verb",
          "body"
        ],
        "additionalProperties": false
      },
      "tool": {
        "type": "object",
        "title": "tool",
        "description": "The kind of mark: pen (the app's Brush; brush is taken for it), marker (translucent, so overlapping passes build up like ink), copic (a broad, angled nib), pencil (a lead through the paper's grain; pencil picks one) or eraser (cuts its line's swath out of the marks drawn before it on its layer, as the app's Eraser does, and draws nothing of its own).",
        "properties": {
          "verb": {
            "const": "tool"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "tool": {
            "type": "string",
            "enum": [
              "pen",
              "marker",
              "copic",
              "pencil",
              "eraser",
              "brush"
            ]
          }
        },
        "required": [
          "verb",
          "tool"
        ],
        "additionalProperties": false
      },
      "color": {
        "type": "object",
        "title": "color",
        "description": "The ink color of every mark after it.",
        "properties": {
          "verb": {
            "const": "color"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "color": {
            "type": "string",
            "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
          }
        },
        "required": [
          "verb",
          "color"
        ],
        "additionalProperties": false
      },
      "width": {
        "type": "object",
        "title": "width",
        "description": "The stroke width of every mark after it.",
        "properties": {
          "verb": {
            "const": "width"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "width": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "width"
        ],
        "additionalProperties": false
      },
      "opacity": {
        "type": "object",
        "title": "opacity",
        "description": "The opacity of every mark after it, from 0 to 1.",
        "properties": {
          "verb": {
            "const": "opacity"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "opacity": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "opacity"
        ],
        "additionalProperties": false
      },
      "fill": {
        "type": "object",
        "title": "fill",
        "description": "The fill color of closed shapes after it, or none.",
        "properties": {
          "verb": {
            "const": "fill"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "fill": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "fill"
        ],
        "additionalProperties": false
      },
      "gradient": {
        "type": "object",
        "title": "gradient",
        "description": "A gradient fill for closed shapes after it: linear at an angle, or radial from the centre out, or none.",
        "properties": {
          "verb": {
            "const": "gradient"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "type": {
            "anyOf": [
              {
                "const": "linear"
              },
              {
                "const": "radial"
              },
              {
                "const": "none"
              }
            ]
          },
          "angle": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "stops": {
            "anyOf": [
              {
                "type": "array",
                "minItems": 2,
                "items": {
                  "$ref": "#/definitions/stop"
                }
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "type"
        ],
        "additionalProperties": false
      },
      "stroke": {
        "type": "object",
        "title": "stroke",
        "description": "Turns the outline on or off. With it off, a closed shape is its fill alone.",
        "properties": {
          "verb": {
            "const": "stroke"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "on": {
            "type": "boolean"
          }
        },
        "required": [
          "verb",
          "on"
        ],
        "additionalProperties": false
      },
      "style": {
        "type": "object",
        "title": "style",
        "description": "The outline's dash: solid, dashed or dotted.",
        "properties": {
          "verb": {
            "const": "style"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "style": {
            "type": "string",
            "enum": [
              "solid",
              "dashed",
              "dotted"
            ]
          }
        },
        "required": [
          "verb",
          "style"
        ],
        "additionalProperties": false
      },
      "profile": {
        "type": "object",
        "title": "profile",
        "description": "How the width runs along a brush or marker stroke: uniform, rounded, tapered or wave.",
        "properties": {
          "verb": {
            "const": "profile"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "profile": {
            "type": "string",
            "enum": [
              "uniform",
              "rounded",
              "tapered",
              "wave"
            ]
          }
        },
        "required": [
          "verb",
          "profile"
        ],
        "additionalProperties": false
      },
      "nib": {
        "type": "object",
        "title": "nib",
        "description": "The angle of the copic nib, in degrees.",
        "properties": {
          "verb": {
            "const": "nib"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "angle": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "angle"
        ],
        "additionalProperties": false
      },
      "pencil": {
        "type": "object",
        "title": "pencil",
        "description": "Takes up the Pencil at a grade: graphite alone, 9H to 9B, or charcoal (HB to 6B), compressed (2B to 6B) or vine (hard, medium, soft) and its grade. Every mark after it is drawn with that lead through the paper's grain, in its tone - or in the color given, a colored pencil. The width is the line's own; the app's softer leads draw broader at one tool width.",
        "properties": {
          "verb": {
            "const": "pencil"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "pencil": {
            "type": "string",
            "enum": [
              "9H",
              "8H",
              "7H",
              "6H",
              "5H",
              "4H",
              "3H",
              "2H",
              "H",
              "F",
              "HB",
              "B",
              "2B",
              "3B",
              "4B",
              "5B",
              "6B",
              "7B",
              "8B",
              "9B",
              "charcoal-HB",
              "charcoal-2B",
              "charcoal-4B",
              "charcoal-6B",
              "vine-hard",
              "vine-medium",
              "vine-soft",
              "compressed-2B",
              "compressed-4B",
              "compressed-6B"
            ]
          },
          "color": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "pencil"
        ],
        "additionalProperties": false
      },
      "rough": {
        "type": "object",
        "title": "rough",
        "description": "The hand-drawn pass for every mark after it: 0 is exact, 1 is clearly drawn by hand, and off is 0. Seeded, so it draws the same way every run.",
        "properties": {
          "verb": {
            "const": "rough"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "amount": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "const": 0
              }
            ]
          },
          "passes": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "overshoot": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "amount"
        ],
        "additionalProperties": false
      },
      "font": {
        "type": "object",
        "title": "font",
        "description": "The font family and size of text after it.",
        "properties": {
          "verb": {
            "const": "font"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "character": {
        "type": "object",
        "title": "character",
        "description": "The character attributes of text after it: its face, tracking, kerning, leading, word spacing, capitals, scales, baseline shift, turn and highlight, and whether it is a superscript or a subscript, underlined or struck through. reset puts every one back.",
        "properties": {
          "verb": {
            "const": "character"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "face": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "tracking": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "kern": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "kerning": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "auto",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "leading": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "spacing": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "caps": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "normal",
                  "all",
                  "small"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hscale": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "vscale": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "shift": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rotate": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "highlight": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          },
          "position": {
            "anyOf": [
              {
                "const": "superscript"
              },
              {
                "const": "subscript"
              },
              {
                "type": "null"
              }
            ]
          },
          "underline": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "strike": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "reset": {
            "anyOf": [
              {
                "const": true
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "paragraph": {
        "type": "object",
        "title": "paragraph",
        "description": "The paragraph attributes of text after it: its alignment, its indents, the space before and after it, whether it hyphenates, and a bulleted or numbered list at a level. reset puts every one back.",
        "properties": {
          "verb": {
            "const": "paragraph"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "align": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "left",
                  "center",
                  "right",
                  "justify"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "indent": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "indentRight": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "first": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "before": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "after": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hyphenate": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "list": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "bullet",
                  "number",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "level": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "reset": {
            "anyOf": [
              {
                "const": true
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "textconfig": {
        "type": "object",
        "title": "textconfig",
        "description": "Defines a Text Configuration, a vector editor's Character Style: a named set of character attributes the book keeps, which text follows with config and its runs with config in their clauses. What a text has of its own overrides it. Defined again under its name, it changes for every text that follows it.",
        "properties": {
          "verb": {
            "const": "textconfig"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "face": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "tracking": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "kerning": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "auto",
                  "none"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "leading": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "spacing": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "caps": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "normal",
                  "all",
                  "small"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hscale": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "vscale": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "shift": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rotate": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "highlight": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          },
          "position": {
            "anyOf": [
              {
                "const": "superscript"
              },
              {
                "const": "subscript"
              },
              {
                "type": "null"
              }
            ]
          },
          "underline": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "strike": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "family": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "color": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "name"
        ],
        "additionalProperties": false
      },
      "accent": {
        "type": "object",
        "title": "accent",
        "description": "A Clean Language Accent for the next text: its paragraphs are colored as a language reads them - keywords, strings, numbers, comments, names - live as the app edits them. A language by its id or a name highlight.js knows it by (a name no word spells in quotes, \"c++\"), auto for the one the code reads most like, or none. It waits for the next text; one nothing takes is reported.",
        "properties": {
          "verb": {
            "const": "accent"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "language": {
            "type": "string",
            "enum": [
              "auto",
              "none",
              "1c",
              "abnf",
              "accesslog",
              "actionscript",
              "as",
              "ada",
              "angelscript",
              "asc",
              "apache",
              "apacheconf",
              "applescript",
              "osascript",
              "arcade",
              "arduino",
              "ino",
              "armasm",
              "arm",
              "asciidoc",
              "adoc",
              "aspectj",
              "autohotkey",
              "ahk",
              "autoit",
              "avrasm",
              "awk",
              "axapta",
              "x++",
              "bash",
              "sh",
              "zsh",
              "basic",
              "bnf",
              "brainfuck",
              "bf",
              "c",
              "h",
              "cal",
              "capnproto",
              "capnp",
              "ceylon",
              "clean",
              "dcl",
              "icl",
              "clojure",
              "clj",
              "edn",
              "clojure-repl",
              "cmake",
              "cmake.in",
              "coffeescript",
              "coffee",
              "cson",
              "iced",
              "coq",
              "cos",
              "cls",
              "cpp",
              "c++",
              "cc",
              "cxx",
              "h++",
              "hh",
              "hpp",
              "hxx",
              "crmsh",
              "crm",
              "pcmk",
              "crystal",
              "cr",
              "csharp",
              "c#",
              "cs",
              "csp",
              "css",
              "d",
              "dart",
              "delphi",
              "dfm",
              "dpr",
              "pas",
              "pascal",
              "diff",
              "patch",
              "django",
              "jinja",
              "dns",
              "bind",
              "zone",
              "dockerfile",
              "docker",
              "dos",
              "bat",
              "batch",
              "cmd",
              "dsconfig",
              "dts",
              "dust",
              "dst",
              "ebnf",
              "elixir",
              "ex",
              "exs",
              "elm",
              "erb",
              "erlang",
              "erl",
              "erlang-repl",
              "excel",
              "xls",
              "xlsx",
              "fix",
              "flix",
              "fortran",
              "f90",
              "f95",
              "freedesktop",
              "desktop",
              "systemd",
              "fsharp",
              "f#",
              "fs",
              "gams",
              "gms",
              "gauss",
              "gss",
              "gcode",
              "nc",
              "gherkin",
              "feature",
              "glsl",
              "gml",
              "go",
              "golang",
              "golo",
              "gradle",
              "graphql",
              "gql",
              "groovy",
              "haml",
              "handlebars",
              "hbs",
              "html.handlebars",
              "html.hbs",
              "htmlbars",
              "haskell",
              "hs",
              "haxe",
              "hx",
              "hsp",
              "http",
              "https",
              "hy",
              "hylang",
              "inform7",
              "i7",
              "ini",
              "toml",
              "irpf90",
              "isbl",
              "java",
              "jsp",
              "javascript",
              "cjs",
              "js",
              "jsx",
              "mjs",
              "jboss-cli",
              "wildfly-cli",
              "json",
              "json5",
              "jsonc",
              "julia",
              "julia-repl",
              "jldoctest",
              "kotlin",
              "kt",
              "ktm",
              "kts",
              "ktx",
              "lasso",
              "lassoscript",
              "ls",
              "latex",
              "tex",
              "ldif",
              "leaf",
              "less",
              "lisp",
              "livecodeserver",
              "livescript",
              "ls",
              "llvm",
              "lsl",
              "lua",
              "pluto",
              "makefile",
              "mak",
              "make",
              "mk",
              "markdown",
              "md",
              "mkd",
              "mkdown",
              "mathematica",
              "mma",
              "wl",
              "matlab",
              "maxima",
              "mel",
              "mercury",
              "m",
              "moo",
              "mipsasm",
              "mips",
              "mizar",
              "mojolicious",
              "monkey",
              "moonscript",
              "moon",
              "n1ql",
              "nestedtext",
              "nt",
              "nginx",
              "nginxconf",
              "nim",
              "nix",
              "nixos",
              "node-repl",
              "nsis",
              "objectivec",
              "mm",
              "obj-c",
              "obj-c++",
              "objc",
              "objective-c++",
              "ocaml",
              "ml",
              "openscad",
              "scad",
              "oxygene",
              "parser3",
              "perl",
              "pl",
              "pm",
              "pf",
              "pf.conf",
              "pgsql",
              "postgres",
              "postgresql",
              "php",
              "php-template",
              "plaintext",
              "text",
              "txt",
              "pony",
              "powershell",
              "ps",
              "ps1",
              "pwsh",
              "processing",
              "pde",
              "profile",
              "prolog",
              "properties",
              "protobuf",
              "proto",
              "puppet",
              "pp",
              "purebasic",
              "pb",
              "pbi",
              "python",
              "gyp",
              "ipython",
              "py",
              "python-repl",
              "pycon",
              "q",
              "k",
              "kdb",
              "qml",
              "qt",
              "r",
              "reasonml",
              "re",
              "rib",
              "roboconf",
              "graph",
              "instances",
              "routeros",
              "mikrotik",
              "rsl",
              "ruby",
              "gemspec",
              "irb",
              "podspec",
              "rb",
              "thor",
              "ruleslanguage",
              "rust",
              "rs",
              "sas",
              "scala",
              "scheme",
              "scm",
              "scilab",
              "sci",
              "scss",
              "shell",
              "console",
              "shellsession",
              "smali",
              "smalltalk",
              "st",
              "sml",
              "ml",
              "sqf",
              "sql",
              "stan",
              "stanfuncs",
              "stata",
              "ado",
              "do",
              "step21",
              "p21",
              "step",
              "stp",
              "stylus",
              "styl",
              "subunit",
              "swift",
              "taggerscript",
              "tap",
              "tcl",
              "tk",
              "thrift",
              "tp",
              "twig",
              "craftcms",
              "typescript",
              "cts",
              "mts",
              "ts",
              "tsx",
              "vala",
              "vbnet",
              "vb",
              "vbscript",
              "vbs",
              "vbscript-html",
              "verilog",
              "sv",
              "svh",
              "v",
              "vhdl",
              "vim",
              "wasm",
              "wren",
              "x86asm",
              "xl",
              "tao",
              "xml",
              "atom",
              "html",
              "plist",
              "rss",
              "svg",
              "wsf",
              "xhtml",
              "xjb",
              "xsd",
              "xsl",
              "xquery",
              "xpath",
              "xq",
              "xqm",
              "yaml",
              "yml",
              "zephir",
              "zep"
            ]
          }
        },
        "required": [
          "verb",
          "language"
        ],
        "additionalProperties": false
      },
      "rect": {
        "type": "object",
        "title": "rect",
        "description": "A rectangle, with rounded corners when r is given.",
        "properties": {
          "verb": {
            "const": "rect"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "radius": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y",
          "width",
          "height"
        ],
        "additionalProperties": false
      },
      "circle": {
        "type": "object",
        "title": "circle",
        "description": "A circle, drawn as four cubic curves rather than a polygon.",
        "properties": {
          "verb": {
            "const": "circle"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "cx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "r": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "cx",
          "cy",
          "r"
        ],
        "additionalProperties": false
      },
      "ellipse": {
        "type": "object",
        "title": "ellipse",
        "description": "An ellipse, from its centre and two radii.",
        "properties": {
          "verb": {
            "const": "ellipse"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "cx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "rx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "ry": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "cx",
          "cy",
          "rx",
          "ry"
        ],
        "additionalProperties": false
      },
      "line": {
        "type": "object",
        "title": "line",
        "description": "A straight line between two points.",
        "properties": {
          "verb": {
            "const": "line"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x1": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y1": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "x2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x1",
          "y1",
          "x2",
          "y2"
        ],
        "additionalProperties": false
      },
      "polygon": {
        "type": "object",
        "title": "polygon",
        "description": "A closed shape through a list of points, with rounded corners when r is given.",
        "properties": {
          "verb": {
            "const": "polygon"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "points": {
            "type": "array",
            "minItems": 3,
            "items": {
              "$ref": "#/definitions/point"
            }
          },
          "radius": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "points"
        ],
        "additionalProperties": false
      },
      "polyline": {
        "type": "object",
        "title": "polyline",
        "description": "An open line through a list of points.",
        "properties": {
          "verb": {
            "const": "polyline"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "points": {
            "type": "array",
            "minItems": 2,
            "items": {
              "$ref": "#/definitions/point"
            }
          }
        },
        "required": [
          "verb",
          "points"
        ],
        "additionalProperties": false
      },
      "star": {
        "type": "object",
        "title": "star",
        "description": "A star with the given number of points, between an outer and an inner radius.",
        "properties": {
          "verb": {
            "const": "star"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "cx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "outer": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "inner": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "cx",
          "cy",
          "outer",
          "inner",
          "count"
        ],
        "additionalProperties": false
      },
      "arc": {
        "type": "object",
        "title": "arc",
        "description": "An open arc of a circle between two angles, in degrees clockwise from three o'clock.",
        "properties": {
          "verb": {
            "const": "arc"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "cx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "r": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "from": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "to": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "cx",
          "cy",
          "r",
          "from",
          "to"
        ],
        "additionalProperties": false
      },
      "spiral": {
        "type": "object",
        "title": "spiral",
        "description": "A spiral winding out from its centre to the radius over the given number of turns.",
        "properties": {
          "verb": {
            "const": "spiral"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "cx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "r": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "turns": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "cx",
          "cy",
          "r",
          "turns"
        ],
        "additionalProperties": false
      },
      "shape": {
        "type": "object",
        "title": "shape",
        "description": "A named shape from the built-in library, drawn in a box from x, y. With one size its longer side is that long and it keeps its proportions; with a width and a height it is stretched to fill them.",
        "properties": {
          "verb": {
            "const": "shape"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "name",
          "x",
          "y",
          "width"
        ],
        "additionalProperties": false
      },
      "wipe": {
        "type": "object",
        "title": "wipe",
        "description": "Combines the marks its block draws, as the app's Wipe Stacks do, and draws what is left in their place: in (Wipe In, their union), out-front (Subtract Top from Below: the bottom one less the rest), out-back (Subtract Below from Top: the top one less the rest), mid (Mid Wipe: where all of them overlap), outer (Outer Wipes: where an odd number overlap) or clean (Clean Wipe: every piece of their overlaps, a mark each). What is left is painted as the topmost mark, or as the bottom one for out-front; text, pictures and eraser marks in the block are passed over. The block keeps its paint and transforms to itself, as a group does, and effects written just before it go on what it leaves.",
        "properties": {
          "verb": {
            "const": "wipe"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "op": {
            "type": "string",
            "enum": [
              "in",
              "out-front",
              "out-back",
              "mid",
              "outer",
              "clean"
            ]
          },
          "body": {
            "$ref": "#/definitions/body"
          }
        },
        "required": [
          "verb",
          "op",
          "body"
        ],
        "additionalProperties": false
      },
      "stack": {
        "type": "object",
        "title": "stack",
        "description": "Stacks the marks its block draws as the app's Shape Stacker does, at the pieces under its points - the places where the marks overlap and where they do not: merge makes those pieces one shape, painted as the topmost mark over the first point, and each mark keeps what was not merged; remove takes them away from every mark. Text, pictures and eraser marks in the block are passed over. The block keeps its paint and transforms to itself, as a group does, and the points are where the stack line is.",
        "properties": {
          "verb": {
            "const": "stack"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "mode": {
            "type": "string",
            "enum": [
              "merge",
              "remove"
            ]
          },
          "points": {
            "type": "array",
            "minItems": 1,
            "items": {
              "$ref": "#/definitions/point"
            }
          },
          "body": {
            "$ref": "#/definitions/body"
          }
        },
        "required": [
          "verb",
          "mode",
          "points",
          "body"
        ],
        "additionalProperties": false
      },
      "path": {
        "type": "object",
        "title": "path",
        "description": "One mark, from SVG path data or from a block of path steps. Each subpath of a compound path is one piece of the same mark.",
        "properties": {
          "verb": {
            "const": "path"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "d": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "anyOf": [
              {
                "$ref": "#/definitions/pathBody"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "move": {
        "type": "object",
        "title": "move",
        "description": "Starts a new subpath at a point.",
        "properties": {
          "verb": {
            "const": "move"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "to": {
        "type": "object",
        "title": "to",
        "description": "A straight segment to a point.",
        "properties": {
          "verb": {
            "const": "to"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "by": {
        "type": "object",
        "title": "by",
        "description": "A straight segment by an offset from the current point.",
        "properties": {
          "verb": {
            "const": "by"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "dx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "dy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "dx",
          "dy"
        ],
        "additionalProperties": false
      },
      "curve": {
        "type": "object",
        "title": "curve",
        "description": "A cubic curve to a point, steered by two handles.",
        "properties": {
          "verb": {
            "const": "curve"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "c1x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "c1y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "c2x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "c2y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "c1x",
          "c1y",
          "c2x",
          "c2y",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "smooth": {
        "type": "object",
        "title": "smooth",
        "description": "A cubic curve whose first handle mirrors the last one, so the join stays smooth.",
        "properties": {
          "verb": {
            "const": "smooth"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "c2x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "c2y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "c2x",
          "c2y",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "through": {
        "type": "object",
        "title": "through",
        "description": "A smooth curve through a list of points. Inside a path block it continues the subpath; outside one it is an open mark of its own.",
        "properties": {
          "verb": {
            "const": "through"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "points": {
            "type": "array",
            "minItems": 2,
            "items": {
              "$ref": "#/definitions/point"
            }
          }
        },
        "required": [
          "verb",
          "points"
        ],
        "additionalProperties": false
      },
      "close": {
        "type": "object",
        "title": "close",
        "description": "Closes the current subpath back to its start.",
        "properties": {
          "verb": {
            "const": "close"
          },
          "at": {
            "$ref": "#/definitions/position"
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "split": {
        "type": "object",
        "title": "split",
        "description": "Cuts the topmost mark drawn so far whose path passes within 4 px of a point, where the point lands on it, as the app's Split does: an open path becomes two, a closed one opens there, and a compound shape gives up the ring that was cut, as an open mark of its own. Nothing moves, and the pieces take the mark's place on its layer. In a wipe or a stack block it cuts among the marks the block has drawn.",
        "properties": {
          "verb": {
            "const": "split"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "smear": {
        "type": "object",
        "title": "smear",
        "description": "A pass of the Smear, a blending stump, along a list of points: it spreads the graphite of every pencil mark drawn so far that it reaches, along the drag, as the app's Smear does. The width is the stump's, scaled by the transform as a width is, and the strength from 0 to 1. In a wipe or a stack block it smears among the marks the block has drawn.",
        "properties": {
          "verb": {
            "const": "smear"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "width": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "strength": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "points": {
            "type": "array",
            "minItems": 2,
            "items": {
              "$ref": "#/definitions/point"
            }
          }
        },
        "required": [
          "verb",
          "width",
          "strength",
          "points"
        ],
        "additionalProperties": false
      },
      "warp": {
        "type": "object",
        "title": "warp",
        "description": "Liquify's Warp, as the app's Liquify does it: a brush pushed from the point by dx and dy, carrying what is under its centre the whole way, like clay. The brush reaches the marks drawn so far whose outline passes within its radius of the point, under the transform as a mark drawn there would be, and its effect falls off smoothly to nothing at the rim; the radius scales with the transform. Pencil marks are the Smear's, and text, pictures and eraser marks have no outline to bend: all are left as they are. Each mark it bends is fitted again after, so its anchors stay few. In a wipe or a stack block it bends among the marks the block has drawn.",
        "properties": {
          "verb": {
            "const": "warp"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "radius": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "dx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "dy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y",
          "radius",
          "dx",
          "dy"
        ],
        "additionalProperties": false
      },
      "twirl": {
        "type": "object",
        "title": "twirl",
        "description": "Liquify's Twirl: turns what is under a brush at the point about its centre, by the angle in degrees there - clockwise on the screen, as rotate turns - and less toward the rim, so distances from the centre are kept. The brush reaches the marks drawn so far whose outline passes within its radius of the point, under the transform as a mark drawn there would be, and its effect falls off smoothly to nothing at the rim; the radius scales with the transform. Pencil marks are the Smear's, and text, pictures and eraser marks have no outline to bend: all are left as they are. Each mark it bends is fitted again after, so its anchors stay few. In a wipe or a stack block it bends among the marks the block has drawn.",
        "properties": {
          "verb": {
            "const": "twirl"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "radius": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y",
          "radius",
          "amount"
        ],
        "additionalProperties": false
      },
      "pucker": {
        "type": "object",
        "title": "pucker",
        "description": "Liquify's Pucker: draws what is under a brush at the point in toward its centre, a point near the centre by the amount, 0 to 1, of its distance. The brush reaches the marks drawn so far whose outline passes within its radius of the point, under the transform as a mark drawn there would be, and its effect falls off smoothly to nothing at the rim; the radius scales with the transform. Pencil marks are the Smear's, and text, pictures and eraser marks have no outline to bend: all are left as they are. Each mark it bends is fitted again after, so its anchors stay few. In a wipe or a stack block it bends among the marks the block has drawn.",
        "properties": {
          "verb": {
            "const": "pucker"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "radius": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y",
          "radius",
          "amount"
        ],
        "additionalProperties": false
      },
      "bloat": {
        "type": "object",
        "title": "bloat",
        "description": "Liquify's Bloat: pushes what is under a brush at the point out from its centre, a point near the centre by the amount, 0 to 1, of its distance. The brush reaches the marks drawn so far whose outline passes within its radius of the point, under the transform as a mark drawn there would be, and its effect falls off smoothly to nothing at the rim; the radius scales with the transform. Pencil marks are the Smear's, and text, pictures and eraser marks have no outline to bend: all are left as they are. Each mark it bends is fitted again after, so its anchors stay few. In a wipe or a stack block it bends among the marks the block has drawn.",
        "properties": {
          "verb": {
            "const": "bloat"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "radius": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y",
          "radius",
          "amount"
        ],
        "additionalProperties": false
      },
      "push": {
        "type": "object",
        "title": "push",
        "description": "Saves the transform, the paint state and the units, for the next pop to restore.",
        "properties": {
          "verb": {
            "const": "push"
          },
          "at": {
            "$ref": "#/definitions/position"
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "pop": {
        "type": "object",
        "title": "pop",
        "description": "Restores the transform, the paint state and the units the last push saved.",
        "properties": {
          "verb": {
            "const": "pop"
          },
          "at": {
            "$ref": "#/definitions/position"
          }
        },
        "required": [
          "verb"
        ],
        "additionalProperties": false
      },
      "translate": {
        "type": "object",
        "title": "translate",
        "description": "Moves everything drawn after it.",
        "properties": {
          "verb": {
            "const": "translate"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "dx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "dy": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "dx",
          "dy"
        ],
        "additionalProperties": false
      },
      "rotate": {
        "type": "object",
        "title": "rotate",
        "description": "Turns everything drawn after it, clockwise in degrees, about the origin or a point given with at.",
        "properties": {
          "verb": {
            "const": "rotate"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "angle": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "cx": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "angle"
        ],
        "additionalProperties": false
      },
      "scale": {
        "type": "object",
        "title": "scale",
        "description": "Scales everything drawn after it, about the origin or a point given with at. One factor scales both ways.",
        "properties": {
          "verb": {
            "const": "scale"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "sx": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "sy": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "cx": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "cy": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "sx"
        ],
        "additionalProperties": false
      },
      "mirror": {
        "type": "object",
        "title": "mirror",
        "description": "Reflects everything drawn after it: x swaps left and right across a vertical line, y swaps top and bottom across a horizontal one, at 0 unless given.",
        "properties": {
          "verb": {
            "const": "mirror"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "axis": {
            "type": "string",
            "enum": [
              "x",
              "y"
            ]
          },
          "about": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "axis"
        ],
        "additionalProperties": false
      },
      "let": {
        "type": "object",
        "title": "let",
        "description": "Names a number for the expressions after it, in the current units.",
        "properties": {
          "verb": {
            "const": "let"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string",
            "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "name",
          "value"
        ],
        "additionalProperties": false
      },
      "define": {
        "type": "object",
        "title": "define",
        "description": "Records a block of drawing under a name without drawing it, for place to draw.",
        "properties": {
          "verb": {
            "const": "define"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "body": {
            "$ref": "#/definitions/body"
          }
        },
        "required": [
          "verb",
          "name",
          "body"
        ],
        "additionalProperties": false
      },
      "place": {
        "type": "object",
        "title": "place",
        "description": "Draws a definition, moved, scaled or turned.",
        "properties": {
          "verb": {
            "const": "place"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "x": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "scale": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rotate": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "name"
        ],
        "additionalProperties": false
      },
      "repeat": {
        "type": "object",
        "title": "repeat",
        "description": "Runs a block a number of times, counting from 0 in the name given with as.",
        "properties": {
          "verb": {
            "const": "repeat"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "as": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
              },
              {
                "type": "null"
              }
            ]
          },
          "body": {
            "$ref": "#/definitions/body"
          }
        },
        "required": [
          "verb",
          "count",
          "body"
        ],
        "additionalProperties": false
      },
      "text": {
        "type": "object",
        "title": "text",
        "description": "A text item, set and aligned, and editable in the app: Sideless Typing from its anchor, Sheet Typing in a box or inside a shape, or Path Typing along a path, set in its runs' styles, the whole of it following a Text Configuration with config. With markdown its text is Markdown, shown as it renders: Markdown Flow. With as marks the letters are drawn as brush strokes instead.",
        "properties": {
          "verb": {
            "const": "text"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "text": {
            "type": "string"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "size": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "box": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "inside": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "along": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "start": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT])?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "flip": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "effect": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "rainbow",
                  "skew",
                  "ribbon",
                  "stair",
                  "gravity"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "align": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "left",
                  "center",
                  "right",
                  "justify"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "vertical": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "config": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "runs": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/definitions/run"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "markdown": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "asMarks": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "text",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "image": {
        "type": "object",
        "title": "image",
        "description": "Places an image: an asset the host supplied, by name, or a data URL. Nothing is read from disk.",
        "properties": {
          "verb": {
            "const": "image"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "src": {
            "type": "string"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "src",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "link": {
        "type": "object",
        "title": "link",
        "description": "Places a linked file: one selectable element that references the file instead of drawing its contents into the page.",
        "properties": {
          "verb": {
            "const": "link"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "href": {
            "type": "string"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "href",
          "x",
          "y"
        ],
        "additionalProperties": false
      },
      "use": {
        "type": "object",
        "title": "use",
        "description": "Copies in a document the host supplied, as a group, with its layers and anchors.",
        "properties": {
          "verb": {
            "const": "use"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "name": {
            "type": "string"
          },
          "x": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "scale": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "layer": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "name"
        ],
        "additionalProperties": false
      },
      "effect": {
        "type": "object",
        "title": "effect",
        "description": "An effect for the next layer, group or mark the script makes: a CSS filter function - blur, brightness, contrast, saturate, grayscale, sepia, invert, hue-rotate, opacity or drop-shadow, which is Outer Shadow - an appearance effect - feather, bevel, emboss, inner-shadow, outer-glow or inner-glow - or splatter, a vector editor's Scribble, which draws a mark's fill as a loose hatch (on a layer or a group it draws nothing) - or warp, a vector editor's Warp, which bends what takes it by a style, a layer's or a group's marks as one - or extrude and revolve, a vector editor's Classic 3D, which build a mark in depth and draw it as shaded faces (on a layer or a group they draw nothing). Any of them also takes `on fill` or `on stroke`, to work on that part of a mark alone, and `hidden`, to be kept without being drawn. Several stack in order, and none clears what is waiting.",
        "properties": {
          "verb": {
            "const": "effect"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "type": {
            "anyOf": [
              {
                "const": "blur"
              },
              {
                "const": "brightness"
              },
              {
                "const": "contrast"
              },
              {
                "const": "saturate"
              },
              {
                "const": "grayscale"
              },
              {
                "const": "sepia"
              },
              {
                "const": "invert"
              },
              {
                "const": "hue-rotate"
              },
              {
                "const": "opacity"
              },
              {
                "const": "drop-shadow"
              },
              {
                "const": "feather"
              },
              {
                "const": "bevel"
              },
              {
                "const": "emboss"
              },
              {
                "const": "inner-shadow"
              },
              {
                "const": "outer-glow"
              },
              {
                "const": "inner-glow"
              },
              {
                "const": "splatter"
              },
              {
                "const": "warp"
              },
              {
                "const": "extrude"
              },
              {
                "const": "revolve"
              },
              {
                "const": "none"
              }
            ]
          },
          "radius": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "amount": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "angle": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "dx": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "dy": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "blur": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "color": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          },
          "spread": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "choke": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "blend": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "normal",
                  "soak",
                  "stack",
                  "scorch",
                  "dry",
                  "sheer",
                  "bleach",
                  "fold",
                  "light",
                  "heavy",
                  "messy",
                  "avoidance",
                  "tidy",
                  "bright",
                  "dye",
                  "cover",
                  "darken",
                  "multiply",
                  "color-burn",
                  "lighten",
                  "screen",
                  "color-dodge",
                  "overlay",
                  "soft-light",
                  "hard-light",
                  "difference",
                  "exclusion",
                  "hue",
                  "saturation",
                  "color",
                  "luminosity"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "opacity": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "style": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "inner",
                  "outer"
                ]
              },
              {
                "type": "string",
                "enum": [
                  "emboss",
                  "pillow"
                ]
              },
              {
                "type": "string",
                "enum": [
                  "arc",
                  "arch",
                  "unroll",
                  "shell",
                  "windy",
                  "breezy",
                  "curvy",
                  "chart",
                  "puffy",
                  "expand",
                  "cram",
                  "twirl",
                  "arc-lower",
                  "arc-upper",
                  "bulge",
                  "shell-lower",
                  "shell-upper",
                  "flag",
                  "wave",
                  "fish",
                  "rise",
                  "fisheye",
                  "inflate",
                  "squeeze",
                  "twist"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "size": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "depth": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "altitude": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "soften": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "direction": {
            "anyOf": [
              {
                "const": "up"
              },
              {
                "const": "down"
              },
              {
                "type": "null"
              }
            ]
          },
          "lightColor": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          },
          "lightOpacity": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "lightBlend": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "normal",
                  "soak",
                  "stack",
                  "scorch",
                  "dry",
                  "sheer",
                  "bleach",
                  "fold",
                  "light",
                  "heavy",
                  "messy",
                  "avoidance",
                  "tidy",
                  "bright",
                  "dye",
                  "cover",
                  "darken",
                  "multiply",
                  "color-burn",
                  "lighten",
                  "screen",
                  "color-dodge",
                  "overlay",
                  "soft-light",
                  "hard-light",
                  "difference",
                  "exclusion",
                  "hue",
                  "saturation",
                  "color",
                  "luminosity"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "shadeColor": {
            "anyOf": [
              {
                "type": "string",
                "description": "A CSS color: a name, #rgb to #rrggbbaa, rgb(), rgba(), hsl() or hsla()."
              },
              {
                "type": "null"
              }
            ]
          },
          "shadeOpacity": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "shadeBlend": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "normal",
                  "soak",
                  "stack",
                  "scorch",
                  "dry",
                  "sheer",
                  "bleach",
                  "fold",
                  "light",
                  "heavy",
                  "messy",
                  "avoidance",
                  "tidy",
                  "bright",
                  "dye",
                  "cover",
                  "darken",
                  "multiply",
                  "color-burn",
                  "lighten",
                  "screen",
                  "color-dodge",
                  "overlay",
                  "soft-light",
                  "hard-light",
                  "difference",
                  "exclusion",
                  "hue",
                  "saturation",
                  "color",
                  "luminosity"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "source": {
            "anyOf": [
              {
                "const": "edge"
              },
              {
                "const": "center"
              },
              {
                "type": "null"
              }
            ]
          },
          "preset": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "default",
                  "childlike",
                  "dense",
                  "loose",
                  "moire",
                  "sharp",
                  "sketch",
                  "snarl",
                  "swash",
                  "tight",
                  "zig-zag"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "overlap": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "overlapVariation": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "curviness": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "curvinessVariation": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "spacing": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "spacingVariation": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "seed": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "bend": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "orientation": {
            "anyOf": [
              {
                "const": "horizontal"
              },
              {
                "const": "vertical"
              },
              {
                "type": "null"
              }
            ]
          },
          "distortH": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "distortV": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "part": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "whole",
                  "lower",
                  "upper"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hollow": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "offset": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "axis": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "left",
                  "right"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "segments": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rotateX": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rotateY": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "rotateZ": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "positionX": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "positionY": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "positionZ": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "scaleX": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "scaleY": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "scaleZ": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "perspective": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "shading": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "plastic",
                  "diffuse",
                  "none",
                  "wireframe"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "lightAzimuth": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "lightElevation": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "lightIntensity": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "lightAmbient": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "target": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "fill",
                  "stroke"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "hidden": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "type"
        ],
        "additionalProperties": false
      },
      "blend": {
        "type": "object",
        "title": "blend",
        "description": "How the next layer or group the script makes mixes with what is drawn under it, the page's background included: a Napkin Blend by its name or by Illustrator's - stack or multiply, sheer or screen, cover or luminosity. A blend is a layer's, so it waits for the next layer or group; normal sets one back.",
        "properties": {
          "verb": {
            "const": "blend"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "mode": {
            "type": "string",
            "enum": [
              "normal",
              "soak",
              "stack",
              "scorch",
              "dry",
              "sheer",
              "bleach",
              "fold",
              "light",
              "heavy",
              "messy",
              "avoidance",
              "tidy",
              "bright",
              "dye",
              "cover",
              "darken",
              "multiply",
              "color-burn",
              "lighten",
              "screen",
              "color-dodge",
              "overlay",
              "soft-light",
              "hard-light",
              "difference",
              "exclusion",
              "hue",
              "saturation",
              "color",
              "luminosity"
            ]
          }
        },
        "required": [
          "verb",
          "mode"
        ],
        "additionalProperties": false
      },
      "crop": {
        "type": "object",
        "title": "crop",
        "description": "The box every output is cut to: auto fits the ink with room to spare, none keeps the page, or a box given outright.",
        "properties": {
          "verb": {
            "const": "crop"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "mode": {
            "anyOf": [
              {
                "const": "auto"
              },
              {
                "const": "none"
              },
              {
                "const": "box"
              }
            ]
          },
          "pad": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "x": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "string",
                    "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
                  },
                  {
                    "$ref": "#/definitions/expression"
                  }
                ]
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "verb",
          "mode"
        ],
        "additionalProperties": false
      },
      "registration": {
        "type": "object",
        "title": "registration",
        "description": "One box every page is written in, so frames drawn by one script line up when they are played in sequence.",
        "properties": {
          "verb": {
            "const": "registration"
          },
          "at": {
            "$ref": "#/definitions/position"
          },
          "x": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "y": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "width": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          },
          "height": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "string",
                "pattern": "^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?(?:[pP][xX]|[iI][nN]|[mM][mM]|[pP][tT]|%)?$"
              },
              {
                "$ref": "#/definitions/expression"
              }
            ]
          }
        },
        "required": [
          "verb",
          "x",
          "y",
          "width",
          "height"
        ],
        "additionalProperties": false
      }
    }
  }
}
