3 use std::cell::{Ref,RefCell};
4 use nihav_core::io::bitreader::*;
6 use nihav_core::codecs::*;
10 pub fn scale_mv(val: i32, scale: u8) -> i32 {
11 (val + (if val > 0 { 1 } else { 0 }) + (scale as i32) - 1) >> scale
15 pub struct IVICodebook {
22 pub fn init(&self) -> Self {
24 let mut base: u32 = 0;
27 base += 1 << cb.bits[i];
33 pub const IVI_CB_ZERO: IVICodebook = IVICodebook { len: 0, bits: [0; 16], offs: [0; 16] };
35 const IVI_REV0: [u32; 1] = [0];
36 const IVI_REV1: [u32; 2] = [0, 1];
37 const IVI_REV2: [u32; 4] = [0, 2, 1, 3];
38 const IVI_REV3: [u32; 8] = [0, 4, 2, 6, 1, 5, 3, 7];
39 const IVI_REV4: [u32; 16] = [ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
40 const IVI_REV5: [u32; 32] = [ 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31];
41 const IVI_REV6: [u32; 64] = [ 0, 32, 16, 48, 8, 40, 24, 56, 4, 36, 20, 52, 12, 44, 28, 60, 2, 34, 18, 50, 10, 42, 26, 58, 6, 38, 22, 54, 14, 46, 30, 62, 1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61, 3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63];
42 const IVI_REV7: [u32; 128] = [ 0, 64, 32, 96, 16, 80, 48, 112, 8, 72, 40, 104, 24, 88, 56, 120, 4, 68, 36, 100, 20, 84, 52, 116, 12, 76, 44, 108, 28, 92, 60, 124, 2, 66, 34, 98, 18, 82, 50, 114, 10, 74, 42, 106, 26, 90, 58, 122, 6, 70, 38, 102, 22, 86, 54, 118, 14, 78, 46, 110, 30, 94, 62, 126, 1, 65, 33, 97, 17, 81, 49, 113, 9, 73, 41, 105, 25, 89, 57, 121, 5, 69, 37, 101, 21, 85, 53, 117, 13, 77, 45, 109, 29, 93, 61, 125, 3, 67, 35, 99, 19, 83, 51, 115, 11, 75, 43, 107, 27, 91, 59, 123, 7, 71, 39, 103, 23, 87, 55, 119, 15, 79, 47, 111, 31, 95, 63, 127];
43 const IVI_REV8: [u32; 256] = [ 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255];
45 const IVI_REVS: [&[u32]; 9] = [ &IVI_REV0, &IVI_REV1, &IVI_REV2, &IVI_REV3, &IVI_REV4, &IVI_REV5, &IVI_REV6, &IVI_REV7, &IVI_REV8];
47 pub trait IVICodebookReader {
48 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, try_default: bool) -> DecoderResult<IVICodebook>;
49 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32>;
50 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32>;
53 impl<'a> IVICodebookReader for BitReader<'a> {
54 fn read_ivi_codebook_desc(&mut self, mb_cb: bool, desc_coded: bool) -> DecoderResult<IVICodebook> {
57 Ok(IVI_MB_CB[7].init())
59 Ok(IVI_BLK_CB[7].init())
62 let idx = self.read(3)? as usize;
65 Ok(IVI_MB_CB[idx].init())
67 Ok(IVI_BLK_CB[idx].init())
70 let mut cb = IVI_CB_ZERO;
71 cb.len = self.read(4)? as usize;
72 if cb.len == 0 { return Err(DecoderError::InvalidData); }
74 cb.bits[i] = self.read(4)? as u8;
81 fn read_ivi_cb(&mut self, cb: &IVICodebook) -> BitReaderResult<u32> {
82 /* let pfx = if cb.len == 1 { 0 } else { self.read_code(UintCodeType::LimitedUnary((cb.len - 1) as u32, 0))? as usize };
83 let nbits = cb.bits[pfx];
84 let mut base: u32 = 0;
85 for i in 0..pfx { base += 1 << cb.bits[i]; }
86 let rval = self.read(nbits)?;
87 let add = reverse_bits(rval, nbits);
90 let len = (!self.peek(16)).trailing_zeros() as usize;
92 if len >= cb.len - 1 {
94 self.skip((cb.len - 1) as u32)?;
97 self.skip((len + 1) as u32)?;
99 let nbits = cb.bits[pfx];
100 let base = cb.offs[pfx];
101 let rval = self.read(nbits)?;
102 let add = IVI_REVS[nbits as usize][rval as usize];
105 let nbits = cb.bits[0];
106 return Ok(IVI_REVS[nbits as usize][self.read(nbits)? as usize]);
110 fn read_ivi_cb_s(&mut self, cb: &IVICodebook) -> BitReaderResult<i32> {
111 let v = self.read_ivi_cb(cb)?;
115 let sign = (v & 1) == 1;
116 let val = (v >> 1) as i32;
126 pub const IVI_MB_CB: &[IVICodebook; 8] = &[
127 IVICodebook { len: 8, bits: [ 0, 4, 5, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
128 IVICodebook { len: 12, bits: [ 0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
129 IVICodebook { len: 12, bits: [ 0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
130 IVICodebook { len: 12, bits: [ 0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] },
131 IVICodebook { len: 13, bits: [ 0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
132 IVICodebook { len: 9, bits: [ 0, 4, 4, 4, 4, 3, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
133 IVICodebook { len: 10, bits: [ 0, 4, 4, 4, 4, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
134 IVICodebook { len: 12, bits: [ 0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2, 0, 0, 0, 0 ], offs: [0; 16] }
137 pub const IVI_BLK_CB: &[IVICodebook; 8] = &[
138 IVICodebook { len: 10, bits: [ 1, 2, 3, 4, 4, 7, 5, 5, 4, 1, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] },
139 IVICodebook { len: 11, bits: [ 2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
140 IVICodebook { len: 12, bits: [ 2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1, 0, 0, 0, 0 ], offs: [0; 16] },
141 IVICodebook { len: 13, bits: [ 3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
142 IVICodebook { len: 11, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2, 0, 0, 0, 0, 0 ], offs: [0; 16] },
143 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
144 IVICodebook { len: 13, bits: [ 3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0 ], offs: [0; 16] },
145 IVICodebook { len: 9, bits: [ 3, 4, 4, 5, 5, 5, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0 ], offs: [0; 16] }
148 #[allow(unused_variables)]
149 fn read_trans_band_header(br: &mut BitReader, w: usize, h: usize, dst: &mut [i16], dstride: usize) -> DecoderResult<()> {
150 let color_plane = br.read(2)?;
151 let bit_depth = br.read(3)?;
152 let dirty_rects = br.read(8)? as usize;
153 for i in 0..dirty_rects {
154 let x = br.read(16)?;
155 let y = br.read(16)?;
156 let l = br.read(16)?;
157 let r = br.read(16)?;
159 let has_trans_color = br.read_bool()?;
168 let mut cb = IVI_CB_ZERO;
169 cb.len = br.read(4)? as usize;
170 if cb.len == 0 { return Err(DecoderError::InvalidData); }
172 cb.bits[i] = br.read(4)? as u8;
176 let tile_start = br.tell();
177 let empty = br.read_bool()?;
180 let mut len = br.read(8)? as usize;
182 len = br.read(24)? as usize;
185 let tile_end = tile_start + len * 8;
187 let first_val = br.read_bool()?;
189 let mut dec_size = 0;
192 let mut fill = if !first_val { 255-128 } else { 0-128 };
193 let tr_w = (w + 31) & !31;
194 while br.tell() < tile_end {
195 let code = br.read_ivi_cb(&cb)? as usize;
199 if (x < w) && (y < h) {
200 dst[x + y * dstride] = fill;
211 if (x < w) && (y < h) {
212 dst[x + y * dstride] = fill;
230 fn decode_block8x8(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams8x8, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> {
231 let mut idx: isize = -1;
232 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
234 let c = br.read_ivi_cb(blk_cb)?;
235 if c == rvmap.eob_sym { break; }
238 if c != rvmap.esc_sym {
240 run = rvmap.runtab[c as usize] as isize;
241 val = rvmap.valtab[c as usize] as i32;
243 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
244 let lo = br.read_ivi_cb(blk_cb)?;
245 let hi = br.read_ivi_cb(blk_cb)?;
246 let v = (hi << 6) + lo;
248 val = 0; // should not happen but still...
250 let vv = (v >> 1) as i32;
259 validate!((idx >= 0) && (idx < 64));
261 let spos = tables.scan[idx as usize];
262 let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
265 let bias = (((q ^ 1) - 1) >> 1) as i32;
266 coeffs[spos] = val * qq;
267 if val > 0 { coeffs[spos] += bias; }
268 else { coeffs[spos] -= bias; }
273 if is_intra && is_2d {
274 *prev_dc += coeffs[0];
275 coeffs[0] = *prev_dc;
280 fn decode_block4x4(br: &mut BitReader, blk_cb: &IVICodebook, rvmap: &RVMap, tables: &TxParams4x4, is_intra: bool, is_2d: bool, prev_dc: &mut i32, quant: u8, coeffs: &mut [i32; 64], transform: &TrFunc) -> DecoderResult<()> {
281 let mut idx: isize = -1;
282 let quant_mat = if is_intra { tables.quant_intra } else { tables.quant_inter };
284 let c = br.read_ivi_cb(blk_cb)?;
285 if c == rvmap.eob_sym { break; }
288 if c != rvmap.esc_sym {
290 run = rvmap.runtab[c as usize] as isize;
291 val = rvmap.valtab[c as usize] as i32;
293 run = (br.read_ivi_cb(blk_cb)? as isize) + 1;
294 let lo = br.read_ivi_cb(blk_cb)?;
295 let hi = br.read_ivi_cb(blk_cb)?;
296 let v = (hi << 6) + lo;
298 val = 0; // should not happen but still...
301 val = ((v >> 1) as i32) + 1;
303 val = -((v >> 1) as i32);
308 validate!((idx >= 0) && (idx < 16));
310 let spos = tables.scan[idx as usize];
311 let q = ((quant_mat[spos] as u32) * (quant as u32)) >> 9;
314 let bias = (((q ^ 1) - 1) >> 1) as i32;
315 coeffs[spos] = val * qq;
316 if val > 0 { coeffs[spos] += bias; }
317 else { coeffs[spos] -= bias; }
322 if is_intra && is_2d {
323 *prev_dc += coeffs[0];
324 coeffs[0] = *prev_dc;
330 fn put_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
332 let mut dptr = frame.as_mut_ptr().offset(offs as isize);
333 for y in 0..blk_size {
334 for x in 0..blk_size {
335 *dptr.offset(x as isize) = blk[x + y * blk_size] as i16;
337 dptr = dptr.offset(stride as isize);
342 fn add_block(frame: &mut [i16], offs: usize, stride: usize, blk: &[i32], blk_size: usize) {
344 let mut dptr = frame.as_mut_ptr().offset(offs as isize);
345 for y in 0..blk_size {
346 for x in 0..blk_size {
347 *dptr.offset(x as isize) = (*dptr.offset(x as isize)).wrapping_add(blk[x + y * blk_size] as i16);
349 dptr = dptr.offset(stride as isize);
355 plane_buf: [Vec<i16>; 4],
356 plane_stride: [usize; 4],
357 pic_hdr: PictureHeader,
360 fn align(val: usize, bits: u8) -> usize {
361 let mask = (1 << bits) - 1;
366 fn new() -> Rc<RefCell<Self>> {
367 Rc::new(RefCell::new(FrameData {
368 plane_buf: [Vec::new(), Vec::new(), Vec::new(), Vec::new()],
369 plane_stride: [0, 0, 0, 0],
370 pic_hdr: PictureHeader::new_null(IVIFrameType::Intra),
373 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
374 let width = align(pic_hdr.width, 6);
375 let height = align(pic_hdr.height, 6);
378 self.plane_buf[0].resize(stride * height, 0);
379 self.plane_stride[0] = stride;
381 self.plane_buf[plane].resize((stride >> 1) * (height >> 1), 0);
382 self.plane_stride[plane] = stride >> 1;
384 if pic_hdr.transparent {
385 self.plane_buf[3].resize(stride * height, 0);
386 self.plane_stride[3] = stride;
388 self.pic_hdr = *pic_hdr;
391 fn fill_plane(&mut self, vb: &mut NAVideoBuffer<u8>, plane: usize) {
392 let (w, h) = vb.get_dimensions(plane);
393 let mut didx = vb.get_offset(plane);
394 let dstride = vb.get_stride(plane);
395 let mut dst = vb.get_data_mut();
396 let src = &self.plane_buf[plane];
398 let sstride = self.plane_stride[plane];
401 dst[didx + x] = clip8(src[sidx + x] + 128);
409 fn do_mc(dst: &mut [i16], dstride: usize, src: &[i16], sstride: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, is_hpel: bool, blk_size: usize) {
410 let (xoff, yoff, mv_mode) = if is_hpel {
411 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
415 let xpos = (x as isize) + (xoff as isize);
416 let ypos = (y as isize) + (yoff as isize);
417 if (xpos < (l as isize)) || ((xpos as usize) + blk_size + ((mv_mode & 1) as usize) > r) ||
418 (ypos < (t as isize)) || ((ypos as usize) + blk_size + ((mv_mode >> 1) as usize) > b) {
419 //println!(" copy from {},{} of {}-{},{}-{} {}x{}!", xpos, ypos, l,r,t,b,blk_size,blk_size);
422 let sidx = (xpos as usize) + (ypos as usize) * sstride;
424 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 8, 8);
426 ivi_mc_put(dst, dstride, &src[sidx..], sstride, mv_mode, 4, 4);
430 fn do_mc_b(dst: &mut [i16], dstride: usize, src1: &[i16], sstride1: usize, src2: &[i16], sstride2: usize, x: usize, y: usize, l: usize, r: usize, t: usize, b: usize, mv_x: i32, mv_y: i32, mv2_x: i32, mv2_y: i32, is_hpel: bool, blk_size: usize) {
431 let (xoff1, yoff1, mv_mode1) = if is_hpel {
432 (mv_x >> 1, mv_y >> 1, ((mv_x & 1) + (mv_y & 1) * 2) as u8)
436 let xpos1 = (x as isize) + (xoff1 as isize);
437 let ypos1 = (y as isize) + (yoff1 as isize);
438 if (xpos1 < (l as isize)) || ((xpos1 as usize) + blk_size + ((mv_mode1 & 1) as usize) > r) ||
439 (ypos1 < (t as isize)) || ((ypos1 as usize) + blk_size + ((mv_mode1 >> 1) as usize) > b) {
442 let sidx1 = (xpos1 as usize) + (ypos1 as usize) * sstride1;
443 let (xoff2, yoff2, mv_mode2) = if is_hpel {
444 (mv2_x >> 1, mv2_y >> 1, ((mv2_x & 1) + (mv2_y & 1) * 2) as u8)
448 let xpos2 = (x as isize) + (xoff2 as isize);
449 let ypos2 = (y as isize) + (yoff2 as isize);
450 if (xpos2 < (l as isize)) || ((xpos2 as usize) + blk_size + ((mv_mode2 & 1) as usize) > r) ||
451 (ypos2 < (t as isize)) || ((ypos2 as usize) + blk_size + ((mv_mode2 >> 1) as usize) > b) {
454 let sidx2 = (xpos2 as usize) + (ypos2 as usize) * sstride2;
455 ivi_mc_avg(dst, dstride, &src1[sidx1..], sstride1, mv_mode1, &src2[sidx2..], sstride2, mv_mode2, blk_size, blk_size);
458 pub trait IndeoXParser {
459 fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader>;
460 fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane: usize, band: usize) -> DecoderResult<BandHeader>;
461 fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band_hdr: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()>;
462 fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize);
465 const MISSING_REF: usize = 42;
467 pub struct IVIDecoder {
469 frames: [Rc<RefCell<FrameData>>; 4],
478 bref: Option<NABufferType>,
480 bands: Vec<BandHeader>,
481 tiles: Vec<Rc<RefCell<IVITile>>>,
482 num_tiles: [[usize; 4]; 4],
483 tile_start: [[usize; 4]; 4],
487 pub fn new() -> Self {
488 let mut bands: Vec<BandHeader> = Vec::with_capacity(12);
489 bands.resize(12, BandHeader::new_empty(42, 42));
491 ftype: IVIFrameType::NULL,
492 frames: [FrameData::new(), FrameData::new(), FrameData::new(), FrameData::new()],
493 cur_frame: 0, prev_frame: MISSING_REF, next_frame: MISSING_REF,
494 iref_0: MISSING_REF, iref_1: MISSING_REF, scal_ref: MISSING_REF,
495 vinfo: NAVideoInfo::new(0, 0, false, YUV410_FORMAT),
496 vinfoa: NAVideoInfo::new(0, 0, false, YUVA410_FORMAT),
500 tiles: Vec::new(), tile_start: [[0; 4]; 4], num_tiles: [[0; 4]; 4],
504 fn realloc(&mut self, pic_hdr: &PictureHeader) -> DecoderResult<()> {
505 let planes = if pic_hdr.transparent { 4 } else { 3 };
507 //self.bands.truncate(0);
508 self.tiles.truncate(0);
509 self.num_tiles = [[0; 4]; 4];
510 self.tile_start = [[0; 4]; 4];
511 let mut tstart: usize = 0;
512 for plane in 0..planes {
513 let is_luma = (plane != 1) && (plane != 2);
514 let bands = if is_luma { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
515 let mut band_w = if is_luma { pic_hdr.width } else { (pic_hdr.width + 3) >> 2 };
516 let mut band_h = if is_luma { pic_hdr.height } else { (pic_hdr.height + 3) >> 2 };
517 let mut tile_w = if is_luma { pic_hdr.slice_w } else { (pic_hdr.slice_w + 3) >> 2 };
518 let mut tile_h = if is_luma { pic_hdr.slice_h } else { (pic_hdr.slice_h + 3) >> 2 };
520 band_w = (band_w + 1) >> 1;
521 band_h = (band_h + 1) >> 1;
523 tile_w = (tile_w + 1) >> 1;
524 tile_h = (tile_h + 1) >> 1;
527 for band in 0..bands {
528 self.tile_start[plane][band] = tstart;
529 let band_xoff = if (band & 1) == 1 { band_w } else { 0 };
530 let band_yoff = if (band & 2) == 2 { band_h } else { 0 };
533 let cur_h = if y + tile_h <= band_h { tile_h } else { band_h - y };
536 let cur_w = if x + tile_w <= band_w { tile_w } else { band_w - x };
537 let tile = IVITile::new(band_xoff + x, band_yoff + y, cur_w, cur_h);
538 self.tiles.push(Rc::new(RefCell::new(tile)));
539 self.num_tiles[plane][band] += 1;
549 fn decode_band(&mut self, pic_hdr: &PictureHeader, dec: &mut IndeoXParser, br: &mut BitReader, plane_no: usize, band_no: usize) -> DecoderResult<()> {
550 let bidx = match plane_no {
552 _ => { pic_hdr.luma_bands + plane_no - 1 },
554 let prev_band = if bidx >= self.bands.len() { BandHeader::new_empty(plane_no, band_no) } else { self.bands[bidx].clone() };
555 let mut band = dec.decode_band_header(br, pic_hdr, plane_no, band_no)?;
556 if let TxType::None = band.ttype {
557 validate!(band.plane_no == prev_band.plane_no);
558 validate!(band.band_no == prev_band.band_no);
559 validate!(band.blk_size == prev_band.blk_size);
560 band.tr = prev_band.tr;
561 band.ttype = prev_band.ttype;
564 let tstart = self.tile_start[band.plane_no][band.band_no];
565 let tend = tstart + self.num_tiles[band.plane_no][band.band_no];
566 let mb_size = band.mb_size;
567 let (tr, tr_dc) = match band.ttype {
568 TxType::Transform4(_) => { ivi_get_transform4x4_funcs(band.tr) },
569 TxType::Transform8(_) => { ivi_get_transform8x8_funcs(band.tr) },
570 _ => { ivi_get_transform4x4_funcs(band.tr) },
572 for tile_no in tstart..tend {
574 let mut tile = self.tiles[tile_no].borrow_mut();
575 let mb_w = (tile.w + mb_size - 1) / mb_size;
576 let mb_h = (tile.h + mb_size - 1) / mb_size;
580 tile.mb.resize(mb_w * mb_h, MB::new(0, 0));
583 let tile_start = br.tell();
584 if !br.read_bool()? {
585 let res = br.read_bool()?;
587 let mut len = br.read(8)? as usize;
589 len = br.read(24)? as usize;
593 let tile_end = tile_start + len * 8;
594 validate!(tile_end > br.tell());
595 validate!(tile_end <= br.tell() + (br.left() as usize));
597 let mut tile = self.tiles[tile_no].borrow_mut();
598 let ref_tile: Option<Ref<IVITile>>;
600 if (plane_no == 0) && (band_no == 0) {
603 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
605 if plane_no != 0 || band_no != 0 {
606 let rtile = self.tiles[0].borrow();
607 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
610 ref_tile = Some(rtile);
615 dec.decode_mb_info(br, pic_hdr, &band, &mut tile, ref_tile, mv_scale)?;
618 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
619 let skip_part = tile_end - br.tell();
620 br.skip(skip_part as u32)?;
623 let mut tile = self.tiles[tile_no].borrow_mut();
624 let ref_tile: Option<Ref<IVITile>>;
626 if (plane_no == 0) && (band_no == 0) {
629 mv_scale = (((self.bands[0].mb_size >> 3) as i8) - ((band.mb_size >> 3) as i8)) as u8;
631 if plane_no != 0 || band_no != 0 {
632 let rtile = self.tiles[0].borrow();
633 if (tile.mb_w != rtile.mb_w) || (tile.mb_h != rtile.mb_h) {
636 ref_tile = Some(rtile);
642 for mb_y in 0..tile.mb_h {
643 for mb_x in 0..tile.mb_w {
644 let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
645 mb.mtype = MBType::Inter;
648 if let Some(ref tileref) = ref_tile {
649 let mx = tileref.mb[mb_idx].mv_x;
650 let my = tileref.mb[mb_idx].mv_y;
651 mb.mv_x = scale_mv(mx, mv_scale);
652 mb.mv_y = scale_mv(my, mv_scale);
655 tile.mb[mb_idx] = mb;
660 self.decode_tile(br, &band, tile_no, &tr, &tr_dc)?;
663 self.bands[bidx] = band;
667 fn decode_tile(&mut self, br: &mut BitReader, band: &BandHeader, tile_no: usize, tr: &TrFunc, transform_dc: &TrFuncDC) -> DecoderResult<()> {
669 let mut prev_dc: i32 = 0;
670 let mut tile = self.tiles[tile_no].borrow_mut();
671 let mut frame = self.frames[self.cur_frame].borrow_mut();
673 let stride = frame.plane_stride[band.plane_no];
674 let mut dstidx = tile.pos_x + tile.pos_y * stride;
675 let mut dst = &mut frame.plane_buf[band.plane_no];
676 let pos_x = tile.pos_x;
677 let pos_y = tile.pos_y;
678 let tile_w = (tile.w + 15) & !15;
679 let tile_h = (tile.h + 15) & !15;
680 for mb_y in 0..tile.mb_h {
681 for mb_x in 0..tile.mb_w {
682 let mb = &mut tile.mb[mb_idx];
684 let is_intra = mb.mtype == MBType::Intra;
686 if band.mb_size != band.blk_size {
687 let mut cbp = mb.cbp;
689 let mut blk: [i32; 64] = [0; 64];
690 let boff = (blk_no & 1) * 8 + (blk_no & 2) * 4 * stride + mb_x * 16;
692 if mb.mtype != MBType::Bidir {
694 if mb.mtype != MBType::Backward {
695 idx = self.prev_frame;
697 idx = self.next_frame;
699 let pf = self.frames[idx].borrow();
700 do_mc(&mut dst[dstidx + boff..], stride,
701 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
702 pos_x + mb_x * 16 + (blk_no & 1) * 8,
703 pos_y + mb_y * 16 + (blk_no & 2) * 4,
704 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
705 mb.mv_x, mb.mv_y, band.halfpel, 8);
707 let pf = self.frames[self.prev_frame].borrow();
708 let nf = self.frames[self.next_frame].borrow();
709 do_mc_b(&mut dst[dstidx + boff..], stride,
710 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
711 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
712 pos_x + mb_x * 16 + (blk_no & 1) * 8,
713 pos_y + mb_y * 16 + (blk_no & 2) * 4,
714 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
715 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
720 if let TxType::Transform8(ref params) = band.ttype {
721 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
723 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
725 add_block(&mut dst, dstidx + boff, stride, &blk, 8);
730 (transform_dc)(&mut blk, prev_dc);
731 put_block(&mut dst, dstidx + boff, stride, &blk, 8);
737 let mut blk: [i32; 64] = [0; 64];
739 if mb.mtype != MBType::Bidir {
741 if mb.mtype != MBType::Backward {
742 idx = self.prev_frame;
744 idx = self.next_frame;
746 let pf = self.frames[idx].borrow();
747 do_mc(&mut dst[dstidx + mb_x * band.blk_size..], stride,
748 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
749 pos_x + mb_x * band.mb_size,
750 pos_y + mb_y * band.mb_size,
751 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
752 mb.mv_x, mb.mv_y, band.halfpel, band.blk_size);
754 let pf = self.frames[self.prev_frame].borrow();
755 let nf = self.frames[self.next_frame].borrow();
756 do_mc_b(&mut dst[dstidx + mb_x * band.blk_size..], stride,
757 &pf.plane_buf[band.plane_no], pf.plane_stride[band.plane_no],
758 &nf.plane_buf[band.plane_no], nf.plane_stride[band.plane_no],
759 pos_x + mb_x * band.mb_size,
760 pos_y + mb_y * band.mb_size,
761 pos_x, pos_x + tile_w, pos_y, pos_y + tile_h,
762 mb.mv_x, mb.mv_y, mb.mv2_x, mb.mv2_y, band.halfpel,
767 if let TxType::Transform8(ref params) = band.ttype {
768 decode_block8x8(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
770 if let TxType::Transform4(ref params) = band.ttype {
771 decode_block4x4(br, &band.blk_cb, &band.rvmap, params, is_intra, band.tr.is_2d(), &mut prev_dc, mb.q, &mut blk, tr)?;
774 if band.blk_size == 8 {
775 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
777 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
780 if band.blk_size == 8 {
781 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
783 add_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
788 (transform_dc)(&mut blk, prev_dc);
789 if band.blk_size == 8 {
790 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 8);
792 put_block(&mut dst, dstidx + mb_x * band.blk_size, stride, &blk, 4);
799 dstidx += stride * band.mb_size;
805 fn find_unused_frame(&self) -> usize {
807 if (fno != self.iref_0) && (fno != self.iref_1) && (fno != self.scal_ref) {
814 fn decode_single_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
815 let pic_hdr = dec.decode_picture_header(br)?;
816 self.ftype = pic_hdr.ftype;
817 if pic_hdr.ftype.is_null() {
818 return Ok(NABufferType::None);
821 self.cur_frame = self.find_unused_frame();
823 IVIFrameType::Inter => {
824 self.prev_frame = self.iref_0;
825 if self.prev_frame == MISSING_REF {
826 return Err(DecoderError::MissingReference);
829 IVIFrameType::InterDroppable => {
830 self.prev_frame = self.scal_ref;
831 if self.prev_frame == MISSING_REF {
832 return Err(DecoderError::MissingReference);
835 IVIFrameType::InterScal => {
836 self.prev_frame = self.scal_ref;
837 if self.prev_frame == MISSING_REF {
838 return Err(DecoderError::MissingReference);
841 IVIFrameType::Bidir => {
842 self.prev_frame = self.iref_1;
843 self.next_frame = self.iref_0;
844 if (self.prev_frame == MISSING_REF) || (self.next_frame == MISSING_REF) {
845 return Err(DecoderError::MissingReference);
852 if pic_hdr.transparent {
853 vinfo = self.vinfoa.clone();
855 vinfo = self.vinfo.clone();
857 vinfo.set_width(pic_hdr.width);
858 vinfo.set_height(pic_hdr.height);
859 let mut buftype = alloc_video_buffer(vinfo, 0)?;
860 self.realloc(&pic_hdr)?;
861 self.frames[self.cur_frame].borrow_mut().realloc(&pic_hdr)?;
864 let num_bands = if plane == 0 { pic_hdr.luma_bands } else { pic_hdr.chroma_bands };
865 for band in 0..num_bands {
866 self.decode_band(&pic_hdr, dec, br, plane, band)?;
868 if let NABufferType::Video(ref mut vb) = buftype {
869 let mut frame = self.frames[self.cur_frame].borrow_mut();
871 frame.fill_plane(vb, plane);
873 let (w, h) = vb.get_dimensions(plane);
874 let dstride = vb.get_stride(plane);
875 let off = vb.get_offset(plane);
876 let mut dst = vb.get_data_mut();
877 dec.recombine_plane(&frame.plane_buf[plane], frame.plane_stride[plane], &mut dst[off..], dstride, w, h);
881 if pic_hdr.transparent {
882 let mut frame = self.frames[self.cur_frame].borrow_mut();
883 let stride = frame.plane_stride[3];
884 read_trans_band_header(br, pic_hdr.width, pic_hdr.height, &mut frame.plane_buf[3], stride)?;
885 if let NABufferType::Video(ref mut vb) = buftype {
886 frame.fill_plane(vb, 3);
891 IVIFrameType::Intra | IVIFrameType::Inter => {
892 self.iref_1 = self.iref_0;
893 self.iref_0 = self.cur_frame;
894 self.scal_ref = self.cur_frame;
896 IVIFrameType::InterScal => {
897 self.scal_ref = self.cur_frame;
905 pub fn decode_frame<'a>(&mut self, dec: &mut IndeoXParser, br: &mut BitReader<'a>) -> DecoderResult<NABufferType> {
906 let res = self.decode_single_frame(dec, br);
907 if res.is_err() { return res; }
908 if (self.ftype == IVIFrameType::Intra) && (br.left() > 16) {
910 if br.left() < 8 { break; }
911 if br.read(8)? == 0 { break; }
914 if br.left() < 8 { break; }
915 if br.peek(8) != 0 { break; }
919 let seq = br.peek(21);
921 let res2 = self.decode_single_frame(dec, br);
923 self.bref = Some(res2.unwrap());
926 self.ftype = IVIFrameType::Intra;
929 if let Ok(NABufferType::None) = res {
930 if self.bref.is_some() {
931 let mut bref: Option<NABufferType> = None;
932 mem::swap(&mut bref, &mut self.bref);
933 self.ftype = IVIFrameType::Inter;
934 return Ok(bref.unwrap());
940 pub fn is_intra(&mut self) -> bool {
941 self.ftype.is_intra()
943 pub fn get_frame_type(&mut self) -> FrameType {
945 IVIFrameType::Intra => { FrameType::I },
946 IVIFrameType::Intra1 => { FrameType::I },
947 IVIFrameType::Inter => { FrameType::P },
948 IVIFrameType::InterDroppable => { FrameType::P },
949 IVIFrameType::InterScal => { FrameType::P },
950 IVIFrameType::Bidir => { FrameType::B },
951 _ => { FrameType::Skip },
959 pub runtab: [u8; 256],
960 pub valtab: [i8; 256],
963 impl Clone for RVMap {
964 fn clone(&self) -> RVMap {
965 let mut runtab: [u8; 256] = [0; 256];
966 let mut valtab: [i8; 256] = [0; 256];
967 runtab.copy_from_slice(&self.runtab);
968 valtab.copy_from_slice(&self.valtab);
969 RVMap { eob_sym: self.eob_sym, esc_sym: self.esc_sym, runtab: runtab, valtab: valtab }
973 pub const IVI_ZERO_RVMAP: RVMap = RVMap { eob_sym: 0, esc_sym: 0, runtab: [0; 256], valtab: [0; 256] };
975 pub static IVI_RVMAPS: [RVMap; 9] = [
976 RVMap { eob_sym: 5, esc_sym: 2, runtab: [
977 1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
978 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
979 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
980 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
981 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
982 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
983 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
984 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
985 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
986 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
987 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
988 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
989 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
990 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
991 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
992 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38 ],
994 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
995 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
996 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
997 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
998 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
999 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
1000 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
1001 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
1002 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
1003 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
1004 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
1005 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
1006 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
1007 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
1008 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
1009 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1 ],
1011 RVMap { eob_sym: 0, esc_sym: 38, runtab: [
1012 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
1013 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
1014 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
1015 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
1016 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
1017 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
1018 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
1019 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
1020 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
1021 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
1022 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
1023 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
1024 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
1025 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
1026 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
1027 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5 ],
1029 0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
1030 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
1031 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
1032 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
1033 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
1034 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
1035 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
1036 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
1037 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
1038 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
1039 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
1040 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
1041 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
1042 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
1043 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
1044 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4 ],
1046 RVMap { eob_sym: 2, esc_sym: 11, runtab: [
1047 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
1048 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
1049 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
1050 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
1051 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
1052 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
1053 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
1054 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
1055 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
1056 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
1057 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
1058 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
1059 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
1060 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
1061 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
1062 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62 ],
1064 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
1065 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
1066 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
1067 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
1068 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
1069 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
1070 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
1071 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
1072 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
1073 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
1074 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
1075 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
1076 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
1077 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
1078 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
1079 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1 ]
1081 RVMap { eob_sym: 0, esc_sym: 35, runtab: [
1082 0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
1083 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
1084 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
1085 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
1086 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
1087 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
1088 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
1089 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
1090 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
1091 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
1092 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
1093 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
1094 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
1095 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
1096 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
1097 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16 ],
1099 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
1100 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
1101 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
1102 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
1103 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
1104 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
1105 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
1106 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
1107 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
1108 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
1109 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
1110 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
1111 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
1112 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
1113 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
1114 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3 ]
1116 RVMap { eob_sym: 0, esc_sym: 34, runtab: [
1117 0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
1118 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
1119 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
1120 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
1121 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
1122 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1123 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
1124 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
1125 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
1126 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
1127 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
1128 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
1129 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
1130 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
1131 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
1132 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 ],
1134 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
1135 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
1136 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
1137 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
1138 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
1139 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
1140 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
1141 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
1142 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
1143 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
1144 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
1145 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
1146 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
1147 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
1148 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
1149 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89 ]
1151 RVMap { eob_sym: 2, esc_sym: 33, runtab: [
1152 1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
1153 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
1154 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
1155 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
1156 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
1157 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
1158 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
1159 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
1160 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
1161 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
1162 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
1163 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
1164 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
1165 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
1166 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
1167 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7 ],
1169 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
1170 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
1171 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
1172 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
1173 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
1174 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
1175 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
1176 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
1177 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
1178 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
1179 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
1180 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
1181 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
1182 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
1183 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
1184 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5 ]
1186 RVMap { eob_sym: 2, esc_sym: 13, runtab: [
1187 1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
1188 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
1189 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
1190 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
1191 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
1192 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
1193 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
1194 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
1195 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
1196 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
1197 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
1198 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
1199 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
1200 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
1201 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
1202 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2 ],
1204 -20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
1205 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
1206 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
1207 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
1208 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
1209 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
1210 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
1211 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
1212 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
1213 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
1214 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
1215 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
1216 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
1217 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
1218 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
1219 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14 ]
1221 RVMap { eob_sym: 2, esc_sym: 38, runtab: [
1222 1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
1223 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
1224 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
1225 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
1226 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
1227 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
1228 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
1229 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
1230 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
1231 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
1232 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
1233 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
1234 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
1235 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
1236 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
1237 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49 ],
1239 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
1240 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
1241 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
1242 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
1243 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
1244 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
1245 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
1246 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
1247 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
1248 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
1249 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
1250 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
1251 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
1252 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
1253 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
1254 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1 ]
1256 RVMap { eob_sym: 4, esc_sym: 11, runtab: [
1257 1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
1258 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
1259 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
1260 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
1261 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
1262 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
1263 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
1264 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
1265 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
1266 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
1267 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
1268 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
1269 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
1270 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
1271 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
1272 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1 ],
1274 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
1275 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
1276 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
1277 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
1278 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
1279 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
1280 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
1281 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
1282 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
1283 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
1284 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
1285 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
1286 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
1287 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
1288 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
1289 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26 ]