digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__mozilla_mar {
label="MozillaMar";
graph[style=dotted];
mozilla_mar__seq [label=<
pos | size | type | id |
0 | 4 | | magic |
4 | 4 | u4be | ofs_index |
8 | 8 | u8be | file_size |
16 | 4 | u4be | len_signatures |
20 | ... | Signature | signatures |
repeat len_signatures times |
... | 4 | u4be | len_additional_sections |
... | ... | AdditionalSection | additional_sections |
repeat len_additional_sections times |
>];
mozilla_mar__inst__index [label=<
pos | size | type | id |
ofs_index | ... | MarIndex | index |
>];
subgraph cluster__mar_index {
label="MozillaMar::MarIndex";
graph[style=dotted];
mar_index__seq [label=<
pos | size | type | id |
0 | 4 | u4be | len_index |
4 | len_index | IndexEntries | index_entries |
>];
}
subgraph cluster__index_entries {
label="MozillaMar::IndexEntries";
graph[style=dotted];
index_entries__seq [label=<
pos | size | type | id |
0 | ... | IndexEntry | index_entry |
repeat to end of stream |
>];
}
subgraph cluster__signature {
label="MozillaMar::Signature";
graph[style=dotted];
signature__seq [label=<
pos | size | type | id |
0 | 4 | u4be→SignatureAlgorithms | algorithm |
4 | 4 | u4be | len_signature |
8 | len_signature | | signature |
>];
}
subgraph cluster__product_information_block {
label="MozillaMar::ProductInformationBlock";
graph[style=dotted];
product_information_block__seq [label=<
pos | size | type | id |
0 | 64 | str(UTF-8) | mar_channel_name |
64 | 32 | str(UTF-8) | product_version |
>];
}
subgraph cluster__index_entry {
label="MozillaMar::IndexEntry";
graph[style=dotted];
index_entry__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ofs_content |
4 | 4 | u4be | len_content |
8 | 4 | u4be | flags |
12 | ... | str(UTF-8) | file_name |
>];
index_entry__inst__body [label=<
pos | size | type | id |
ofs_content | len_content | | body |
>];
}
subgraph cluster__additional_section {
label="MozillaMar::AdditionalSection";
graph[style=dotted];
additional_section__seq [label=<
pos | size | type | id |
0 | 4 | u4be | len_block |
4 | 4 | u4be→BlockIdentifiers | block_identifier |
8 | ... | switch (block_identifier) | bytes |
>];
additional_section__seq_bytes_switch [label=<
case | type |
:block_identifiers_product_information | ProductInformationBlock |
>];
}
}
mozilla_mar__seq:signatures_type -> signature__seq [style=bold];
mozilla_mar__seq:len_signatures_type -> mozilla_mar__seq:signatures__repeat [color="#404040"];
mozilla_mar__seq:additional_sections_type -> additional_section__seq [style=bold];
mozilla_mar__seq:len_additional_sections_type -> mozilla_mar__seq:additional_sections__repeat [color="#404040"];
mozilla_mar__seq:ofs_index_type -> mozilla_mar__inst__index:index_pos [color="#404040"];
mozilla_mar__inst__index:index_type -> mar_index__seq [style=bold];
mar_index__seq:len_index_type -> mar_index__seq:index_entries_size [color="#404040"];
mar_index__seq:index_entries_type -> index_entries__seq [style=bold];
index_entries__seq:index_entry_type -> index_entry__seq [style=bold];
signature__seq:len_signature_type -> signature__seq:signature_size [color="#404040"];
index_entry__seq:ofs_content_type -> index_entry__inst__body:body_pos [color="#404040"];
index_entry__seq:len_content_type -> index_entry__inst__body:body_size [color="#404040"];
additional_section__seq:bytes_type -> additional_section__seq_bytes_switch [style=bold];
additional_section__seq_bytes_switch:case0 -> product_information_block__seq [style=bold];
additional_section__seq:block_identifier_type -> additional_section__seq:bytes_type [color="#404040"];
}