Python pickle serialization format: GraphViz block diagram (.dot) source

Python Pickle format serializes Python objects to a byte stream, as a sequence of operations to run on the Pickle Virtual Machine.

The format is mostly implementation defined, there is no formal specification. Pickle data types are closely coupled to the Python object model. Python singletons, and most builtin types (e.g. None, int,dict, list) are serialised using dedicated Pickle opcodes. Other builtin types, and all classes (e.g. set, datetime.datetime) are serialised by encoding the name of a constructor callable. They are deserialised by importing that constructor, and calling it. So, unpickling an arbitrary pickle, using the Python's stdlib pickle module can cause arbitrary code execution.

Pickle format has evolved with Python, later protocols add opcodes & types. Later Python releases can pickle to or unpickle from any earlier protocol.

  • Protocol 0: ASCII clean, no explicit version, fields are '\n' terminated.
  • Protocol 1: Binary, no explicit version, first length prefixed types.
  • Protocol 2: Python 2.3+. Explicit versioning, more length prefixed types. https://www.python.org/dev/peps/pep-0307/
  • Protocol 3: Python 3.0+. Dedicated opcodes for bytes objects.
  • Protocol 4: Python 3.4+. Opcodes for 64 bit strings, framing, set. https://www.python.org/dev/peps/pep-3154/

Application

Python

File extension

["pickle", "pkl"]

KS implementation details

License: CC0-1.0

References

This page hosts a formal specification of Python pickle serialization format using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

GraphViz block diagram source

python_pickle.dot

