smb_msg/
compressed.rs

1//! Compressed messages
2
3use std::io::SeekFrom;
4
5use smb_dtyp::binrw_util::prelude::*;
6
7use super::negotiate::CompressionAlgorithm;
8use binrw::io::TakeSeekExt;
9use binrw::prelude::*;
10
11#[binrw::binrw]
12#[derive(Debug, PartialEq, Eq)]
13#[brw(little)]
14pub enum CompressedMessage {
15    Unchained(CompressedUnchainedMessage),
16    Chained(CompressedChainedMessage),
17}
18
19impl CompressedMessage {
20    pub fn total_size(&self) -> usize {
21        match self {
22            CompressedMessage::Unchained(m) => {
23                m.data.len() + CompressedUnchainedMessage::STRUCT_SIZE
24            }
25            CompressedMessage::Chained(m) => {
26                m.items.iter().map(|i| i.payload_data.len()).sum::<usize>()
27                    + m.items.len() * 4
28                    + CompressedChainedMessage::STRUCT_SIZE
29            }
30        }
31    }
32}
33
34#[binrw::binrw]
35#[derive(Debug, PartialEq, Eq)]
36#[brw(magic(b"\xfcSMB"), little)]
37pub struct CompressedUnchainedMessage {
38    pub original_size: u32,
39    // The same as the negotiation, but must be set.
40    #[brw(assert(!matches!(compression_algorithm, CompressionAlgorithm::None)))]
41    pub compression_algorithm: CompressionAlgorithm,
42    #[br(assert(flags == 0))]
43    #[bw(calc = 0)]
44    flags: u16,
45    #[bw(calc = 0)]
46    offset: u32,
47    #[br(seek_before = SeekFrom::Current(offset as i64))]
48    #[br(parse_with = binrw::helpers::until_eof)]
49    pub data: Vec<u8>,
50}
51
52impl CompressedUnchainedMessage {
53    const MAGIC_SIZE: usize = 4;
54    pub const STRUCT_SIZE: usize = Self::MAGIC_SIZE
55        + std::mem::size_of::<u32>() * 2
56        + std::mem::size_of::<CompressionAlgorithm>()
57        + std::mem::size_of::<u16>();
58}
59
60#[binrw::binrw]
61#[derive(Debug, PartialEq, Eq)]
62#[brw(magic(b"\xfcSMB"), little)]
63pub struct CompressedChainedMessage {
64    pub original_size: u32,
65    #[br(parse_with = binrw::helpers::until_eof)]
66    pub items: Vec<CompressedChainedItem>,
67}
68
69impl CompressedChainedMessage {
70    pub const STRUCT_SIZE: usize = std::mem::size_of::<u32>() + 4;
71}
72
73#[binrw::binrw]
74#[derive(Debug, PartialEq, Eq)]
75pub struct CompressedChainedItem {
76    pub compression_algorithm: CompressionAlgorithm,
77    pub flags: u16,
78    #[bw(calc = PosMarker::default())]
79    length: PosMarker<u32>,
80    // Only present if algorithms require it.
81    #[brw(if(compression_algorithm.original_size_required()))]
82    #[bw(assert(original_size.is_none() ^ compression_algorithm.original_size_required()))]
83    pub original_size: Option<u32>,
84    // The length specified in `length` also includes `original_size` if present!
85    #[br(map_stream = |s| s.take_seek(length.value as u64 - (if compression_algorithm.original_size_required() {4} else {0})), parse_with = binrw::helpers::until_eof)]
86    #[bw(write_with = PosMarker::write_size, args(&length))]
87    pub payload_data: Vec<u8>,
88}
89
90#[binrw::binrw]
91#[derive(Debug, PartialEq, Eq)]
92pub struct CompressedData {
93    #[br(parse_with = binrw::helpers::until_eof)]
94    data: Vec<u8>,
95}
96
97#[cfg(test)]
98mod tests {
99    use std::io::Cursor;
100
101    use super::*;
102
103    #[test]
104    pub fn test_comp_chained_simple() {
105        // This is a simple compressed chained message.
106        // No special compression (LZ??) is used.
107        // Does not test the presence of original_size.
108        let data_bytes = [
109            0xfcu8, 0x53, 0x4d, 0x42, 0x70, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x68, 0x0, 0x0, 0x0,
110            0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x1, 0x0,
111            0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
112            0xfe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x28, 0x0, 0x30, 0x0, 0x0, 0x0,
113            0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0,
114            0x1, 0xf, 0x2a, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
115            0x0, 0x3, 0x0, 0x0, 0x0, 0xee, 0x5, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0,
116            0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, 0xb9, 0x1a, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
117            0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44, 0x32, 0x36, 0x32, 0x41, 0x43, 0x36,
118            0x32, 0x34, 0x34, 0x35, 0x31, 0x32, 0x39, 0x35, 0x4, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0,
119            0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0,
120        ];
121
122        let mut cursor = Cursor::new(data_bytes);
123
124        assert_eq!(
125            CompressedMessage::read_le(&mut cursor).unwrap(),
126            CompressedMessage::Chained(CompressedChainedMessage {
127                original_size: 368,
128                items: vec![
129                    CompressedChainedItem {
130                        compression_algorithm: CompressionAlgorithm::None,
131                        flags: 1,
132                        original_size: None,
133                        payload_data: vec![
134                            0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10,
135                            0x0, 0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0,
136                            0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
137                            0x7d, 0x0, 0x0, 0x28, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
138                            0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, 0x1,
139                            0xf, 0x2a, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0,
140                            0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xee, 0x5, 0x0, 0x0, 0xc, 0x0, 0x0,
141                            0x0, 0x8d, 0x0, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0
142                        ],
143                    },
144                    CompressedChainedItem {
145                        compression_algorithm: CompressionAlgorithm::None,
146                        flags: 0xb975,
147                        original_size: None,
148                        payload_data: vec![
149                            0x0, 0x0, 0x0, 0x0, 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44,
150                            0x32, 0x36, 0x32, 0x41, 0x43, 0x36, 0x32, 0x34, 0x34, 0x35, 0x31, 0x32,
151                            0x39, 0x35
152                        ],
153                    },
154                    CompressedChainedItem {
155                        compression_algorithm: CompressionAlgorithm::PatternV1,
156                        flags: 0,
157                        original_size: None,
158                        payload_data: vec![0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0]
159                    }
160                ]
161            })
162        );
163    }
164
165    #[test]
166    pub fn test_comp_chained_with_orig_size() {
167        // as opposed to the first test, this DOES test original_size field!
168        let data = vec![
169            0xfc, 0x53, 0x4d, 0x42, 0x50, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x50, 0x0, 0x0, 0x0,
170            0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x1, 0x0,
171            0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
172            0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1d, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x25,
173            0x16, 0x98, 0xbc, 0x89, 0x8e, 0x3e, 0x86, 0xae, 0xb7, 0x13, 0x55, 0x7c, 0xfa, 0xf1,
174            0xbb, 0x11, 0x0, 0x50, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
175            0x0, 0x5, 0x0, 0x0, 0x0, 0xf7, 0x4, 0x0, 0x0, 0xc8, 0x7, 0x0, 0x0, 0xf2, 0x3, 0x4d,
176            0x5a, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0xb8,
177            0x0, 0x1, 0x0, 0x12, 0x40, 0x7, 0x0, 0xf, 0x2, 0x0, 0xa, 0xf3, 0x2e, 0x20, 0x1, 0x0,
178            0x0, 0xe, 0x1f, 0xba, 0xe, 0x0, 0xb4, 0x9, 0xcd, 0x21, 0xb8, 0x1, 0x4c, 0xcd, 0x21,
179            0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x63,
180            0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x69,
181            0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0xd, 0xd, 0xa, 0x24,
182            0x5a, 0x0, 0x84, 0xa9, 0x8e, 0xee, 0xb9, 0xed, 0xef, 0x80, 0xea, 0x4, 0x0, 0xd1, 0x99,
183            0x6e, 0x86, 0xeb, 0xdd, 0xef, 0x80, 0xea, 0x9f, 0x6e, 0x83, 0xeb, 0xe8, 0x10, 0x0,
184            0xb1, 0x81, 0xeb, 0xe1, 0xef, 0x80, 0xea, 0xbe, 0x90, 0x84, 0xeb, 0xec, 0x8, 0x0, 0x31,
185            0x83, 0xeb, 0xe3, 0x20, 0x0, 0x31, 0x81, 0xeb, 0xef, 0x38, 0x0, 0xb1, 0x81, 0xea, 0xad,
186            0xef, 0x80, 0xea, 0xe4, 0x97, 0x13, 0xea, 0xf0, 0x10, 0x0, 0x31, 0x80, 0xea, 0x7f,
187            0x38, 0x0, 0x40, 0x88, 0xeb, 0x5e, 0xe9, 0x40, 0x0, 0x31, 0x85, 0xeb, 0xf3, 0x10, 0x0,
188            0x31, 0x84, 0xeb, 0x90, 0x8, 0x0, 0x31, 0x83, 0xeb, 0xa9, 0x8, 0x0, 0x11, 0x80, 0x50,
189            0x0, 0x40, 0x99, 0x6e, 0x7f, 0xea, 0x58, 0x0, 0x31, 0x99, 0x6e, 0x82, 0x10, 0x0, 0x40,
190            0x52, 0x69, 0x63, 0x68, 0x44, 0x0, 0x3, 0x9f, 0x0, 0xd4, 0x0, 0x50, 0x45, 0x0, 0x0,
191            0x64, 0x86, 0x24, 0x0, 0xbb, 0xf4, 0xba, 0x23, 0x14, 0x0, 0xf1, 0xb, 0xf0, 0x0, 0x22,
192            0x0, 0xb, 0x2, 0xe, 0x26, 0x0, 0x90, 0xa6, 0x0, 0x0, 0xe0, 0x1d, 0x0, 0x0, 0xf0, 0x61,
193            0x0, 0x90, 0x2, 0xb1, 0x0, 0x0, 0x10, 0x22, 0x0, 0x20, 0x40, 0x1, 0x7, 0x0, 0x0, 0xc,
194            0x0, 0x56, 0x10, 0x0, 0x0, 0xa, 0x0, 0x4, 0x0, 0x1, 0x2, 0x0, 0x30, 0xf0, 0x44, 0x1,
195            0x28, 0x0, 0xb1, 0x26, 0xd1, 0xc2, 0x0, 0x1, 0x0, 0x60, 0x41, 0x0, 0x0, 0x8, 0x17, 0x0,
196            0x22, 0x0, 0x20, 0x7, 0x0, 0x1, 0x35, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, 0x3, 0x2,
197            0x0, 0x1, 0xb, 0x0, 0xc1, 0x70, 0x14, 0x0, 0x8f, 0xb3, 0x1, 0x0, 0x28, 0x47, 0x14, 0x0,
198            0xb8, 0x61, 0x0, 0xf3, 0x14, 0x40, 0x1, 0x28, 0x8e, 0x3, 0x0, 0x0, 0x70, 0xd, 0x0,
199            0xb4, 0xcf, 0x6, 0x0, 0x0, 0x70, 0xc2, 0x0, 0xb8, 0x25, 0x0, 0x0, 0x0, 0x90, 0x43, 0x1,
200            0xdc, 0x5f, 0x0, 0x0, 0x10, 0x10, 0x4, 0x0, 0x70, 0x40, 0x0, 0xf, 0x2, 0x0, 0x1, 0x20,
201            0xa0, 0x5b, 0x42, 0x0, 0x7, 0x1a, 0x0, 0x57, 0x40, 0x14, 0x0, 0xf8, 0x6, 0x10, 0x0,
202            0xb, 0x2, 0x0, 0xb2, 0x2e, 0x72, 0x64, 0x61, 0x74, 0x61, 0x0, 0x0, 0x30, 0x5c, 0xd,
203            0x91, 0x0, 0x13, 0x60, 0x8, 0x0, 0x7, 0x2, 0x0, 0x62, 0x40, 0x0, 0x0, 0x48, 0x2e, 0x70,
204            0x28, 0x0, 0x2, 0x94, 0x0, 0x40, 0xd, 0x0, 0x0, 0xd0, 0x9c, 0x0, 0x17, 0xd, 0x26, 0x0,
205            0x3, 0x28, 0x0, 0x12, 0x69, 0x28, 0x0, 0x22, 0x24, 0x26, 0x7c, 0x0, 0x23, 0x0, 0x30,
206            0x8, 0x0, 0x7, 0x2, 0x0, 0x1, 0x50, 0x0, 0x12, 0x65, 0x28, 0x0, 0x0, 0xfc, 0x0, 0x63,
207            0x0, 0x70, 0x14, 0x0, 0x0, 0xc0, 0x8, 0x0, 0x7, 0x2, 0x0, 0xc1, 0x40, 0x0, 0x0, 0x40,
208            0x50, 0x52, 0x4f, 0x54, 0x44, 0x41, 0x54, 0x41, 0x1b, 0x1, 0x22, 0x30, 0x16, 0xa4, 0x0,
209            0x0, 0x8, 0x0, 0x7, 0x2, 0x0, 0x0, 0x50, 0x0, 0xa0, 0x47, 0x46, 0x49, 0x44, 0x53, 0x0,
210            0x0, 0x0, 0x2c, 0xa9, 0x70, 0x0, 0x43, 0x16, 0x0, 0x0, 0xb0, 0x8, 0x0, 0x7, 0x2, 0x0,
211            0x81, 0x40, 0x0, 0x0, 0x42, 0x50, 0x61, 0x64, 0x31, 0x13, 0x0, 0x61, 0x10, 0x9, 0x0,
212            0x0, 0xf0, 0x16, 0xb, 0x0, 0xc, 0x2, 0x0, 0xf2, 0x0, 0x80, 0x0, 0x0, 0x42, 0x2e, 0x74,
213            0x65, 0x78, 0x74, 0x0, 0x0, 0x0, 0xb, 0xa1, 0x4c, 0xc5, 0x1, 0x2d, 0xb0, 0x4c, 0x30,
214            0x0, 0x80, 0x20, 0x0, 0x0, 0x68, 0x50, 0x41, 0x47, 0x45, 0x40, 0x0, 0xf0, 0x0, 0x80,
215            0x42, 0x44, 0x0, 0x0, 0xb0, 0x6c, 0x0, 0x0, 0x50, 0x44, 0x0, 0x0, 0xa0, 0x63, 0x13,
216            0x0, 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x60, 0x28, 0x0, 0xf5, 0x4, 0x4c, 0x4b, 0x0,
217            0x0, 0x1c, 0x64, 0x2, 0x0, 0x0, 0x0, 0xb1, 0x0, 0x0, 0x70, 0x2, 0x0, 0x0, 0xf0, 0xa7,
218            0x24, 0x0, 0x0, 0x2, 0x0, 0x1, 0x28, 0x0, 0x80, 0x4f, 0x4f, 0x4c, 0x43, 0x4f, 0x44,
219            0x45, 0xbe, 0xf4, 0x1, 0x22, 0x70, 0xb3, 0x40, 0x1, 0x20, 0x60, 0xaa, 0x1f, 0x0, 0x5,
220            0x2, 0x0, 0x4, 0x78, 0x0, 0xe0, 0x4b, 0x44, 0x0, 0x0, 0xea, 0x5d, 0x0, 0x0, 0x0, 0xa0,
221            0xb3, 0x0, 0x0, 0x60, 0x24, 0x2, 0xd, 0x28, 0x0, 0x1, 0x78, 0x0, 0x60, 0x56, 0x52,
222            0x46, 0x59, 0x19, 0x15, 0xe, 0x4, 0x8f, 0xb4, 0x0, 0x0, 0x20, 0x3, 0x0, 0x0, 0xf0,
223            0x28, 0x0, 0x3, 0x50, 0x48, 0x44, 0x4c, 0x53, 0x76, 0xe, 0x3, 0x22, 0x20, 0xb7, 0x78,
224            0x0, 0x25, 0x10, 0xae, 0x74, 0x0, 0x0, 0x2, 0x0, 0x1, 0xa0, 0x0, 0x90, 0x41, 0x47,
225            0x45, 0x42, 0x47, 0x46, 0x58, 0x68, 0x69, 0x45, 0x3, 0x21, 0xb7, 0x0, 0x8d, 0x2, 0x1e,
226            0x40, 0x28, 0x0, 0xf1, 0x0, 0x54, 0x52, 0x41, 0x43, 0x45, 0x53, 0x55, 0x50, 0xa3, 0x19,
227            0x0, 0x0, 0x0, 0xc0, 0xb7, 0x3d, 0x0, 0x2d, 0x0, 0xb0, 0x28, 0x0, 0x1, 0x40, 0x1, 0xb2,
228            0x43, 0x4d, 0x52, 0x43, 0xf3, 0xe, 0x0, 0x0, 0x0, 0xe0, 0xb7, 0xe0, 0x1, 0x1d, 0xd0,
229            0x28, 0x0, 0x50, 0x60, 0x4b, 0x56, 0x41, 0x53, 0x18, 0x1, 0x10, 0x7e, 0x61, 0x4, 0x13,
230            0xf0, 0xa0, 0x0, 0x1d, 0xe0, 0x28, 0x0, 0x50, 0x68, 0x4b, 0x53, 0x43, 0x50, 0xac, 0x0,
231            0x10, 0x60, 0x7f, 0x3, 0x22, 0x20, 0xb8, 0x50, 0x0, 0x20, 0x10, 0xaf, 0x13, 0x0, 0x5,
232            0x2, 0x0, 0x0, 0x40, 0x1, 0x90, 0x44, 0x52, 0x56, 0x50, 0x52, 0x58, 0x0, 0x0, 0xb7,
233            0x16, 0x0, 0x13, 0x30, 0x28, 0x0, 0x1e, 0x20, 0x28, 0x0, 0x50, 0x66, 0x6f, 0x74, 0x68,
234            0x6b, 0x24, 0x0, 0x0, 0xad, 0x3, 0x13, 0x40, 0x28, 0x0, 0x1e, 0x30, 0x28, 0x0, 0xe0,
235            0x49, 0x4e, 0x49, 0x54, 0x4b, 0x44, 0x42, 0x47, 0xa6, 0xf1, 0x1, 0x0, 0x0, 0x50, 0x6e,
236            0x5, 0x4e, 0x2, 0x0, 0x0, 0x40, 0x28, 0x0, 0x90, 0x4d, 0x49, 0x4e, 0x49, 0x45, 0x58,
237            0x0, 0x0, 0xbc, 0x20, 0x3, 0x22, 0x50, 0xba, 0x68, 0x1, 0x20, 0x40, 0xb1, 0x62, 0x0,
238            0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x62, 0x50, 0x0, 0x0, 0x11, 0x0, 0xee, 0x1b, 0xe0,
239            0x9, 0x0, 0x0, 0x80, 0xba, 0x0, 0x0, 0xf0, 0x9, 0x0, 0x0, 0x70, 0x28, 0x0, 0x40, 0x50,
240            0x61, 0x64, 0x32, 0x28, 0x0, 0x71, 0x0, 0x90, 0x1b, 0x0, 0x0, 0x70, 0xc4, 0xb, 0x0,
241            0xc, 0x2, 0x0, 0x52, 0x80, 0x0, 0x0, 0x62, 0x2e, 0x6f, 0x3, 0x40, 0x0, 0x80, 0x29,
242            0x1c, 0x69, 0x1, 0x0, 0xed, 0x4, 0x49, 0x0, 0x0, 0x60, 0xbb, 0x2b, 0x0, 0xf1, 0x4,
243            0x40, 0x0, 0x0, 0xc8, 0x41, 0x4c, 0x4d, 0x4f, 0x53, 0x54, 0x52, 0x4f, 0x40, 0x9c, 0x0,
244            0x0, 0x0, 0x30, 0xfc, 0x8d, 0x0, 0x3d, 0x0, 0x50, 0xbc, 0x28, 0x0, 0xf2, 0x0, 0x43,
245            0x41, 0x43, 0x48, 0x45, 0x41, 0x4c, 0x49, 0x0, 0x8e, 0x0, 0x0, 0x0, 0xd0, 0xfc, 0x20,
246            0x1, 0x1e, 0x70, 0x28, 0x0, 0x0, 0xf8, 0x2, 0x0, 0xc0, 0x3, 0x72, 0x50, 0xb4, 0x1, 0x0,
247            0x0, 0x60, 0xfd, 0x50, 0x0, 0x1d, 0x80, 0x28, 0x0, 0x10, 0xc0, 0x28, 0x0, 0xe0, 0x56,
248            0x52, 0x46, 0x44, 0x50, 0x3c, 0x1, 0x0, 0x0, 0x20, 0xff, 0x0, 0x0, 0xa0, 0xd8, 0x2,
249            0xe, 0x28, 0x0, 0x0, 0x18, 0x1, 0x0, 0x50, 0x0, 0x30, 0xb4, 0x14, 0x2, 0xf4, 0x2, 0x1,
250            0x74, 0x5, 0x39, 0x0, 0x40, 0xbd, 0xa0, 0x0, 0x81, 0x20, 0x0, 0x0, 0xc2, 0x50, 0x61,
251            0x64, 0x33, 0x15, 0x0, 0x61, 0x80, 0x1d, 0x0, 0x0, 0x80, 0x2, 0x3f, 0x4, 0xc, 0x2, 0x0,
252            0x90, 0x80, 0x0, 0x0, 0xc2, 0x43, 0x46, 0x47, 0x52, 0x4f, 0xe3, 0x0, 0x1, 0xa8, 0x5,
253            0x21, 0x20, 0x1, 0x70, 0x3, 0x1a, 0x50, 0x50, 0x0, 0x0, 0x18, 0x1, 0x41, 0x50, 0x61,
254            0x64, 0x34, 0x40, 0x0, 0x50, 0xd0, 0x1f, 0x0, 0x0, 0x30, 0x22, 0x7, 0xe, 0x2, 0x0,
255            0x80, 0x80, 0x0, 0x0, 0xca, 0x2e, 0x72, 0x73, 0x72, 0xfe, 0x3, 0x1, 0xc4, 0x5, 0x9d,
256            0x0, 0x40, 0x1, 0x0, 0x90, 0x3, 0x0, 0x0, 0x80, 0x50, 0x0, 0xc1, 0x42, 0x2e, 0x72,
257            0x65, 0x6c, 0x6f, 0x63, 0x0, 0x0, 0xdc, 0x55, 0x1, 0xdc, 0x5, 0x78, 0x0, 0x60, 0x1,
258            0x0, 0x0, 0x10, 0xc1, 0x55, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, 0x42, 0x4, 0x0, 0x0, 0x0,
259            0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0x8, 0x0, 0x0,
260        ];
261        let mut cursor = Cursor::new(data);
262        let comp_msg = CompressedMessage::read_le(&mut cursor).unwrap();
263        assert_eq!(
264            comp_msg,
265            CompressedMessage::Chained(CompressedChainedMessage {
266                original_size: 4176,
267                items: vec![
268                    CompressedChainedItem {
269                        compression_algorithm: CompressionAlgorithm::None,
270                        flags: 1,
271                        original_size: None,
272                        payload_data: vec![
273                            0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8,
274                            0x0, 0x1, 0x0, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0,
275                            0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1d,
276                            0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x25, 0x16, 0x98, 0xbc, 0x89, 0x8e,
277                            0x3e, 0x86, 0xae, 0xb7, 0x13, 0x55, 0x7c, 0xfa, 0xf1, 0xbb, 0x11, 0x0,
278                            0x50, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
279                        ],
280                    },
281                    CompressedChainedItem {
282                        compression_algorithm: CompressionAlgorithm::LZ4,
283                        flags: 0,
284                        original_size: Some(0x7c8),
285                        payload_data: vec![
286                            0xf2, 0x3, 0x4d, 0x5a, 0x90, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0,
287                            0x0, 0xff, 0xff, 0x0, 0x0, 0xb8, 0x0, 0x1, 0x0, 0x12, 0x40, 0x7, 0x0,
288                            0xf, 0x2, 0x0, 0xa, 0xf3, 0x2e, 0x20, 0x1, 0x0, 0x0, 0xe, 0x1f, 0xba,
289                            0xe, 0x0, 0xb4, 0x9, 0xcd, 0x21, 0xb8, 0x1, 0x4c, 0xcd, 0x21, 0x54,
290                            0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20,
291                            0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75,
292                            0x6e, 0x20, 0x69, 0x6e, 0x20, 0x44, 0x4f, 0x53, 0x20, 0x6d, 0x6f, 0x64,
293                            0x65, 0x2e, 0xd, 0xd, 0xa, 0x24, 0x5a, 0x0, 0x84, 0xa9, 0x8e, 0xee,
294                            0xb9, 0xed, 0xef, 0x80, 0xea, 0x4, 0x0, 0xd1, 0x99, 0x6e, 0x86, 0xeb,
295                            0xdd, 0xef, 0x80, 0xea, 0x9f, 0x6e, 0x83, 0xeb, 0xe8, 0x10, 0x0, 0xb1,
296                            0x81, 0xeb, 0xe1, 0xef, 0x80, 0xea, 0xbe, 0x90, 0x84, 0xeb, 0xec, 0x8,
297                            0x0, 0x31, 0x83, 0xeb, 0xe3, 0x20, 0x0, 0x31, 0x81, 0xeb, 0xef, 0x38,
298                            0x0, 0xb1, 0x81, 0xea, 0xad, 0xef, 0x80, 0xea, 0xe4, 0x97, 0x13, 0xea,
299                            0xf0, 0x10, 0x0, 0x31, 0x80, 0xea, 0x7f, 0x38, 0x0, 0x40, 0x88, 0xeb,
300                            0x5e, 0xe9, 0x40, 0x0, 0x31, 0x85, 0xeb, 0xf3, 0x10, 0x0, 0x31, 0x84,
301                            0xeb, 0x90, 0x8, 0x0, 0x31, 0x83, 0xeb, 0xa9, 0x8, 0x0, 0x11, 0x80,
302                            0x50, 0x0, 0x40, 0x99, 0x6e, 0x7f, 0xea, 0x58, 0x0, 0x31, 0x99, 0x6e,
303                            0x82, 0x10, 0x0, 0x40, 0x52, 0x69, 0x63, 0x68, 0x44, 0x0, 0x3, 0x9f,
304                            0x0, 0xd4, 0x0, 0x50, 0x45, 0x0, 0x0, 0x64, 0x86, 0x24, 0x0, 0xbb,
305                            0xf4, 0xba, 0x23, 0x14, 0x0, 0xf1, 0xb, 0xf0, 0x0, 0x22, 0x0, 0xb, 0x2,
306                            0xe, 0x26, 0x0, 0x90, 0xa6, 0x0, 0x0, 0xe0, 0x1d, 0x0, 0x0, 0xf0, 0x61,
307                            0x0, 0x90, 0x2, 0xb1, 0x0, 0x0, 0x10, 0x22, 0x0, 0x20, 0x40, 0x1, 0x7,
308                            0x0, 0x0, 0xc, 0x0, 0x56, 0x10, 0x0, 0x0, 0xa, 0x0, 0x4, 0x0, 0x1, 0x2,
309                            0x0, 0x30, 0xf0, 0x44, 0x1, 0x28, 0x0, 0xb1, 0x26, 0xd1, 0xc2, 0x0,
310                            0x1, 0x0, 0x60, 0x41, 0x0, 0x0, 0x8, 0x17, 0x0, 0x22, 0x0, 0x20, 0x7,
311                            0x0, 0x1, 0x35, 0x0, 0x0, 0x2, 0x0, 0x0, 0x40, 0x0, 0x3, 0x2, 0x0, 0x1,
312                            0xb, 0x0, 0xc1, 0x70, 0x14, 0x0, 0x8f, 0xb3, 0x1, 0x0, 0x28, 0x47,
313                            0x14, 0x0, 0xb8, 0x61, 0x0, 0xf3, 0x14, 0x40, 0x1, 0x28, 0x8e, 0x3,
314                            0x0, 0x0, 0x70, 0xd, 0x0, 0xb4, 0xcf, 0x6, 0x0, 0x0, 0x70, 0xc2, 0x0,
315                            0xb8, 0x25, 0x0, 0x0, 0x0, 0x90, 0x43, 0x1, 0xdc, 0x5f, 0x0, 0x0, 0x10,
316                            0x10, 0x4, 0x0, 0x70, 0x40, 0x0, 0xf, 0x2, 0x0, 0x1, 0x20, 0xa0, 0x5b,
317                            0x42, 0x0, 0x7, 0x1a, 0x0, 0x57, 0x40, 0x14, 0x0, 0xf8, 0x6, 0x10, 0x0,
318                            0xb, 0x2, 0x0, 0xb2, 0x2e, 0x72, 0x64, 0x61, 0x74, 0x61, 0x0, 0x0,
319                            0x30, 0x5c, 0xd, 0x91, 0x0, 0x13, 0x60, 0x8, 0x0, 0x7, 0x2, 0x0, 0x62,
320                            0x40, 0x0, 0x0, 0x48, 0x2e, 0x70, 0x28, 0x0, 0x2, 0x94, 0x0, 0x40, 0xd,
321                            0x0, 0x0, 0xd0, 0x9c, 0x0, 0x17, 0xd, 0x26, 0x0, 0x3, 0x28, 0x0, 0x12,
322                            0x69, 0x28, 0x0, 0x22, 0x24, 0x26, 0x7c, 0x0, 0x23, 0x0, 0x30, 0x8,
323                            0x0, 0x7, 0x2, 0x0, 0x1, 0x50, 0x0, 0x12, 0x65, 0x28, 0x0, 0x0, 0xfc,
324                            0x0, 0x63, 0x0, 0x70, 0x14, 0x0, 0x0, 0xc0, 0x8, 0x0, 0x7, 0x2, 0x0,
325                            0xc1, 0x40, 0x0, 0x0, 0x40, 0x50, 0x52, 0x4f, 0x54, 0x44, 0x41, 0x54,
326                            0x41, 0x1b, 0x1, 0x22, 0x30, 0x16, 0xa4, 0x0, 0x0, 0x8, 0x0, 0x7, 0x2,
327                            0x0, 0x0, 0x50, 0x0, 0xa0, 0x47, 0x46, 0x49, 0x44, 0x53, 0x0, 0x0, 0x0,
328                            0x2c, 0xa9, 0x70, 0x0, 0x43, 0x16, 0x0, 0x0, 0xb0, 0x8, 0x0, 0x7, 0x2,
329                            0x0, 0x81, 0x40, 0x0, 0x0, 0x42, 0x50, 0x61, 0x64, 0x31, 0x13, 0x0,
330                            0x61, 0x10, 0x9, 0x0, 0x0, 0xf0, 0x16, 0xb, 0x0, 0xc, 0x2, 0x0, 0xf2,
331                            0x0, 0x80, 0x0, 0x0, 0x42, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x0, 0x0, 0x0,
332                            0xb, 0xa1, 0x4c, 0xc5, 0x1, 0x2d, 0xb0, 0x4c, 0x30, 0x0, 0x80, 0x20,
333                            0x0, 0x0, 0x68, 0x50, 0x41, 0x47, 0x45, 0x40, 0x0, 0xf0, 0x0, 0x80,
334                            0x42, 0x44, 0x0, 0x0, 0xb0, 0x6c, 0x0, 0x0, 0x50, 0x44, 0x0, 0x0, 0xa0,
335                            0x63, 0x13, 0x0, 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x60, 0x28, 0x0,
336                            0xf5, 0x4, 0x4c, 0x4b, 0x0, 0x0, 0x1c, 0x64, 0x2, 0x0, 0x0, 0x0, 0xb1,
337                            0x0, 0x0, 0x70, 0x2, 0x0, 0x0, 0xf0, 0xa7, 0x24, 0x0, 0x0, 0x2, 0x0,
338                            0x1, 0x28, 0x0, 0x80, 0x4f, 0x4f, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0xbe,
339                            0xf4, 0x1, 0x22, 0x70, 0xb3, 0x40, 0x1, 0x20, 0x60, 0xaa, 0x1f, 0x0,
340                            0x5, 0x2, 0x0, 0x4, 0x78, 0x0, 0xe0, 0x4b, 0x44, 0x0, 0x0, 0xea, 0x5d,
341                            0x0, 0x0, 0x0, 0xa0, 0xb3, 0x0, 0x0, 0x60, 0x24, 0x2, 0xd, 0x28, 0x0,
342                            0x1, 0x78, 0x0, 0x60, 0x56, 0x52, 0x46, 0x59, 0x19, 0x15, 0xe, 0x4,
343                            0x8f, 0xb4, 0x0, 0x0, 0x20, 0x3, 0x0, 0x0, 0xf0, 0x28, 0x0, 0x3, 0x50,
344                            0x48, 0x44, 0x4c, 0x53, 0x76, 0xe, 0x3, 0x22, 0x20, 0xb7, 0x78, 0x0,
345                            0x25, 0x10, 0xae, 0x74, 0x0, 0x0, 0x2, 0x0, 0x1, 0xa0, 0x0, 0x90, 0x41,
346                            0x47, 0x45, 0x42, 0x47, 0x46, 0x58, 0x68, 0x69, 0x45, 0x3, 0x21, 0xb7,
347                            0x0, 0x8d, 0x2, 0x1e, 0x40, 0x28, 0x0, 0xf1, 0x0, 0x54, 0x52, 0x41,
348                            0x43, 0x45, 0x53, 0x55, 0x50, 0xa3, 0x19, 0x0, 0x0, 0x0, 0xc0, 0xb7,
349                            0x3d, 0x0, 0x2d, 0x0, 0xb0, 0x28, 0x0, 0x1, 0x40, 0x1, 0xb2, 0x43,
350                            0x4d, 0x52, 0x43, 0xf3, 0xe, 0x0, 0x0, 0x0, 0xe0, 0xb7, 0xe0, 0x1,
351                            0x1d, 0xd0, 0x28, 0x0, 0x50, 0x60, 0x4b, 0x56, 0x41, 0x53, 0x18, 0x1,
352                            0x10, 0x7e, 0x61, 0x4, 0x13, 0xf0, 0xa0, 0x0, 0x1d, 0xe0, 0x28, 0x0,
353                            0x50, 0x68, 0x4b, 0x53, 0x43, 0x50, 0xac, 0x0, 0x10, 0x60, 0x7f, 0x3,
354                            0x22, 0x20, 0xb8, 0x50, 0x0, 0x20, 0x10, 0xaf, 0x13, 0x0, 0x5, 0x2,
355                            0x0, 0x0, 0x40, 0x1, 0x90, 0x44, 0x52, 0x56, 0x50, 0x52, 0x58, 0x0,
356                            0x0, 0xb7, 0x16, 0x0, 0x13, 0x30, 0x28, 0x0, 0x1e, 0x20, 0x28, 0x0,
357                            0x50, 0x66, 0x6f, 0x74, 0x68, 0x6b, 0x24, 0x0, 0x0, 0xad, 0x3, 0x13,
358                            0x40, 0x28, 0x0, 0x1e, 0x30, 0x28, 0x0, 0xe0, 0x49, 0x4e, 0x49, 0x54,
359                            0x4b, 0x44, 0x42, 0x47, 0xa6, 0xf1, 0x1, 0x0, 0x0, 0x50, 0x6e, 0x5,
360                            0x4e, 0x2, 0x0, 0x0, 0x40, 0x28, 0x0, 0x90, 0x4d, 0x49, 0x4e, 0x49,
361                            0x45, 0x58, 0x0, 0x0, 0xbc, 0x20, 0x3, 0x22, 0x50, 0xba, 0x68, 0x1,
362                            0x20, 0x40, 0xb1, 0x62, 0x0, 0x5, 0x2, 0x0, 0x40, 0x20, 0x0, 0x0, 0x62,
363                            0x50, 0x0, 0x0, 0x11, 0x0, 0xee, 0x1b, 0xe0, 0x9, 0x0, 0x0, 0x80, 0xba,
364                            0x0, 0x0, 0xf0, 0x9, 0x0, 0x0, 0x70, 0x28, 0x0, 0x40, 0x50, 0x61, 0x64,
365                            0x32, 0x28, 0x0, 0x71, 0x0, 0x90, 0x1b, 0x0, 0x0, 0x70, 0xc4, 0xb, 0x0,
366                            0xc, 0x2, 0x0, 0x52, 0x80, 0x0, 0x0, 0x62, 0x2e, 0x6f, 0x3, 0x40, 0x0,
367                            0x80, 0x29, 0x1c, 0x69, 0x1, 0x0, 0xed, 0x4, 0x49, 0x0, 0x0, 0x60,
368                            0xbb, 0x2b, 0x0, 0xf1, 0x4, 0x40, 0x0, 0x0, 0xc8, 0x41, 0x4c, 0x4d,
369                            0x4f, 0x53, 0x54, 0x52, 0x4f, 0x40, 0x9c, 0x0, 0x0, 0x0, 0x30, 0xfc,
370                            0x8d, 0x0, 0x3d, 0x0, 0x50, 0xbc, 0x28, 0x0, 0xf2, 0x0, 0x43, 0x41,
371                            0x43, 0x48, 0x45, 0x41, 0x4c, 0x49, 0x0, 0x8e, 0x0, 0x0, 0x0, 0xd0,
372                            0xfc, 0x20, 0x1, 0x1e, 0x70, 0x28, 0x0, 0x0, 0xf8, 0x2, 0x0, 0xc0, 0x3,
373                            0x72, 0x50, 0xb4, 0x1, 0x0, 0x0, 0x60, 0xfd, 0x50, 0x0, 0x1d, 0x80,
374                            0x28, 0x0, 0x10, 0xc0, 0x28, 0x0, 0xe0, 0x56, 0x52, 0x46, 0x44, 0x50,
375                            0x3c, 0x1, 0x0, 0x0, 0x20, 0xff, 0x0, 0x0, 0xa0, 0xd8, 0x2, 0xe, 0x28,
376                            0x0, 0x0, 0x18, 0x1, 0x0, 0x50, 0x0, 0x30, 0xb4, 0x14, 0x2, 0xf4, 0x2,
377                            0x1, 0x74, 0x5, 0x39, 0x0, 0x40, 0xbd, 0xa0, 0x0, 0x81, 0x20, 0x0, 0x0,
378                            0xc2, 0x50, 0x61, 0x64, 0x33, 0x15, 0x0, 0x61, 0x80, 0x1d, 0x0, 0x0,
379                            0x80, 0x2, 0x3f, 0x4, 0xc, 0x2, 0x0, 0x90, 0x80, 0x0, 0x0, 0xc2, 0x43,
380                            0x46, 0x47, 0x52, 0x4f, 0xe3, 0x0, 0x1, 0xa8, 0x5, 0x21, 0x20, 0x1,
381                            0x70, 0x3, 0x1a, 0x50, 0x50, 0x0, 0x0, 0x18, 0x1, 0x41, 0x50, 0x61,
382                            0x64, 0x34, 0x40, 0x0, 0x50, 0xd0, 0x1f, 0x0, 0x0, 0x30, 0x22, 0x7,
383                            0xe, 0x2, 0x0, 0x80, 0x80, 0x0, 0x0, 0xca, 0x2e, 0x72, 0x73, 0x72,
384                            0xfe, 0x3, 0x1, 0xc4, 0x5, 0x9d, 0x0, 0x40, 0x1, 0x0, 0x90, 0x3, 0x0,
385                            0x0, 0x80, 0x50, 0x0, 0xc1, 0x42, 0x2e, 0x72, 0x65, 0x6c, 0x6f, 0x63,
386                            0x0, 0x0, 0xdc, 0x55, 0x1, 0xdc, 0x5, 0x78, 0x0, 0x60, 0x1, 0x0, 0x0,
387                            0x10, 0xc1, 0x55, 0x0, 0x50, 0x0, 0x40, 0x0, 0x0, 0x42
388                        ]
389                    },
390                    CompressedChainedItem {
391                        compression_algorithm: CompressionAlgorithm::PatternV1,
392                        flags: 0,
393                        original_size: None,
394                        payload_data: vec![0x0, 0x0, 0x0, 0x0, 0x38, 0x8, 0x0, 0x0]
395                    },
396                ]
397            })
398        )
399    }
400
401    #[test]
402    pub fn test_compressed_data_chained_write() {
403        let value = CompressedMessage::Chained(CompressedChainedMessage {
404            original_size: 368,
405            items: vec![
406                CompressedChainedItem {
407                    compression_algorithm: CompressionAlgorithm::None,
408                    flags: 1,
409                    original_size: None,
410                    payload_data: vec![
411                        0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0,
412                        0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x3, 0x0, 0x0,
413                        0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9, 0x0,
414                        0x0, 0x2c, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
415                        0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0x0, 0x1, 0xf, 0x2a, 0x2,
416                        0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3,
417                        0x0, 0x0, 0x0, 0x11, 0x7, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x69, 0x0, 0x20,
418                        0x0, 0xc, 0x0, 0x0, 0x0,
419                    ],
420                },
421                CompressedChainedItem {
422                    compression_algorithm: CompressionAlgorithm::None,
423                    flags: 0,
424                    original_size: None,
425                    payload_data: vec![
426                        0x0, 0x0, 0x0, 0x0, 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44, 0x32,
427                        0x36, 0x32, 0x41, 0x43, 0x36, 0x32, 0x34, 0x34, 0x35, 0x31, 0x32, 0x39,
428                        0x35,
429                    ],
430                },
431                CompressedChainedItem {
432                    compression_algorithm: CompressionAlgorithm::PatternV1,
433                    flags: 0,
434                    original_size: None,
435                    payload_data: vec![0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0],
436                },
437            ],
438        });
439
440        let mut cursor = Cursor::new(Vec::new());
441        value.write_le(&mut cursor).unwrap();
442
443        assert_eq!(
444            cursor.into_inner(),
445            [
446                0xfc, 0x53, 0x4d, 0x42, 0x70, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x68, 0x0, 0x0,
447                0x0, 0xfe, 0x53, 0x4d, 0x42, 0x40, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0,
448                0x1, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x3, 0x0, 0x0, 0x0, 0x0,
449                0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x2c, 0x0, 0x30,
450                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
451                0x0, 0x0, 0x29, 0x0, 0x1, 0xf, 0x2a, 0x2, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x8, 0x1,
452                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x11, 0x7, 0x0, 0x0, 0xc, 0x0,
453                0x0, 0x0, 0x69, 0x0, 0x20, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0,
454                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x24, 0x4d, 0x70, 0x45, 0x61, 0x5f, 0x44, 0x32,
455                0x36, 0x32, 0x41, 0x43, 0x36, 0x32, 0x34, 0x34, 0x35, 0x31, 0x32, 0x39, 0x35, 0x4,
456                0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0
457            ]
458        );
459    }
460}