Apple macOS '.DS_Store' file format.
This page hosts a formal specification of macOS '.DS_Store' format using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__ds_store {
label="DsStore";
graph[style=dotted];
ds_store__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="alignment_header_pos">0</TD><TD PORT="alignment_header_size">4</TD><TD></TD><TD PORT="alignment_header_type">alignment_header</TD></TR>
<TR><TD PORT="buddy_allocator_header_pos">4</TD><TD PORT="buddy_allocator_header_size">32</TD><TD>BuddyAllocatorHeader</TD><TD PORT="buddy_allocator_header_type">buddy_allocator_header</TD></TR>
</TABLE>>];
ds_store__inst__buddy_allocator_body [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="buddy_allocator_body_pos">(buddy_allocator_header.ofs_bookkeeping_info_block + 4)</TD><TD PORT="buddy_allocator_body_size">buddy_allocator_header.len_bookkeeping_info_block</TD><TD>BuddyAllocatorBody</TD><TD PORT="buddy_allocator_body_type">buddy_allocator_body</TD></TR>
</TABLE>>];
ds_store__inst__block_address_mask [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>block_address_mask</TD><TD>31</TD></TR>
</TABLE>>];
subgraph cluster__buddy_allocator_header {
label="DsStore::BuddyAllocatorHeader";
graph[style=dotted];
buddy_allocator_header__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="magic_pos">0</TD><TD PORT="magic_size">4</TD><TD></TD><TD PORT="magic_type">magic</TD></TR>
<TR><TD PORT="ofs_bookkeeping_info_block_pos">4</TD><TD PORT="ofs_bookkeeping_info_block_size">4</TD><TD>u4be</TD><TD PORT="ofs_bookkeeping_info_block_type">ofs_bookkeeping_info_block</TD></TR>
<TR><TD PORT="len_bookkeeping_info_block_pos">8</TD><TD PORT="len_bookkeeping_info_block_size">4</TD><TD>u4be</TD><TD PORT="len_bookkeeping_info_block_type">len_bookkeeping_info_block</TD></TR>
<TR><TD PORT="copy_ofs_bookkeeping_info_block_pos">12</TD><TD PORT="copy_ofs_bookkeeping_info_block_size">4</TD><TD>u4be</TD><TD PORT="copy_ofs_bookkeeping_info_block_type">copy_ofs_bookkeeping_info_block</TD></TR>
<TR><TD PORT="_unnamed4_pos">16</TD><TD PORT="_unnamed4_size">16</TD><TD></TD><TD PORT="_unnamed4_type">_unnamed4</TD></TR>
</TABLE>>];
}
subgraph cluster__buddy_allocator_body {
label="DsStore::BuddyAllocatorBody";
graph[style=dotted];
buddy_allocator_body__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="num_blocks_pos">0</TD><TD PORT="num_blocks_size">4</TD><TD>u4be</TD><TD PORT="num_blocks_type">num_blocks</TD></TR>
<TR><TD PORT="_unnamed1_pos">4</TD><TD PORT="_unnamed1_size">4</TD><TD></TD><TD PORT="_unnamed1_type">_unnamed1</TD></TR>
<TR><TD PORT="block_addresses_pos">8</TD><TD PORT="block_addresses_size">4</TD><TD>BlockDescriptor</TD><TD PORT="block_addresses_type">block_addresses</TD></TR>
<TR><TD COLSPAN="4" PORT="block_addresses__repeat">repeat num_block_addresses times</TD></TR>
<TR><TD PORT="num_directories_pos">...</TD><TD PORT="num_directories_size">4</TD><TD>u4be</TD><TD PORT="num_directories_type">num_directories</TD></TR>
<TR><TD PORT="directory_entries_pos">...</TD><TD PORT="directory_entries_size">...</TD><TD>DirectoryEntry</TD><TD PORT="directory_entries_type">directory_entries</TD></TR>
<TR><TD COLSPAN="4" PORT="directory_entries__repeat">repeat num_directories times</TD></TR>
<TR><TD PORT="free_lists_pos">...</TD><TD PORT="free_lists_size">...</TD><TD>FreeList</TD><TD PORT="free_lists_type">free_lists</TD></TR>
<TR><TD COLSPAN="4" PORT="free_lists__repeat">repeat num_free_lists times</TD></TR>
</TABLE>>];
buddy_allocator_body__inst__num_block_addresses [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>num_block_addresses</TD><TD>256</TD></TR>
</TABLE>>];
buddy_allocator_body__inst__num_free_lists [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>num_free_lists</TD><TD>32</TD></TR>
</TABLE>>];
buddy_allocator_body__inst__directories [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="directories_pos">...</TD><TD PORT="directories_size">0</TD><TD>MasterBlockRef</TD><TD PORT="directories_type">directories</TD></TR>
<TR><TD COLSPAN="4" PORT="directories__repeat">repeat num_directories times</TD></TR>
</TABLE>>];
subgraph cluster__block_descriptor {
label="DsStore::BuddyAllocatorBody::BlockDescriptor";
graph[style=dotted];
block_descriptor__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="address_raw_pos">0</TD><TD PORT="address_raw_size">4</TD><TD>u4be</TD><TD PORT="address_raw_type">address_raw</TD></TR>
</TABLE>>];
block_descriptor__inst__offset [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>offset</TD><TD>((address_raw & ~(_root.block_address_mask)) + 4)</TD></TR>
</TABLE>>];
block_descriptor__inst__size [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>size</TD><TD>(1 << (address_raw & _root.block_address_mask))</TD></TR>
</TABLE>>];
}
subgraph cluster__directory_entry {
label="DsStore::BuddyAllocatorBody::DirectoryEntry";
graph[style=dotted];
directory_entry__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_name_pos">0</TD><TD PORT="len_name_size">1</TD><TD>u1</TD><TD PORT="len_name_type">len_name</TD></TR>
<TR><TD PORT="name_pos">1</TD><TD PORT="name_size">len_name</TD><TD>str(UTF-8)</TD><TD PORT="name_type">name</TD></TR>
<TR><TD PORT="block_id_pos">...</TD><TD PORT="block_id_size">4</TD><TD>u4be</TD><TD PORT="block_id_type">block_id</TD></TR>
</TABLE>>];
}
subgraph cluster__free_list {
label="DsStore::BuddyAllocatorBody::FreeList";
graph[style=dotted];
free_list__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="counter_pos">0</TD><TD PORT="counter_size">4</TD><TD>u4be</TD><TD PORT="counter_type">counter</TD></TR>
<TR><TD PORT="offsets_pos">4</TD><TD PORT="offsets_size">4</TD><TD>u4be</TD><TD PORT="offsets_type">offsets</TD></TR>
<TR><TD COLSPAN="4" PORT="offsets__repeat">repeat counter times</TD></TR>
</TABLE>>];
}
}
subgraph cluster__master_block_ref {
label="DsStore::MasterBlockRef";
graph[style=dotted];
master_block_ref__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>>];
master_block_ref__inst__master_block [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="master_block_pos">_parent.block_addresses[_parent.directory_entries[idx].block_id].offset</TD><TD PORT="master_block_size">_parent.block_addresses[_parent.directory_entries[idx].block_id].size</TD><TD>MasterBlock</TD><TD PORT="master_block_type">master_block</TD></TR>
</TABLE>>];
subgraph cluster__master_block {
label="DsStore::MasterBlockRef::MasterBlock";
graph[style=dotted];
master_block__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="block_id_pos">0</TD><TD PORT="block_id_size">4</TD><TD>u4be</TD><TD PORT="block_id_type">block_id</TD></TR>
<TR><TD PORT="num_internal_nodes_pos">4</TD><TD PORT="num_internal_nodes_size">4</TD><TD>u4be</TD><TD PORT="num_internal_nodes_type">num_internal_nodes</TD></TR>
<TR><TD PORT="num_records_pos">8</TD><TD PORT="num_records_size">4</TD><TD>u4be</TD><TD PORT="num_records_type">num_records</TD></TR>
<TR><TD PORT="num_nodes_pos">12</TD><TD PORT="num_nodes_size">4</TD><TD>u4be</TD><TD PORT="num_nodes_type">num_nodes</TD></TR>
<TR><TD PORT="_unnamed4_pos">16</TD><TD PORT="_unnamed4_size">4</TD><TD>u4be</TD><TD PORT="_unnamed4_type">_unnamed4</TD></TR>
</TABLE>>];
master_block__inst__root_block [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="root_block_pos">_root.buddy_allocator_body.block_addresses[block_id].offset</TD><TD PORT="root_block_size">...</TD><TD>Block</TD><TD PORT="root_block_type">root_block</TD></TR>
</TABLE>>];
}
}
subgraph cluster__block {
label="DsStore::Block";
graph[style=dotted];
block__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="mode_pos">0</TD><TD PORT="mode_size">4</TD><TD>u4be</TD><TD PORT="mode_type">mode</TD></TR>
<TR><TD PORT="counter_pos">4</TD><TD PORT="counter_size">4</TD><TD>u4be</TD><TD PORT="counter_type">counter</TD></TR>
<TR><TD PORT="data_pos">8</TD><TD PORT="data_size">...</TD><TD>BlockData</TD><TD PORT="data_type">data</TD></TR>
<TR><TD COLSPAN="4" PORT="data__repeat">repeat counter times</TD></TR>
</TABLE>>];
block__inst__rightmost_block [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="rightmost_block_pos">_root.buddy_allocator_body.block_addresses[mode].offset</TD><TD PORT="rightmost_block_size">...</TD><TD>Block</TD><TD PORT="rightmost_block_type">rightmost_block</TD></TR>
</TABLE>>];
subgraph cluster__block_data {
label="DsStore::Block::BlockData";
graph[style=dotted];
block_data__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="block_id_pos">0</TD><TD PORT="block_id_size">4</TD><TD>u4be</TD><TD PORT="block_id_type">block_id</TD></TR>
<TR><TD PORT="record_pos">4</TD><TD PORT="record_size">...</TD><TD>Record</TD><TD PORT="record_type">record</TD></TR>
</TABLE>>];
block_data__inst__block [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="block_pos">_root.buddy_allocator_body.block_addresses[block_id].offset</TD><TD PORT="block_size">...</TD><TD>Block</TD><TD PORT="block_type">block</TD></TR>
</TABLE>>];
subgraph cluster__record {
label="DsStore::Block::BlockData::Record";
graph[style=dotted];
record__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="filename_pos">0</TD><TD PORT="filename_size">...</TD><TD>Ustr</TD><TD PORT="filename_type">filename</TD></TR>
<TR><TD PORT="structure_type_pos">...</TD><TD PORT="structure_type_size">4</TD><TD>FourCharCode</TD><TD PORT="structure_type_type">structure_type</TD></TR>
<TR><TD PORT="data_type_pos">...</TD><TD PORT="data_type_size">4</TD><TD>str(UTF-8)</TD><TD PORT="data_type_type">data_type</TD></TR>
<TR><TD PORT="value_pos">...</TD><TD PORT="value_size">...</TD><TD>switch (data_type)</TD><TD PORT="value_type">value</TD></TR>
</TABLE>>];
record__seq_value_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>"ustr"</TD><TD PORT="case0">Ustr</TD></TR>
<TR><TD>"type"</TD><TD PORT="case1">FourCharCode</TD></TR>
<TR><TD>"blob"</TD><TD PORT="case2">RecordBlob</TD></TR>
</TABLE>>];
subgraph cluster__record_blob {
label="DsStore::Block::BlockData::Record::RecordBlob";
graph[style=dotted];
record_blob__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="length_pos">0</TD><TD PORT="length_size">4</TD><TD>u4be</TD><TD PORT="length_type">length</TD></TR>
<TR><TD PORT="value_pos">4</TD><TD PORT="value_size">length</TD><TD></TD><TD PORT="value_type">value</TD></TR>
</TABLE>>];
}
subgraph cluster__ustr {
label="DsStore::Block::BlockData::Record::Ustr";
graph[style=dotted];
ustr__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="length_pos">0</TD><TD PORT="length_size">4</TD><TD>u4be</TD><TD PORT="length_type">length</TD></TR>
<TR><TD PORT="value_pos">4</TD><TD PORT="value_size">(2 * length)</TD><TD>str(UTF-16BE)</TD><TD PORT="value_type">value</TD></TR>
</TABLE>>];
}
subgraph cluster__four_char_code {
label="DsStore::Block::BlockData::Record::FourCharCode";
graph[style=dotted];
four_char_code__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="value_pos">0</TD><TD PORT="value_size">4</TD><TD>str(UTF-8)</TD><TD PORT="value_type">value</TD></TR>
</TABLE>>];
}
}
}
}
}
ds_store__seq:buddy_allocator_header_type -> buddy_allocator_header__seq [style=bold];
buddy_allocator_header__seq:ofs_bookkeeping_info_block_type -> ds_store__inst__buddy_allocator_body:buddy_allocator_body_pos [color="#404040"];
buddy_allocator_header__seq:len_bookkeeping_info_block_type -> ds_store__inst__buddy_allocator_body:buddy_allocator_body_size [color="#404040"];
ds_store__inst__buddy_allocator_body:buddy_allocator_body_type -> buddy_allocator_body__seq [style=bold];
buddy_allocator_body__seq:block_addresses_type -> block_descriptor__seq [style=bold];
buddy_allocator_body__inst__num_block_addresses:num_block_addresses_type -> buddy_allocator_body__seq:block_addresses__repeat [color="#404040"];
buddy_allocator_body__seq:directory_entries_type -> directory_entry__seq [style=bold];
buddy_allocator_body__seq:num_directories_type -> buddy_allocator_body__seq:directory_entries__repeat [color="#404040"];
buddy_allocator_body__seq:free_lists_type -> free_list__seq [style=bold];
buddy_allocator_body__inst__num_free_lists:num_free_lists_type -> buddy_allocator_body__seq:free_lists__repeat [color="#404040"];
buddy_allocator_body__inst__directories:directories_type -> master_block_ref__seq [style=bold];
buddy_allocator_body__seq:num_directories_type -> buddy_allocator_body__inst__directories:directories__repeat [color="#404040"];
block_descriptor__seq:address_raw_type -> block_descriptor__inst__offset [color="#404040"];
ds_store__inst__block_address_mask:block_address_mask_type -> block_descriptor__inst__offset [color="#404040"];
block_descriptor__seq:address_raw_type -> block_descriptor__inst__size [color="#404040"];
ds_store__inst__block_address_mask:block_address_mask_type -> block_descriptor__inst__size [color="#404040"];
directory_entry__seq:len_name_type -> directory_entry__seq:name_size [color="#404040"];
free_list__seq:counter_type -> free_list__seq:offsets__repeat [color="#404040"];
block_descriptor__inst__offset:offset_type -> master_block_ref__inst__master_block:master_block_pos [color="#404040"];
block_descriptor__inst__size:size_type -> master_block_ref__inst__master_block:master_block_size [color="#404040"];
master_block_ref__inst__master_block:master_block_type -> master_block__seq [style=bold];
block_descriptor__inst__offset:offset_type -> master_block__inst__root_block:root_block_pos [color="#404040"];
master_block__inst__root_block:root_block_type -> block__seq [style=bold];
block__seq:data_type -> block_data__seq [style=bold];
block__seq:counter_type -> block__seq:data__repeat [color="#404040"];
block_descriptor__inst__offset:offset_type -> block__inst__rightmost_block:rightmost_block_pos [color="#404040"];
block__inst__rightmost_block:rightmost_block_type -> block__seq [style=bold];
block_data__seq:record_type -> record__seq [style=bold];
block_descriptor__inst__offset:offset_type -> block_data__inst__block:block_pos [color="#404040"];
block_data__inst__block:block_type -> block__seq [style=bold];
record__seq:filename_type -> ustr__seq [style=bold];
record__seq:structure_type_type -> four_char_code__seq [style=bold];
record__seq:value_type -> record__seq_value_switch [style=bold];
record__seq_value_switch:case0 -> ustr__seq [style=bold];
record__seq_value_switch:case1 -> four_char_code__seq [style=bold];
record__seq_value_switch:case2 -> record_blob__seq [style=bold];
record__seq:data_type_type -> record__seq:value_type [color="#404040"];
record_blob__seq:length_type -> record_blob__seq:value_size [color="#404040"];
ustr__seq:length_type -> ustr__seq:value_size [color="#404040"];
}