wai-vector: section 5 and the text layer, its checker, and the three-engine browser leg (D7-7, D7-8) #237

Merged
dcharlot merged 5 commits from wai/d7-text-and-browser into main 2026-10-13 07:57:39 -04:00
115 changed files with 6854 additions and 122 deletions

View file

@ -8,19 +8,37 @@ name: wai-vector vector graphics
# - Linux x86_64, Linux arm64 and macOS arm64, natively, debug and release: the unit
# tests, the refusal-order, canonical, clock, track, geometry, cost, held-set and
# raster tests, the corpus tests (every frame of the rendering groups recomputed
# to its SHA-256), the in-house sets' tests (the default stroke set's SHA-256 is
# Annex B's, Annex A's table is the expansion's, and both sets re-derive from their
# WSF1 sources), and `wai-vector vectors verify`, which also regenerates the
# whole corpus and converts every payload's authoring form back to its bytes; and
# the sink's build, without the feature `author`, so with no stroker;
# to its SHA-256, and every text record of the a11y group recomputed byte for
# byte), the in-house sets' tests (the default stroke set's SHA-256 is Annex B's,
# Annex A's table is the expansion's, and both sets re-derive from their WSF1
# sources), the text layer's tests (the projection and the transcript of section
# 5.4 against JSON written out by hand, and the worked example read from the
# extension), and `wai-vector vectors verify`, which also regenerates the whole
# corpus and converts every payload's authoring form back to its bytes; and the
# sink's build, without the feature `author`, so with no stroker;
# - WASI (wasm32-wasip2) under wasmtime, a 32-bit target: the same tests and the same
# `vectors verify`;
# - a browser's engine (wasm32-unknown-unknown) under Node: the recomputation of
# every expected file and every authoring form, in a sink's build, and the default
# stroke set's SHA-256 against Annex B;
# every expected file and every authoring form, in a sink's build (an a11y
# payload's expected file states the SHA-256 of its text record, so the projection
# and the transcript are recomputed here too), and the default stroke set's
# SHA-256 against Annex B;
# - three browser engines (chromium, webkit and firefox, as Playwright 1.60.0 names
# the engines it drives), in that version's container image, pinned by digest. The
# package a site serves (the sink's exports alone, built for wasm32v1-none and read
# back as WebAssembly 1.0 by wasm/check-mvp.mjs) loads every payload to its code,
# states each listed size's cost, and renders the frames through the page's hook:
# each is hashed by the module and by the platform, and the sampled ones are sent
# to Node and hashed there. For each a11y payload the sink's transcript and its
# projection at every frame of every listed rate, written out as the text
# record's lines, must be the committed record byte for byte. The recomputation
# module then recomputes every expected file and authoring form in each engine.
# A missing engine fails the job;
# - the fuzz leg: the corpus-seeded fuzz of the WOS1 and WVG1 parsers at depth, each
# accepted payload of small cost rendered, the peak-allocation test and the
# duplicate-detection comparison count;
# accepted payload of small cost rendered and each accepted payload's text layer
# held (its transcript is JSON, and its projections list the blocks the frame
# procedure draws), the peak-allocation test and the duplicate-detection
# comparison count;
# - the independent checker, tools/wai_vector_check.py: Python standard library only,
# written from the extension text alone and sharing no code with wai-vector, which
# recomputes every expected file byte for byte (every frame by the closed-form
@ -199,6 +217,87 @@ jobs:
shell: bash
run: node verify.mjs target/wasm32-unknown-unknown/release/wai_vector_wasm.wasm ../../vector-conformance
browser:
name: wasm32 in three browser engines
runs-on: linux
timeout-minutes: 45
# Playwright 1.60.0's own image: Node and the three engines that version drives,
# already installed. Pinned by the digest of its linux/amd64 manifest (the linux
# runner is x86_64), so the engines' builds cannot move under the tag.
container:
image: mcr.microsoft.com/playwright:v1.60.0-noble@sha256:83192064c7510f7ee73dd63dc5f22a5e01a92c81a2e6a9c715d9e3fe55471fd9
env:
# The image runs as root, and an engine that finds HOME owned by another user
# refuses to start.
HOME: /root
steps:
- uses: actions/checkout@v4
# The image ships no Rust. wasm32v1-none is the package's target: its
# precompiled core and alloc are WebAssembly 1.0, which those of
# wasm32-unknown-unknown are not (wasm/build-pkg.sh says why that decides it).
- name: Install Rust 1.98.0 with the wasm32v1-none and wasm32-unknown-unknown targets
shell: bash
run: |
export PATH="$HOME/.cargo/bin:$PATH"
command -v rustup >/dev/null 2>&1 || \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
rustup toolchain install 1.98.0 --profile minimal
rustup default 1.98.0
rustup target add wasm32v1-none wasm32-unknown-unknown
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
# The sink's exports alone, built and then read back: every section, type,
# segment and instruction WebAssembly 1.0's, no imports, no 64-bit integer at an
# exported function, no floating point, and the exported functions the script
# lists. The build fails otherwise.
- name: The package, built for wasm32v1-none and read back as WebAssembly 1.0
shell: bash
run: bash wai/wai-vector/wasm/build-pkg.sh
- name: Build the recomputation for wasm32-unknown-unknown
working-directory: wai/wai-vector/wasm
shell: bash
run: cargo build --locked --release --target wasm32-unknown-unknown
# The check must be able to fail. The recomputation module is the default
# target's build, whose precompiled core and alloc use bulk memory: the reader
# must refuse it, and for that reason.
- name: The reader refuses a module that is not WebAssembly 1.0
working-directory: wai/wai-vector/wasm
shell: bash
run: |
set -euo pipefail
if node check-mvp.mjs target/wasm32-unknown-unknown/release/wai_vector_wasm.wasm > "$RUNNER_TEMP/check-default.log" 2>&1; then
cat "$RUNNER_TEMP/check-default.log"
echo "::error::check-mvp.mjs passed the default target's build"
exit 1
fi
cat "$RUNNER_TEMP/check-default.log"
grep -q 'NOT 1.0: bulk-memory (memory.copy)' "$RUNNER_TEMP/check-default.log" \
|| { echo "::error::check-mvp.mjs did not report bulk memory in the default target's build"; exit 1; }
# The image's engines are the ones this Playwright drives; the package comes
# from the lockfile, with its integrity hash.
- name: Playwright 1.60.0, from the lockfile
working-directory: wai/wai-vector/browser
shell: bash
run: |
set -euo pipefail
node --version
npm ci --no-audit --no-fund
# A missing engine is a failure: run.mjs passes only when all three ran.
- name: Every payload, frame, text record and vector in chromium, webkit and firefox
working-directory: wai/wai-vector/browser
shell: bash
run: |
set -euo pipefail
node run.mjs --engines chromium,webkit,firefox \
--pkg ../wasm/dist/pkg-vector \
--recompute ../wasm/target/wasm32-unknown-unknown/release/wai_vector_wasm.wasm \
../../vector-conformance
fuzz:
name: fuzz, peak allocation, comparison count
runs-on: linux

View file