digraph {
	rankdir=LR;
	node [shape=plaintext];
	subgraph cluster__python_pickle {
		label="PythonPickle";
		graph[style=dotted];

		python_pickle__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
			<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			<TR><TD PORT="ops_pos">0</TD><TD PORT="ops_size">...</TD><TD>Op</TD><TD PORT="ops_type">ops</TD></TR>
			<TR><TD COLSPAN="4" PORT="ops__repeat">repeat to end of stream</TD></TR>
		</TABLE>>];
		subgraph cluster__unicodestring8 {
			label="PythonPickle::Unicodestring8";
			graph[style=dotted];

			unicodestring8__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">8</TD><TD>u8le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">8</TD><TD PORT="val_size">len</TD><TD>str(utf8)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__long1 {
			label="PythonPickle::Long1";
			graph[style=dotted];

			long1__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__bytes8 {
			label="PythonPickle::Bytes8";
			graph[style=dotted];

			bytes8__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">8</TD><TD>u8le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">8</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__bytes1 {
			label="PythonPickle::Bytes1";
			graph[style=dotted];

			bytes1__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__bytes4 {
			label="PythonPickle::Bytes4";
			graph[style=dotted];

			bytes4__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__no_arg {
			label="PythonPickle::NoArg";
			graph[style=dotted];

			no_arg__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__stringnl_noescape {
			label="PythonPickle::StringnlNoescape";
			graph[style=dotted];

			stringnl_noescape__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__decimalnl_long {
			label="PythonPickle::DecimalnlLong";
			graph[style=dotted];

			decimalnl_long__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__unicodestring4 {
			label="PythonPickle::Unicodestring4";
			graph[style=dotted];

			unicodestring4__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD>str(utf8)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__unicodestringnl {
			label="PythonPickle::Unicodestringnl";
			graph[style=dotted];

			unicodestringnl__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__long4 {
			label="PythonPickle::Long4";
			graph[style=dotted];

			long4__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__string1 {
			label="PythonPickle::String1";
			graph[style=dotted];

			string1__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">1</TD><TD>u1</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">1</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__decimalnl_short {
			label="PythonPickle::DecimalnlShort";
			graph[style=dotted];

			decimalnl_short__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__unicodestring1 {
			label="PythonPickle::Unicodestring1";
			graph[style=dotted];

			unicodestring1__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">4</TD><TD>u4le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD>str(utf8)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__stringnl {
			label="PythonPickle::Stringnl";
			graph[style=dotted];

			stringnl__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__stringnl_noescape_pair {
			label="PythonPickle::StringnlNoescapePair";
			graph[style=dotted];

			stringnl_noescape_pair__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val1_pos">0</TD><TD PORT="val1_size">...</TD><TD>StringnlNoescape</TD><TD PORT="val1_type">val1</TD></TR>
				<TR><TD PORT="val2_pos">...</TD><TD PORT="val2_size">...</TD><TD>StringnlNoescape</TD><TD PORT="val2_type">val2</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__string4 {
			label="PythonPickle::String4";
			graph[style=dotted];

			string4__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="len_pos">0</TD><TD PORT="len_size">4</TD><TD>s4le</TD><TD PORT="len_type">len</TD></TR>
				<TR><TD PORT="val_pos">4</TD><TD PORT="val_size">len</TD><TD></TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
		subgraph cluster__op {
			label="PythonPickle::Op";
			graph[style=dotted];

			op__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="code_pos">0</TD><TD PORT="code_size">1</TD><TD>u1→Opcode</TD><TD PORT="code_type">code</TD></TR>
				<TR><TD PORT="arg_pos">1</TD><TD PORT="arg_size">...</TD><TD>switch (code)</TD><TD PORT="arg_type">arg</TD></TR>
			</TABLE>>];
op__seq_arg_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
	<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
	<TR><TD>:opcode_tuple1</TD><TD PORT="case0">NoArg</TD></TR>
	<TR><TD>:opcode_setitem</TD><TD PORT="case1">NoArg</TD></TR>
	<TR><TD>:opcode_stop</TD><TD PORT="case2">NoArg</TD></TR>
	<TR><TD>:opcode_empty_tuple</TD><TD PORT="case3">NoArg</TD></TR>
	<TR><TD>:opcode_newtrue</TD><TD PORT="case4">NoArg</TD></TR>
	<TR><TD>:opcode_long</TD><TD PORT="case5">DecimalnlLong</TD></TR>
	<TR><TD>:opcode_newobj</TD><TD PORT="case6">NoArg</TD></TR>
	<TR><TD>:opcode_put</TD><TD PORT="case7">DecimalnlShort</TD></TR>
	<TR><TD>:opcode_stack_global</TD><TD PORT="case8">NoArg</TD></TR>
	<TR><TD>:opcode_pop_mark</TD><TD PORT="case9">NoArg</TD></TR>
	<TR><TD>:opcode_append</TD><TD PORT="case10">NoArg</TD></TR>
	<TR><TD>:opcode_newfalse</TD><TD PORT="case11">NoArg</TD></TR>
	<TR><TD>:opcode_binpersid</TD><TD PORT="case12">NoArg</TD></TR>
	<TR><TD>:opcode_build</TD><TD PORT="case13">NoArg</TD></TR>
	<TR><TD>:opcode_empty_dict</TD><TD PORT="case14">NoArg</TD></TR>
	<TR><TD>:opcode_tuple2</TD><TD PORT="case15">NoArg</TD></TR>
	<TR><TD>:opcode_long4</TD><TD PORT="case16">Long4</TD></TR>
	<TR><TD>:opcode_appends</TD><TD PORT="case17">NoArg</TD></TR>
	<TR><TD>:opcode_binbytes</TD><TD PORT="case18">Bytes4</TD></TR>
	<TR><TD>:opcode_dup</TD><TD PORT="case19">NoArg</TD></TR>
	<TR><TD>:opcode_list</TD><TD PORT="case20">NoArg</TD></TR>
	<TR><TD>:opcode_pop</TD><TD PORT="case21">NoArg</TD></TR>
	<TR><TD>:opcode_string</TD><TD PORT="case22">Stringnl</TD></TR>
	<TR><TD>:opcode_binunicode</TD><TD PORT="case23">Unicodestring4</TD></TR>
	<TR><TD>:opcode_float</TD><TD PORT="case24">Floatnl</TD></TR>
	<TR><TD>:opcode_reduce</TD><TD PORT="case25">NoArg</TD></TR>
	<TR><TD>:opcode_memoize</TD><TD PORT="case26">NoArg</TD></TR>
	<TR><TD>:opcode_persid</TD><TD PORT="case27">StringnlNoescape</TD></TR>
	<TR><TD>:opcode_none</TD><TD PORT="case28">NoArg</TD></TR>
	<TR><TD>:opcode_short_binunicode</TD><TD PORT="case29">Unicodestring1</TD></TR>
	<TR><TD>:opcode_obj</TD><TD PORT="case30">NoArg</TD></TR>
	<TR><TD>:opcode_newobj_ex</TD><TD PORT="case31">NoArg</TD></TR>
	<TR><TD>:opcode_empty_list</TD><TD PORT="case32">NoArg</TD></TR>
	<TR><TD>:opcode_tuple</TD><TD PORT="case33">NoArg</TD></TR>
	<TR><TD>:opcode_binunicode8</TD><TD PORT="case34">Unicodestring8</TD></TR>
	<TR><TD>:opcode_global</TD><TD PORT="case35">StringnlNoescapePair</TD></TR>
	<TR><TD>:opcode_dict</TD><TD PORT="case36">NoArg</TD></TR>
	<TR><TD>:opcode_binstring</TD><TD PORT="case37">String4</TD></TR>
	<TR><TD>:opcode_setitems</TD><TD PORT="case38">NoArg</TD></TR>
	<TR><TD>:opcode_binbytes8</TD><TD PORT="case39">Bytes8</TD></TR>
	<TR><TD>:opcode_inst</TD><TD PORT="case40">StringnlNoescapePair</TD></TR>
	<TR><TD>:opcode_int</TD><TD PORT="case41">DecimalnlShort</TD></TR>
	<TR><TD>:opcode_unicode</TD><TD PORT="case42">Unicodestringnl</TD></TR>
	<TR><TD>:opcode_long1</TD><TD PORT="case43">Long1</TD></TR>
	<TR><TD>:opcode_short_binstring</TD><TD PORT="case44">String1</TD></TR>
	<TR><TD>:opcode_mark</TD><TD PORT="case45">NoArg</TD></TR>
	<TR><TD>:opcode_frozenset</TD><TD PORT="case46">NoArg</TD></TR>
	<TR><TD>:opcode_tuple3</TD><TD PORT="case47">NoArg</TD></TR>
	<TR><TD>:opcode_additems</TD><TD PORT="case48">NoArg</TD></TR>
	<TR><TD>:opcode_get</TD><TD PORT="case49">DecimalnlShort</TD></TR>
	<TR><TD>:opcode_empty_set</TD><TD PORT="case50">NoArg</TD></TR>
	<TR><TD>:opcode_short_binbytes</TD><TD PORT="case51">Bytes1</TD></TR>
</TABLE>>];
		}
		subgraph cluster__floatnl {
			label="PythonPickle::Floatnl";
			graph[style=dotted];

			floatnl__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
				<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
				<TR><TD PORT="val_pos">0</TD><TD PORT="val_size">...</TD><TD>str(term=10, ascii)</TD><TD PORT="val_type">val</TD></TR>
			</TABLE>>];
		}
	}
	python_pickle__seq:ops_type -> op__seq [style=bold];
	unicodestring8__seq:len_type -> unicodestring8__seq:val_size [color="#404040"];
	long1__seq:len_type -> long1__seq:val_size [color="#404040"];
	bytes8__seq:len_type -> bytes8__seq:val_size [color="#404040"];
	bytes1__seq:len_type -> bytes1__seq:val_size [color="#404040"];
	bytes4__seq:len_type -> bytes4__seq:val_size [color="#404040"];
	unicodestring4__seq:len_type -> unicodestring4__seq:val_size [color="#404040"];
	long4__seq:len_type -> long4__seq:val_size [color="#404040"];
	string1__seq:len_type -> string1__seq:val_size [color="#404040"];
	unicodestring1__seq:len_type -> unicodestring1__seq:val_size [color="#404040"];
	stringnl_noescape_pair__seq:val1_type -> stringnl_noescape__seq [style=bold];
	stringnl_noescape_pair__seq:val2_type -> stringnl_noescape__seq [style=bold];
	string4__seq:len_type -> string4__seq:val_size [color="#404040"];
	op__seq:arg_type -> op__seq_arg_switch [style=bold];
	op__seq_arg_switch:case0 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case1 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case2 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case3 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case4 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case5 -> decimalnl_long__seq [style=bold];
	op__seq_arg_switch:case6 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case7 -> decimalnl_short__seq [style=bold];
	op__seq_arg_switch:case8 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case9 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case10 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case11 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case12 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case13 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case14 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case15 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case16 -> long4__seq [style=bold];
	op__seq_arg_switch:case17 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case18 -> bytes4__seq [style=bold];
	op__seq_arg_switch:case19 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case20 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case21 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case22 -> stringnl__seq [style=bold];
	op__seq_arg_switch:case23 -> unicodestring4__seq [style=bold];
	op__seq_arg_switch:case24 -> floatnl__seq [style=bold];
	op__seq_arg_switch:case25 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case26 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case27 -> stringnl_noescape__seq [style=bold];
	op__seq_arg_switch:case28 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case29 -> unicodestring1__seq [style=bold];
	op__seq_arg_switch:case30 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case31 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case32 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case33 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case34 -> unicodestring8__seq [style=bold];
	op__seq_arg_switch:case35 -> stringnl_noescape_pair__seq [style=bold];
	op__seq_arg_switch:case36 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case37 -> string4__seq [style=bold];
	op__seq_arg_switch:case38 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case39 -> bytes8__seq [style=bold];
	op__seq_arg_switch:case40 -> stringnl_noescape_pair__seq [style=bold];
	op__seq_arg_switch:case41 -> decimalnl_short__seq [style=bold];
	op__seq_arg_switch:case42 -> unicodestringnl__seq [style=bold];
	op__seq_arg_switch:case43 -> long1__seq [style=bold];
	op__seq_arg_switch:case44 -> string1__seq [style=bold];
	op__seq_arg_switch:case45 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case46 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case47 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case48 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case49 -> decimalnl_short__seq [style=bold];
	op__seq_arg_switch:case50 -> no_arg__seq [style=bold];
	op__seq_arg_switch:case51 -> bytes1__seq [style=bold];
	op__seq:code_type -> op__seq:arg_type [color="#404040"];
}