@ -6,6 +6,98 @@ wire format may change and such changes are recorded here.
## v0.4.0 — current
### Vector graphics (Draft): the sink as a WebAssembly 1.0 module, in three browser engines
Additive. No payload, outline set, vector or digest changes.
- **The sink's exports.** `wai-vector/wasm` exports the sink of
[graphics-vector](extensions/graphics-vector.md) behind a C ABI, with no bindings
generator and no imports. `wv_add_set` holds an outline set a payload may name;
`wv_open` loads a payload to a handle, or to its refusal's code; `wv_render` gives a
frame's `RGBA8P` at a listed size and rate, or the request error's code; `wv_cost`
gives a listed size's cost; `wv_transcript` gives the transcript, and `wv_projection`
the projection at a frame of a listed rate, each as the JSON of §5.4, or the request
error's code; `wv_sha256` gives a digest; `wv_close` releases a handle. A result is
read at `wv_out_ptr`, `wv_out_len` bytes of it. No export takes or returns a 64-bit
integer: a frame number goes in as two halves.
- **The package.** `wai-vector/wasm/build-pkg.sh` builds the module a site serves: the
sink's exports alone, with no glue script. It is WebAssembly 1.0 and nothing later:
no SIMD, no threads, no bulk memory, no sign-extension operators, no reference types.
The target is `wasm32v1-none`, whose precompiled `core` and `alloc` are 1.0
themselves, so the crate is now `no_std` and carries its own allocator. The build
then reads the module back: `wasm/check-mvp.mjs` decodes every section, type, segment
and instruction, and refuses anything later than 1.0, any import, any 64-bit integer
at an exported function, any floating point, and any exported function the script
does not list.
- **Three browser engines.** `wai-vector/browser/run.mjs` serves a page, the package and
the corpus, and in each engine loads every payload of `vector-conformance` to its
expected code, checks its SHA-256 and each listed size's cost, and renders its frames
through the page's hook, `window.__wai_overlay.frame(size, rate, g)`, which returns
the renderer's own buffer: every listed frame at sizes up to 1280 × 720, and sampled
frames above. The page hashes each frame with the module's SHA-256 and with the
platform's digest. The sampled frames are also sent to Node as bytes, and Node hashes
them itself. Where a payload's expected file states a text record, the page's hook
also gives the sink's transcript and its projection at every frame of every listed
rate, `transcript()` and `projection(rate, g)`; written out as the record's lines,
they must be the committed `<name>.a11y.jsonl` byte for byte. The recomputation
module then recomputes every expected file and authoring form in each engine.
Nothing is read from a canvas. A run passes only when all three engines ran: a
missing engine is a failure.
- **CI.** `wai-vector.yml` gains the `browser` job: the package built and read back,
then the three engines, in a container image pinned by digest.
### Vector graphics (Draft): text and accessibility, §5 of `wai.graphics.vector`
- **[graphics-vector](extensions/graphics-vector.md) §5 is written.** A payload carries
its words beside its glyphs, and this revision says what a sink computes from them and
what it owes the viewer:
- **The projection and the transcript, byte for byte (§5.4).** A block's active set is
the union of the effective windows of the runs and paths that draw it, cut to the
document's window, sorted, with windows that overlap or touch merged. The projection
at a frame is every block active at the frame's tick, in reading order; the
transcript is every block with its active set. Both are JSON with a fixed member
order and exactly three string escapes. A block's `purpose` is written as the byte
carried, an unregistered code included; `mode` is in every node; a ruby link is
written as the base block's index with the range's start and length; `decorative`
blocks are in neither. Opacity, position and clips do not enter either value. A
payload's *text record* is its transcript and every frame's projection at every
listed rate, one value a line: text-equivalence is byte equality of it.
- **Encoder rules (§5.1, §5.3)** that a verifier checks and a sink does not: one base
direction for a block, one joining sequence in one run, vertical text and its
`mode`, Normalization Form C, every byte of a string in exactly one cluster, no
zero-glyph cluster for a visible character, and no colour glyphs.
- **The purpose vocabulary (§5.2),** with how each purpose is exposed and whether it is
announced by default.
- **Exposure (§5.5).** A presenting sink exposes the current projection to the
platform's accessibility interface, updates it when the projection changes, inserts
strings as text and never as markup, and keeps within stated announcement limits.
What assistive technology then says is not claimed.
- **Whether the words match the glyphs (§5.6):** the chain from a parent font to an
outline set, from a text block to glyph IDs, and from glyphs to the overlay layer;
what an authoring receipt records; and what the chain does not reach.
- **Captions under the viewer's control (§5.7).** Captions travel as timed text. A
sink that cannot read the platform's caption preferences does not draw `caption` or
`subtitle` items, and a frame it draws without them is not the published frame.
- **`wai-vector`: the text layer.** `wai_vector::text` computes `text_hash`, block
identities, effective windows, active sets, the projection, the transcript and the
text record, in a sink's build, and a verifier's check of the cluster rule. The tool
gains `wai-vector a11y` (the text record, the transcript, or one frame's projection)
and `wai-vector text` (the text digests and each block as a reviewer reads it). The
corpus-seeded fuzz holds the text layer of every payload it accepts: the transcript
is JSON that gives back each tag and string, and a projection lists exactly the
blocks the frame procedure draws at that tick.
- **`vector-conformance`: the `a11y` group.** Each payload's expected file states the
SHA-256 of its text record, and the record is committed beside it, so every fabric leg
recomputes it: the worked example of §5.4, windows and a fade to nothing, a
`decorative` block, text alternatives of paths, reading groups, ruby over part of a
base, registered and unregistered purposes, merged and clipped intervals, windows cut
by enclosing groups, the three writing modes, four rates over one document, strings
that take each escape and strings that take none, and a payload with no text. The
`canonical` and `refusals` groups gain text-block cases: an ungrouped block between
groups, ruby links to a later block and ranges that end inside a character or at the
string's end, and pairs that pin where `TEXTS` sits in the record pass and that the
text-block rules come before any outline set is read.
### Reader limits that bound memory: manifest values, and text decode
Two reader limits join the manifest length limit (SPEC §2, *Reader limits*), and with

View file

@ -4,11 +4,12 @@
> - the model, the conformance criteria and what they cover (§1);
> - the payload format `WVG1`, the outline-set format `WOS1`, the digest sidecar, and the order in which a sink refuses a payload (§2);
> - the arithmetic: the clock, track evaluation, placement, the load-time interval check and cost, flattening, coverage and compositing, written as the raster stage family RS1–RS9 (§3);
> - outline sets: pinning and carriage, the notes and the licence they carry, the default stroke set and the test repertoire (§4), the stroke source format `WSF1` and its integer expansion (Annex A), and the default stroke set's digest (Annex B).
> - outline sets: pinning and carriage, the notes and the licence they carry, the default stroke set and the test repertoire (§4), the stroke source format `WSF1` and its integer expansion (Annex A), and the default stroke set's digest (Annex B);
> - text and accessibility: what an encoder does to pre-shape text, the purpose vocabulary, clusters, the projection and the transcript with their exact JSON, exposure to the platform's accessibility interface, the chain that ties the words to the glyphs, and captions under the viewer's control (§5).
>
> Sections 5 and 6 are headings in this revision. Their text lands in later revisions of this Draft: text and accessibility (§5), and packages and floors (§6). Where §1–§4 depend on them, they say what they depend on.
> Section 6 is a heading in this revision. Its text lands in a later revision of this Draft: packages and floors. Where §1–§5 depend on it, they say what they depend on.
>
> **What a reader can build from this text.** A sink that loads a `WVG1` payload and the `WOS1` sets it names, refuses exactly the payloads §2.7 refuses with the code §2.7 gives, and renders each listed size, rate and frame to the bytes §3 defines; and a verifier that checks rendered frames against a digest sidecar (§2.10).
> **What a reader can build from this text.** A sink that loads a `WVG1` payload and the `WOS1` sets it names, refuses exactly the payloads §2.7 refuses with the code §2.7 gives, renders each listed size, rate and frame to the bytes §3 defines, and computes the projection at each frame and the transcript to the bytes §5.4 defines; and a verifier that checks rendered frames against a digest sidecar (§2.10).
>
> The string `wai.graphics.vector` is not registered in this revision: SPEC §5 registers it once its conformance corpus is complete (§1.8). Reference implementation: the `wai-vector` crate (`wai/wai-vector`). Conformance: `wai/vector-conformance/`. This Draft precedes both.
>
@ -872,7 +873,230 @@ With it, the corpus pins right-to-left visual order, contextual forms, a conjunc
## 5. Text and accessibility
*This section lands in a later revision of this Draft:* what the authoring tool does to pre-shape text, the purpose vocabulary (§2.3 uses codes 0 and 13), clusters, the projection and the transcript with their exact JSON (text-equivalence, §1.3), exposure on each platform, the chain that checks that the words match the glyphs, and how captions stay under the viewer's control.
A payload carries its words beside its glyphs: text blocks in reading order, and clusters that tie each run's glyphs to the bytes of its block (§2.3). This section states:
- what an encoder does before it writes them (§5.1–§5.3);
- the two values a sink computes from them, the **projection** and the **transcript**, byte for byte (§5.4): this is text-equivalence (§1.3);
- what a sink owes the platform's accessibility interface (§5.5) and the viewer's caption settings (§5.7);
- how a third party checks that the words match the glyphs (§5.6).
### 5.1 Pre-shaped text
The sink never shapes, reorders or breaks text. An authoring tool does all of it before it writes the payload:
1. **Itemise** the text by script, language, direction, writing mode and outline set. A fallback set is chosen here; the sink has none (§1.6).
2. **Resolve direction** by the Unicode Bidirectional Algorithm (UAX #9), under the block's base direction.
3. **Break lines** by the Unicode Line Breaking Algorithm (UAX #14), tailored by language.
4. **Shape** each item, with the font instance its outline set was made from (§4.3).
5. **Justify and align.** A glyph the layout adds, such as a hyphen at a break or an elongation, becomes an inserted cluster (§5.3).
6. **Reorder** each line into visual order.
7. **Write the glyph records** `(gid, x, y)`, in design subpixels relative to the run's origin, with no snapping to pixels (§2.3). The subpixel phase is kept, so equal glyphs at different phases rasterise differently, and identically on every sink (§3.3).
8. **Write the text block and the clusters** (§5.2, §5.3).
The payload fixes the result. Another shaper, or a later version of the same one, may write a different payload; a payload already written renders the same on every sink. Which shaper and which versions made a payload is recorded beside it, never in it (§5.6).
**Encoder rules.** An encoder MUST meet each rule below, and each rule of §5.3. A verifier checks them. A sink does not: it loads and renders a payload that breaks one, because none of them is a check of §2.7.
- **One base direction for a block.** A block's `dir` is the direction the tool gave every paragraph of the block's string, set explicitly (UAX #9, rule HL1) and never detected from the first strong character (rule P3). So a U+000A inside a string never changes direction. A change of language, of direction or of writing mode starts a new block, in the same group.
- **One joining sequence in one run.** A cursive joining sequence, and an Indic syllable, each lie within one run. Within a run, glyphs join by the glyph-wise union; across runs, fills composite by source-over, which would open a seam where the glyphs abut (§3.8). So a change of paint or of outline set never falls inside one.
- **Vertical text.** The tool gives the glyphs of a vertical line vertical positions, puts text set sideways in a run of its own under a rotation matrix, and sets the block's `mode`: 1 for vertical-rl, 2 for vertical-lr. The sink draws every glyph where the payload puts it, whatever the mode. The mode is for the projection (§5.4), exposure (§5.5) and the text floor (§6).
- **Normalisation.** A string is in Unicode Normalization Form C (UAX #15), so approved copy compares byte for byte with the string carried.
- **Language tags** are well-formed under RFC 5646 and valid against its registry (§2.5 rule 6 checks their syntax only).
§5.4 adds a recommendation about windows (*Where a block is*).
### 5.2 Text blocks and the purpose vocabulary
A **text block** is one `TEXT` record and its bytes of `STRINGS` (§2.3). It carries:
- **the string:** the words as authored, in logical order, UTF-8. It is the words themselves, never a description of them;
- **`lang`:** a BCP 47 language tag; `und` is allowed;
- **`dir`:** the base direction of every paragraph of the string (§5.1): 0 left-to-right, 1 right-to-left;
- **`mode`:** the writing mode: 0 horizontal-tb, 1 vertical-rl, 2 vertical-lr;
- **`purpose`:** what the words are for, from the vocabulary below;
- **`group`:** the blocks of one lower third, or of one credit card, which are read together. 0 is no group. The blocks of a group are contiguous in block order (§2.5 rule 4);
- **`ruby`:** optionally, the earlier block this block annotates, and the byte range of that block's string it annotates.
**Reading order is block order:** the order of the `TEXT` records, whatever the paint order of the items and wherever the glyphs sit on the canvas.
**The purpose vocabulary**
| code | purpose | exposed as | announced by default (within §5.5's limits) |
|---|---|---|---|
| 1 | `title` | a heading | politely |
| 2 | `credit` | a list item, in its group | no: the transcript carries it |
| 3 | `lower_third` | grouped text | politely |
| 4 | `caption` | text; §5.7 applies | no: the platform's caption renderer carries it |
| 5 | `subtitle` | text; §5.7 applies | no: the platform's caption renderer carries it |
| 6 | `forced_narrative` | text; §5.7 applies | politely |
| 7 | `label` | text | no |
| 8 | `legal` | text | politely |
| 9 | `alert` | an alert | assertively, within the limit of §5.5 |
| 10 | `logo` | the text alternative of a mark | no |
| 11 | `graphic` | the text alternative of a shape | no |
| 12 | `data` | text, such as a score or a reading | no |
| 13 | `decorative` | **not exposed**: text used as ornament | never |
| 0 | none | refused (`field_range`, §2.7) | |
| 14–255 | unregistered | as `label` | no |
- **An unregistered code is carried as it is.** A sink exposes its block as it exposes a `label`, and writes the code itself in the JSON of §5.4, never 7.
- **The purpose is not an input to §3.** No frame of `R` (§3.10) depends on it. A later revision that names an unregistered code therefore changes no frame and no projection: a sink of this revision goes on reading the code as `label`.
- **The last column is a sink's default,** which the viewer can change, for example to have credits announced. A sink MAY announce less. The assignments are to be revised from tests with screen-reader users, and a revision of them changes no payload.
### 5.3 Clusters
A run's clusters follow its glyphs in order (§2.3): each cluster ties `glyph_count` consecutive glyphs of the run to the bytes `[byte_first, byte_first + byte_len)` of its block's string. A run's glyphs are in visual order, so in a right-to-left run the byte ranges descend.
| case | its cluster |
|---|---|
| a ligature: several code points, one glyph | one cluster: one glyph, the bytes of all of them |
| a syllable whose vowel sign is drawn before its consonant, or split around it; a base with its marks | one cluster: the syllable's glyphs, which are consecutive, and the syllable's bytes |
| right-to-left text | clusters in visual order, `byte_first` descending |
| a glyph the layout inserts: a hyphen at a break, an elongation | `byte_len = 0`, and `byte_first` the place in the string where it stands |
| characters that no glyph draws: a space at a line's end, a default-ignorable code point | `glyph_count = 0` |
| a soft hyphen, U+00AD | it stays in the string. Where a line breaks at it, the hyphen drawn is an inserted cluster |
| an emoji, or another character usually drawn in colour | one cluster for its whole code point sequence, drawn by a monochrome outline glyph from a pinned set |
**Encoder rules** (a verifier checks them; a sink checks only §2.5 rule 5):
- **Every byte in one cluster.** In a block that at least one run draws, every byte of the string lies in the byte range of exactly one cluster, over all the clusters of all the runs that draw the block. Two code points may lie in no cluster: U+000A, which separates lines, and U+00AD, which is drawn only as an inserted hyphen. A block that only paths draw has no clusters.
- **No zero-glyph cluster for a visible character.** A cluster with `glyph_count = 0` covers only characters that are meant to draw nothing.
- **No colour glyphs.** `WOS1` has no colour layers, and layers drawn as several runs would break the rule above. An encoder draws a character that is usually drawn in colour with a monochrome outline glyph from a pinned set, or it does not write the payload. Colour glyphs are a successor string (§2.8).
*What clusters are for* (informative). With them a sink can find the character under a point, highlight a word as it is spoken or sung, and show progress through a line, all without shaping; and a verifier can compare a run with a fresh shaping of its words (§5.6).
### 5.4 The projection and the transcript
**Definitions**
- **An item's effective window** is §3.4(b)'s: its `[t_on, t_off)`, intersected with the window of every group that encloses it and with the document's window `[t0, t0 + dur)`. It may be empty.
- **The items that draw a block** are the run items whose `text` is the block's index, and the path items whose `text` is the block's index (§2.4).
- **A block's active set** is the union of the effective windows of the items that draw it, written as a list of half-open tick intervals `[on, off)`:
- sorted in ascending order of `on`;
- with intervals that overlap or touch merged, so `[a, b)` and `[b, c)` become `[a, c)`, and no two intervals of the list share a tick or an end;
- empty when the block is never active inside the document's window.
Every interval has `t0 ≤ on < off ≤ t0 + dur`.
- **The projection at frame `g` of listed rate `r`**, for a frame in the document's range at that rate (§2.7), is the list, in block order, of every block whose purpose is not 13 (`decorative`) and whose active set holds the frame's tick `τ = g·P_r` (§3.1): some interval has `on ≤ τ < off`.
- **The transcript** is the list, in block order, of every block whose purpose is not 13, each with its active set. A block that is never active is in it, with an empty active set.
The projection follows windows, not pixels. An item's opacity, its position, a clip, and what other items cover do not enter it: a block is in the projection at a frame whenever the frame's tick lies in the effective window of an item that draws it, even at opacity 0 or off the canvas. An author ends a window where a fade ends.
A request for the projection at an unlisted rate is `rate_unlisted`, and at a frame outside the document at that rate `frame_range`: the request errors of §2.7, decided the same way.
**The JSON (normative).** A projection is one JSON array of **node objects**. A transcript is one JSON array of **block objects**. Both are in block order, and each is `[]` when it holds nothing.
A node object has these members, in this order, which is the ascending byte order of their keys:
| key | value |
|---|---|
| `dir` | integer: the block's `dir`, 0 or 1 |
| `group` | integer: the block's `group`, 0 ..= 65,535 |
| `index` | integer: the block's index in `TEXTS`, counted from 0. Blocks of purpose 13 keep their indices, so the indices of a list need not be consecutive |
| `lang` | string: the bytes of the block's language tag, as carried |
| `mode` | integer: the block's `mode`, 0, 1 or 2 |
| `purpose` | integer: the block's `purpose` byte itself, 1 ..= 255 and never 13. An unregistered code is written as it is |
| `ruby` | present only when the block's `ruby` is not 0: the object `{"base":B,"len":L,"start":S}`, its members in that order, where `B = ruby − 1` is the index in `TEXTS` of the block it annotates, `S = ruby_start` and `L = ruby_len`. It is written whether or not block `B` is itself in the list |
| `text` | string: the bytes of the block's string, as carried |
A block object has the member `active` first, then the members of a node object. `active` is the block's active set: an array of two-element arrays `[on,off]` of integers, in ticks, in the order defined above; `[]` for a block that is never active.
**The encoding**
- UTF-8, with no byte order mark, no whitespace anywhere, and nothing before or after the value.
- An integer is written in decimal, with no sign and no leading zero; zero is `0`. Every integer here is non-negative.
- A string is `"`, then the bytes carried, then `"`, with exactly three replacements among those bytes: `0x22` is written `\"`, `0x5C` is written `\\`, and `0x0A` is written `\n`. Nothing else is escaped: every other character is written as its UTF-8 bytes, a solidus and every character outside ASCII among them. No other control character occurs (§2.5 rule 6).
- Members and array elements are separated by `,`, and a key from its value by `:`.
**The text record.** A payload's text record is the following lines, each ended by one U+000A:
1. the transcript;
2. then, for each listed rate in `RATE` order, and for each frame `g` of the document at that rate in ascending order (§3.1), the object `{"den":D,"g":G,"num":N,"projection":J}`, its members in that order, where `N` and `D` are the rate's `num` and `den`, `G` is the frame, and `J` is the projection at that frame.
A rate at which the document has no frame adds no line. Two sinks are text-equivalent on a payload exactly when their text records are the same bytes, so conformance material states a payload's projections and transcript as its text record, or as the record's SHA-256.
**A worked example.** A document with `tb = 120000`, `t0 = 0` and `dur = 360000`, listed at 25 fps, so `P = 4800`. It holds a lower third of three blocks, all in group 1:
- block 0: purpose 3, `ar`, right-to-left, writing mode 0, the string `باب البيت` ("the door of the house"), drawn by a run active over `[24000, 264000)`;
- block 1: purpose 3, `en`, left-to-right, writing mode 0, the string `Director of photography`, drawn by a run active over the same window;
- block 2: purpose 7, `en`, left-to-right, writing mode 0, the string `DOP`, a ruby annotation of the first 8 bytes of block 1's string (`ruby = 2`, `ruby_start = 0`, `ruby_len = 8`), drawn by a run active over `[24000, 120000)`.
Its transcript, and the text record's line for frame 30, whose tick 144000 is past block 2's window:
```text
[{"active":[[24000,264000]],"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"active":[[24000,264000]],"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"active":[[24000,120000]],"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]
{"den":1,"g":30,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
```
**Text-equivalence (normative).** A sink is text-equivalent on a payload when the transcript it computes, and the projection it computes for every listed rate and every frame of the document at that rate, are these JSON values byte for byte (§1.3). Suppressing caption items (§5.7) does not change either value: it changes what the sink draws and exposes, not what it computes.
**Where a block is** (encoder rule; a verifier warns). A block can be active while the runs that draw it are off the canvas, because a window may cover time before a line slides in.
- A run **meets the canvas** at a frame when the box of at least one of its glyph records, placed at that frame at the design size (§3.3, with `w = design_w`, over the glyph's exact box, §2.1), overlaps the canvas: the design subpixels with `0 ≤ x < 256·design_w` and `0 ≤ y < 256·design_h`.
- A verifier warns `window_offcanvas` for a run that is active at a frame of a listed rate at which it does not meet the canvas.
- An encoder SHOULD cut each window to the frames at which its run meets the canvas, so a line that slides in is not announced before it appears.
### 5.5 Exposure
**A sink that presents a `WVG1` layer MUST expose the current projection to the platform's accessibility interface.** It updates what it exposes when the projection changes, never on every frame. Exposure is a requirement of its own, beside text-equivalence (§1.3): what the platform's assistive technology then says, and when, is the platform's, and is not claimed.
- **What is exposed,** for each node, in block order: its text; its language and its direction; the role its purpose gives it (§5.2); its group, as one group holding the group's blocks; its writing mode; and, for a ruby block, that it annotates the stated range of its base.
- **Two adjustments.** The sink leaves out every block whose items it did not draw under §5.7, whose words the platform's caption renderer exposes from the timed-text component; and it keeps to the announcement limits below.
- **The transcript** SHOULD also be reachable, so that a viewer can read the credits at a pace of their own.
**Strings are text, never markup (normative).** A string may hold `<`, `&` and any other character §2.5 rule 6 allows.
- A sink that exposes through a document tree MUST insert a payload's strings only as text nodes, or as attribute values through the tree's attribute interface.
- It MUST NOT build markup from them: no assignment to `innerHTML` or `outerHTML`, no `insertAdjacentHTML`, no `document.write`, and no template whose text is parsed as markup.
- The label of the exposed region is the application's own string, never a payload's.
**Announcement limits (normative maxima).** A sink MAY announce less than these allow, and MUST NOT announce more.
- A block is announced only when the interval of its active set that holds the current frame's tick is at least one second long: `off − on ≥ tb`. The transcript decides this, so it does not depend on playback.
- A block is announced at most once for each interval of its active set.
- At most one assertive announcement (an `alert`) is made in any 10 seconds of presentation, for each overlay. An alert that falls inside that time is announced politely.
So no payload can make assistive technology speak on every frame. The values are a first assignment, to be revised from tests with screen-reader users.
**On the web** (informative, except where it restates the rules above). A sink meets the requirement with a mirror in the document, beside the overlay's canvas:
- **A region** (`role="region"`) labelled by the page's own string, hidden from sight by clipping and never by `display: none`, which would hide it from assistive technology too.
- **Live regions:** one `aria-live="polite"` container and one `role="alert"` container. When a block enters the projection, a node carrying `lang`, `dir`, the purpose, the mode and the text joins the container its purpose selects, within the limits above. It leaves when the block leaves.
- **A transcript section:** a `title` as a heading, the `credit` blocks of a group as a list, a group as `role="group"`, a ruby block as `<ruby>` with `<rt>`, and a `logo` as a text alternative.
- **Placement.** The nodes MAY be placed over each block's glyphs, so that magnification and exploration by touch find them. The positions are not part of any claim.
- **Translation** by the browser acts on the mirror, never on the layer. Nothing in the mirror changes a frame.
**On other platforms** (informative). One accessibility element for each block of the projection: its label the text, its language the tag, and a heading trait for a `title`; announcements carry the block's language, within the same limits. On a platform with no web engine this is the only route. Whether the screen readers of television web engines honour live regions and language tags inside an application is not established, and no statement about them is made here.
**Checking exposure against the JSON.** An accessibility tree normalises text, so a check that compares an exposed tree with a projection or a transcript compares `text` under this normalisation, and no other: every maximal run of U+0009, U+000A and U+0020 becomes one U+0020; leading and trailing U+0020 are removed; and U+00AD is removed. The order of the nodes, and each node's language, direction, purpose, mode, group and ruby structure, are compared as they are.
### 5.6 Whether the words match the glyphs
A payload could draw glyphs that say something other than its text block says, so that assistive technology reads one word while the layer shows another. A sink cannot detect that, because it does not shape. The words are tied to the layer by a chain, each link of which a third party can check:
| link | check | by |
|---|---|---|
| parent font → `WOS1` set | derive the set again from the parent the notes name (`parent_sha256`), by the converter, rules and instance they record (§4.3); compare byte for byte | a verifier |
| text block → glyph IDs | shape each run again with the recorded shaper, Unicode version, script, direction, features and language, on the parent font instance. The glyph IDs and the clusters MUST equal the run's, inserted clusters aside; a difference is reported as `glyph_text_mismatch` | a verifier |
| glyphs and positions → overlay layer | §3, and the frame digests (§2.10) | any sink |
| overlay layer → screen | not covered (§1.4) | |
**The authoring receipt.** What the second link needs (the shaper's name and version, the Unicode version, and for each run its script, direction, features, language and byte range) travels in an authoring receipt beside the payload, which names the payload by its SHA-256. It is not in the payload, so the sink parses none of it, and the payload's hash does not change when only that record would. This revision states what the receipt records; its carriage as a receipt is a later revision's.
**What the chain does not reach**
- **Positions.** Positions are layout, not shaping, so shaping a run again does not check them. Glyphs laid over one another to hide a word are not caught.
- **The shaper has to stay obtainable.** The second link can be checked only while the recorded shaper can still be run.
- **No statement that a payload's pixels say its words is made without a verifier's report for that payload.**
### 5.7 Captions stay under the viewer's control
Rules on access services require that the viewer control how captions are displayed, their size and font among other things (for example Directive (EU) 2019/882, Annex I, Section IV(b)(ii), and 47 CFR 79.103(c)). Glyphs already shaped and placed cannot be restyled without shaping at the sink. So:
- **Captions travel as timed text,** a component of their own, which the platform renders under the viewer's settings (§6).
- **A `WVG1` MAY also carry blocks of purpose `caption`, `subtitle` or `forced_narrative`,** as the author's default rendering. *The package rule:* every such payload is published with a timed-text component in the same language that carries the same strings and timing. A package verifier checks it, and reports `caption_without_track` (§6).
- **A sink that cannot read the platform's caption preferences MUST NOT draw the items of `caption` or `subtitle` blocks,** and MUST hand the timed-text component to the platform's caption renderer. A sink in a web page is in this case wherever the web platform gives it no access to those preferences.
- **A sink that can read them MUST NOT draw those items** when the viewer has turned captions off, has chosen another caption language, or has set any caption styling.
- **For `forced_narrative`:**
- when the viewer has set caption styling, the sink MUST present the timed-text equivalent in that style, and not draw those items;
- when the viewer has only turned captions off, the forced narrative is still drawn as authored, because it is not an access service;
- a sink that cannot read the preferences draws it as authored, and SHOULD offer a control of its own that hands forced narratives to the platform's renderer.
- **The items of a block** are the items that draw it (§5.4): its runs, and any path whose text alternative it is.
- **A frame drawn without those items is not the published frame.** The sink MUST NOT claim a published digest for it. Its probes follow §2.10's rule for suppressed frames, its exposure leaves out the suppressed blocks (§5.5), and its receipt says that the viewer's caption settings applied.
Exactness never overrides the viewer's settings.
### 5.8 Two standing rules
- **No generative path.** `WVG1` has no generative operation. A sink MUST NOT put generated or recognised text in place of a block's string, and MUST NOT derive a string from pixels: it never reads text back out of a frame.
- **Never a page's own text.** This capability is for titles and graphics that belong to a piece of media. A page's own text stays in the page's markup, where the user's settings reach it, and a sink on the web keeps the mirror of §5.5 beside every layer it presents.
## 6. Packages and floors

View file

@ -2,9 +2,9 @@
"""Independent conformance checker for `wai.graphics.vector`.
Written from the extension text alone: wai/extensions/graphics-vector.md, sections
1-3 (the normative revision), with the notation of integer-operators section 2 and
the digests of SPEC section 7, which that text cites. It shares no code with the
reference crate, and was written without reading it.
1-3 and section 5 (the normative revision), with the notation of integer-operators
section 2 and the digests of SPEC section 7, which that text cites. It shares no code
with the reference crate, and was written without reading it.
Python 3.11 or later, standard library only. Run it with `python3 -I`.
@ -23,18 +23,27 @@ What it computes, each from the section that defines it:
- the digest sidecar (2.10): its canonical form and checks, the probe digests,
the clip digests, and the authoring tool's probe set;
- the text digests (2.11);
- the text layer (5.4): each block's active set from the effective windows of the
items that draw it, the projection at a frame of a listed rate and the transcript,
their JSON byte for byte, and the text record with its SHA-256; and the same
record a second way, from activity tick by tick and JSON with sorted keys;
- section 3.12's bounds, asserted on every value the procedure forms.
python3 -I wai_vector_check.py load PAYLOAD [--sets DIR]
python3 -I wai_vector_check.py render PAYLOAD WxH NUM/DEN G [--sets DIR] [--out F]
python3 -I wai_vector_check.py text PAYLOAD [NUM/DEN G] [--sets DIR] [--out F]
python3 -I wai_vector_check.py sidecar PAYLOAD SIDECAR [--sets DIR] [--verify]
python3 -I wai_vector_check.py selftest
python3 -I wai_vector_check.py corpus vector-conformance [--groups a,b] [--quiet]
`text` prints the SHA-256 of a payload's text record, and writes the record with
`--out`; with a rate and a frame it prints that frame's projection.
`corpus` recomputes every expected file under vector-conformance/ from its vector and
sets/ alone and requires the committed bytes; rewrites every payload and set to its
own bytes; checks each refusal's step where the vector's name or description pins
one; and recomputes every digest of sha256.json.
sets/ alone and requires the committed bytes, the text records among them, and
requires that it recomputed every file under expected/; rewrites every payload and
set to its own bytes; checks each refusal's step, and its canonical rule, where the
vector's name or description pins one; and recomputes every digest of sha256.json.
Exit status 1 on any failure.
"""
@ -1969,6 +1978,254 @@ def probe_set(P, pairs):
return sorted(held)
# ------------------------------------------------------------------ section 5.4
#
# The text layer: each block's active set, the projection at a frame, the transcript,
# their JSON, and the text record. Section 5.4 defines all of it over the loaded
# payload; nothing here reads a set, a glyph or a pixel.
DECORATIVE = 13 # section 2.3: text used as ornament, never exposed
def text_fault(P, what):
"""A statement of section 5.4 that a computed value breaks. It is recorded, not
raised, so the record is still written and compared with the corpus."""
if getattr(P, "text_faults", None) is None:
P.text_faults = []
P.text_faults.append(what)
def drawing_items(P, k):
"""Section 5.4, "the items that draw a block": the run items whose `text` is the
block's index, and the path items whose `text` is the block's index (section 2.4).
A group begin carries no text, and its clip draws no block."""
return [i for i, it in enumerate(P.items) if it.kind in (2, 3) and it.text == k]
def active_set(P, k):
"""Section 5.4, "a block's active set": the union of the effective windows
(section 3.4(b) step 4) of the items that draw block k, as half-open tick
intervals [on, off): ascending by `on`, with intervals that overlap or touch
merged; empty when the block is never active inside the document's window."""
windows = []
for i in drawing_items(P, k):
a, b = effective_window(P, i)
if a < b: # "It may be empty": an empty window adds nothing to the union
windows.append((a, b))
windows.sort() # ascending order of `on`
out = []
for a, b in windows:
if out and a <= out[-1][1]: # overlaps the last interval, or touches it: merge
if b > out[-1][1]:
out[-1][1] = b
else:
out.append([a, b])
t0, end = P.H["t0"], P.H["t0"] + P.H["dur"]
for j, (a, b) in enumerate(out):
# "Every interval has t0 <= on < off <= t0 + dur", and "no two intervals of
# the list share a tick or an end".
if not t0 <= a < b <= end:
text_fault(P, f"block {k}: interval [{a}, {b}) outside [t0, t0 + dur) or empty")
if j > 0 and not out[j - 1][1] < a:
text_fault(P, f"block {k}: intervals {out[j - 1]} and {[a, b]} share a tick or an "
"end, or are out of order")
return out
def active_sets(P):
"""Every block's active set, computed once for a payload."""
if getattr(P, "active", None) is None:
P.active = [active_set(P, k) for k in range(len(P.texts))]
return P.active
def holds(active, tau):
"""Section 5.4: an active set holds a tick when some interval has on <= tau < off."""
return any(a <= tau < b for a, b in active)
def projection_blocks(P, num, den, g):
"""Section 5.4, "the projection at frame g of listed rate r": the indices, in block
order, of every block whose purpose is not 13 and whose active set holds the
frame's tick tau = g*P_r (section 3.1). A request at an unlisted rate is
rate_unlisted and one at a frame outside the document at that rate frame_range,
the request errors of section 2.7, decided by its divisions."""
if not any(r.num == num and r.den == den for r in P.rates):
raise RequestError("rate_unlisted")
lo, hi = frame_range(P, num, den)
if not (isinstance(g, int) and g >= 0 and lo <= g <= hi):
raise RequestError("frame_range")
tau = g * ticks_per_frame(P, num, den)
act = active_sets(P)
return [k for k, t in enumerate(P.texts) if t.purpose != DECORATIVE and holds(act[k], tau)]
def transcript_blocks(P):
"""Section 5.4, "the transcript": the indices, in block order, of every block whose
purpose is not 13. A block that is never active is in it."""
return [k for k, t in enumerate(P.texts) if t.purpose != DECORATIVE]
def json_string(b):
"""Section 5.4, "the encoding": a quotation mark, the bytes carried, a quotation
mark, with exactly three replacements among those bytes: 0x22 as \\", 0x5C as \\\\
and 0x0A as \\n. Nothing else is escaped."""
out = bytearray(b'"')
for c in b:
if c == 0x22:
out += b'\\"'
elif c == 0x5C:
out += b"\\\\"
elif c == 0x0A:
out += b"\\n"
else:
out.append(c)
out += b'"'
return bytes(out)
def json_uint(v):
"""Section 5.4, "the encoding": decimal, no sign, no leading zero; zero is 0."""
assert type(v) is int and v >= 0
return b"%d" % v
def node_members(P, k):
"""Section 5.4's table: a node object's members for block k, in the stated order
(the ascending byte order of their keys): dir, group, index, lang, mode, purpose,
ruby (only when the block's `ruby` is not 0) and text."""
t = P.texts[k]
if t.purpose == 13: # "1 ..= 255 and never 13"
text_fault(P, f"block {k}: a node of purpose 13")
m = [b'"dir":' + json_uint(t.dir),
b'"group":' + json_uint(t.group),
b'"index":' + json_uint(k),
b'"lang":' + json_string(P.text_lang[k]),
b'"mode":' + json_uint(t.mode),
b'"purpose":' + json_uint(t.purpose)]
if t.ruby != 0:
# {"base":B,"len":L,"start":S}: B = ruby - 1, S = ruby_start, L = ruby_len;
# "written whether or not block B is itself in the list".
m.append(b'"ruby":{"base":' + json_uint(t.ruby - 1) + b',"len":' + json_uint(t.ruby_len)
+ b',"start":' + json_uint(t.ruby_start) + b"}")
m.append(b'"text":' + json_string(P.text_str[k]))
return m
def node_json(P, k):
return b"{" + b",".join(node_members(P, k)) + b"}"
def block_json(P, k):
"""Section 5.4: a block object has the member `active` first, then the members of a
node object. `active` is an array of two-element arrays [on,off], in ticks."""
act = b"[" + b",".join(b"[" + json_uint(a) + b"," + json_uint(b) + b"]"
for a, b in active_sets(P)[k]) + b"]"
return b"{" + b",".join([b'"active":' + act] + node_members(P, k)) + b"}"
def projection_json(P, num, den, g):
"""Section 5.4: a projection is one JSON array of node objects, in block order."""
return b"[" + b",".join(node_json(P, k) for k in projection_blocks(P, num, den, g)) + b"]"
def transcript_json(P):
"""Section 5.4: a transcript is one JSON array of block objects, in block order."""
return b"[" + b",".join(block_json(P, k) for k in transcript_blocks(P)) + b"]"
def text_record_lines(P):
"""Section 5.4, "the text record", as its lines without their line ends: the
transcript; then, for each listed rate in RATE order and each frame g of the
document at that rate in ascending order, {"den":D,"g":G,"num":N,"projection":J}.
A rate at which the document has no frame adds no line."""
yield transcript_json(P)
for r in P.rates:
lo, hi = frame_range(P, r.num, r.den)
for g in range(lo, hi + 1):
yield (b'{"den":' + json_uint(r.den) + b',"g":' + json_uint(g) + b',"num":'
+ json_uint(r.num) + b',"projection":' + projection_json(P, r.num, r.den, g)
+ b"}")
def text_record(P):
"""Section 5.4: a payload's text record, each line ended by one U+000A."""
return b"".join(line + b"\n" for line in text_record_lines(P))
def blocks_drawn_at(P, tau):
"""The blocks an active item draws at tick tau, by the walk of section 3.10 over
section 2.4's activity rule: an item is active when t_on <= tau < t_off, and an
inactive group begin skips everything up to its matching end. No tick outside the
document's window [t0, t0 + dur) draws anything (section 5.4)."""
out = set()
if not P.H["t0"] <= tau < P.H["t0"] + P.H["dur"]:
return out
i = 0
while i < len(P.items):
it = P.items[i]
if it.kind == 0 and not it.t_on <= tau < it.t_off:
i = P.match[i] + 1
continue
if it.kind in (2, 3) and it.t_on <= tau < it.t_off and it.text != ABSENT:
out.add(it.text)
i += 1
return out
def text_record_recheck(P, record):
"""A second derivation of the text record, which shares neither the interval
arithmetic nor the writer of the first. Returns a list of failures.
- Active sets, by ticks: between two consecutive ticks at which some window opens
or closes nothing changes, so a block's active set is the maximal stretches of
such ticks at which section 3.10's walk finds an active item that draws it.
- Frames, by section 3.1's definition: the g with t0 <= g*P < t0 + dur.
- The JSON: section 5.4 states that each object's member order is the ascending
byte order of its keys, and that after its three replacements no other control
character occurs (section 2.5 rule 6). So each line is the value written with
sorted keys, no whitespace, and characters outside ASCII as their UTF-8 bytes."""
t0, end = P.H["t0"], P.H["t0"] + P.H["dur"]
edges = {t0, end}
for it in P.items:
if it.kind != 1:
edges.update(t for t in (it.t_on, it.t_off) if t0 < t < end)
edges = sorted(edges)
act = [[] for _ in P.texts]
for p, q in zip(edges, edges[1:]):
for k in blocks_drawn_at(P, p):
if act[k] and act[k][-1][1] == p:
act[k][-1][1] = q
else:
act[k].append([p, q])
def dump(v):
return json.dumps(v, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
def node(k):
t = P.texts[k]
d = {"dir": t.dir, "group": t.group, "index": k, "lang": P.text_lang[k].decode("utf-8"),
"mode": t.mode, "purpose": t.purpose, "text": P.text_str[k].decode("utf-8")}
if t.ruby:
d["ruby"] = {"base": t.ruby - 1, "len": t.ruby_len, "start": t.ruby_start}
return d
shown = [k for k, t in enumerate(P.texts) if t.purpose != DECORATIVE]
lines = [dump([dict(node(k), active=act[k]) for k in shown])]
for r in P.rates:
Pf = ticks_per_frame(P, r.num, r.den)
g = cdiv(t0, Pf)
while g * Pf < end:
here = blocks_drawn_at(P, g * Pf)
lines.append(dump({"den": r.den, "g": g, "num": r.num,
"projection": [node(k) for k in shown if k in here]}))
g += 1
if "".join(line + "\n" for line in lines).encode("utf-8") != record:
return ["the text record differs from its second derivation (activity by ticks, "
"frames by section 3.1, JSON by sorted keys)"]
return []
# ------------------------------------------------------------------ set store
@ -1986,14 +2243,110 @@ def load_store(dirpath):
# ------------------------------------------------------------------ self-test from the text
def spec_worked_example():
"""Section 5.4's worked example as the extension text prints it: the two lines of
its fenced block (the transcript, and the text record's line for frame 30), read
from the text beside this tool. None when the text is not there."""
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, "extensions",
"graphics-vector.md")
try:
with open(path, "rb") as f:
text = f.read()
except OSError:
return None
at = text.find(b"**A worked example.**")
start = text.find(b"```text\n", at)
stop = text.find(b"\n```", start)
if at < 0 or start < 0 or stop < 0:
return None
lines = text[start + len(b"```text\n"):stop].split(b"\n")
return lines if len(lines) == 2 else None
def text_only_payload(tb, t0, dur, rates, blocks, runs):
"""A payload's text layer alone, as section 5.4 reads it. `blocks` are
(purpose, dir, mode, group, ruby, ruby_start, ruby_len, tag, string), and `runs`
are (block index, t_on, t_off) with no enclosing group."""
P = Payload()
P.H = {"tb": tb, "t0": t0, "dur": dur}
P.rates = [Rate(*r) for r in rates]
P.texts = [Text(b[0], b[1], len(b[7]), b[2], b[3], b[4], b[5], b[6], len(b[8])) for b in blocks]
P.text_lang = [b[7] for b in blocks]
P.text_str = [b[8] for b in blocks]
P.items = [Item(3, 0, 0, 0, 0, k, 0, 1, 1, on, off, 65536, (ABSENT,) * 7, b"\0" * 6)
for k, on, off in runs]
P.parents = [() for _ in runs]
P.match = {}
return P
def selftest_text(eq, notes):
"""Section 5.4's statements, recomputed."""
# "The encoding": exactly three replacements, and a solidus takes none.
eq("5.4 string escapes", json_string(b'a"b\\c\nd/<&'), b'"a\\"b\\\\c\\nd/<&"')
eq("5.4 zero", json_uint(0), b"0")
# "A block's active set": [a, b) and [b, c) become [a, c); windows one tick apart
# stay two; the list ascends whatever the items' order; a window is cut to the
# document's, and a block never active inside it has an empty active set.
lab = (7, 0, 0, 0, 0, 0, 0, b"en", b"x")
P = text_only_payload(1000, 100, 900, [(10, 1)], [lab, lab, lab, lab],
[(0, 300, 400), (0, 200, 300), (1, 520, 600), (1, 500, 519),
(2, 0, 150), (2, 950, 5000), (2, 140, 160), (3, 1000, 2000)])
eq("5.4 active set, touching", active_set(P, 0), [[200, 400]])
eq("5.4 active set, one tick apart", active_set(P, 1), [[500, 519], [520, 600]])
eq("5.4 active set, cut and merged", active_set(P, 2), [[100, 160], [950, 1000]])
eq("5.4 active set, never active", active_set(P, 3), [])
eq("5.4 never active, in the transcript", transcript_blocks(P), [0, 1, 2, 3])
# "on <= tau < off": frame 2 sits at tick 200, block 0's first; frame 4 at its end.
eq("5.4 projection at a first tick", projection_blocks(P, 10, 1, 2), [0])
eq("5.4 projection at an end", projection_blocks(P, 10, 1, 4), [])
for bad, code in (((25, 1, 2), "rate_unlisted"), ((10, 1, 0), "frame_range"),
((10, 1, 10), "frame_range")):
try:
projection_blocks(P, *bad)
eq(f"5.4 request {bad}", "answered", code)
except RequestError as e:
eq(f"5.4 request {bad}", e.code, code)
eq("5.4 second derivation", text_record_recheck(P, text_record(P)), [])
eq("5.4 stated invariants", getattr(P, "text_faults", None) or [], [])
# "A worked example": tb = 120000, t0 = 0, dur = 360000, 25 fps, so P = 4800; three
# blocks in group 1, the third a ruby annotation of the first 8 bytes of block 1.
# Its list of blocks states each block's string and writing mode (0). The strings
# are read from the two lines it prints, which hold the same ones; every other byte
# of those lines is recomputed from the stated fields.
ex = spec_worked_example()
if ex is None:
notes.append("section 5.4's worked example was not recomputed: the extension text "
"is not beside this tool")
return
s = [e["text"].encode("utf-8") for e in json.loads(ex[0].decode("utf-8"))]
eq("5.4 worked example, blocks", len(s), 3)
if len(s) != 3:
return
P = text_only_payload(120000, 0, 360000, [(25, 1)],
[(3, 1, 0, 1, 0, 0, 0, b"ar", s[0]), (3, 0, 0, 1, 0, 0, 0, b"en", s[1]),
(7, 0, 0, 1, 2, 0, 8, b"en", s[2])],
[(0, 24000, 264000), (1, 24000, 264000), (2, 24000, 120000)])
eq("5.4 worked example, P", ticks_per_frame(P, 25, 1), 4800)
eq("5.4 worked example, frames", frame_range(P, 25, 1), (0, 74))
lines = list(text_record_lines(P))
eq("5.4 worked example, transcript", lines[0], ex[0])
eq("5.4 worked example, frame 30", lines[1 + 30], ex[1])
eq("5.4 worked example, second derivation", text_record_recheck(P, text_record(P)), [])
eq("5.4 worked example, stated invariants", getattr(P, "text_faults", None) or [], [])
def selftest():
"""Worked examples and claims the text states, recomputed."""
fails = []
notes = []
def eq(what, got, want):
if got != want:
fails.append(f"{what}: {got} != {want}")
selftest_text(eq, notes)
# 3.8: the triangle (0,0)-(512,3)-(0,3) gives |v| = 1280 and 512 in its two pixels.
vals = fill_values([[(0, 0), (512, 3), (0, 3), (0, 0)]], 4, 4)
got = sorted(abs(v) for spans in vals.values() for c0, c1, v in spans for _ in range(c0, c1))
@ -2024,6 +2377,8 @@ def selftest():
a = fill_values([[(10, 7), (900, 700), (10, 700), (10, 7)]], 8, 4)
b = fill_values([[(10, 7), (10, 700), (900, 700), (10, 7)]], 8, 4)
eq("3.11 P1 reversal", {r: [(c0, c1, -v) for c0, c1, v in s] for r, s in a.items()}, b)
for n in notes:
print("NOTE", n)
if fails:
for f in fails:
print("FAIL", f)
@ -2043,6 +2398,10 @@ def selftest():
# The groups the corpus README names as rendering: their expected files list frames.
RENDER_GROUPS = ("clock", "composite", "fills", "motion", "runs", "slicing", "text")
RGBA8S_GROUPS = ("composite",)
# The group whose expected files state `text_record`, each with its text record beside
# it as <name>.a11y.jsonl. Its frames are not rendered.
TEXT_GROUPS = ("a11y",)
TEXT_RECORD_SUFFIX = ".a11y.jsonl"
def canon(obj):
@ -2089,6 +2448,9 @@ def payload_result(data, store, group):
"text_hash": P.text_hash.hex()}
if group in RENDER_GROUPS:
d["frames"] = frames_of(P, group)
if group in TEXT_GROUPS:
P.record = text_record(P) # section 5.4; the file beside the expected file
d["text_record"] = sha256(P.record).hex()
return d, write_wvg1(P) == data, None, P
@ -2168,9 +2530,22 @@ def pinned_step(name, desc):
m = re.match(r"(?:step|check) (\d+[a-h]?):", desc)
if m:
return m.group(1)
m = re.match(r"step (\d+)\(([a-h])\):", desc)
if m:
return m.group(1) + m.group(2)
if pinned_rule(desc) is not None:
return "5g" # section 2.7: rules 2-5 of section 2.5 are checked at step 5(g)
return None
def pinned_rule(desc):
"""The canonical rule of section 2.5 a vector's description pins ("rule 4: ..."),
or None."""
import re
m = re.match(r"rule (\d):", desc)
return m.group(1) if m else None
def json_diff(a, b, path=""):
"""Field paths where two JSON values differ."""
if isinstance(a, dict) and isinstance(b, dict):
@ -2191,6 +2566,24 @@ def json_diff(a, b, path=""):
return [] if a == b else [f"{path}: checker {a!r}, expected {b!r}"]
def text_record_diff(mine, want):
"""Where a recomputed text record first differs from the committed one."""
if want is None:
return ["no text record beside the expected file"]
a, b = mine.split(b"\n"), want.split(b"\n")
out = []
if len(a) != len(b):
out.append(f"{len(a) - 1} lines, expected {len(b) - 1}")
for n, (x, y) in enumerate(zip(a, b)):
if x != y:
at = next((i for i, (p, q) in enumerate(zip(x, y)) if p != q), min(len(x), len(y)))
lo = max(0, at - 60)
out.append(f"line {n + 1}, byte {at}: checker ...{x[lo:at + 60]!r}")
out.append(f"line {n + 1}, byte {at}: expected ...{y[lo:at + 60]!r}")
break
return out or ["byte form differs"]
def sidecar_exercise(P, frames):
"""The digest sidecar (section 2.10) the authoring tool writes for an accepted
payload, built from its rendered frames: the probe set over every listed pair and
@ -2247,6 +2640,9 @@ def corpus(root, only_groups=None, verbose=True):
step_disagreements = []
rendered = {}
sidecars = 0
records = 0
compared = set() # the files under expected/ this run recomputed
example = spec_worked_example()
vroot = os.path.join(root, "vectors")
for group in sorted(os.listdir(vroot)):
if only_groups and group not in only_groups:
@ -2259,6 +2655,7 @@ def corpus(root, only_groups=None, verbose=True):
exp_path = os.path.join(root, "expected", group, name + ".json")
with open(exp_path, "rb") as f:
exp_bytes = f.read()
compared.add((group, name + ".json"))
refusal = None
rw = None
P = None
@ -2284,6 +2681,11 @@ def corpus(root, only_groups=None, verbose=True):
except BoundError as e:
mine = None
got = {"bound": str(e)}
except AssertionError as e:
import traceback
at = traceback.extract_tb(e.__traceback__)[-1]
mine = None
got = {"assertion": f"line {at.lineno}: {at.line}"}
total += 1
ok = mine == exp_bytes
if ok:
@ -2295,6 +2697,34 @@ def corpus(root, only_groups=None, verbose=True):
except ValueError:
diff = ["expected file is not JSON"]
disagreements.append((f"{group}/{name}", diff[:6] or ["byte form differs"]))
if P is not None and group in TEXT_GROUPS:
# The text record (section 5.4) is an expected file of its own, the
# file beside the one that states its SHA-256.
records += 1
total += 1
rec_name = name + TEXT_RECORD_SUFFIX
rec_path = os.path.join(root, "expected", group, rec_name)
want_rec = None
if os.path.exists(rec_path):
with open(rec_path, "rb") as f:
want_rec = f.read()
compared.add((group, rec_name))
if P.record == want_rec:
agree += 1
else:
disagreements.append((f"{group}/{rec_name}",
text_record_diff(P.record, want_rec)))
for fl in text_record_recheck(P, P.record):
disagreements.append((f"{group}/{rec_name}", [fl]))
for fl in getattr(P, "text_faults", None) or []:
disagreements.append((f"{group}/{rec_name}", [f"section 5.4: {fl}"]))
if name == "worked-example" and example is not None:
# The vector its index calls the worked example of section 5.4:
# the text prints its transcript and its line for frame 30.
lines = P.record.split(b"\n")
if lines[0] != example[0] or example[1] not in lines[1:]:
disagreements.append((f"{group}/{rec_name}", [
"the record is not the worked example section 5.4 prints"]))
if rw is not None:
rewrite_total += 1
rewrite_ok += bool(rw)
@ -2305,6 +2735,12 @@ def corpus(root, only_groups=None, verbose=True):
mystep = refusal.step
if group == "refusals" and name.startswith("wos1"):
mystep = refusal.where.split(":")[0].replace("wos1 step ", "")
rule = pinned_rule(index[name])
if rule is not None:
# A canonical rule of section 2.5: the checker names the rule it
# refused under at the start of `where`.
want += f" rule {rule}"
mystep += " " + refusal.where.split(":")[0]
if want is not None:
step_total += 1
if want == mystep:
@ -2349,8 +2785,22 @@ def corpus(root, only_groups=None, verbose=True):
sha_ok += good
if not good:
disagreements.append((f"sha256.json {key}", ["digest differs"]))
# Every file under expected/, in the groups this run covers, must be one it
# recomputed: a file no index names and no rule above reaches is a disagreement.
eroot = os.path.join(root, "expected")
present = 0
for group in sorted(os.listdir(eroot)):
if only_groups and group not in only_groups:
continue
for fname in sorted(os.listdir(os.path.join(eroot, group))):
present += 1
if (group, fname) not in compared:
disagreements.append((f"{group}/{fname}",
["a file under expected/ that this run did not recompute"]))
print()
print(f"expected files recomputed byte for byte: {agree} of {total}")
print(f"files under expected/ in the groups covered: {present}, compared: {len(compared)}")
print(f"text records recomputed, and recomputed a second way: {records}")
print(f"payloads and sets rewritten to their own bytes: {rewrite_ok} of {rewrite_total}")
print(f"refusal steps the vectors pin, reported at that step: {step_ok} of {step_total}")
if sha_total:
@ -2393,7 +2843,8 @@ def main(argv):
args.remove("--quiet")
groups = _opt(args, "--groups")
rc = selftest()
return rc or corpus(args[0], groups.split(",") if groups else None, not quiet)
rc2 = corpus(args[0], groups.split(",") if groups else None, not quiet)
return rc or rc2
sets_dir = _opt(args, "--sets")
out = _opt(args, "--out")
verify = "--verify" in args
@ -2422,6 +2873,23 @@ def main(argv):
open(out, "wb").write(buf)
print(sha256(buf).hex())
return 0
if cmd == "text":
data = open(args[0], "rb").read()
P = load(data, store)
if len(args) >= 3:
num, den = (int(x) for x in args[1].split("/"))
try:
line = projection_json(P, num, den, int(args[2]))
except RequestError as e:
print(json.dumps({"request": e.code}))
return 1
sys.stdout.buffer.write(line + b"\n")
return 0
rec = text_record(P)
if out:
open(out, "wb").write(rec)
print(sha256(rec).hex())
return 0
if cmd == "sidecar":
data = open(args[0], "rb").read()
sc_bytes = open(args[1], "rb").read()

View file

@ -5,20 +5,22 @@ Vectors for `wai.graphics.vector`
outline set and the `WVG1` payload with the order in which a sink refuses them (§2),
the arithmetic a sink loads with: the clock, track evaluation, the load-time interval
check and the per-frame cost (§3.1–§3.4); and the raster stage family RS1–RS9 and the
frame procedure (§3.5–§3.10), as the SHA-256 of every frame's `RGBA8P`; and text runs
frame procedure (§3.5–§3.10), as the SHA-256 of every frame's `RGBA8P`; text runs
drawn from the in-house outline sets (§4): the default stroke set and the test
repertoire. The capability is a Draft and is not registered; this corpus precedes its
registration.
repertoire; and the text layer (§5): the transcript and every frame's projection, as
each payload's text record. The capability is a Draft and is not registered; this
corpus precedes its registration.
**Provenance.** Generated here by `wai-vector vectors gen` from formulas and from centre lines drawn in this repository: every payload, outline set, stroke source and arithmetic input is integers and text written here, with no media and no third-party font. The synthetic outline sets are drawn from formulas in `wai-vector/src/vectors/sets.rs` and `raster.rs`. The two in-house sets are drawn here as integer centre lines, the ASCII stroke set in `wai-vector/src/vectors/stroke.rs` and the Arabic, Hebrew and Devanagari test repertoire in `wai-vector/src/vectors/repertoire.rs`; the generator writes them as `WSF1` sources under `sources/` and expands each by Annex A into `sets/stroke-ascii.wos1` and `sets/test-repertoire.wos1`. No outline is traced from any font. Every set's notes state where it comes from and that it is licensed Apache-2.0, and the two in-house sets' notes carry the licence text. All text in the blocks is written here.
**Provenance.** Generated here by `wai-vector vectors gen` from formulas and from centre lines drawn in this repository: every payload, outline set, stroke source and arithmetic input is integers and text written here, with no media and no third-party font. The synthetic outline sets are drawn from formulas in `wai-vector/src/vectors/sets.rs` and `raster.rs`. The two in-house sets are drawn here as integer centre lines, the ASCII stroke set in `wai-vector/src/vectors/stroke.rs` and the Arabic, Hebrew and Devanagari test repertoire in `wai-vector/src/vectors/repertoire.rs`; the generator writes them as `WSF1` sources under `sources/` and expands each by Annex A into `sets/stroke-ascii.wos1` and `sets/test-repertoire.wos1`. No outline is traced from any font. Every set's notes state where it comes from and that it is licensed Apache-2.0, and the two in-house sets' notes carry the licence text. All text in the blocks is written here; the `a11y` payloads' blocks, windows and strings are written in `wai-vector/src/vectors/a11y.rs`, and each text record is computed from its payload by `wai-vector/src/text.rs`.
**Equivalence.** A sink conforms on this corpus when, for every payload, it reports the
expected file's `code`: the first refusal §2.7 gives, or `accepted`; and for every
accepted payload it computes the same `SIZE` costs (§3.4(b)), the same `text_hash` and
block identities (§2.11), the same ticks per frame and frame range for each rate
(§3.1, §2.7), and, where the expected file lists frames, the same `RGBA8P` bytes for
every frame at every listed size and rate (overlay-equivalence, §1.3). An outline-set
parser conforms when it reports §2.1's first code for every `.wos1` vector.
every frame at every listed size and rate (overlay-equivalence, §1.3); and, in the
group `a11y`, the same text record, byte for byte (text-equivalence, §1.3). An
outline-set parser conforms when it reports §2.1's first code for every `.wos1` vector.
## Layout
@ -47,7 +49,13 @@ parser conforms when it reports §2.1's first code for every `.wos1` vector.
`[g, SHA-256 of RGBA8P]` and the clip digest, the SHA-256 of the frames' digests
concatenated in order of `g` (SPEC §7, *Digests*); in `composite`, also each
frame's `RGBA8S` digest (`rgba8s`);
- in the group `a11y`, `text_record`: the SHA-256 of the payload's text record
(§5.4), which is the file beside it;
- an arithmetic input: its results, or the SHA-256 of a whole table.
- `expected/a11y/<name>.a11y.jsonl` — an accepted `a11y` payload's text record (§5.4),
exactly as §5.4 writes it: the transcript on the first line, then one line for each
frame of the document at each listed rate, rates in `RATE` order and frames
ascending, each line ended by U+000A.
- `sha256.json` — the digest sidecar SPEC §7, *Digests*, asks of a corpus: each entry
names its buffer and states its SHA-256: the `div255` table, and for each rendering
vector at each listed size and rate, every frame's digest and the clip digest.
@ -60,13 +68,18 @@ parser conforms when it reports §2.1's first code for every `.wos1` vector.
spans of `2^31 − 1` ticks, value steps of `2^23` and tables that are not monotone.
- `canonical` — accepted payloads of every structure, each of which writes back to its
own bytes, and one refusal per canonical rule (§2.5): first-reference order,
duplicates and unreferenced entries in each pool, group numbering and contiguity,
ruby links, clusters, and a decorative path alternative.
duplicates and unreferenced entries in each pool; text blocks: group numbering, an
ungrouped block between groups (accepted), a group that resumes or is split
(refused), ruby links to the block itself and to a later block, and ruby ranges that
start or end inside a character, run past the string, or end where it ends
(accepted); clusters; and a decorative path alternative.
- `refusals` — a payload or outline set per code and per check of §2.7 and §2.1, and
pairs of faults whose code pins the order: steps in order, fields in offset order
within a record, the record pass before any cross-table check, each set's checks
before the next set's. Held sets come from `sets/`, through a resolver that refuses a
digest it does not hold and reads at most `length + 1` bytes.
within a record, tables in file order (`PATHS` before `TEXTS` before `ITEMS`), the
record pass before any cross-table check, typing before strings, the text-block
rules and the decorative path alternative before any set, each set's checks before
the next set's. Held sets come from `sets/`, through a resolver that refuses a digest
it does not hold and reads at most `length + 1` bytes.
- `geometry` — the interval check (§3.4(a)) accepted with an end at `2^22 − 1` and
refused at `2^22` on each axis, at a second listed size, for an item never active,
for a clip, for enclosing groups' translations and for a glyph with no points; and a
@ -106,8 +119,20 @@ parser conforms when it reports §2.1's first code for every `.wos1` vector.
drawn before its consonant, a mark above and a conjunct; an Arabic block holding a
Latin word and digits, its runs from both sets; one block over three runs and lines,
with a cluster of no glyphs and an inserted hyphen; a ruby annotation; a vertical-rl
block; and U+1F600 drawn by one monochrome glyph. The blocks' projection lands with
§5; these vectors pin runs, clusters, blocks and frames.
block; and U+1F600 drawn by one monochrome glyph. These vectors pin runs, clusters,
blocks and frames; `a11y` pins the projection and the transcript.
- `a11y` — the text layer (§5.4), as each payload's text record: §5.4's worked
example; frames before, between and after windows, and a title that stays projected
at opacity 0 until its window ends; a `decorative` block, left out; the text
alternatives of paths; reading groups; ruby links over part of a base, one of which
outlasts its base; every registered purpose and three unregistered ones, written as
the byte carried; windows that touch, overlap, nest, stay one tick apart and come
out of order; windows cut by the document's own; windows cut by enclosing groups,
one of which never opens; the three writing modes, whose block identities differ; one
document at four rates, with a frame on a window's first tick and one on its end;
strings that take each of the three escapes, and markup characters, a soft hyphen,
Hebrew, Devanagari and U+1F600, which take none; and a payload with no text. The
frames of this group are not rendered.
## Regenerating and verifying
@ -118,6 +143,35 @@ cargo run --release --features std --bin wai-vector -- vectors verify ..
```
`vectors verify` regenerates every file and requires the committed bytes, then
recomputes every expected file from its vector and `sets/` alone, and converts every
payload's authoring form back to its bytes. `wai-vector/wasm/verify.mjs` recomputes the
expected files under a browser's WebAssembly engine with Node.
recomputes every expected file and every text record from its vector and `sets/`
alone, and converts every payload's authoring form back to its bytes.
`wai-vector/wasm/verify.mjs` recomputes the expected files under a browser's
WebAssembly engine with Node, each `a11y` payload's `text_record` among them.
```sh
cargo run --release --features std --bin wai-vector -- a11y ../vector-conformance/vectors/a11y/worked-example.wvg1 --sets ../vector-conformance/sets
cargo run --release --features std --bin wai-vector -- text ../vector-conformance/vectors/a11y/worked-example.wvg1 --sets ../vector-conformance/sets
```
`a11y` prints a payload's text record (or, with `transcript`, or a rate and a frame,
one value of it), and `text` its `text_hash` and each block's identity, fields, string
and active set.
`wai-vector/browser/run.mjs` runs the corpus in three browser engines. It puts every
payload through the sink's package, the module `wai-vector/wasm/build-pkg.sh` builds:
the payload's code, each listed size's cost, and its frames, each hashed in the page by
the module and by the platform, the sampled ones again in Node from the bytes the page
sent; and, for each `a11y` payload, the sink's transcript and its projection at every
frame of every listed rate, which written out as lines must be the committed
`<name>.a11y.jsonl` byte for byte. It then runs the recomputation of
`wai-vector/wasm/verify.mjs` in each engine. A run passes only when all three engines
ran.
```sh
bash wai/wai-vector/wasm/build-pkg.sh
(cd wai/wai-vector/wasm && cargo build --release --target wasm32-unknown-unknown)
cd wai/wai-vector/browser
npm ci
npx playwright install chromium webkit firefox
node run.mjs --engines chromium,webkit,firefox ../../vector-conformance
```

View file

@ -0,0 +1,26 @@
[{"active":[[0,72000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"active":[[48000,120000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"},{"active":[[0,24000],[96000,120000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":10,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"}]}
{"den":1,"g":20,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":21,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":11,"text":"A red square"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Both"}]}

View file

@ -0,0 +1 @@
{"blocks":["ca88458c4ee4dc28f9744245e897f4a3cd84010b5bec034f95fc7ed355ee46ee","ffd5280e18b2c2d5e0c45338cd3941b663db6ec966f7e701afc47b4dc064f7ac","aed6f806bac9925457759b007860245459a32bd3fe9ea93db520c999affe82b2"],"code":"accepted","instr":"0468e1e98c8efd8e0031ec37b71b2103173918ab39c780edcf6fcdfee3043661","rates":[[25,1,4800,0,24]],"sizes":[[640,360,1307915]],"text_hash":"7dfef93b07be30ecc6aff3c62375d5fe833ff6cac0890c28e5618a3d00bf6f6f","text_record":"379cbc9350ca8490d45bfd566a686ebbc8e2387ac6532542117683e32e98941f"}

View file

@ -0,0 +1,20 @@
[{"active":[[50000,72000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"starts before"},{"active":[[120000,144000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"ends after"},{"active":[[50000,144000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"active":[],"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"over by then"},{"active":[],"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"not yet"},{"active":[[50000,144000]],"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"starts before"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"starts before"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"starts before"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"starts before"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":20,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":21,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":25,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"ends after"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":26,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"ends after"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":27,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"ends after"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":28,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"ends after"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}
{"den":1,"g":29,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"ends after"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"spans it"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"two parts"}]}

View file

@ -0,0 +1 @@
{"blocks":["00c1e14bc07174a6d67d196fd8f1fab91f005c21c44337e13f70d1b5b5abe8a9","4cd240a8579588b991bcf0a6145e00149fbbe4375ef7daa113c4020b008dea85","9e0f835b50020956df86c248a30e3a80830e927646dda8d84142326f82889b6a","1b49953f3a5eb03a46882a8fc816ecb77fc10977f4997929ea4b408137f0fa2c","7174b9bff0e4b79d59fb5b311c93b55de384034d55dd09c0b68e804456103991","b9516e95c53a745095e2f474337c6bff1be9ce6b07753bb28debf545a5325cce"],"code":"accepted","instr":"0d83a17dd8953346935ec8ed1c98a688981ff5e0bccbdcb7172c8c789208b41a","rates":[[25,1,4800,11,29]],"sizes":[[640,360,6611664]],"text_hash":"b5dd11f2e4c5abc7445c6894edb176a192b17d7a779b0c7eb7e5ab23324d6227","text_record":"ce79f2a3366392d806682f1cc0b0d67120a4a6b3f759484ee28d80b4f9d8d1c2"}

View file

@ -0,0 +1,26 @@
[{"active":[[0,120000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"active":[[0,120000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":20,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":21,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"Scores"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":12,"text":"3 - 1"}]}

View file

@ -0,0 +1 @@
{"blocks":["9b2a6dbea8a24042136f3aef42473b9cc989d40e430f9fd792893a8bc6b43932","77f81a2ce213db8ffe9a08c327feba022518b4de24faef66613f50b2e00fc153","d6a6376deac7414d078f9b7041805661e0d8b9783255e89b52707947b7d0640f"],"code":"accepted","instr":"149aeef7ab2313c3e7b6b9311eeaed7fb55c1924bc9edc756cfe6774f5ccff8a","rates":[[25,1,4800,0,24]],"sizes":[[640,360,2924252]],"text_hash":"10d923bf436c63195e13e0a30bcd56b428a297682cd18c687970bdec421a6f14","text_record":"111295c8003c566b13df153b1f63af638d57a64cb213c2e415c5ff6004affa4d"}

View file

@ -0,0 +1,26 @@
[{"active":[[0,48000]],"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"active":[[0,48000]],"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"},{"active":[[48000,72000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Interval"},{"active":[[72000,120000]],"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"active":[[72000,120000]],"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"},{"active":[[96000,120000]],"dir":0,"group":2,"index":5,"lang":"en","mode":0,"purpose":2,"text":"Music"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":1,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Camera"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Second unit"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Interval"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Interval"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Interval"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Interval"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"Interval"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"}]}
{"den":1,"g":20,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"},{"dir":0,"group":2,"index":5,"lang":"en","mode":0,"purpose":2,"text":"Music"}]}
{"den":1,"g":21,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"},{"dir":0,"group":2,"index":5,"lang":"en","mode":0,"purpose":2,"text":"Music"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"},{"dir":0,"group":2,"index":5,"lang":"en","mode":0,"purpose":2,"text":"Music"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"},{"dir":0,"group":2,"index":5,"lang":"en","mode":0,"purpose":2,"text":"Music"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":0,"group":2,"index":3,"lang":"en","mode":0,"purpose":2,"text":"Editing"},{"dir":0,"group":2,"index":4,"lang":"en","mode":0,"purpose":2,"text":"Sound"},{"dir":0,"group":2,"index":5,"lang":"en","mode":0,"purpose":2,"text":"Music"}]}

View file

@ -0,0 +1 @@
{"blocks":["3178a166bac0962438e1e2ec6c45b6097fd8621368ca241305d3d41ad072df2a","2f1c46c346a58fc8e91ce1bfe7f30ab1c79fc088078e97748ed311475739fa38","6cf151556e8345d543885f5f60044c92edab71f29afb339edb1a387458a1f047","f771053bc83798d847a8c2511bfc992b0f79f4fa9227f3c26dbf13f2aa0b9959","bf2000dd621ba83c1b96312f2fa3c43031555e4c80d588e81d55a7214c00104d","f35dc7476c9ed9026693ecea3698eab61028efd2f555ea2e7135202b65f6c69d"],"code":"accepted","instr":"f90c52b04a22cbed32b36bac02f7a68304cc7c1c9965825be8207eadb05b91ea","rates":[[25,1,4800,0,24]],"sizes":[[640,360,4416300]],"text_hash":"a8abdb6c365e4d363b36798a3454faf387a0ad42bfb39c79c7db23ee3fcc0fc8","text_record":"eb58245e48162b9f3a55bdce7c640d229d22ca1174d6407c8875a15f717d19a0"}

View file

@ -0,0 +1,26 @@
[{"active":[[0,48000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"active":[[0,60000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"active":[[0,24000],[24001,48000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"active":[[0,96000]],"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"active":[[0,48000],[72000,96000]],"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"touching windows"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"apart windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"overlapping windows"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"nested windows"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"later then earlier"}]}
{"den":1,"g":20,"num":25,"projection":[]}
{"den":1,"g":21,"num":25,"projection":[]}
{"den":1,"g":22,"num":25,"projection":[]}
{"den":1,"g":23,"num":25,"projection":[]}
{"den":1,"g":24,"num":25,"projection":[]}

View file

@ -0,0 +1 @@
{"blocks":["7e4581efd596e36b5e20ac37f54d1b7169fa169bec9d6d8b82f97c02094b400f","91abb1ee408fd4568bf20889ce8d9916b940f63bb461a36755782fadf3cd1e40","fc7cb59cacd92959f7e5169c2d506a413b2cd9ca8b19be988496d0bf96058825","1c4f5fec6b8252da509e726bd2d9c94e287955eb67214b2810e6cf002cae734f","a906c6f214f3d3ba82e034c2fdca7d634cde4ba08cdf0892cbf07d770e49b89b"],"code":"accepted","instr":"4366d09386763911349f4e84cc15a60cef315631c16a394a5326fc2fe294c966","rates":[[25,1,4800,0,24]],"sizes":[[640,360,12359740]],"text_hash":"51fe1ecdb64b542fdb91e9880d7f3b700e47edd01d3590c5e816fb1603fed5e6","text_record":"dd46fc43f39b1e34686b4bbb028decb18dbefba6d95074d4f088175c9ba7101e"}

View file

@ -0,0 +1,6 @@
[{"active":[[0,24000]],"dir":0,"group":0,"index":0,"lang":"en","mode":1,"purpose":7,"text":"WAI"},{"active":[[0,24000]],"dir":0,"group":0,"index":1,"lang":"en","mode":2,"purpose":7,"text":"WAI"},{"active":[[0,24000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"WAI"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":1,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":2,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"WAI"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":1,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":2,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"WAI"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":1,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":2,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"WAI"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":1,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":2,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"WAI"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":1,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":1,"lang":"en","mode":2,"purpose":7,"text":"WAI"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"WAI"}]}

View file

@ -0,0 +1 @@
{"blocks":["47d74c9ccb8456e3f1171904dda15a84bf74897c9bcc12d9f4fef166730e8c1a","916bd4458608698f35b350172b1827ab26e53094e6d9fd784a62311f4270c7bc","7717339a5b738a00c3f6191d2f43cc78156c65651b8c55d4ec234efa06efc968"],"code":"accepted","instr":"30e09b46e3e68745f9ac635fc20a37b4e16bac29b97739a563138f272e3521bc","rates":[[25,1,4800,0,4]],"sizes":[[640,360,1445598]],"text_hash":"b8dadc4d14f2da3ca1134c42a812c7164b88f89d0c71d3da048de597f8847471","text_record":"e99c7f5224b7d7db1a6aea665fbc94e56048952d8fda357dc5456c7ccd4ef071"}

View file

@ -0,0 +1,51 @@
[{"active":[[24000,96000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"active":[[48000,60000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"in both groups"},{"active":[[72000,96000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"in both, later"},{"active":[],"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":7,"text":"in a group that never opens"},{"active":[[100000,130000]],"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]
{"den":1,"g":0,"num":25,"projection":[]}
{"den":1,"g":1,"num":25,"projection":[]}
{"den":1,"g":2,"num":25,"projection":[]}
{"den":1,"g":3,"num":25,"projection":[]}
{"den":1,"g":4,"num":25,"projection":[]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"in both groups"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"in both groups"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"in both groups"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"in both, later"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"in both, later"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"in both, later"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"in both, later"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"in the outer group"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":7,"text":"in both, later"}]}
{"den":1,"g":20,"num":25,"projection":[]}
{"den":1,"g":21,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":25,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":26,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":27,"num":25,"projection":[{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":7,"text":"in no group"}]}
{"den":1,"g":28,"num":25,"projection":[]}
{"den":1,"g":29,"num":25,"projection":[]}
{"den":1,"g":30,"num":25,"projection":[]}
{"den":1,"g":31,"num":25,"projection":[]}
{"den":1,"g":32,"num":25,"projection":[]}
{"den":1,"g":33,"num":25,"projection":[]}
{"den":1,"g":34,"num":25,"projection":[]}
{"den":1,"g":35,"num":25,"projection":[]}
{"den":1,"g":36,"num":25,"projection":[]}
{"den":1,"g":37,"num":25,"projection":[]}
{"den":1,"g":38,"num":25,"projection":[]}
{"den":1,"g":39,"num":25,"projection":[]}
{"den":1,"g":40,"num":25,"projection":[]}
{"den":1,"g":41,"num":25,"projection":[]}
{"den":1,"g":42,"num":25,"projection":[]}
{"den":1,"g":43,"num":25,"projection":[]}
{"den":1,"g":44,"num":25,"projection":[]}
{"den":1,"g":45,"num":25,"projection":[]}
{"den":1,"g":46,"num":25,"projection":[]}
{"den":1,"g":47,"num":25,"projection":[]}
{"den":1,"g":48,"num":25,"projection":[]}
{"den":1,"g":49,"num":25,"projection":[]}

View file

@ -0,0 +1 @@
{"blocks":["01b82dd381859ca795e0b61db0fb19df8773f9f5cbc3a65a3c67cc0145d3e1a9","e1392669dad95818d457d1ee8ab65df918934397047f2f42e8f2483cc7d36765","93382a097e389c49c1991864fee8379257cfbc48bc802b1a0e907f99903c7e2c","992de910448c2bc75b0c930481492b070843c7ababf5c75a103dabfa07a8c857","03d264ab7dc26f9561b313b27c2a5e20b1768ee7f0f34b882fbf8cfe16a53d5d"],"code":"accepted","instr":"22351d620fa668a2bd2d8b2d8665797f470d3d306acc0b1bfc67873e2f98e352","rates":[[25,1,4800,0,49]],"sizes":[[640,360,7588831]],"text_hash":"34456e22dcd71bd03e0a47e23530864ba7d4de993037e3a8cb599932a8975407","text_record":"c8d65ab35d3378051eccfd06f52d0f4435367843567db9bfd43fcd61b04f7925"}

View file

@ -0,0 +1,6 @@
[]
{"den":1,"g":0,"num":25,"projection":[]}
{"den":1,"g":1,"num":25,"projection":[]}
{"den":1,"g":2,"num":25,"projection":[]}
{"den":1,"g":3,"num":25,"projection":[]}
{"den":1,"g":4,"num":25,"projection":[]}

View file

@ -0,0 +1 @@
{"blocks":[],"code":"accepted","instr":"df8b6dc7bd4dd19892f19db68d78ae66d0353f40ebf8a360f492bdcc34aa655f","rates":[[25,1,4800,0,4]],"sizes":[[640,360,239241]],"text_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","text_record":"5bb8213e7e03d4edfb194e18f23bcfec100ed9151a31209c311aec82b6d2a89b"}

View file

@ -0,0 +1,6 @@
[{"active":[[0,24000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"title"},{"active":[[0,24000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"credit"},{"active":[[0,24000]],"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":3,"text":"lower_third"},{"active":[[0,24000]],"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":4,"text":"caption"},{"active":[[0,24000]],"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":5,"text":"subtitle"},{"active":[[0,24000]],"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":6,"text":"forced_narrative"},{"active":[[0,24000]],"dir":0,"group":0,"index":6,"lang":"en","mode":0,"purpose":7,"text":"label"},{"active":[[0,24000]],"dir":0,"group":0,"index":7,"lang":"en","mode":0,"purpose":8,"text":"legal"},{"active":[[0,24000]],"dir":0,"group":0,"index":8,"lang":"en","mode":0,"purpose":9,"text":"alert"},{"active":[[0,24000]],"dir":0,"group":0,"index":9,"lang":"en","mode":0,"purpose":10,"text":"logo"},{"active":[[0,24000]],"dir":0,"group":0,"index":10,"lang":"en","mode":0,"purpose":11,"text":"graphic"},{"active":[[0,24000]],"dir":0,"group":0,"index":11,"lang":"en","mode":0,"purpose":12,"text":"data"},{"active":[[0,24000]],"dir":0,"group":0,"index":13,"lang":"en","mode":0,"purpose":14,"text":"p14"},{"active":[[0,24000]],"dir":0,"group":0,"index":14,"lang":"en","mode":0,"purpose":200,"text":"p200"},{"active":[[0,24000]],"dir":0,"group":0,"index":15,"lang":"en","mode":0,"purpose":255,"text":"p255"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"title"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"credit"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":3,"text":"lower_third"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":4,"text":"caption"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":5,"text":"subtitle"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":6,"text":"forced_narrative"},{"dir":0,"group":0,"index":6,"lang":"en","mode":0,"purpose":7,"text":"label"},{"dir":0,"group":0,"index":7,"lang":"en","mode":0,"purpose":8,"text":"legal"},{"dir":0,"group":0,"index":8,"lang":"en","mode":0,"purpose":9,"text":"alert"},{"dir":0,"group":0,"index":9,"lang":"en","mode":0,"purpose":10,"text":"logo"},{"dir":0,"group":0,"index":10,"lang":"en","mode":0,"purpose":11,"text":"graphic"},{"dir":0,"group":0,"index":11,"lang":"en","mode":0,"purpose":12,"text":"data"},{"dir":0,"group":0,"index":13,"lang":"en","mode":0,"purpose":14,"text":"p14"},{"dir":0,"group":0,"index":14,"lang":"en","mode":0,"purpose":200,"text":"p200"},{"dir":0,"group":0,"index":15,"lang":"en","mode":0,"purpose":255,"text":"p255"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"title"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"credit"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":3,"text":"lower_third"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":4,"text":"caption"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":5,"text":"subtitle"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":6,"text":"forced_narrative"},{"dir":0,"group":0,"index":6,"lang":"en","mode":0,"purpose":7,"text":"label"},{"dir":0,"group":0,"index":7,"lang":"en","mode":0,"purpose":8,"text":"legal"},{"dir":0,"group":0,"index":8,"lang":"en","mode":0,"purpose":9,"text":"alert"},{"dir":0,"group":0,"index":9,"lang":"en","mode":0,"purpose":10,"text":"logo"},{"dir":0,"group":0,"index":10,"lang":"en","mode":0,"purpose":11,"text":"graphic"},{"dir":0,"group":0,"index":11,"lang":"en","mode":0,"purpose":12,"text":"data"},{"dir":0,"group":0,"index":13,"lang":"en","mode":0,"purpose":14,"text":"p14"},{"dir":0,"group":0,"index":14,"lang":"en","mode":0,"purpose":200,"text":"p200"},{"dir":0,"group":0,"index":15,"lang":"en","mode":0,"purpose":255,"text":"p255"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"title"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"credit"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":3,"text":"lower_third"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":4,"text":"caption"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":5,"text":"subtitle"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":6,"text":"forced_narrative"},{"dir":0,"group":0,"index":6,"lang":"en","mode":0,"purpose":7,"text":"label"},{"dir":0,"group":0,"index":7,"lang":"en","mode":0,"purpose":8,"text":"legal"},{"dir":0,"group":0,"index":8,"lang":"en","mode":0,"purpose":9,"text":"alert"},{"dir":0,"group":0,"index":9,"lang":"en","mode":0,"purpose":10,"text":"logo"},{"dir":0,"group":0,"index":10,"lang":"en","mode":0,"purpose":11,"text":"graphic"},{"dir":0,"group":0,"index":11,"lang":"en","mode":0,"purpose":12,"text":"data"},{"dir":0,"group":0,"index":13,"lang":"en","mode":0,"purpose":14,"text":"p14"},{"dir":0,"group":0,"index":14,"lang":"en","mode":0,"purpose":200,"text":"p200"},{"dir":0,"group":0,"index":15,"lang":"en","mode":0,"purpose":255,"text":"p255"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"title"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"credit"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":3,"text":"lower_third"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":4,"text":"caption"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":5,"text":"subtitle"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":6,"text":"forced_narrative"},{"dir":0,"group":0,"index":6,"lang":"en","mode":0,"purpose":7,"text":"label"},{"dir":0,"group":0,"index":7,"lang":"en","mode":0,"purpose":8,"text":"legal"},{"dir":0,"group":0,"index":8,"lang":"en","mode":0,"purpose":9,"text":"alert"},{"dir":0,"group":0,"index":9,"lang":"en","mode":0,"purpose":10,"text":"logo"},{"dir":0,"group":0,"index":10,"lang":"en","mode":0,"purpose":11,"text":"graphic"},{"dir":0,"group":0,"index":11,"lang":"en","mode":0,"purpose":12,"text":"data"},{"dir":0,"group":0,"index":13,"lang":"en","mode":0,"purpose":14,"text":"p14"},{"dir":0,"group":0,"index":14,"lang":"en","mode":0,"purpose":200,"text":"p200"},{"dir":0,"group":0,"index":15,"lang":"en","mode":0,"purpose":255,"text":"p255"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"title"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"credit"},{"dir":0,"group":0,"index":2,"lang":"en","mode":0,"purpose":3,"text":"lower_third"},{"dir":0,"group":0,"index":3,"lang":"en","mode":0,"purpose":4,"text":"caption"},{"dir":0,"group":0,"index":4,"lang":"en","mode":0,"purpose":5,"text":"subtitle"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":6,"text":"forced_narrative"},{"dir":0,"group":0,"index":6,"lang":"en","mode":0,"purpose":7,"text":"label"},{"dir":0,"group":0,"index":7,"lang":"en","mode":0,"purpose":8,"text":"legal"},{"dir":0,"group":0,"index":8,"lang":"en","mode":0,"purpose":9,"text":"alert"},{"dir":0,"group":0,"index":9,"lang":"en","mode":0,"purpose":10,"text":"logo"},{"dir":0,"group":0,"index":10,"lang":"en","mode":0,"purpose":11,"text":"graphic"},{"dir":0,"group":0,"index":11,"lang":"en","mode":0,"purpose":12,"text":"data"},{"dir":0,"group":0,"index":13,"lang":"en","mode":0,"purpose":14,"text":"p14"},{"dir":0,"group":0,"index":14,"lang":"en","mode":0,"purpose":200,"text":"p200"},{"dir":0,"group":0,"index":15,"lang":"en","mode":0,"purpose":255,"text":"p255"}]}

View file

@ -0,0 +1 @@
{"blocks":["7d9e857db708d0b5259fcd4298387b34f93cc6d7062fa0ce6037aa094b6e27dc","f17c0d40188346946440bed75777b14d8bcf2763a1af244d8a9bd9ca818dc28a","45daabd319d36574bc92fd564395e83703e8452d05816a2dcd264c713e87871c","11f2cecc76b477269c751e2a8debea9bdfaf1da8f3d525af2010c6580eddabb3","933575b2576cbbfff7d08dbd8765f15fd445ccea9ace32e4bbc7497dafe7b710","fe0af73ac2e6f43ed88fbc2c7693837996d749cca41a36574545b9b00a32b0f0","995ee4642ae0ba83546b1fab8d649c5cbea163f5d7874ff7b498d38b5062d23b","356e8c59662fccd5d46f60e1d22bb7637dbe09d2f621abdc796b130f40f3447a","75bb28dd70a1da8fd6b43ac92b473ee99a88d8ffbda292e01de100ad68360399","dbc8b9bdbe318420bac1794f3ffa004df06a9265f2d4e1c32ae9b5d6c4835d92","5d459a6f94eaed4e068a5ca4f44f34171b034e913f78c63405f8b016198ca361","712f02b30587742652158953d117673e71dd076ba5ed0ade37ae4770c2b25b44","fb9a1ef96369f402d99a7c9b413aed471697316bb5f41ef0f4862e5ed3bd7ba4","a0bc207b0900868c7ba29f4a7985874a99271ac63c7cd3329e6b2ffc0dc7c8a8","56851537f63a3a5c4345f562aff332148134010c5d806ac955a69f764c0a4b3a","f331e96b11804bea9fdf0bb863180091004b8a65d35292ff61edda7b5ff955bb"],"code":"accepted","instr":"8d72f40b55ce014c463d9c9d877b25f3c29eb8578fb4186124e2e75aa01eaea6","rates":[[25,1,4800,0,4]],"sizes":[[640,360,24150310]],"text_hash":"dfb62a056dfb0d1542231aa7b28ee5f291c62a506755f7fa00701a8d2eac2beb","text_record":"77aab308861a87a1af8a98ae4db67d6f4bc9781f610e9ba3002376e593c52e96"}

View file

@ -0,0 +1,71 @@
[{"active":[[24000,50000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]
{"den":1001,"g":0,"num":24000,"projection":[]}
{"den":1001,"g":1,"num":24000,"projection":[]}
{"den":1001,"g":2,"num":24000,"projection":[]}
{"den":1001,"g":3,"num":24000,"projection":[]}
{"den":1001,"g":4,"num":24000,"projection":[]}
{"den":1001,"g":5,"num":24000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":6,"num":24000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":7,"num":24000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":8,"num":24000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":9,"num":24000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":10,"num":24000,"projection":[]}
{"den":1001,"g":11,"num":24000,"projection":[]}
{"den":1,"g":0,"num":25,"projection":[]}
{"den":1,"g":1,"num":25,"projection":[]}
{"den":1,"g":2,"num":25,"projection":[]}
{"den":1,"g":3,"num":25,"projection":[]}
{"den":1,"g":4,"num":25,"projection":[]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":11,"num":25,"projection":[]}
{"den":1,"g":12,"num":25,"projection":[]}
{"den":1001,"g":0,"num":30000,"projection":[]}
{"den":1001,"g":1,"num":30000,"projection":[]}
{"den":1001,"g":2,"num":30000,"projection":[]}
{"den":1001,"g":3,"num":30000,"projection":[]}
{"den":1001,"g":4,"num":30000,"projection":[]}
{"den":1001,"g":5,"num":30000,"projection":[]}
{"den":1001,"g":6,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":7,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":8,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":9,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":10,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":11,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":12,"num":30000,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1001,"g":13,"num":30000,"projection":[]}
{"den":1001,"g":14,"num":30000,"projection":[]}
{"den":1,"g":0,"num":60,"projection":[]}
{"den":1,"g":1,"num":60,"projection":[]}
{"den":1,"g":2,"num":60,"projection":[]}
{"den":1,"g":3,"num":60,"projection":[]}
{"den":1,"g":4,"num":60,"projection":[]}
{"den":1,"g":5,"num":60,"projection":[]}
{"den":1,"g":6,"num":60,"projection":[]}
{"den":1,"g":7,"num":60,"projection":[]}
{"den":1,"g":8,"num":60,"projection":[]}
{"den":1,"g":9,"num":60,"projection":[]}
{"den":1,"g":10,"num":60,"projection":[]}
{"den":1,"g":11,"num":60,"projection":[]}
{"den":1,"g":12,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":13,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":14,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":15,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":16,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":17,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":18,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":19,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":20,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":21,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":22,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":23,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":24,"num":60,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":3,"text":"Four rates"}]}
{"den":1,"g":25,"num":60,"projection":[]}
{"den":1,"g":26,"num":60,"projection":[]}
{"den":1,"g":27,"num":60,"projection":[]}
{"den":1,"g":28,"num":60,"projection":[]}
{"den":1,"g":29,"num":60,"projection":[]}

View file

@ -0,0 +1 @@
{"blocks":["0ad56f255b6aa4690808061f233651423d744ce823f923cabbf96310a23b8201"],"code":"accepted","instr":"d4189fec2f822915f98184ffc69379fe2f9b21749fb7f10fcb095d7007c802f2","rates":[[24000,1001,5005,0,11],[25,1,4800,0,12],[30000,1001,4004,0,14],[60,1,2000,0,29]],"sizes":[[640,360,2415278]],"text_hash":"b91c0980a104beb71b72fcdb9759a737a7afd27a9a608e4f9277ea07531fd5ee","text_record":"870f1f9899b38b64a58ac6da51392de453a9c9351b37e4c99f46da23481cda63"}

View file

@ -0,0 +1,26 @@
[{"active":[[0,96000]],"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"active":[[0,48000]],"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"},{"active":[[48000,120000]],"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":1,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":9,"start":0},"text":"hin"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"hi","mode":0,"purpose":7,"text":"हिंदी"},{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":20,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":21,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":0,"group":0,"index":2,"lang":"hi-Latn","mode":0,"purpose":7,"ruby":{"base":0,"len":6,"start":9},"text":"di"}]}

View file

@ -0,0 +1 @@
{"blocks":["3fa00b9bbe6f4ce44ff3efa35063be19619e6a9d50491980625dab76495506ef","7ea59bb34ed19148010994406826e8aa83fcaa650e09b1a337b0def275d34161","23972f01741155a401f77574f7f5cad70fa0f0a21bdca8afa672ed21d3318922"],"code":"accepted","instr":"d28b7b0cf6ecd4a0b8f5dfe9fb7b17bfd304945ec81d4ec35e8eb3410510b583","rates":[[25,1,4800,0,24]],"sizes":[[640,360,1990795]],"text_hash":"ebbfffe5c0e85c02b4884d4c174419d770100e4796df859dc4c26353ad2c2ae7","text_record":"c197bff9cd3d2f4ca63ae9d8d250ff3ef9883bf2dca2ff972feb2e80655d0d3d"}

View file

@ -0,0 +1,6 @@
[{"active":[[0,24000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"He said \"A&B\" <b>\\</b>\n2/2"},{"active":[[0,24000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"OK 😀"},{"active":[[0,24000]],"dir":1,"group":0,"index":2,"lang":"he","mode":0,"purpose":7,"text":"שלום"},{"active":[[0,24000]],"dir":0,"group":0,"index":3,"lang":"hi","mode":0,"purpose":7,"text":"हिन्दी"},{"active":[[0,24000]],"dir":0,"group":0,"index":4,"lang":"sr-Latn-RS","mode":0,"purpose":7,"text":"Zdravo"},{"active":[[0,24000]],"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"soft­hyphen"}]
{"den":1,"g":0,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"He said \"A&B\" <b>\\</b>\n2/2"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"OK 😀"},{"dir":1,"group":0,"index":2,"lang":"he","mode":0,"purpose":7,"text":"שלום"},{"dir":0,"group":0,"index":3,"lang":"hi","mode":0,"purpose":7,"text":"हिन्दी"},{"dir":0,"group":0,"index":4,"lang":"sr-Latn-RS","mode":0,"purpose":7,"text":"Zdravo"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"soft­hyphen"}]}
{"den":1,"g":1,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"He said \"A&B\" <b>\\</b>\n2/2"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"OK 😀"},{"dir":1,"group":0,"index":2,"lang":"he","mode":0,"purpose":7,"text":"שלום"},{"dir":0,"group":0,"index":3,"lang":"hi","mode":0,"purpose":7,"text":"हिन्दी"},{"dir":0,"group":0,"index":4,"lang":"sr-Latn-RS","mode":0,"purpose":7,"text":"Zdravo"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"soft­hyphen"}]}
{"den":1,"g":2,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"He said \"A&B\" <b>\\</b>\n2/2"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"OK 😀"},{"dir":1,"group":0,"index":2,"lang":"he","mode":0,"purpose":7,"text":"שלום"},{"dir":0,"group":0,"index":3,"lang":"hi","mode":0,"purpose":7,"text":"हिन्दी"},{"dir":0,"group":0,"index":4,"lang":"sr-Latn-RS","mode":0,"purpose":7,"text":"Zdravo"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"soft­hyphen"}]}
{"den":1,"g":3,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"He said \"A&B\" <b>\\</b>\n2/2"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"OK 😀"},{"dir":1,"group":0,"index":2,"lang":"he","mode":0,"purpose":7,"text":"שלום"},{"dir":0,"group":0,"index":3,"lang":"hi","mode":0,"purpose":7,"text":"हिन्दी"},{"dir":0,"group":0,"index":4,"lang":"sr-Latn-RS","mode":0,"purpose":7,"text":"Zdravo"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"soft­hyphen"}]}
{"den":1,"g":4,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":7,"text":"He said \"A&B\" <b>\\</b>\n2/2"},{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":7,"text":"OK 😀"},{"dir":1,"group":0,"index":2,"lang":"he","mode":0,"purpose":7,"text":"שלום"},{"dir":0,"group":0,"index":3,"lang":"hi","mode":0,"purpose":7,"text":"हिन्दी"},{"dir":0,"group":0,"index":4,"lang":"sr-Latn-RS","mode":0,"purpose":7,"text":"Zdravo"},{"dir":0,"group":0,"index":5,"lang":"en","mode":0,"purpose":7,"text":"soft­hyphen"}]}

View file

@ -0,0 +1 @@
{"blocks":["1d55c585f948d167f1c192c10a461c93c17de3a381f6df13df3fff1b15103d80","21b751ed648ba10c6594afca8701e14dcc8f19880662f3a571f4da32ae581677","722c8daf25a3241f335fb4286ecdce0ab9363527bdd554d42ac0c07203f52066","7f8c28dc03300c226e65813032980fa890110d4d90c066b0238da0febc0ccdde","173ba88478947083166f18db924bcaf11e0f191428f7989bc84a0b87f4c39f74","908a6204290e5e2814dcd3b30e278c4b75b1b6d2023c71d28f2b9f02ae45c5b3"],"code":"accepted","instr":"fe0b3acd351b5d1c420d0af4552cde490821a65f96d1ad27050c536736b7e00a","rates":[[25,1,4800,0,4]],"sizes":[[640,360,11169106]],"text_hash":"d1d74b9c63272f115c6454dcba48241f02868a52c849f201d64677ba59c4171d","text_record":"145f0cba50b3330f69577daccf8e24682f0403108e26cdd8ce4a31f6e30d24aa"}

View file

@ -0,0 +1,51 @@
[{"active":[[24000,96000]],"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"},{"active":[[120000,216000]],"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]
{"den":1,"g":0,"num":25,"projection":[]}
{"den":1,"g":1,"num":25,"projection":[]}
{"den":1,"g":2,"num":25,"projection":[]}
{"den":1,"g":3,"num":25,"projection":[]}
{"den":1,"g":4,"num":25,"projection":[]}
{"den":1,"g":5,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":0,"group":0,"index":0,"lang":"en","mode":0,"purpose":1,"text":"Opening title"}]}
{"den":1,"g":20,"num":25,"projection":[]}
{"den":1,"g":21,"num":25,"projection":[]}
{"den":1,"g":22,"num":25,"projection":[]}
{"den":1,"g":23,"num":25,"projection":[]}
{"den":1,"g":24,"num":25,"projection":[]}
{"den":1,"g":25,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":26,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":27,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":28,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":29,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":30,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":31,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":32,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":33,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":34,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":35,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":36,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":37,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":38,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":39,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":40,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":41,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":42,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":43,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":44,"num":25,"projection":[{"dir":0,"group":0,"index":1,"lang":"en","mode":0,"purpose":2,"text":"Written here"}]}
{"den":1,"g":45,"num":25,"projection":[]}
{"den":1,"g":46,"num":25,"projection":[]}
{"den":1,"g":47,"num":25,"projection":[]}
{"den":1,"g":48,"num":25,"projection":[]}
{"den":1,"g":49,"num":25,"projection":[]}

View file

@ -0,0 +1 @@
{"blocks":["a6ad09349fc54b2e8a83d4798b78b9e57888de7ef5ca28cc751cb8606d09ad6c","d5447338e2cc60b19f5613a91dc55e178867fcd0cbd486a6bb9c3753009ccef2"],"code":"accepted","instr":"9939d05524de498c1dd2bac0cf438f0ba34a44d176a5e8dcf7f1b7be55b02ea1","rates":[[25,1,4800,0,49]],"sizes":[[640,360,2995585]],"text_hash":"355c1d3f1998dd10f25bf8b1bd1ecbf39f190bb4f85c70338d954e57415fd1f7","text_record":"95f151ba7dd7f1ea563c5a05113e6b541ee7a98be08abe783a49f4eb5513680f"}

View file

@ -0,0 +1,76 @@
[{"active":[[24000,264000]],"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"active":[[24000,264000]],"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"active":[[24000,120000]],"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]
{"den":1,"g":0,"num":25,"projection":[]}
{"den":1,"g":1,"num":25,"projection":[]}
{"den":1,"g":2,"num":25,"projection":[]}
{"den":1,"g":3,"num":25,"projection":[]}
{"den":1,"g":4,"num":25,"projection":[]}
{"den":1,"g":5,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":6,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":7,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":8,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":9,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":10,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":11,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":12,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":13,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":14,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":15,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":16,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":17,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":18,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":19,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":20,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":21,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":22,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":23,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":24,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"},{"dir":0,"group":1,"index":2,"lang":"en","mode":0,"purpose":7,"ruby":{"base":1,"len":8,"start":0},"text":"DOP"}]}
{"den":1,"g":25,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":26,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":27,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":28,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":29,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":30,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":31,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":32,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":33,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":34,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":35,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":36,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":37,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":38,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":39,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":40,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":41,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":42,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":43,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":44,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":45,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":46,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":47,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":48,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":49,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":50,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":51,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":52,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":53,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":54,"num":25,"projection":[{"dir":1,"group":1,"index":0,"lang":"ar","mode":0,"purpose":3,"text":"باب البيت"},{"dir":0,"group":1,"index":1,"lang":"en","mode":0,"purpose":3,"text":"Director of photography"}]}
{"den":1,"g":55,"num":25,"projection":[]}
{"den":1,"g":56,"num":25,"projection":[]}
{"den":1,"g":57,"num":25,"projection":[]}
{"den":1,"g":58,"num":25,"projection":[]}
{"den":1,"g":59,"num":25,"projection":[]}
{"den":1,"g":60,"num":25,"projection":[]}
{"den":1,"g":61,"num":25,"projection":[]}
{"den":1,"g":62,"num":25,"projection":[]}
{"den":1,"g":63,"num":25,"projection":[]}
{"den":1,"g":64,"num":25,"projection":[]}
{"den":1,"g":65,"num":25,"projection":[]}
{"den":1,"g":66,"num":25,"projection":[]}
{"den":1,"g":67,"num":25,"projection":[]}
{"den":1,"g":68,"num":25,"projection":[]}
{"den":1,"g":69,"num":25,"projection":[]}
{"den":1,"g":70,"num":25,"projection":[]}
{"den":1,"g":71,"num":25,"projection":[]}
{"den":1,"g":72,"num":25,"projection":[]}
{"den":1,"g":73,"num":25,"projection":[]}
{"den":1,"g":74,"num":25,"projection":[]}

View file

@ -0,0 +1 @@
{"blocks":["50987f1d37f03a0be0501013f423fed3bd083543f4c1ed1de2d37e075c46b752","fe8c37c546452f6f7912e5a5469db18061fd6828f0ed3f4d7f0df412386f13fc","7f0681341d7be2983e71b1441be5f9a1f574640fa298838418b967d1c9610c5c"],"code":"accepted","instr":"c00c5d7926ccfdea223c94e11f71eff3f720dd26fbe9bd44f8b391042981473e","rates":[[25,1,4800,0,74]],"sizes":[[640,360,7393573]],"text_hash":"70d5ce883f06a8aedd33bfa1fbc638e69909a380c19007a252584a7d38e0d432","text_record":"c7d4d5aa901ca7a25aef195f1c186b205dcb0734b6f0b2a8e8115333090b9af2"}

View file

@ -0,0 +1 @@
{"blocks":["621e4d7b8298eccc9a7064872192109d9ccfa13a442235357a3bb05a3861badd","621e4d7b8298eccc9a7064872192109d9ccfa13a442235357a3bb05a3861badd","621e4d7b8298eccc9a7064872192109d9ccfa13a442235357a3bb05a3861badd"],"code":"accepted","instr":"c17c22d2644a5ef2f9f517774014750a92cd237627f3e83ce89c29b69e4e22a2","rates":[[25,1,4800,0,24]],"sizes":[[640,360,245472]],"text_hash":"a1e113ae2bd73a400f060fc215d85ea6afd4a7b7df3084aa53159b3c476ca21f"}

View file

@ -0,0 +1 @@
{"code":"payload_malformed"}

View file

@ -0,0 +1 @@
{"code":"payload_malformed"}

View file

@ -0,0 +1 @@
{"blocks":["4945d802da2fbb68f3e726d726375e774435c17a41f19ee263c64849105aa959","06861e0fa3ebbdcf8a61591543447c7e912c42423c37d2abcc035bfdd8ed09d6"],"code":"accepted","instr":"8a50cfa0381f22bd5cbc2069c26f60adf521f42eb9f1723d196030ff43d0907f","rates":[[25,1,4800,0,24]],"sizes":[[640,360,258277]],"text_hash":"489942ecb8278f3462c0ee9a5ee3261a509f3a17d9f638372298514f363d11d4"}

View file

@ -0,0 +1 @@
{"code":"payload_malformed"}

View file

@ -0,0 +1 @@
{"code":"field_range"}

View file

@ -0,0 +1 @@
{"code":"field_range"}

View file

@ -0,0 +1 @@
{"code":"field_range"}

View file

@ -0,0 +1 @@
{"code":"payload_malformed"}

View file

@ -0,0 +1 @@
{"code":"payload_malformed"}

View file

@ -0,0 +1,86 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":2,"n_texts":3,"n_tracks":4,"n_paths":4,"n_items":5,"n_keys":4,"n_glyphs":4,"n_clusters":4,"path_contours":4,"path_points":22,"strings_len":25,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":1307915}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255],
[220,40,40,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,4096,0,[0,0,0]],
[0,76800,0,[0,0,0]],
[0,102400,0,[0,0,0]],
[0,128000,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":10,"zero@4":0,"xmin":0,"ymin":-60,"xmax":240,"ymax":100},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":64,"ymax":64},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":32,"ymax":32},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":16,"ymax":16}
],
"path_ends":[9,3,3,3],
"path_points":[
[0,0,0],
[60,100,0],
[120,0,0],
[180,100,0],
[240,0,0],
[200,0,0],
[180,40,0],
[120,-60,0],
[60,40,0],
[40,0,0],
[0,0,0],
[64,0,0],
[64,64,0],
[0,64,0],
[0,0,0],
[32,0,0],
[32,32,0],
[0,32,0],
[0,0,0],
[16,0,0],
[16,16,0],
[0,16,0]
],
"texts":[
{"purpose":10,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":3},
{"purpose":11,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":12},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":4}
],
"items":[
{"kind":2,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":72000,"unit_scale":16777216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":1,"paint":1,"text":1,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":48000,"t_off":120000,"unit_scale":16777216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":1,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":2,"paint":0,"text":2,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":24000,"unit_scale":16777216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":2,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":3,"paint":1,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":16777216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":3,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":4,"n_clusters":4,"t_on":96000,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[66,0,4096,49152],
[111,0,6596,49152],
[116,0,8836,49152],
[104,0,10276,49152]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1]
],
"strings":"enWAIenA red squareenBoth",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,162 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":50000,"dur":94000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":6,"n_tracks":0,"n_paths":0,"n_items":7,"n_keys":0,"n_glyphs":59,"n_clusters":59,"path_contours":0,"path_points":0,"strings_len":71,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":6611664}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":13},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":10},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":8},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":12},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":7},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":9}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":13,"n_clusters":13,"t_on":0,"t_off":72000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":10,"n_clusters":10,"t_on":120000,"t_off":240000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":0,"t_off":2147483648,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":3,"zero@10":0,"n_glyphs":12,"n_clusters":12,"t_on":0,"t_off":50000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":7,"n_clusters":7,"t_on":144000,"t_off":200000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":5,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":24000,"t_off":60000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":5,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":60000,"t_off":150000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[115,0,4096,9216],
[116,0,5976,9216],
[97,0,7416,9216],
[114,0,9576,9216],
[116,0,11096,9216],
[115,0,12536,9216],
[32,0,14416,9216],
[98,0,15616,9216],
[101,0,17856,9216],
[102,0,20016,9216],
[111,0,21416,9216],
[114,0,23656,9216],
[101,0,25176,9216],
[101,0,4096,15872],
[110,0,6256,15872],
[100,0,8496,15872],
[115,0,10736,15872],
[32,0,12616,15872],
[97,0,13816,15872],
[102,0,15976,15872],
[116,0,17376,15872],
[101,0,18816,15872],
[114,0,20976,15872],
[115,0,4096,22528],
[112,0,5976,22528],
[97,0,8216,22528],
[110,0,10376,22528],
[115,0,12616,22528],
[32,0,14496,22528],
[105,0,15696,22528],
[116,0,16656,22528],
[111,0,4096,29184],
[118,0,6336,29184],
[101,0,8416,29184],
[114,0,10576,29184],
[32,0,12096,29184],
[98,0,13296,29184],
[121,0,15536,29184],
[32,0,17616,29184],
[116,0,18816,29184],
[104,0,20256,29184],
[101,0,22496,29184],
[110,0,24656,29184],
[110,0,4096,35840],
[111,0,6336,35840],
[116,0,8576,35840],
[32,0,10016,35840],
[121,0,11216,35840],
[101,0,13296,35840],
[116,0,15456,35840],
[116,0,4096,42496],
[119,0,5536,42496],
[111,0,8536,42496],
[32,0,10776,42496],
[112,0,11976,42496],
[97,0,14216,42496],
[114,0,16376,42496],
[116,0,17896,42496],
[115,0,19336,42496]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1]
],
"strings":"enstarts beforeenends afterenspans itenover by thenennot yetentwo parts",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,69 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":3,"n_tracks":0,"n_paths":0,"n_items":3,"n_keys":0,"n_glyphs":16,"n_clusters":16,"path_contours":0,"path_points":0,"strings_len":22,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":2924252}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6},
{"purpose":13,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5},
{"purpose":12,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":0,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[83,0,4096,9216],
[99,0,6396,9216],
[111,0,8396,9216],
[114,0,10636,9216],
[101,0,12156,9216],
[115,0,14316,9216],
[42,0,4096,15872],
[32,0,5896,15872],
[42,0,7096,15872],
[32,0,8896,15872],
[42,0,10096,15872],
[51,0,4096,22528],
[32,0,6336,22528],
[45,0,7536,22528],
[32,0,9056,22528],
[49,0,10256,22528]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1]
],
"strings":"enScoresen* * *en3 - 1",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,127 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":6,"n_tracks":0,"n_paths":0,"n_items":6,"n_keys":0,"n_glyphs":42,"n_clusters":42,"path_contours":0,"path_points":0,"strings_len":54,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":4416300}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":1,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6},
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":1,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":11},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":8},
{"purpose":2,"dir":0,"lang_len":2,"mode":0,"group":2,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":7},
{"purpose":2,"dir":0,"lang_len":2,"mode":0,"group":2,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5},
{"purpose":2,"dir":0,"lang_len":2,"mode":0,"group":2,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":0,"t_off":48000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":11,"n_clusters":11,"t_on":0,"t_off":48000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":48000,"t_off":72000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":3,"zero@10":0,"n_glyphs":7,"n_clusters":7,"t_on":72000,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":72000,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":5,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":96000,"t_off":120000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[67,0,4096,9216],
[97,0,6696,9216],
[109,0,8856,9216],
[101,0,11696,9216],
[114,0,13856,9216],
[97,0,15376,9216],
[83,0,4096,15872],
[101,0,6396,15872],
[99,0,8556,15872],
[111,0,10556,15872],
[110,0,12796,15872],
[100,0,15036,15872],
[32,0,17276,15872],
[117,0,18476,15872],
[110,0,20716,15872],
[105,0,22956,15872],
[116,0,23916,15872],
[73,0,4096,22528],
[110,0,5136,22528],
[116,0,7376,22528],
[101,0,8816,22528],
[114,0,10976,22528],
[118,0,12496,22528],
[97,0,14576,22528],
[108,0,16736,22528],
[69,0,4096,29184],
[100,0,6396,29184],
[105,0,8636,29184],
[116,0,9596,29184],
[105,0,11036,29184],
[110,0,11996,29184],
[103,0,14236,29184],
[83,0,4096,35840],
[111,0,6396,35840],
[117,0,8636,35840],
[110,0,10876,35840],
[100,0,13116,35840],
[77,0,4096,42496],
[117,0,7096,42496],
[115,0,9336,42496],
[105,0,11216,42496],
[99,0,12176,42496]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1]
],
"strings":"enCameraenSecond unitenIntervalenEditingenSoundenMusic",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,16 @@
{
"alternatives":"a logo block and a graphic block, each the text alternative of a path and active over that path's window; a block drawn by a path and later by a run, active over both windows; and a path with no alternative: accepted",
"clipped":"a document whose window is [50000, 144000), its first frame at tick 52800: windows that begin before it, end after it or span it are cut to it; a window that ends where it begins, and one that begins where it ends, leave their blocks never active, with an empty active set; two windows are cut and then merged: accepted",
"decorative":"three blocks drawn for the whole document, the second of purpose 13 (decorative): the transcript and every projection hold blocks 0 and 2 only, with their own indices: accepted",
"groups":"a lower third of two blocks in group 1, an ungrouped label, and three credits in group 2, the last entering later: each node carries its group number, and reading order is block order: accepted",
"intervals":"five blocks, each drawn by one run a word over that word's own window: windows that touch merge into one interval, as do windows that overlap and a window inside another; windows one tick apart stay two intervals; and the intervals are sorted whatever the items' order: accepted",
"modes":"three blocks equal in everything but the writing mode: vertical-rl (1), vertical-lr (2) and horizontal-tb (0), the vertical ones upright and stacked; each node carries its mode, and the three block identities differ: accepted",
"nested-groups":"runs inside item groups: each run's effective window is its own cut by every enclosing group's, so a run active throughout is active over its group's window only, a run in two groups over the intersection of all three, and a run in a group whose window misses its parent's is never active: accepted",
"no-text":"a payload with no text blocks: the transcript and every projection are the empty array: accepted",
"purposes":"one block of each purpose 1 to 13, then of the unregistered purposes 14, 200 and 255: every node carries the TEXT byte as an integer, 200 as 200; the decorative block (13) is left out: accepted",
"rates":"one block active over [24000, 50000) in a document listed at 24000/1001, 25, 30000/1001 and 60 fps: the record gives every frame of each rate in RATE order; at 60 fps frame 12 sits on the window's first tick and is in it, and frame 25 sits on its end and is not: accepted",
"ruby":"a Devanagari base block of two syllables and two ruby blocks, one over the base's first 9 bytes and one over the 6 bytes after them: each node's ruby object gives the base's index, the range's length and its start; the second annotation stays active after its base's window ends, and keeps its ruby object: accepted",
"strings":"strings as JSON: a quotation mark, a backslash and U+000A take the three escapes, and nothing else is escaped: markup characters, a solidus, a soft hyphen, Hebrew, Devanagari and U+1F600 are written as their UTF-8 bytes; a language tag keeps its letter case: accepted",
"windows":"a title active over [24000, 96000) whose opacity reaches 0 at tick 86400, and a credit active over [120000, 216000): frames before, between and after the windows project nothing, and the title stays in the projection at opacity 0 until its window ends: accepted",
"worked-example":"the worked example of section 5.4: a lower third of an Arabic block and an English block in group 1, both active over [24000, 264000), and a ruby annotation of the first 8 bytes of the second, active over [24000, 120000): accepted"
}

View file

@ -0,0 +1,207 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":5,"n_tracks":0,"n_paths":0,"n_items":11,"n_keys":0,"n_glyphs":80,"n_clusters":80,"path_contours":0,"path_points":0,"strings_len":90,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":12359740}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":16},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":19},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":13},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":14},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":18}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":24000,"t_off":48000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":11,"n_clusters":11,"t_on":0,"t_off":36000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":24000,"t_off":60000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":24001,"t_off":48000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":3,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":0,"t_off":96000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":3,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":24000,"t_off":48000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":72000,"t_off":96000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":24000,"t_off":48000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[116,0,4096,9216],
[111,0,5536,9216],
[117,0,7776,9216],
[99,0,10016,9216],
[104,0,12016,9216],
[105,0,14256,9216],
[110,0,15216,9216],
[103,0,17456,9216],
[32,0,19656,9216],
[119,0,20856,9216],
[105,0,23856,9216],
[110,0,24816,9216],
[100,0,27056,9216],
[111,0,29296,9216],
[119,0,31536,9216],
[115,0,34536,9216],
[111,0,4096,15872],
[118,0,6336,15872],
[101,0,8416,15872],
[114,0,10576,15872],
[108,0,12096,15872],
[97,0,13056,15872],
[112,0,15216,15872],
[112,0,17456,15872],
[105,0,19696,15872],
[110,0,20656,15872],
[103,0,22896,15872],
[32,0,25096,15872],
[119,0,26296,15872],
[105,0,29296,15872],
[110,0,30256,15872],
[100,0,32496,15872],
[111,0,34736,15872],
[119,0,36976,15872],
[115,0,39976,15872],
[97,0,4096,22528],
[112,0,6256,22528],
[97,0,8496,22528],
[114,0,10656,22528],
[116,0,12176,22528],
[32,0,13616,22528],
[119,0,14816,22528],
[105,0,17816,22528],
[110,0,18776,22528],
[100,0,21016,22528],
[111,0,23256,22528],
[119,0,25496,22528],
[115,0,28496,22528],
[110,0,4096,29184],
[101,0,6336,29184],
[115,0,8496,29184],
[116,0,10376,29184],
[101,0,11816,29184],
[100,0,13976,29184],
[32,0,16216,29184],
[119,0,17416,29184],
[105,0,20416,29184],
[110,0,21376,29184],
[100,0,23616,29184],
[111,0,25856,29184],
[119,0,28096,29184],
[115,0,31096,29184],
[108,0,4096,35840],
[97,0,5056,35840],
[116,0,7216,35840],
[101,0,8656,35840],
[114,0,10816,35840],
[32,0,12336,35840],
[116,0,13536,35840],
[104,0,14976,35840],
[101,0,17216,35840],
[110,0,19376,35840],
[32,0,21616,35840],
[101,0,22816,35840],
[97,0,24976,35840],
[114,0,27136,35840],
[108,0,28656,35840],
[105,0,29616,35840],
[101,0,30576,35840],
[114,0,32736,35840]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,16,1],
[1,0,17,1],
[1,0,18,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,16,1],
[1,0,17,1]
],
"strings":"entouching windowsenoverlapping windowsenapart windowsennested windowsenlater then earlier",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,55 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":24000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":3,"n_tracks":0,"n_paths":0,"n_items":3,"n_keys":0,"n_glyphs":9,"n_clusters":9,"path_contours":0,"path_points":0,"strings_len":15,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":1445598}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":1,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":3},
{"purpose":7,"dir":0,"lang_len":2,"mode":2,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":3},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":3}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[87,0,141660,15360],
[65,0,142080,18760],
[73,0,142840,22160],
[87,0,8540,15360],
[65,0,8960,18760],
[73,0,9720,22160],
[87,0,4096,75776],
[65,0,7496,75776],
[73,0,10056,75776]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1]
],
"strings":"enWAIenWAIenWAI",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,215 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":240000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":5,"n_tracks":0,"n_paths":0,"n_items":11,"n_keys":0,"n_glyphs":84,"n_clusters":84,"path_contours":0,"path_points":0,"strings_len":94,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":7588831}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":18},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":14},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":14},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":27},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":11}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":65535,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":24000,"t_off":96000,"unit_scale":0,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":18,"n_clusters":18,"t_on":0,"t_off":240000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":0,"rule":0,"zero@2":0,"ref":65535,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":48000,"t_off":200000,"unit_scale":0,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":14,"n_clusters":14,"t_on":0,"t_off":60000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":14,"n_clusters":14,"t_on":72000,"t_off":240000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]},
{"kind":0,"rule":0,"zero@2":0,"ref":65535,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":96000,"t_off":120000,"unit_scale":0,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":3,"zero@10":0,"n_glyphs":27,"n_clusters":27,"t_on":0,"t_off":240000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":11,"n_clusters":11,"t_on":100000,"t_off":130000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[105,0,4096,9216],
[110,0,5056,9216],
[32,0,7296,9216],
[116,0,8496,9216],
[104,0,9936,9216],
[101,0,12176,9216],
[32,0,14336,9216],
[111,0,15536,9216],
[117,0,17776,9216],
[116,0,20016,9216],
[101,0,21456,9216],
[114,0,23616,9216],
[32,0,25136,9216],
[103,0,26336,9216],
[114,0,28536,9216],
[111,0,30056,9216],
[117,0,32296,9216],
[112,0,34536,9216],
[105,0,4096,15872],
[110,0,5056,15872],
[32,0,7296,15872],
[98,0,8496,15872],
[111,0,10736,15872],
[116,0,12976,15872],
[104,0,14416,15872],
[32,0,16656,15872],
[103,0,17856,15872],
[114,0,20056,15872],
[111,0,21576,15872],
[117,0,23816,15872],
[112,0,26056,15872],
[115,0,28296,15872],
[105,0,4096,22528],
[110,0,5056,22528],
[32,0,7296,22528],
[98,0,8496,22528],
[111,0,10736,22528],
[116,0,12976,22528],
[104,0,14416,22528],
[44,0,16656,22528],
[32,0,17536,22528],
[108,0,18736,22528],
[97,0,19696,22528],
[116,0,21856,22528],
[101,0,23296,22528],
[114,0,25456,22528],
[105,0,4096,29184],
[110,0,5056,29184],
[32,0,7296,29184],
[97,0,8496,29184],
[32,0,10656,29184],
[103,0,11856,29184],
[114,0,14056,29184],
[111,0,15576,29184],
[117,0,17816,29184],
[112,0,20056,29184],
[32,0,22296,29184],
[116,0,23496,29184],
[104,0,24936,29184],
[97,0,27176,29184],
[116,0,29336,29184],
[32,0,30776,29184],
[110,0,31976,29184],
[101,0,34216,29184],
[118,0,36376,29184],
[101,0,38456,29184],
[114,0,40616,29184],
[32,0,42136,29184],
[111,0,43336,29184],
[112,0,45576,29184],
[101,0,47816,29184],
[110,0,49976,29184],
[115,0,52216,29184],
[105,0,4096,35840],
[110,0,5056,35840],
[32,0,7296,35840],
[110,0,8496,35840],
[111,0,10736,35840],
[32,0,12976,35840],
[103,0,14176,35840],
[114,0,16376,35840],
[111,0,17896,35840],
[117,0,20136,35840],
[112,0,22376,35840]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,16,1],
[1,0,17,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,16,1],
[1,0,17,1],
[1,0,18,1],
[1,0,19,1],
[1,0,20,1],
[1,0,21,1],
[1,0,22,1],
[1,0,23,1],
[1,0,24,1],
[1,0,25,1],
[1,0,26,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1]
],
"strings":"enin the outer groupenin both groupsenin both, laterenin a group that never opensenin no group",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,34 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":24000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":0,"n_tables":0,"n_paints":1,"n_texts":0,"n_tracks":0,"n_paths":1,"n_items":1,"n_keys":0,"n_glyphs":0,"n_clusters":0,"path_contours":1,"path_points":4,"strings_len":0,"inline_len":0,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":239241}
],
"rates":[
{"num":25,"den":1}
],
"sets":[],
"tables":[],
"paints":[
[220,40,40,255]
],
"tracks":[],
"keys":[],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":64,"ymax":64}
],
"path_ends":[3],
"path_points":[
[0,0,0],
[64,0,0],
[64,64,0],
[0,64,0]
],
"texts":[],
"items":[
{"kind":2,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":24000,"unit_scale":16777216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[],
"clusters":[],
"strings":"",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,271 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":24000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":16,"n_tracks":0,"n_paths":0,"n_items":16,"n_keys":0,"n_glyphs":104,"n_clusters":104,"path_contours":0,"path_points":0,"strings_len":136,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":24150310}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":1,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5},
{"purpose":2,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6},
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":11},
{"purpose":4,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":7},
{"purpose":5,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":8},
{"purpose":6,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":16},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5},
{"purpose":8,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5},
{"purpose":9,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":5},
{"purpose":10,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":4},
{"purpose":11,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":7},
{"purpose":12,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":4},
{"purpose":13,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":10},
{"purpose":14,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":3},
{"purpose":200,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":4},
{"purpose":255,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":4}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":11,"n_clusters":11,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":3,"zero@10":0,"n_glyphs":7,"n_clusters":7,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":8,"n_clusters":8,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":5,"zero@10":0,"n_glyphs":16,"n_clusters":16,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":6,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":7,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":8,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":9,"zero@10":0,"n_glyphs":4,"n_clusters":4,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":10,"zero@10":0,"n_glyphs":7,"n_clusters":7,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":11,"zero@10":0,"n_glyphs":4,"n_clusters":4,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":12,"zero@10":0,"n_glyphs":10,"n_clusters":10,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":13,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":14,"zero@10":0,"n_glyphs":4,"n_clusters":4,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":15,"zero@10":0,"n_glyphs":4,"n_clusters":4,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[116,0,4096,9216],
[105,0,5536,9216],
[116,0,6496,9216],
[108,0,7936,9216],
[101,0,8896,9216],
[99,0,4096,15872],
[114,0,6096,15872],
[101,0,7616,15872],
[100,0,9776,15872],
[105,0,12016,15872],
[116,0,12976,15872],
[108,0,4096,22528],
[111,0,5056,22528],
[119,0,7296,22528],
[101,0,10296,22528],
[114,0,12456,22528],
[95,0,13976,22528],
[116,0,15976,22528],
[104,0,17416,22528],
[105,0,19656,22528],
[114,0,20616,22528],
[100,0,22136,22528],
[99,0,4096,29184],
[97,0,6096,29184],
[112,0,8256,29184],
[116,0,10496,29184],
[105,0,11936,29184],
[111,0,12896,29184],
[110,0,15136,29184],
[115,0,4096,35840],
[117,0,5976,35840],
[98,0,8216,35840],
[116,0,10456,35840],
[105,0,11896,35840],
[116,0,12856,35840],
[108,0,14296,35840],
[101,0,15256,35840],
[102,0,4096,42496],
[111,0,5496,42496],
[114,0,7736,42496],
[99,0,9256,42496],
[101,0,11256,42496],
[100,0,13416,42496],
[95,0,15656,42496],
[110,0,17656,42496],
[97,0,19896,42496],
[114,0,22056,42496],
[114,0,23576,42496],
[97,0,25096,42496],
[116,0,27256,42496],
[105,0,28696,42496],
[118,0,29656,42496],
[101,0,31736,42496],
[108,0,4096,49152],
[97,0,5056,49152],
[98,0,7216,49152],
[101,0,9456,49152],
[108,0,11616,49152],
[108,0,4096,55808],
[101,0,5056,55808],
[103,0,7216,55808],
[97,0,9416,55808],
[108,0,11576,55808],
[97,0,80896,9216],
[108,0,83056,9216],
[101,0,84016,9216],
[114,0,86176,9216],
[116,0,87696,9216],
[108,0,80896,15872],
[111,0,81856,15872],
[103,0,84096,15872],
[111,0,86296,15872],
[103,0,80896,22528],
[114,0,83096,22528],
[97,0,84616,22528],
[112,0,86776,22528],
[104,0,89016,22528],
[105,0,91256,22528],
[99,0,92216,22528],
[100,0,80896,29184],
[97,0,83136,29184],
[116,0,85296,29184],
[97,0,86736,29184],
[100,0,80896,35840],
[101,0,83136,35840],
[99,0,85296,35840],
[111,0,87296,35840],
[114,0,89536,35840],
[97,0,91056,35840],
[116,0,93216,35840],
[105,0,94656,35840],
[118,0,95616,35840],
[101,0,97696,35840],
[112,0,80896,42496],
[49,0,83136,42496],
[52,0,85376,42496],
[112,0,80896,49152],
[50,0,83136,49152],
[48,0,85376,49152],
[48,0,87616,49152],
[112,0,80896,55808],
[50,0,83136,55808],
[53,0,85376,55808],
[53,0,87616,55808]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1]
],
"strings":"entitleencreditenlower_thirdencaptionensubtitleenforced_narrativeenlabelenlegalenalertenlogoengraphicendataendecorativeenp14enp200enp255",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,56 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":60000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":4,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":1,"n_tracks":0,"n_paths":0,"n_items":1,"n_keys":0,"n_glyphs":10,"n_clusters":10,"path_contours":0,"path_points":0,"strings_len":12,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":2415278}
],
"rates":[
{"num":24000,"den":1001},
{"num":25,"den":1},
{"num":30000,"den":1001},
{"num":60,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":10}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":10,"n_clusters":10,"t_on":24000,"t_off":50000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[70,0,4096,9216],
[111,0,6296,9216],
[117,0,8536,9216],
[114,0,10776,9216],
[32,0,12296,9216],
[114,0,13496,9216],
[97,0,15016,9216],
[116,0,17176,9216],
[101,0,18616,9216],
[115,0,20776,9216]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1]
],
"strings":"enFour rates",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,55 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":2,"n_tables":0,"n_paints":1,"n_texts":3,"n_tracks":0,"n_paths":0,"n_items":3,"n_keys":0,"n_glyphs":10,"n_clusters":7,"path_contours":0,"path_points":0,"strings_len":36,"inline_len":0,"held_len":165402,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":1990795}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":59879,"sha256":"2310ab64ddcf4d851d4d7c08bbce141fba178f03fdcbb07b05db3863e179846f"},
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":15},
{"purpose":7,"dir":0,"lang_len":7,"mode":0,"group":0,"ruby":1,"ruby_start":0,"ruby_len":9,"str_len":3},
{"purpose":7,"dir":0,"lang_len":7,"mode":0,"group":0,"ruby":1,"ruby_start":9,"ruby_len":6,"str_len":2}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":5,"n_clusters":2,"t_on":0,"t_off":96000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":1,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":48000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":2,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":48000,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[2367,0,4096,17920],
[2361,0,4896,17920],
[2306,0,6416,17920],
[2342,0,6896,17920],
[2368,0,8776,17920],
[104,0,4096,9216],
[105,0,5216,9216],
[110,0,5696,9216],
[100,0,7680,9216],
[105,0,8800,9216]
],
"clusters":[
[3,0,0,9],
[2,0,9,6],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,0,1],
[1,0,1,1]
],
"strings":"hiहिंदीhi-Latnhinhi-Latndi",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,153 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":24000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":2,"n_tables":0,"n_paints":1,"n_texts":6,"n_tracks":0,"n_paths":0,"n_items":9,"n_keys":0,"n_glyphs":54,"n_clusters":52,"path_contours":0,"path_points":0,"strings_len":97,"inline_len":0,"held_len":165402,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":11169106}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"},
{"carriage":0,"zero@1":[0,0,0],"length":59879,"sha256":"2310ab64ddcf4d851d4d7c08bbce141fba178f03fdcbb07b05db3863e179846f"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":26},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":7},
{"purpose":7,"dir":1,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":8},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":18},
{"purpose":7,"dir":0,"lang_len":10,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":12}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":22,"n_clusters":22,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":1,"zero@10":0,"n_glyphs":1,"n_clusters":1,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":2,"zero@10":0,"n_glyphs":4,"n_clusters":4,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":3,"zero@10":0,"n_glyphs":4,"n_clusters":2,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":4,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":5,"zero@10":0,"n_glyphs":5,"n_clusters":5,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":5,"zero@10":0,"n_glyphs":6,"n_clusters":6,"t_on":0,"t_off":24000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[72,0,4096,9216],
[101,0,6696,9216],
[32,0,8856,9216],
[115,0,10056,9216],
[97,0,11936,9216],
[105,0,14096,9216],
[100,0,15056,9216],
[32,0,17296,9216],
[34,0,18496,9216],
[65,0,20016,9216],
[38,0,22576,9216],
[66,0,25176,9216],
[34,0,27676,9216],
[32,0,29196,9216],
[60,0,30396,9216],
[98,0,32596,9216],
[62,0,34836,9216],
[92,0,37036,9216],
[60,0,38636,9216],
[47,0,40836,9216],
[98,0,42436,9216],
[62,0,44676,9216],
[50,0,4096,15872],
[47,0,6336,15872],
[50,0,7936,15872],
[79,0,4096,22528],
[75,0,6936,22528],
[32,0,9336,22528],
[57345,0,10536,22528],
[1501,0,4096,29184],
[1493,0,6216,29184],
[1500,0,7416,29184],
[1513,0,9416,29184],
[2367,0,4096,42496],
[2361,0,4896,42496],
[57344,0,6896,42496],
[2368,0,9496,42496],
[90,0,4096,49152],
[100,0,6396,49152],
[114,0,8636,49152],
[97,0,10156,49152],
[118,0,12316,49152],
[111,0,14396,49152],
[115,0,4096,55808],
[111,0,5976,55808],
[102,0,8216,55808],
[116,0,9616,55808],
[45,0,11056,55808],
[104,0,4096,62464],
[121,0,6336,62464],
[112,0,8416,62464],
[104,0,10656,62464],
[101,0,12896,62464],
[110,0,15056,62464]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,16,1],
[1,0,17,1],
[1,0,18,1],
[1,0,19,1],
[1,0,20,1],
[1,0,21,1],
[1,0,23,1],
[1,0,24,1],
[1,0,25,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,4],
[1,0,6,2],
[1,0,4,2],
[1,0,2,2],
[1,0,0,2],
[2,0,0,6],
[2,0,6,12],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,0],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1]
],
"strings":"enHe said \"A&B\" <b>\\</b>\n2/2enOK 😀heשלוםhiहिन्दीsr-Latn-RSZdravoensoft­hyphen",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,91 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":240000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":2,"n_tracks":1,"n_paths":0,"n_items":2,"n_keys":3,"n_glyphs":25,"n_clusters":25,"path_contours":0,"path_points":0,"strings_len":29,"inline_len":0,"held_len":105523,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":2995585}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":3}
],
"keys":[
[0,255,0,[0,0,0]],
[72000,255,1,[0,0,0]],
[86400,0,0,[0,0,0]]
],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":1,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":13},
{"purpose":2,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":12}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":13,"n_clusters":13,"t_on":24000,"t_off":96000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":0,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":12,"n_clusters":12,"t_on":120000,"t_off":216000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[79,0,4096,9216],
[112,0,6936,9216],
[101,0,9176,9216],
[110,0,11336,9216],
[105,0,13576,9216],
[110,0,14536,9216],
[103,0,16776,9216],
[32,0,18976,9216],
[116,0,20176,9216],
[105,0,21616,9216],
[116,0,22576,9216],
[108,0,24016,9216],
[101,0,24976,9216],
[87,0,4096,15872],
[114,0,7496,15872],
[105,0,9016,15872],
[116,0,9976,15872],
[116,0,11416,15872],
[101,0,12856,15872],
[110,0,15016,15872],
[32,0,17256,15872],
[104,0,18456,15872],
[101,0,20696,15872],
[114,0,22856,15872],
[101,0,24376,15872]
],
"clusters":[
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1]
],
"strings":"enOpening titleenWritten here",
"inline":""
}

Binary file not shown.

View file

@ -0,0 +1,108 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":360000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":2,"n_tables":0,"n_paints":1,"n_texts":3,"n_tracks":0,"n_paths":0,"n_items":3,"n_keys":0,"n_glyphs":35,"n_clusters":35,"path_contours":0,"path_points":0,"strings_len":49,"inline_len":0,"held_len":165402,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":7393573}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":59879,"sha256":"2310ab64ddcf4d851d4d7c08bbce141fba178f03fdcbb07b05db3863e179846f"},
{"carriage":0,"zero@1":[0,0,0],"length":105523,"sha256":"05476c4658ef7366c7700736487eac4c3c1b7d21264978c7d05bd4c7427736c9"}
],
"tables":[],
"paints":[
[255,255,255,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":3,"dir":1,"lang_len":2,"mode":0,"group":1,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":17},
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":1,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":23},
{"purpose":7,"dir":0,"lang_len":2,"mode":0,"group":1,"ruby":2,"ruby_start":0,"ruby_len":8,"str_len":3}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":9,"n_clusters":9,"t_on":24000,"t_off":264000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":1,"zero@10":0,"n_glyphs":23,"n_clusters":23,"t_on":24000,"t_off":264000,"unit_scale":131072,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":2,"zero@10":0,"n_glyphs":3,"n_clusters":3,"t_on":24000,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[65174,0,4096,69120],
[65268,0,6016,69120],
[65170,0,7056,69120],
[65247,0,8096,69120],
[65165,0,9136,69120],
[32,0,10096,69120],
[65167,0,11296,69120],
[65166,0,13216,69120],
[65169,0,14176,69120],
[68,0,4096,82432],
[105,0,6696,82432],
[114,0,7656,82432],
[101,0,9176,82432],
[99,0,11336,82432],
[116,0,13336,82432],
[111,0,14776,82432],
[114,0,17016,82432],
[32,0,18536,82432],
[111,0,19736,82432],
[102,0,21976,82432],
[32,0,23376,82432],
[112,0,24576,82432],
[104,0,26816,82432],
[111,0,29056,82432],
[116,0,31296,82432],
[111,0,32736,82432],
[103,0,34976,82432],
[114,0,37176,82432],
[97,0,38696,82432],
[112,0,40856,82432],
[104,0,43096,82432],
[121,0,45336,82432],
[68,0,4096,74752],
[79,0,5396,74752],
[80,0,6816,74752]
],
"clusters":[
[1,0,15,2],
[1,0,13,2],
[1,0,11,2],
[1,0,9,2],
[1,0,7,2],
[1,0,6,1],
[1,0,4,2],
[1,0,2,2],
[1,0,0,2],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1],
[1,0,3,1],
[1,0,4,1],
[1,0,5,1],
[1,0,6,1],
[1,0,7,1],
[1,0,8,1],
[1,0,9,1],
[1,0,10,1],
[1,0,11,1],
[1,0,12,1],
[1,0,13,1],
[1,0,14,1],
[1,0,15,1],
[1,0,16,1],
[1,0,17,1],
[1,0,18,1],
[1,0,19,1],
[1,0,20,1],
[1,0,21,1],
[1,0,22,1],
[1,0,0,1],
[1,0,1,1],
[1,0,2,1]
],
"strings":"arباب البيتenDirector of photographyenDOP",
"inline":""
}

View file

@ -0,0 +1,43 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":3,"n_tracks":0,"n_paths":0,"n_items":3,"n_keys":0,"n_glyphs":3,"n_clusters":3,"path_contours":0,"path_points":0,"strings_len":9,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":245472}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[],
"paints":[
[30,60,200,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":1,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":1},
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":1},
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":2,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":1}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":1,"n_clusters":1,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":1,"n_clusters":1,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":2,"zero@10":0,"n_glyphs":1,"n_clusters":1,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,5000,10000],
[1,0,5000,15000],
[1,0,5000,20000]
],
"clusters":[
[1,0,0,1],
[1,0,0,1],
[1,0,0,1]
],
"strings":"enAenAenA",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -11,6 +11,7 @@
"group-split-by-ungrouped":"rule 4: groups [1, 0, 1] -> payload_malformed",
"groups":"groups nested four deep, clips under both rules, translations and opacities on groups: accepted",
"groups-in-order":"rule 4: group numbers in order of first use, each group contiguous: accepted",
"groups-with-ungrouped":"rule 4: groups [1, 0, 2], an ungrouped block between two groups: accepted",
"held":"a run from a held set, obtained by its SHA-256 and exact length: accepted",
"minimal":"one path fill, the smallest payload: accepted",
"paint-duplicate":"rule 3: two equal paints -> payload_malformed",
@ -19,9 +20,12 @@
"path-alternative-decorative":"step 5(h): a path whose text alternative is a decorative block -> payload_malformed",
"path-duplicate":"rule 3: two paths with equal records, ends and points -> payload_malformed",
"ruby":"rule 4: a ruby block annotating the first character of an earlier block: accepted",
"ruby-ends-mid-character":"rule 4: a ruby range ending inside a character -> payload_malformed",
"ruby-mid-character":"rule 4: a ruby range starting inside a character -> payload_malformed",
"ruby-names-itself":"rule 4: a ruby link to its own block -> payload_malformed",
"ruby-names-later":"rule 4: a ruby link to a later block -> payload_malformed",
"ruby-past-string":"rule 4: a ruby range past the base block's string -> payload_malformed",
"ruby-to-string-end":"rule 4: a ruby range that starts inside the base block's string, on a character boundary, and ends where the string ends: accepted",
"set-duplicate":"rule 3: two sets with one SHA-256 -> payload_malformed",
"shared":"one path, one paint and one track each used by several items, each pool holding an entry once, in first-reference order: accepted",
"sizes-rates":"five sizes from 1/8 to 4 times the design width and four rates, each ascending: accepted",

View file

@ -0,0 +1,43 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":2,"n_tracks":0,"n_paths":0,"n_items":2,"n_keys":0,"n_glyphs":4,"n_clusters":4,"path_contours":0,"path_points":0,"strings_len":16,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":258277}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[],
"paints":[
[30,60,200,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":5,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6},
{"purpose":6,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":1,"ruby_start":0,"ruby_len":4,"str_len":6}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":196608,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[2,0,0,9000],
[3,0,9000,9000],
[5,0,0,3000],
[5,0,4000,3000]
],
"clusters":[
[1,0,0,3],
[1,0,3,3],
[1,0,0,3],
[1,0,3,3]
],
"strings":"ja漢字jaかん",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -0,0 +1,43 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":2,"n_tracks":0,"n_paths":0,"n_items":2,"n_keys":0,"n_glyphs":4,"n_clusters":4,"path_contours":0,"path_points":0,"strings_len":16,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":258277}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[],
"paints":[
[30,60,200,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":5,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":2,"ruby_start":0,"ruby_len":3,"str_len":6},
{"purpose":6,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":196608,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[2,0,0,9000],
[3,0,9000,9000],
[5,0,0,3000],
[5,0,4000,3000]
],
"clusters":[
[1,0,0,3],
[1,0,3,3],
[1,0,0,3],
[1,0,3,3]
],
"strings":"ja漢字jaかん",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -0,0 +1,43 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":0,"n_paints":1,"n_texts":2,"n_tracks":0,"n_paths":0,"n_items":2,"n_keys":0,"n_glyphs":4,"n_clusters":4,"path_contours":0,"path_points":0,"strings_len":16,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":258277}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[],
"paints":[
[30,60,200,255]
],
"tracks":[],
"keys":[],
"paths":[],
"path_ends":[],
"path_points":[],
"texts":[
{"purpose":5,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":6},
{"purpose":6,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":1,"ruby_start":3,"ruby_len":3,"str_len":6}
],
"items":[
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":1,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":196608,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[2,0,0,9000],
[3,0,9000,9000],
[5,0,0,3000],
[5,0,4000,3000]
],
"clusters":[
[1,0,0,3],
[1,0,3,3],
[1,0,0,3],
[1,0,3,3]
],
"strings":"ja漢字jaかん",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -76,6 +76,7 @@
"s4-n-rates-zero":"step 4: n_rates = 0 -> field_range",
"s4-n-sizes-zero":"step 4: n_sizes = 0 -> field_range",
"s4-paint-over-alpha":"PAINT r > a -> field_range",
"s4-path-before-text":"pair: a PATH zero field and TEXT.purpose = 0 -> payload_malformed (tables in file order: PATHS before TEXTS)",
"s4-path-contours-over-points":"PATH.n_contours above n_points -> field_range",
"s4-path-n-contours-zero":"PATH.n_contours = 0 -> field_range",
"s4-path-n-points-zero":"PATH.n_points = 0 -> field_range",
@ -107,11 +108,13 @@
"s4-tb-not-divisible":"step 4, the header: tb = 119,999 (a header value in range; the RATE's P is not an integer) -> field_range at RATE.den",
"s4-tb-over":"step 4, the header: tb = 2^20 + 1 -> field_range",
"s4-tb-zero":"step 4, the header: tb = 0 -> field_range",
"s4-text-before-item":"pair: TEXT.mode = 3 and an ITEM zero field -> field_range (tables in file order: TEXTS before ITEMS)",
"s4-text-dir":"TEXT.dir = 2 -> field_range",
"s4-text-lang-len-over":"TEXT.lang_len = 64 -> field_range",
"s4-text-lang-len-zero":"TEXT.lang_len = 0 -> field_range",
"s4-text-mode":"TEXT.mode = 3 -> field_range",
"s4-text-purpose-zero":"TEXT.purpose = 0 -> field_range",
"s4-text-ruby-len-no-ruby":"TEXT.ruby_len = 1 with no ruby -> field_range",
"s4-text-ruby-len-zero":"TEXT ruby set with ruby_len = 0 -> field_range",
"s4-text-ruby-over":"TEXT.ruby above n_texts -> field_range",
"s4-text-ruby-start":"TEXT.ruby_start with no ruby -> field_range",
@ -141,6 +144,7 @@
"s5c-slot-kind":"5(c): a matrix slot naming an opacity track -> field_range",
"s5c-translation-key":"5(c): a translation key of 2^22 + 1 -> field_range",
"s5c-typing-before-groups":"pair: an opacity key of 256 and a group left open -> field_range (5(c) before 5(d))",
"s5c-typing-before-strings":"pair: an opacity key of 256 and a language tag with a leading hyphen -> field_range (5(c) before 5(f))",
"s5d-depth-five":"5(d): groups nested five deep -> payload_malformed",
"s5d-end-first":"5(d): a group end with no group open -> payload_malformed",
"s5d-open":"5(d): a group open after the last item -> payload_malformed",
@ -160,6 +164,8 @@
"s5f-tag-leading-hyphen":"5(f): a language tag with a leading hyphen -> payload_malformed",
"s5f-tag-trailing-hyphen":"5(f): a trailing hyphen -> payload_malformed",
"s5f-tag-underscore":"5(f): an underscore -> payload_malformed",
"s5g-block-before-sets":"pair: a block no run or path names, and a held set the sink cannot obtain -> payload_malformed (5(g) before 6)",
"s5h-decorative-before-sets":"pair: a path whose text alternative is a decorative block, and a held set the sink cannot obtain -> payload_malformed (5(h) before 6)",
"s6-held-malformed":"6: a held set that hashes right and is not a valid WOS1 -> outline_malformed",
"s6-held-not-held":"6: a held set the sink cannot obtain -> outline_not_held",
"s6-held-one-byte-longer":"6: a held set one byte longer than its length; the sink reads at most length + 1 bytes -> outline_mismatch",

View file

@ -0,0 +1,64 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":1,"n_paints":2,"n_texts":1,"n_tracks":3,"n_paths":2,"n_items":4,"n_keys":4,"n_glyphs":2,"n_clusters":2,"path_contours":2,"path_points":8,"strings_len":4,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":498549}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[
[0,100,400,900,1600,2500,3600,4900,6400,8100,10000,12100,14400,16900,19600,40000,65536]
],
"paints":[
[200,30,30,255],
[30,60,200,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":2},
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":3,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,0,2,[0,0,0]],
[120000,2560,0,[0,0,0]],
[0,200,0,[0,0,0]],
[0,65536,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":25600,"ymax":25600},
{"n_contours":1,"n_points":4,"zero@4":1,"xmin":256,"ymin":256,"xmax":5120,"ymax":5120}
],
"path_ends":[3,3],
"path_points":[
[0,0,0],
[25600,0,0],
[25600,25600,0],
[0,25600,0],
[256,256,0],
[5120,256,0],
[5120,5120,0],
[256,5120,0]
],
"texts":[
{"purpose":0,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":2}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":0,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":1,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":2,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":1,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,6000,20000],
[3,0,10096,20000]
],
"clusters":[
[1,0,0,1],
[1,0,1,1]
],
"strings":"enAB",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -0,0 +1,64 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":1,"n_paints":2,"n_texts":1,"n_tracks":3,"n_paths":2,"n_items":4,"n_keys":4,"n_glyphs":2,"n_clusters":2,"path_contours":2,"path_points":8,"strings_len":4,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":498549}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[
[0,100,400,900,1600,2500,3600,4900,6400,8100,10000,12100,14400,16900,19600,40000,65536]
],
"paints":[
[200,30,30,255],
[30,60,200,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":2},
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":3,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,0,2,[0,0,0]],
[120000,2560,0,[0,0,0]],
[0,200,0,[0,0,0]],
[0,65536,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":25600,"ymax":25600},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":256,"ymin":256,"xmax":5120,"ymax":5120}
],
"path_ends":[3,3],
"path_points":[
[0,0,0],
[25600,0,0],
[25600,25600,0],
[0,25600,0],
[256,256,0],
[5120,256,0],
[5120,5120,0],
[256,5120,0]
],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":3,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":2}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":0,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":1,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":1,"ref":1,"paint":0,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":2,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":1,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,6000,20000],
[3,0,10096,20000]
],
"clusters":[
[1,0,0,1],
[1,0,1,1]
],
"strings":"enAB",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -0,0 +1,64 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":1,"n_paints":2,"n_texts":1,"n_tracks":3,"n_paths":2,"n_items":4,"n_keys":4,"n_glyphs":2,"n_clusters":2,"path_contours":2,"path_points":8,"strings_len":4,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":498549}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[
[0,100,400,900,1600,2500,3600,4900,6400,8100,10000,12100,14400,16900,19600,40000,65536]
],
"paints":[
[200,30,30,255],
[30,60,200,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":2},
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":3,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,0,2,[0,0,0]],
[120000,2560,0,[0,0,0]],
[0,200,0,[0,0,0]],
[0,65536,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":25600,"ymax":25600},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":256,"ymin":256,"xmax":5120,"ymax":5120}
],
"path_ends":[3,3],
"path_points":[
[0,0,0],
[25600,0,0],
[25600,25600,0],
[0,25600,0],
[256,256,0],
[5120,256,0],
[5120,5120,0],
[256,5120,0]
],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":1,"str_len":2}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":0,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":1,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":2,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":1,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,6000,20000],
[3,0,10096,20000]
],
"clusters":[
[1,0,0,1],
[1,0,1,1]
],
"strings":"enAB",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -0,0 +1,64 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":1,"n_paints":2,"n_texts":1,"n_tracks":3,"n_paths":2,"n_items":4,"n_keys":4,"n_glyphs":2,"n_clusters":2,"path_contours":2,"path_points":8,"strings_len":5,"inline_len":554,"held_len":0,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":498549}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":1,"zero@1":[0,0,0],"length":554,"sha256":"6b368f6c7be1d26780df1299e2842791f9a34de167ec7bd655f4dd1564e3d9fd"}
],
"tables":[
[0,100,400,900,1600,2500,3600,4900,6400,8100,10000,12100,14400,16900,19600,40000,65536]
],
"paints":[
[200,30,30,255],
[30,60,200,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":2},
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":3,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,0,2,[0,0,0]],
[120000,2560,0,[0,0,0]],
[0,256,0,[0,0,0]],
[0,65536,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":25600,"ymax":25600},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":256,"ymin":256,"xmax":5120,"ymax":5120}
],
"path_ends":[3,3],
"path_points":[
[0,0,0],
[25600,0,0],
[25600,25600,0],
[0,25600,0],
[256,256,0],
[5120,256,0],
[5120,5120,0],
[256,5120,0]
],
"texts":[
{"purpose":3,"dir":0,"lang_len":3,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":2}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":0,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":1,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":2,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":1,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,6000,20000],
[3,0,10096,20000]
],
"clusters":[
[1,0,0,1],
[1,0,1,1]
],
"strings":"-enAB",
"inline":"574f53310100000000080000080000002100000008000000d500000000000000000000000000000000000000000000000100010004000000640088faf40100000200020008000000640088fa4c0400000300010008000000640088fa4c0400000400010005000000640088fa4c0400000500010003000000640088fa4c040000060001000100000000000000000000000900010004000000000088fad0070000030003000700070004000200000003006400000000f401000000f40188fa00640088fa0064000000004c040000004c0488fa00640088fa002c0138ff002c0150fb00840350fb00840338ff0058020000004c040000014c0444fd004c0488fa01580288fa00640088fa01640044fd006400000001640000000090017cfc0220030cfe024c0488fa004c0400000064000000004c04000000580288fa0000000000000000000000d007000000d00788fa00000088fa006e616d653d73796e7468657469632d610a736f757263653d67656e657261746564206279207761692d766563746f7220766563746f72732067656e2066726f6d20666f726d756c61730a6c6963656e63653d4170616368652d322e300a0a54686973206f75746c696e6520736574207761732067656e65726174656420696e2074686973207265706f7369746f72792066726f6d20666f726d756c61732e204974206973206c6963656e73656420756e6465722074686520417061636865204c6963656e73652c2056657273696f6e20322e302e0a"
}

View file

@ -0,0 +1,65 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":1,"n_paints":2,"n_texts":2,"n_tracks":3,"n_paths":2,"n_items":4,"n_keys":4,"n_glyphs":2,"n_clusters":2,"path_contours":2,"path_points":8,"strings_len":7,"inline_len":0,"held_len":40,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":498549}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":40,"sha256":"22b94c8c4fa46c25e33acb82f6071fa66e39381e35c18faf635257340879c8e8"}
],
"tables":[
[0,100,400,900,1600,2500,3600,4900,6400,8100,10000,12100,14400,16900,19600,40000,65536]
],
"paints":[
[200,30,30,255],
[30,60,200,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":2},
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":3,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,0,2,[0,0,0]],
[120000,2560,0,[0,0,0]],
[0,200,0,[0,0,0]],
[0,65536,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":25600,"ymax":25600},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":256,"ymin":256,"xmax":5120,"ymax":5120}
],
"path_ends":[3,3],
"path_points":[
[0,0,0],
[25600,0,0],
[25600,25600,0],
[0,25600,0],
[256,256,0],
[5120,256,0],
[5120,5120,0],
[256,5120,0]
],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":2},
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":1}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":0,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":1,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":2,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":1,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,6000,20000],
[3,0,10096,20000]
],
"clusters":[
[1,0,0,1],
[1,0,1,1]
],
"strings":"enABenC",
"inline":""
}

View file

@ -0,0 +1,65 @@
{
"header":{"magic":"WVG1","format":1,"tb":120000,"t0":0,"dur":120000,"design_w":640,"design_h":360,"n_sizes":1,"n_rates":1,"n_sets":1,"n_tables":1,"n_paints":2,"n_texts":2,"n_tracks":3,"n_paths":2,"n_items":4,"n_keys":4,"n_glyphs":2,"n_clusters":2,"path_contours":2,"path_points":8,"strings_len":7,"inline_len":0,"held_len":40,"zero@72":[0,0,0,0,0,0,0,0]},
"sizes":[
{"w":640,"h":360,"cost":498549}
],
"rates":[
{"num":25,"den":1}
],
"sets":[
{"carriage":0,"zero@1":[0,0,0],"length":40,"sha256":"22b94c8c4fa46c25e33acb82f6071fa66e39381e35c18faf635257340879c8e8"}
],
"tables":[
[0,100,400,900,1600,2500,3600,4900,6400,8100,10000,12100,14400,16900,19600,40000,65536]
],
"paints":[
[200,30,30,255],
[30,60,200,255]
],
"tracks":[
{"kind":2,"zero@1":0,"zero@2":0,"n_keys":2},
{"kind":1,"zero@1":0,"zero@2":0,"n_keys":1},
{"kind":3,"zero@1":0,"zero@2":0,"n_keys":1}
],
"keys":[
[0,0,2,[0,0,0]],
[120000,2560,0,[0,0,0]],
[0,200,0,[0,0,0]],
[0,65536,0,[0,0,0]]
],
"paths":[
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":0,"ymin":0,"xmax":25600,"ymax":25600},
{"n_contours":1,"n_points":4,"zero@4":0,"xmin":256,"ymin":256,"xmax":5120,"ymax":5120}
],
"path_ends":[3,3],
"path_points":[
[0,0,0],
[25600,0,0],
[25600,25600,0],
[0,25600,0],
[256,256,0],
[5120,256,0],
[5120,5120,0],
[256,5120,0]
],
"texts":[
{"purpose":3,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":2},
{"purpose":13,"dir":0,"lang_len":2,"mode":0,"group":0,"ruby":0,"ruby_start":0,"ruby_len":0,"str_len":1}
],
"items":[
{"kind":0,"rule":0,"zero@2":0,"ref":0,"paint":65535,"text":65535,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":0,"ty":65535,"op":1,"zero@42":[0,0,0,0,0,0]},
{"kind":2,"rule":0,"zero@2":0,"ref":1,"paint":0,"text":1,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":120000,"unit_scale":65536,"m00":2,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":3,"rule":0,"zero@2":0,"ref":0,"paint":1,"text":0,"zero@10":0,"n_glyphs":2,"n_clusters":2,"t_on":0,"t_off":120000,"unit_scale":393216,"m00":65535,"m01":65535,"m10":65535,"m11":65535,"tx":65535,"ty":65535,"op":65535,"zero@42":[0,0,0,0,0,0]},
{"kind":1,"rule":0,"zero@2":0,"ref":0,"paint":0,"text":0,"zero@10":0,"n_glyphs":0,"n_clusters":0,"t_on":0,"t_off":0,"unit_scale":0,"m00":0,"m01":0,"m10":0,"m11":0,"tx":0,"ty":0,"op":0,"zero@42":[0,0,0,0,0,0]}
],
"glyphs":[
[1,0,6000,20000],
[3,0,10096,20000]
],
"clusters":[
[1,0,0,1],
[1,0,1,1]
],
"strings":"enABen*",
"inline":""
}

View file

@ -1,7 +1,7 @@
# The reference implementation of `wai.graphics.vector`
# (`extensions/graphics-vector.md`): the `WOS1` and `WVG1` formats with their
# refusal order (§2), the arithmetic of §3, and the conformance vectors of
# `../vector-conformance/`.
# refusal order (§2), the arithmetic of §3, the text layer of §5 (the projection and
# the transcript), and the conformance vectors of `../vector-conformance/`.
#
# `no_std` with `alloc`, and no dependencies, so that a model checker can include
# its sources by `#[path]` the way `wai-verify` includes the other integer sources.

60
wai/wai-vector/browser/package-lock.json generated Normal file
View file

@ -0,0 +1,60 @@
{
"name": "wai-vector-browser",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "wai-vector-browser",
"version": "0.1.0",
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.60.0"
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/playwright": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz",
"integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==",
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.60.0"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/playwright-core": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz",
"integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==",
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
}
}
}

View file

@ -0,0 +1,14 @@
{
"name": "wai-vector-browser",
"version": "0.1.0",
"private": true,
"description": "The sink of wai.graphics.vector in three browser engines, against wai/vector-conformance",
"license": "Apache-2.0",
"type": "module",
"scripts": {
"test": "node run.mjs --engines chromium,webkit,firefox ../../vector-conformance"
},
"dependencies": {
"playwright": "1.60.0"
}
}

View file

@ -0,0 +1,230 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>wai-vector in this engine</title>
</head>
<body>
<p id="state">loading</p>
<script type="module">
// The sink of wai.graphics.vector in this page's engine. run.mjs serves this page,
// the two modules and the corpus, and drives it; nothing here draws to a canvas.
//
// /pkg/wai_vector.wasm the package: the sink's exports alone, WebAssembly 1.0
// /recompute.wasm the recomputation of the conformance vectors
// /corpus/… wai/vector-conformance
// POST /frame/<id> a frame's bytes, for run.mjs to hash for itself
//
// window.__wai_overlay is the hook a page gives its tests: frame(size, rate, g)
// returns the renderer's own buffer, RGBA8P, copied out of the module's memory, and
// transcript() and projection(rate, g) return the sink's own JSON.
// window.__wai_harness is what run.mjs calls. window.__wai_ready settles when both
// exist.
const u32 = (v) => v >>> 0;
const hex = (b) => Array.from(b, (v) => v.toString(16).padStart(2, '0')).join('');
const text = (b) => new TextDecoder().decode(b);
// The sink's JSON as a string, losing nothing: bytes that are not UTF-8 throw, and a
// leading U+FEFF is kept, so the string encodes back to the same bytes.
const json = (b) => new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(b);
const utf8 = (s) => new TextEncoder().encode(s);
async function bytesAt(url) {
const r = await fetch(url);
if (!r.ok) throw new Error(`${url}: HTTP ${r.status}`);
return new Uint8Array(await r.arrayBuffer());
}
// A module's exports, over byte arrays. The module imports nothing. Its memory moves
// when it grows, so no view of it outlives the call that made it.
async function moduleAt(url) {
const { instance } = await WebAssembly.instantiate(await bytesAt(url), {});
const x = instance.exports;
const put = (b) => {
const p = u32(x.wv_alloc(b.length));
new Uint8Array(x.memory.buffer, p, b.length).set(b);
return p;
};
return {
x,
put,
// The output of the last call, copied.
out: () => new Uint8Array(x.memory.buffer, u32(x.wv_out_ptr()), u32(x.wv_out_len())).slice(),
// f(pointer, length) over a copy of b in the module's memory, freed afterwards.
over(b, f) {
const p = put(b);
try {
return f(p, b.length);
} finally {
x.wv_free(p, b.length);
}
},
};
}
// The hook, over the package. One payload is open at a time.
function overlay(m) {
let handle = 0;
const refused = (status) => {
const code = status === 1 ? text(m.out()) : 'no_payload_open';
return Object.assign(new Error(code), { code });
};
return {
// Hold an outline set a payload may name.
addSet(bytes) {
m.over(bytes, (p, n) => m.x.wv_add_set(p, n));
},
// Open a payload; the one open before it is closed. Returns 'accepted', or the
// refusal's code.
open(bytes) {
if (handle !== 0) m.x.wv_close(handle);
handle = u32(m.over(bytes, (p, n) => m.x.wv_open(p, n)));
return handle !== 0 ? 'accepted' : text(m.out());
},
// Frame g at the size [w, h] and the rate [num, den]: RGBA8P, 4·w·h bytes. A
// request the payload does not list throws an Error whose code names why.
frame(size, rate, g) {
if (!Number.isSafeInteger(g) || g < 0) throw new RangeError(`frame ${g}`);
const status = m.x.wv_render(handle, size[0], size[1], rate[0], rate[1], g % 4294967296, Math.floor(g / 4294967296));
if (status !== 0) throw refused(status);
return m.out();
},
// The per-frame cost the payload states for the size [w, h].
cost(size) {
const status = m.x.wv_cost(handle, size[0], size[1]);
if (status !== 0) throw refused(status);
return Number(text(m.out()));
},
// The transcript: every block that is not decorative, with the ticks over which
// it is active, as the sink's JSON.
transcript() {
const status = m.x.wv_transcript(handle);
if (status !== 0) throw refused(status);
return json(m.out());
},
// The projection at frame g of the rate [num, den]: the blocks active at that
// frame, as the sink's JSON. A request the payload does not list throws an Error
// whose code names why.
projection(rate, g) {
if (!Number.isSafeInteger(g) || g < 0) throw new RangeError(`frame ${g}`);
const status = m.x.wv_projection(handle, rate[0], rate[1], g % 4294967296, Math.floor(g / 4294967296));
if (status !== 0) throw refused(status);
return json(m.out());
},
// SHA-256, computed in the module.
sha256(bytes) {
m.over(bytes, (p, n) => m.x.wv_sha256(p, n));
return m.out();
},
};
}
window.__wai_ready = (async () => {
const [pkg, rec] = await Promise.all([moduleAt('/pkg/wai_vector.wasm'), moduleAt('/recompute.wasm')]);
const hook = overlay(pkg);
window.__wai_overlay = hook;
const harness = {
// Every set under sets/, held by both modules.
async sets(names) {
for (const name of names) {
const b = await bytesAt(`/corpus/sets/${encodeURIComponent(name)}`);
window.__wai_overlay.addSet(b);
rec.over(b, (p, n) => rec.x.wv_add_set(p, n));
}
},
// Two SHA-256 digests of the same bytes: the module's, and the platform's.
async digests(bytes) {
if (!globalThis.crypto || !crypto.subtle) throw new Error('this page has no platform digest (crypto.subtle)');
const inModule = hex(window.__wai_overlay.sha256(bytes));
const platform = hex(new Uint8Array(await crypto.subtle.digest('SHA-256', bytes)));
return { inModule, platform };
},
// One frame through the hook, with its two digests.
async check(size, rate, g) {
const bytes = window.__wai_overlay.frame(size, rate, g);
return { bytes, ...(await this.digests(bytes)) };
},
// Hand a frame's bytes to run.mjs.
async send(id, bytes) {
const r = await fetch(`/frame/${id}`, { method: 'POST', headers: { 'content-type': 'application/octet-stream' }, body: bytes });
if (!r.ok) throw new Error(`/frame/${id}: HTTP ${r.status}`);
},
// One payload through the package, by plan:
// sizes [[w, h], …] each one's cost is asked
// frames [{ size, rate, g, send }, …] each rendered and hashed twice;
// sent when `send` is an id
// requests [{ size, rate, g }, …] requests expected to be refused
// text null, or { projections: [{ rate, g }, …], requests: [{ rate, g }, …] }:
// the transcript, each projection, and requests expected to be refused
async payload(path, plan) {
const bytes = await bytesAt(`/corpus/${path}`);
const r = { instr: await this.digests(bytes), code: window.__wai_overlay.open(bytes), costs: [], frames: [], requests: [], text: null };
if (r.code !== 'accepted') return r;
for (const size of plan.sizes) r.costs.push(window.__wai_overlay.cost(size));
for (const f of plan.frames) {
const c = await this.check(f.size, f.rate, f.g);
if (f.send !== null) await this.send(f.send, c.bytes);
r.frames.push({ bytes: c.bytes.length, inModule: c.inModule, platform: c.platform });
}
for (const q of plan.requests) {
try {
window.__wai_overlay.frame(q.size, q.rate, q.g);
r.requests.push('rendered');
} catch (e) {
r.requests.push(e.code || String(e));
}
}
if (plan.text !== null) {
const t = { transcript: window.__wai_overlay.transcript(), projections: [], requests: [] };
for (const q of plan.text.projections) t.projections.push(window.__wai_overlay.projection(q.rate, q.g));
for (const q of plan.text.requests) {
try {
window.__wai_overlay.projection(q.rate, q.g);
t.requests.push('projected');
} catch (e) {
t.requests.push(e.code || String(e));
}
}
r.text = t;
}
return r;
},
// One vector through the recomputation: its expected file, and for a payload its
// authoring form.
async recompute(group, name, ext) {
const data = await bytesAt(`/corpus/vectors/${group}/${encodeURIComponent(name)}.${ext}`);
const [g, e] = [utf8(group), utf8(ext)];
const [pg, pe, pd] = [rec.put(g), rec.put(e), rec.put(data)];
try {
const status = rec.x.wv_recompute(pg, g.length, pe, e.length, pd, data.length);
const r = { status, expected: text(rec.out()), form: null };
if (ext === 'wvg1') {
rec.x.wv_form(pd, data.length);
r.form = text(rec.out());
}
return r;
} finally {
rec.x.wv_free(pg, g.length);
rec.x.wv_free(pe, e.length);
rec.x.wv_free(pd, data.length);
}
},
};
window.__wai_harness = harness;
document.getElementById('state').textContent = 'ready';
return {
package: Object.keys(pkg.x).sort(),
recompute: Object.keys(rec.x).sort(),
platformDigest: Boolean(globalThis.crypto && crypto.subtle),
};
})();
</script>
</body>
</html>

View file

@ -0,0 +1,439 @@
// The sink of wai.graphics.vector in three browser engines, against
// wai/vector-conformance.
//
// node run.mjs --engines chromium,webkit,firefox [--pkg <dir>] [--recompute <module.wasm>]
// <vector-conformance dir>
//
// It serves page.html, the two modules and the corpus from a local server, launches
// each engine named, and in each one:
//
// 1. Through the package (<pkg dir>/wai_vector.wasm, which wasm/build-pkg.sh builds),
// every payload of the corpus:
// - it loads to the expected file's code: accepted, or the first refusal;
// - an accepted payload's SHA-256 is the expected `instr`, and each listed
// size's cost is the expected one;
// - in the groups that render, frames come through the page's hook,
// window.__wai_overlay.frame(size, rate, g), which returns the renderer's own
// buffer: every listed frame at sizes up to 1280 x 720, and at larger sizes the
// sampled frames. The page hashes each frame twice, with the module's SHA-256
// and with the platform's digest, and both must be the expected digest;
// - the sampled frames (the first, the last, the middle one, and the frames on
// each side of every key tick and of every item's window edges) are also sent
// here as bytes, and Node hashes them itself: the run does not rest on a hash
// the page computed;
// - a frame outside the range, a frame number above 2^32, an unlisted size and
// an unlisted rate are each refused with their code;
// - where the expected file states a text record, the sink's transcript and its
// projection at every frame of every listed rate, written out as the record's
// lines, are the committed <name>.a11y.jsonl byte for byte; and a projection
// outside the range or at an unlisted rate is refused with its code.
// 2. Through the recomputation module (the build verify.mjs runs under Node), every
// vector's expected file and every payload's authoring form, byte for byte.
//
// A missing engine is a failure, never a skip: the run passes only when chromium,
// webkit and firefox each ran and passed. --engines says which to launch; any of the
// three left out, or that cannot launch, fails the run.
//
// Nothing is read from a canvas, and nothing waits for a length of time.
//
// --lying-page is for testing this script. The page then changes one byte of every
// frame and reports the expected digest as both of its hashes; Node's own hash of the
// bytes sent must report every frame it was sent. A run with it never passes.
//
// Exit status 0: all three engines pass; 1: a failure; 2: usage.
import { createHash } from 'node:crypto';
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
import { createServer } from 'node:http';
import { dirname, join, resolve, sep } from 'node:path';
import { fileURLToPath } from 'node:url';
const HERE = dirname(fileURLToPath(import.meta.url));
const REQUIRED = ['chromium', 'webkit', 'firefox'];
// The groups whose vectors are arithmetic inputs, not payloads or outline sets.
const INPUT_GROUPS = ['arith', 'flatten'];
// Every listed frame is rendered at sizes up to this many pixels; sampled frames above.
const FULL = 1280 * 720;
function usage(why) {
if (why) console.error(`run.mjs: ${why}`);
console.error('usage: node run.mjs --engines chromium,webkit,firefox [--pkg <dir>] [--recompute <module.wasm>] <vector-conformance dir>');
process.exit(2);
}
let engines = null, pkgDir = join(HERE, '..', 'wasm', 'dist', 'pkg-vector');
let recomputePath = join(HERE, '..', 'wasm', 'target', 'wasm32-unknown-unknown', 'release', 'wai_vector_wasm.wasm');
let root = null, lying = false;
for (let a = process.argv.slice(2), i = 0; i < a.length; i++) {
if (a[i] === '--engines' && i + 1 < a.length) engines = [...new Set(a[++i].split(',').filter(Boolean))];
else if (a[i] === '--pkg' && i + 1 < a.length) pkgDir = a[++i];
else if (a[i] === '--recompute' && i + 1 < a.length) recomputePath = a[++i];
else if (a[i] === '--lying-page') lying = true;
else if (!a[i].startsWith('--') && root === null) root = a[i];
else usage(`unexpected argument ${a[i]}`);
}
if (engines === null || engines.length === 0) usage('--engines is required');
if (root === null) usage('the vector-conformance directory is required');
for (const e of engines) if (!REQUIRED.includes(e)) usage(`no engine named ${e}`);
root = resolve(root);
const pkgPath = resolve(pkgDir, 'wai_vector.wasm');
recomputePath = resolve(recomputePath);
const pagePath = join(HERE, 'page.html');
const sha256 = (b) => createHash('sha256').update(b).digest('hex');
const firstLine = (s) => String(s).split('\n')[0];
const failuresOf = (n) => `${n} failure${n === 1 ? '' : 's'}`;
for (const [what, p] of [['the package', pkgPath], ['the recomputation module', recomputePath], ['the corpus', join(root, 'vectors')]]) {
if (!existsSync(p)) {
console.error(`run.mjs: ${what} is not at ${p}`);
process.exit(1);
}
}
console.log(`the package: ${pkgPath}, ${statSync(pkgPath).size} bytes, SHA-256 ${sha256(readFileSync(pkgPath))}`);
console.log(`the recomputation module: ${recomputePath}, ${statSync(recomputePath).size} bytes, SHA-256 ${sha256(readFileSync(recomputePath))}`);
// ---- the server ---------------------------------------------------------------------
// The frames the page sent: id -> what Node read, hashed here.
const received = new Map();
function fileFor(path) {
if (path === '/' || path === '/page.html') return [pagePath, 'text/html; charset=utf-8'];
if (path === '/pkg/wai_vector.wasm') return [pkgPath, 'application/wasm'];
if (path === '/recompute.wasm') return [recomputePath, 'application/wasm'];
if (path.startsWith('/corpus/')) {
const f = resolve(root, path.slice('/corpus/'.length));
if (f.startsWith(root + sep)) return [f, 'application/octet-stream'];
}
return null;
}
const server = createServer((req, res) => {
let path;
try {
path = decodeURIComponent(new URL(req.url, 'http://localhost').pathname);
} catch {
res.writeHead(400).end();
return;
}
if (req.method === 'POST' && path.startsWith('/frame/')) {
const h = createHash('sha256');
let bytes = 0;
req.on('data', (d) => { h.update(d); bytes += d.length; });
req.on('end', () => {
received.set(path.slice('/frame/'.length), { sha256: h.digest('hex'), bytes });
res.writeHead(204).end();
});
return;
}
const f = req.method === 'GET' ? fileFor(path) : null;
if (f === null || !existsSync(f[0]) || !statSync(f[0]).isFile()) {
res.writeHead(404).end();
return;
}
const body = readFileSync(f[0]);
res.writeHead(200, { 'content-type': f[1], 'content-length': body.length, 'cache-control': 'no-store' }).end(body);
});
await new Promise((ok) => server.listen(0, '127.0.0.1', ok));
const origin = `http://127.0.0.1:${server.address().port}`;
// ---- the corpus ---------------------------------------------------------------------
// Every vector, in the order verify.mjs reads them: an index file is not a vector, and
// a .json file is one only in the input groups (elsewhere it is an authoring form).
const vectors = [];
for (const group of readdirSync(join(root, 'vectors')).sort()) {
for (const f of readdirSync(join(root, 'vectors', group)).sort()) {
const dot = f.lastIndexOf('.');
const name = f.slice(0, dot), ext = f.slice(dot + 1);
if (name === 'index' || (ext === 'json' && !INPUT_GROUPS.includes(group))) continue;
vectors.push({ group, name, ext, id: `${group}/${name}` });
}
}
const setNames = readdirSync(join(root, 'sets')).filter((n) => n.endsWith('.wos1')).sort();
const expectedBytes = (v) => readFileSync(join(root, 'expected', v.group, `${v.name}.json`));
const key = (f) => `${f.size[0]}x${f.size[1]}@${f.rate[0]}/${f.rate[1]}#${f.g}`;
// The sampled frames of a list: the first, the last, the middle one, and the frame at
// or after each tick with the frame before it.
function sampled(gs, ticks, ticksPerFrame) {
const first = gs[0], last = gs[gs.length - 1];
const s = new Set([first, last, gs[gs.length >> 1]]);
for (const t of ticks) {
const g = Math.ceil(t / ticksPerFrame);
for (const c of [g - 1, g]) if (c >= first && c <= last) s.add(c);
}
return s;
}
// The first pair [n, 1] that `listed` does not hold.
function unlisted(listed) {
for (let n = 1; ; n++) if (!listed.some((p) => p[0] === n && p[1] === 1)) return [n, 1];
}
// What to ask of a payload, from its expected file: the sizes whose cost is asked, the
// frames to render (with each one's expected digest, and an id when it is also sent),
// the requests that must be refused (with each one's code), and, where the expected
// file states a text record, every projection the record holds and the projections
// that must be refused.
let nextId = 0;
function planOf(v, expected) {
const plan = { sizes: [], frames: [], requests: [], text: null };
if (expected.code !== 'accepted') return plan;
plan.sizes = expected.sizes.map((s) => [s[0], s[1]]);
if (expected.frames) {
const form = JSON.parse(readFileSync(join(root, 'vectors', v.group, `${v.name}.json`), 'utf8'));
const ticks = [...form.keys.map((k) => k[0]), ...form.items.flatMap((i) => [i.t_on, i.t_off])];
for (const s of expected.frames) {
if (s.frames.length === 0) continue;
const rate = expected.rates.find((r) => r[0] === s.num && r[1] === s.den);
const sample = sampled(s.frames.map((f) => f[0]), ticks, rate[2]);
const full = s.w * s.h <= FULL;
for (const [g, digest] of s.frames) {
if (!full && !sample.has(g)) continue;
plan.frames.push({ size: [s.w, s.h], rate: [s.num, s.den], g, send: sample.has(g) ? nextId++ : null, digest });
}
}
}
if (plan.sizes.length > 0 && expected.rates.length > 0) {
const size = plan.sizes[0];
for (const [num, den, , first, last] of expected.rates) {
plan.requests.push({ size, rate: [num, den], g: last + 1, want: 'frame_range' });
if (first > 0) plan.requests.push({ size, rate: [num, den], g: first - 1, want: 'frame_range' });
}
const [num, den, , first] = expected.rates[0];
// A frame number whose low half alone would be in range.
plan.requests.push({ size, rate: [num, den], g: 4294967296 + Math.max(first, 0), want: 'frame_range' });
plan.requests.push({ size: unlisted(plan.sizes), rate: [num, den], g: Math.max(first, 0), want: 'size_unlisted' });
plan.requests.push({ size, rate: unlisted(expected.rates), g: Math.max(first, 0), want: 'rate_unlisted' });
}
if (expected.text_record !== undefined) {
// The record's order: each listed rate, and within it each frame of the document.
plan.text = { projections: [], requests: [] };
for (const [num, den, , first, last] of expected.rates) {
for (let g = first; g <= last; g++) plan.text.projections.push({ rate: [num, den], g });
plan.text.requests.push({ rate: [num, den], g: last + 1, want: 'frame_range' });
}
if (expected.rates.length > 0) {
const [num, den, , first] = expected.rates[0];
plan.text.requests.push({ rate: [num, den], g: 4294967296 + Math.max(first, 0), want: 'frame_range' });
plan.text.requests.push({ rate: unlisted(expected.rates), g: Math.max(first, 0), want: 'rate_unlisted' });
}
}
return plan;
}
// A text record's line for a projection.
const recordLine = (q, projection) => `{"den":${q.rate[1]},"g":${q.g},"num":${q.rate[0]},"projection":${projection}}`;
// Two lines that differ, each shown around the first character at which they do.
function differing(got, want) {
if (got === undefined || want === undefined) return `the sink gives ${got === undefined ? 'no such line' : 'a line'}; the committed record has ${want === undefined ? 'no such line' : 'one'}`;
let at = 0;
while (at < got.length && at < want.length && got[at] === want[at]) at++;
const from = Math.max(0, at - 60);
const part = (s) => `${from > 0 ? '…' : ''}${s.slice(from, at + 60)}${s.length > at + 60 ? '…' : ''}`;
return `at character ${at} the sink gives ${part(got)}; expected ${part(want)}`;
}
// ---- one engine ---------------------------------------------------------------------
async function runEngine(playwright, name) {
const failures = [];
const fail = (where, what) => {
failures.push(`${where}: ${what}`);
console.error(`FAIL ${name} ${where}: ${what}`);
};
const n = { payloads: 0, accepted: 0, frames: 0, sent: 0, sentBytes: 0, records: 0, lines: 0, recomputed: 0, forms: 0 };
let browser;
try {
browser = await playwright[name].launch();
} catch (e) {
fail('launch', firstLine(e.message));
return { failures, version: null };
}
const version = browser.version();
try {
const page = await browser.newPage();
let dead = false;
page.on('pageerror', (e) => fail('the page', `uncaught: ${firstLine(e.message)}`));
page.on('crash', () => { dead = true; fail('the page', 'crashed'); });
await page.goto(`${origin}/page.html`);
await page.waitForFunction(() => window.__wai_ready !== undefined);
const ready = await page.evaluate(() => window.__wai_ready);
if (!ready.platformDigest) fail('the page', 'has no platform digest (crypto.subtle)');
await page.evaluate((names) => window.__wai_harness.sets(names), setNames);
if (lying) {
await page.evaluate(() => {
const h = window.__wai_harness;
const honest = h.check.bind(h);
h.check = async (size, rate, g) => {
const r = await honest(size, rate, g);
const claim = window.__wai_claims[`${size[0]}x${size[1]}@${rate[0]}/${rate[1]}#${g}`];
r.bytes[r.bytes.length >> 1] ^= 0x01;
return { bytes: r.bytes, inModule: claim, platform: claim };
};
});
}
// 1. Every payload through the package.
for (const v of vectors.filter((x) => x.ext === 'wvg1')) {
if (dead) break;
const expected = JSON.parse(expectedBytes(v).toString('utf8'));
const plan = planOf(v, expected);
const asked = {
sizes: plan.sizes,
frames: plan.frames.map((f) => ({ size: f.size, rate: f.rate, g: f.g, send: f.send })),
requests: plan.requests.map((q) => ({ size: q.size, rate: q.rate, g: q.g })),
text: plan.text === null ? null : {
projections: plan.text.projections,
requests: plan.text.requests.map((q) => ({ rate: q.rate, g: q.g })),
},
};
const claims = lying ? Object.fromEntries(plan.frames.map((f) => [key(f), f.digest])) : null;
let got;
try {
got = await page.evaluate(([path, p, c]) => {
if (c !== null) window.__wai_claims = c;
return window.__wai_harness.payload(path, p);
}, [`vectors/${v.group}/${v.name}.wvg1`, asked, claims]);
} catch (e) {
fail(v.id, firstLine(e.message));
continue;
}
n.payloads += 1;
if (got.code !== expected.code) {
fail(v.id, `loads as ${got.code}; expected ${expected.code}`);
continue;
}
if (expected.code !== 'accepted') continue;
n.accepted += 1;
if (got.instr.inModule !== expected.instr) fail(v.id, `the module's SHA-256 of the payload is ${got.instr.inModule}; expected ${expected.instr}`);
if (got.instr.platform !== expected.instr) fail(v.id, `the platform's digest of the payload is ${got.instr.platform}; expected ${expected.instr}`);
expected.sizes.forEach(([w, h, cost], i) => {
if (got.costs[i] !== cost) fail(v.id, `the cost at ${w}x${h} is ${got.costs[i]}; expected ${cost}`);
});
plan.frames.forEach((f, i) => {
const r = got.frames[i];
const where = `${v.id} frame ${key(f)}`;
n.frames += 1;
if (r === undefined) { fail(where, 'not rendered'); return; }
if (r.bytes !== 4 * f.size[0] * f.size[1]) fail(where, `${r.bytes} bytes; expected ${4 * f.size[0] * f.size[1]}`);
if (r.inModule !== f.digest) fail(where, `the module's SHA-256 is ${r.inModule}; expected ${f.digest}`);
if (r.platform !== f.digest) fail(where, `the platform's digest is ${r.platform}; expected ${f.digest}`);
if (f.send === null) return;
const sent = received.get(String(f.send));
received.delete(String(f.send));
if (sent === undefined) { fail(where, 'its bytes did not arrive'); return; }
n.sent += 1;
n.sentBytes += sent.bytes;
if (sent.sha256 !== f.digest) fail(where, `Node's SHA-256 of the bytes sent is ${sent.sha256}; expected ${f.digest}`);
});
plan.requests.forEach((q, i) => {
if (got.requests[i] !== q.want) fail(`${v.id} request ${key(q)}`, `${got.requests[i]}; expected ${q.want}`);
});
if (plan.text === null) continue;
// The text record: the transcript and every projection, as the record's lines,
// against the committed file's bytes.
const recordPath = join(root, 'expected', v.group, `${v.name}.a11y.jsonl`);
if (!existsSync(recordPath)) {
fail(v.id, `its expected file states a text record, and expected/${v.group}/${v.name}.a11y.jsonl is missing`);
continue;
}
const want = readFileSync(recordPath);
if (sha256(want) !== expected.text_record) fail(v.id, `the committed text record's SHA-256 is ${sha256(want)}; its expected file states ${expected.text_record}`);
if (got.text === null) {
fail(v.id, 'the page returned no transcript and no projection');
continue;
}
const lines = [got.text.transcript, ...plan.text.projections.map((q, i) => recordLine(q, got.text.projections[i]))];
n.records += 1;
n.lines += lines.length;
if (Buffer.compare(Buffer.from(lines.map((l) => `${l}\n`).join(''), 'utf8'), want) !== 0) {
const wantLines = want.toString('utf8').split('\n');
if (wantLines[wantLines.length - 1] === '') wantLines.pop();
const differ = [];
for (let i = 0; i < Math.max(lines.length, wantLines.length); i++) if (lines[i] !== wantLines[i]) differ.push(i);
if (differ.length === 0) {
fail(`${v.id} text record`, 'every line is the committed one, and the bytes differ: the committed file does not end each line with one U+000A');
} else {
const i = differ[0];
const q = plan.text.projections[i - 1];
const which = i === 0 ? 'the transcript' : q === undefined ? `line ${i + 1}, which the sink was not asked for` : `the projection at ${q.rate.join('/')}#${q.g}`;
fail(
`${v.id} text record`,
`${differ.length} of ${wantLines.length} lines differ (${differ.includes(0) ? 'the transcript and ' : ''}${differ.filter((d) => d > 0).length} projections); `
+ `the first is ${which}: ${differing(lines[i], wantLines[i])}`,
);
}
}
plan.text.requests.forEach((q, i) => {
if (got.text.requests[i] !== q.want) fail(`${v.id} projection request ${q.rate.join('/')}#${q.g}`, `${got.text.requests[i]}; expected ${q.want}`);
});
}
// 2. Every vector through the recomputation.
for (const v of vectors) {
if (dead) break;
let got;
try {
got = await page.evaluate(([g, name, ext]) => window.__wai_harness.recompute(g, name, ext), [v.group, v.name, v.ext]);
} catch (e) {
fail(v.id, `recomputation: ${firstLine(e.message)}`);
continue;
}
n.recomputed += 1;
if (got.status !== 0) fail(`${v.id}.${v.ext}`, `recomputation: ${got.expected}`);
else if (Buffer.compare(Buffer.from(got.expected, 'utf8'), expectedBytes(v)) !== 0) fail(`${v.id}.${v.ext}`, 'the recomputed expected file differs');
if (v.ext === 'wvg1') {
n.forms += 1;
const form = readFileSync(join(root, 'vectors', v.group, `${v.name}.json`));
if (Buffer.compare(Buffer.from(got.form, 'utf8'), form) !== 0) fail(`${v.id}.${v.ext}`, 'the authoring form differs');
}
}
} catch (e) {
fail('the run', firstLine(e.message));
} finally {
await browser.close();
}
console.log(
`${name} ${version}: ${n.payloads} payloads through the package, ${n.accepted} accepted; `
+ `${n.frames} frames rendered and hashed twice in the page, ${n.sent} of them hashed again in Node (${n.sentBytes} bytes); `
+ `${n.records} text records, ${n.lines} lines; `
+ `${n.recomputed} vectors and ${n.forms} authoring forms recomputed; ${failuresOf(failures.length)}`,
);
return { failures, version, n };
}
// ---- the run ------------------------------------------------------------------------
let playwright;
try {
playwright = await import('playwright');
} catch (e) {
console.error(`run.mjs: playwright is not installed here (npm ci): ${firstLine(e.message)}`);
process.exit(1);
}
if (lying) console.log('--lying-page: the page changes one byte of every frame and reports the expected digest; this run cannot pass');
const results = new Map();
for (const name of engines) results.set(name, await runEngine(playwright, name));
server.close();
let bad = 0;
for (const name of REQUIRED) {
const r = results.get(name);
if (r === undefined) {
bad += 1;
console.error(`FAIL ${name}: not run. A missing engine is a failure: chromium, webkit and firefox must each run.`);
} else if (r.failures.length > 0) {
bad += 1;
console.error(`FAIL ${name}: ${failuresOf(r.failures.length)}, the first: ${r.failures[0]}`);
}
}
if (lying && bad === 0) {
console.error('FAIL --lying-page: no engine reported the changed frames');
bad += 1;
}
if (bad > 0) process.exit(1);
console.log('vector-conformance: every payload, frame, text record and vector verifies in chromium, webkit and firefox');

View file

@ -7,6 +7,13 @@
//! frame g's RGBA8P (§3.10, §2.9)
//! wai-vector hash <payload.wvg1> [--sets <dir>] every frame's SHA-256 and each clip digest,
//! at every listed size and rate
//! wai-vector text <payload.wvg1> [--sets <dir>] text_hash, and each block: its identity (§2.11), its
//! fields and string, when it is active, and what a
//! verifier finds of the cluster rule (§5.3)
//! wai-vector a11y <payload.wvg1> [--sets <dir>] the text record (§5.4): the transcript, then every
//! frame's projection at every listed rate
//! wai-vector a11y <payload.wvg1> transcript [--sets <dir>] the transcript alone
//! wai-vector a11y <payload.wvg1> <num>/<den> <g> [--sets <dir>] frame g's projection
//! wai-vector pack <form.json> <payload.wvg1> the authoring form (§2.12) to bytes
//! wai-vector unpack <payload.wvg1> <form.json> bytes to the authoring form
//! wai-vector vectors gen <wai dir> write vector-conformance/ and the fuzz seeds
@ -21,6 +28,7 @@ use std::path::{Path, PathBuf};
use std::process::ExitCode;
use wai_vector::vectors::{self, CORPUS, SEEDS};
use wai_vector::text::{self, TextLayer};
use wai_vector::{SetStore, form, frame, place, wvg1};
fn die(msg: &str) -> ExitCode {
@ -98,7 +106,7 @@ fn verify(wai: &Path) -> Result<(), String> {
}
// 2. Every expected file recomputed from the committed vector and sets alone.
let mut store = store_from(Some(&corpus.join("sets")))?;
let mut n = 0usize;
let (mut n, mut records) = (0usize, 0usize);
let mut groups: BTreeSet<String> = BTreeSet::new();
walk(&corpus.join("vectors"), &corpus.join("vectors"), &mut groups);
for rel in &groups {
@ -115,6 +123,14 @@ fn verify(wai: &Path) -> Result<(), String> {
bad += 1;
eprintln!("FAIL {rel}: recomputed\n {}", got.trim_end());
}
// The text record beside it (§5.4), from the committed payload alone.
if let Some(record) = vectors::text_record(group, ext, &bytes, &mut store) {
records += 1;
if read(&corpus.join("expected").join(group).join(format!("{name}.a11y.jsonl")))? != record.as_bytes() {
bad += 1;
eprintln!("RECORD {rel}: the recomputed text record differs");
}
}
if ext == "wvg1" {
let form = read(&corpus.join("vectors").join(group).join(format!("{name}.json")))?;
if vectors::form_of(&bytes).as_bytes() != form {
@ -127,7 +143,7 @@ fn verify(wai: &Path) -> Result<(), String> {
}
}
}
println!("recomputed {n} vectors, checked {} generated files", generated.len());
println!("recomputed {n} vectors and {records} text records, checked {} generated files", generated.len());
if bad > 0 {
return Err(format!("{bad} failures"));
}
@ -135,6 +151,58 @@ fn verify(wai: &Path) -> Result<(), String> {
Ok(())
}
/// `wai-vector text`: the text digests, and each block as a reviewer reads it.
fn describe_text(d: &wvg1::Doc) -> String {
use std::fmt::Write;
let layer = TextLayer::new(d);
let hex = wai_vector::json::hex;
let mut o = String::new();
let _ = writeln!(o, "text_hash {}", hex(&text::text_hash(d)));
for (t, b) in d.texts.iter().enumerate() {
let _ = writeln!(o, "block {t} identity {}", hex(&text::block_identity(d, t)));
let purpose = match text::purpose_name(b.purpose) {
Some(n) => n.to_string(),
None => String::from("unregistered, read as label"),
};
let _ = writeln!(
o,
" purpose {} ({purpose}) dir {} mode {} lang {} group {}",
b.purpose,
["ltr", "rtl"].get(b.dir as usize).copied().unwrap_or("?"),
["horizontal-tb", "vertical-rl", "vertical-lr"].get(b.mode as usize).copied().unwrap_or("?"),
String::from_utf8_lossy(d.lang(t)),
b.group,
);
if b.ruby != 0 {
let _ = writeln!(o, " ruby over block {}, bytes {}..{}", b.ruby - 1, b.ruby_start, u64::from(b.ruby_start) + u64::from(b.ruby_len));
}
let mut s = String::new();
wai_vector::json::push_str(&mut s, &String::from_utf8_lossy(d.string(t)));
let _ = writeln!(o, " string {s}");
let active: Vec<String> = layer.active[t].iter().map(|(a, b)| format!("[{a}, {b})")).collect();
let _ = writeln!(o, " active {}", if active.is_empty() { String::from("never") } else { active.join(" ") });
let (mut runs, mut paths) = (0usize, 0usize);
for it in d.items.iter().filter(|it| it.text as usize == t) {
match it.kind {
wvg1::KIND_RUN => runs += 1,
wvg1::KIND_PATH => paths += 1,
_ => {}
}
}
let _ = writeln!(o, " drawn by {runs} run(s) and {paths} path(s)");
if runs > 0 {
let c = text::coverage(d, t);
let list = |v: &[(u32, u32)]| v.iter().map(|(a, b)| format!("{a}..{b}")).collect::<Vec<_>>().join(" ");
if c.complete() {
let _ = writeln!(o, " clusters: every byte in one cluster");
} else {
let _ = writeln!(o, " clusters: bytes in no cluster [{}], bytes in more than one [{}]", list(&c.uncovered), list(&c.repeated));
}
}
}
o
}
fn main() -> ExitCode {
let args: Vec<String> = std::env::args().skip(1).collect();
let a: Vec<&str> = args.iter().map(String::as_str).collect();
@ -180,6 +248,28 @@ fn main() -> ExitCode {
}
Ok(())
})(),
["text", p, ..] => (|| {
let mut st = store_from(sets_arg(&args).as_deref())?;
let l = wvg1::load(&read(Path::new(p))?, &mut st).map_err(|e| e.code.name().to_string())?;
print!("{}", describe_text(&l.doc));
Ok(())
})(),
["a11y", p, rest @ ..] => (|| {
let mut st = store_from(sets_arg(&args).as_deref())?;
let l = wvg1::load(&read(Path::new(p))?, &mut st).map_err(|e| e.code.name().to_string())?;
let layer = TextLayer::new(&l.doc);
match rest {
["transcript", ..] => println!("{}", layer.transcript()),
[rate, g, ..] if !rate.starts_with("--") => {
let (num, den) = rate.split_once('/').ok_or("rate: <num>/<den>")?;
let n = |s: &str| s.parse::<u64>().map_err(|_| format!("{s}: not a number"));
let (num, den) = (u32::try_from(n(num)?).map_err(|_| "rate: out of range")?, u32::try_from(n(den)?).map_err(|_| "rate: out of range")?);
println!("{}", layer.projection_request(num, den, n(g)?).map_err(|e| e.code.name().to_string())?);
}
_ => print!("{}", layer.record()),
}
Ok(())
})(),
["pack", src, dst] => (|| {
let text = String::from_utf8(read(Path::new(src))?).map_err(|_| String::from("not UTF-8"))?;
std::fs::write(dst, form::to_bytes(&text)?).map_err(|e| e.to_string())
@ -196,7 +286,7 @@ fn main() -> ExitCode {
Ok(())
})(),
["vectors", "verify", wai] => verify(Path::new(wai)),
_ => return die("usage: check|cost|hash <payload> [--sets dir] | render <payload> <W>x<H> <num>/<den> <g> <out> [--sets dir] | pack <form> <payload> | unpack <payload> <form> | vectors gen|verify <wai dir>"),
_ => return die("usage: check|cost|hash|text <payload> [--sets dir] | render <payload> <W>x<H> <num>/<den> <g> <out> [--sets dir] | a11y <payload> [transcript | <num>/<den> <g>] [--sets dir] | pack <form> <payload> | unpack <payload> <form> | vectors gen|verify <wai dir>"),
};
match r {
Ok(()) => ExitCode::SUCCESS,

Some files were not shown because too many files have changed in this diff Show more