00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00029 #define BITSTREAM_READER_LE
00030 #include "libavutil/attributes.h"
00031 #include "avcodec.h"
00032 #include "get_bits.h"
00033 #include "internal.h"
00034 #include "mathops.h"
00035 #include "ivi_common.h"
00036 #include "ivi_dsp.h"
00037
00038 extern const IVIHuffDesc ff_ivi_mb_huff_desc[8];
00039 extern const IVIHuffDesc ff_ivi_blk_huff_desc[8];
00040
00041 static VLC ivi_mb_vlc_tabs [8];
00042 static VLC ivi_blk_vlc_tabs[8];
00043
00048 static uint16_t inv_bits(uint16_t val, int nbits)
00049 {
00050 uint16_t res;
00051
00052 if (nbits <= 8) {
00053 res = ff_reverse[val] >> (8-nbits);
00054 } else
00055 res = ((ff_reverse[val & 0xFF] << 8) + (ff_reverse[val >> 8])) >> (16-nbits);
00056
00057 return res;
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 static int ivi_create_huff_from_desc(const IVIHuffDesc *cb, VLC *vlc, int flag)
00070 {
00071 int pos, i, j, codes_per_row, prefix, not_last_row;
00072 uint16_t codewords[256];
00073 uint8_t bits[256];
00074
00075 pos = 0;
00076
00077 for (i = 0; i < cb->num_rows; i++) {
00078 codes_per_row = 1 << cb->xbits[i];
00079 not_last_row = (i != cb->num_rows - 1);
00080 prefix = ((1 << i) - 1) << (cb->xbits[i] + not_last_row);
00081
00082 for (j = 0; j < codes_per_row; j++) {
00083 if (pos >= 256)
00084 break;
00085
00086 bits[pos] = i + cb->xbits[i] + not_last_row;
00087 if (bits[pos] > IVI_VLC_BITS)
00088 return -1;
00089
00090 codewords[pos] = inv_bits((prefix | j), bits[pos]);
00091 if (!bits[pos])
00092 bits[pos] = 1;
00093
00094 pos++;
00095 }
00096 }
00097
00098
00099 return init_vlc(vlc, IVI_VLC_BITS, pos, bits, 1, 1, codewords, 2, 2,
00100 (flag ? INIT_VLC_USE_NEW_STATIC : 0) | INIT_VLC_LE);
00101 }
00102
00103 void ff_ivi_init_static_vlc(void)
00104 {
00105 int i;
00106 static VLC_TYPE table_data[8192 * 16][2];
00107 static int initialized_vlcs = 0;
00108
00109 if (initialized_vlcs)
00110 return;
00111 for (i = 0; i < 8; i++) {
00112 ivi_mb_vlc_tabs[i].table = table_data + i * 2 * 8192;
00113 ivi_mb_vlc_tabs[i].table_allocated = 8192;
00114 ivi_create_huff_from_desc(&ff_ivi_mb_huff_desc[i], &ivi_mb_vlc_tabs[i], 1);
00115 ivi_blk_vlc_tabs[i].table = table_data + (i * 2 + 1) * 8192;
00116 ivi_blk_vlc_tabs[i].table_allocated = 8192;
00117 ivi_create_huff_from_desc(&ff_ivi_blk_huff_desc[i], &ivi_blk_vlc_tabs[i], 1);
00118 }
00119 initialized_vlcs = 1;
00120 }
00121
00122
00123
00124
00125
00126
00127
00128 static void ivi_huff_desc_copy(IVIHuffDesc *dst, const IVIHuffDesc *src)
00129 {
00130 dst->num_rows = src->num_rows;
00131 memcpy(dst->xbits, src->xbits, src->num_rows);
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141 static int ivi_huff_desc_cmp(const IVIHuffDesc *desc1, const IVIHuffDesc *desc2)
00142 {
00143 return desc1->num_rows != desc2->num_rows
00144 || memcmp(desc1->xbits, desc2->xbits, desc1->num_rows);
00145 }
00146
00147 int ff_ivi_dec_huff_desc(GetBitContext *gb, int desc_coded, int which_tab,
00148 IVIHuffTab *huff_tab, AVCodecContext *avctx)
00149 {
00150 int i, result;
00151 IVIHuffDesc new_huff;
00152
00153 if (!desc_coded) {
00154
00155 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[7]
00156 : &ivi_mb_vlc_tabs [7];
00157 } else {
00158 huff_tab->tab_sel = get_bits(gb, 3);
00159 if (huff_tab->tab_sel == 7) {
00160
00161 new_huff.num_rows = get_bits(gb, 4);
00162 if (!new_huff.num_rows) {
00163 av_log(avctx, AV_LOG_ERROR, "Empty custom Huffman table!\n");
00164 return AVERROR_INVALIDDATA;
00165 }
00166
00167 for (i = 0; i < new_huff.num_rows; i++)
00168 new_huff.xbits[i] = get_bits(gb, 4);
00169
00170
00171 if (ivi_huff_desc_cmp(&new_huff, &huff_tab->cust_desc) || !huff_tab->cust_tab.table) {
00172 ivi_huff_desc_copy(&huff_tab->cust_desc, &new_huff);
00173
00174 if (huff_tab->cust_tab.table)
00175 ff_free_vlc(&huff_tab->cust_tab);
00176 result = ivi_create_huff_from_desc(&huff_tab->cust_desc,
00177 &huff_tab->cust_tab, 0);
00178 if (result) {
00179 huff_tab->cust_desc.num_rows = 0;
00180 av_log(avctx, AV_LOG_ERROR,
00181 "Error while initializing custom vlc table!\n");
00182 return result;
00183 }
00184 }
00185 huff_tab->tab = &huff_tab->cust_tab;
00186 } else {
00187
00188 huff_tab->tab = (which_tab) ? &ivi_blk_vlc_tabs[huff_tab->tab_sel]
00189 : &ivi_mb_vlc_tabs [huff_tab->tab_sel];
00190 }
00191 }
00192
00193 return 0;
00194 }
00195
00196
00197
00198
00199
00200
00201 static av_cold void ivi_free_buffers(IVIPlaneDesc *planes)
00202 {
00203 int p, b, t;
00204
00205 for (p = 0; p < 3; p++) {
00206 if (planes[p].bands)
00207 for (b = 0; b < planes[p].num_bands; b++) {
00208 av_freep(&planes[p].bands[b].bufs[0]);
00209 av_freep(&planes[p].bands[b].bufs[1]);
00210 av_freep(&planes[p].bands[b].bufs[2]);
00211
00212 if (planes[p].bands[b].blk_vlc.cust_tab.table)
00213 ff_free_vlc(&planes[p].bands[b].blk_vlc.cust_tab);
00214 for (t = 0; t < planes[p].bands[b].num_tiles; t++)
00215 av_freep(&planes[p].bands[b].tiles[t].mbs);
00216 av_freep(&planes[p].bands[b].tiles);
00217 }
00218 av_freep(&planes[p].bands);
00219 }
00220 }
00221
00222 av_cold int ff_ivi_init_planes(IVIPlaneDesc *planes, const IVIPicConfig *cfg)
00223 {
00224 int p, b;
00225 uint32_t b_width, b_height, align_fac, width_aligned, height_aligned, buf_size;
00226 IVIBandDesc *band;
00227
00228 ivi_free_buffers(planes);
00229
00230
00231 planes[0].width = cfg->pic_width;
00232 planes[0].height = cfg->pic_height;
00233 planes[0].num_bands = cfg->luma_bands;
00234
00235
00236 planes[1].width = planes[2].width = (cfg->pic_width + 3) >> 2;
00237 planes[1].height = planes[2].height = (cfg->pic_height + 3) >> 2;
00238 planes[1].num_bands = planes[2].num_bands = cfg->chroma_bands;
00239
00240 for (p = 0; p < 3; p++) {
00241 planes[p].bands = av_mallocz(planes[p].num_bands * sizeof(IVIBandDesc));
00242 if (!planes[p].bands)
00243 return AVERROR(ENOMEM);
00244
00245
00246
00247
00248 b_width = planes[p].num_bands == 1 ? planes[p].width : (planes[p].width + 1) >> 1;
00249 b_height = planes[p].num_bands == 1 ? planes[p].height : (planes[p].height + 1) >> 1;
00250
00251
00252
00253 align_fac = p ? 8 : 16;
00254 width_aligned = FFALIGN(b_width , align_fac);
00255 height_aligned = FFALIGN(b_height, align_fac);
00256 buf_size = width_aligned * height_aligned * sizeof(int16_t);
00257
00258 for (b = 0; b < planes[p].num_bands; b++) {
00259 band = &planes[p].bands[b];
00260 band->plane = p;
00261 band->band_num = b;
00262 band->width = b_width;
00263 band->height = b_height;
00264 band->pitch = width_aligned;
00265 band->aheight = height_aligned;
00266 band->bufs[0] = av_mallocz(buf_size);
00267 band->bufs[1] = av_mallocz(buf_size);
00268 band->bufsize = buf_size/2;
00269 if (!band->bufs[0] || !band->bufs[1])
00270 return AVERROR(ENOMEM);
00271
00272
00273 if (cfg->luma_bands > 1) {
00274 band->bufs[2] = av_mallocz(buf_size);
00275 if (!band->bufs[2])
00276 return AVERROR(ENOMEM);
00277 }
00278
00279 planes[p].bands[0].blk_vlc.cust_desc.num_rows = 0;
00280 }
00281 }
00282
00283 return 0;
00284 }
00285
00286 av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
00287 {
00288 int p, b, x, y, x_tiles, y_tiles, t_width, t_height;
00289 IVIBandDesc *band;
00290 IVITile *tile, *ref_tile;
00291
00292 for (p = 0; p < 3; p++) {
00293 t_width = !p ? tile_width : (tile_width + 3) >> 2;
00294 t_height = !p ? tile_height : (tile_height + 3) >> 2;
00295
00296 if (!p && planes[0].num_bands == 4) {
00297 t_width >>= 1;
00298 t_height >>= 1;
00299 }
00300 if(t_width<=0 || t_height<=0)
00301 return AVERROR(EINVAL);
00302
00303 for (b = 0; b < planes[p].num_bands; b++) {
00304 band = &planes[p].bands[b];
00305 x_tiles = IVI_NUM_TILES(band->width, t_width);
00306 y_tiles = IVI_NUM_TILES(band->height, t_height);
00307 band->num_tiles = x_tiles * y_tiles;
00308
00309 av_freep(&band->tiles);
00310 band->tiles = av_mallocz(band->num_tiles * sizeof(IVITile));
00311 if (!band->tiles)
00312 return AVERROR(ENOMEM);
00313
00314 tile = band->tiles;
00315
00316
00317
00318 ref_tile = planes[0].bands[0].tiles;
00319
00320 for (y = 0; y < band->height; y += t_height) {
00321 for (x = 0; x < band->width; x += t_width) {
00322 tile->xpos = x;
00323 tile->ypos = y;
00324 tile->mb_size = band->mb_size;
00325 tile->width = FFMIN(band->width - x, t_width);
00326 tile->height = FFMIN(band->height - y, t_height);
00327 tile->is_empty = tile->data_size = 0;
00328
00329 tile->num_MBs = IVI_MBs_PER_TILE(tile->width, tile->height,
00330 band->mb_size);
00331
00332 av_freep(&tile->mbs);
00333 tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
00334 if (!tile->mbs)
00335 return AVERROR(ENOMEM);
00336
00337 tile->ref_mbs = 0;
00338 if (p || b) {
00339 if (tile->num_MBs <= ref_tile->num_MBs) {
00340 tile->ref_mbs = ref_tile->mbs;
00341 }else
00342 av_log(NULL, AV_LOG_DEBUG, "Cannot use ref_tile, too few mbs\n");
00343 ref_tile++;
00344 }
00345
00346 tile++;
00347 }
00348 }
00349
00350 }
00351 }
00352
00353 return 0;
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366 static int ivi_dec_tile_data_size(GetBitContext *gb)
00367 {
00368 int len;
00369
00370 len = 0;
00371 if (get_bits1(gb)) {
00372 len = get_bits(gb, 8);
00373 if (len == 255)
00374 len = get_bits_long(gb, 24);
00375 }
00376
00377
00378 align_get_bits(gb);
00379
00380 return len;
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394 static int ivi_decode_blocks(GetBitContext *gb, IVIBandDesc *band, IVITile *tile,
00395 AVCodecContext *avctx)
00396 {
00397 int mbn, blk, num_blocks, num_coeffs, blk_size, scan_pos, run, val,
00398 pos, is_intra, mc_type = 0, mv_x, mv_y, col_mask;
00399 uint8_t col_flags[8];
00400 int32_t prev_dc, trvec[64];
00401 uint32_t cbp, sym, lo, hi, quant, buf_offs, q;
00402 IVIMbInfo *mb;
00403 RVMapDesc *rvmap = band->rv_map;
00404 void (*mc_with_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00405 void (*mc_no_delta_func) (int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
00406 const uint16_t *base_tab;
00407 const uint8_t *scale_tab;
00408
00409 prev_dc = 0;
00410
00411 blk_size = band->blk_size;
00412 col_mask = blk_size - 1;
00413 num_blocks = (band->mb_size != blk_size) ? 4 : 1;
00414 num_coeffs = blk_size * blk_size;
00415 if (blk_size == 8) {
00416 mc_with_delta_func = ff_ivi_mc_8x8_delta;
00417 mc_no_delta_func = ff_ivi_mc_8x8_no_delta;
00418 } else {
00419 mc_with_delta_func = ff_ivi_mc_4x4_delta;
00420 mc_no_delta_func = ff_ivi_mc_4x4_no_delta;
00421 }
00422
00423 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00424 is_intra = !mb->type;
00425 cbp = mb->cbp;
00426 buf_offs = mb->buf_offs;
00427
00428 quant = av_clip(band->glob_quant + mb->q_delta, 0, 23);
00429
00430 base_tab = is_intra ? band->intra_base : band->inter_base;
00431 scale_tab = is_intra ? band->intra_scale : band->inter_scale;
00432 if (scale_tab)
00433 quant = scale_tab[quant];
00434
00435 if (!is_intra) {
00436 mv_x = mb->mv_x;
00437 mv_y = mb->mv_y;
00438 if (band->is_halfpel) {
00439 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00440 mv_x >>= 1;
00441 mv_y >>= 1;
00442 }
00443 if (mb->type) {
00444 int dmv_x, dmv_y, cx, cy;
00445
00446 dmv_x = mb->mv_x >> band->is_halfpel;
00447 dmv_y = mb->mv_y >> band->is_halfpel;
00448 cx = mb->mv_x & band->is_halfpel;
00449 cy = mb->mv_y & band->is_halfpel;
00450
00451 if ( mb->xpos + dmv_x < 0
00452 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
00453 || mb->ypos + dmv_y < 0
00454 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
00455 return AVERROR_INVALIDDATA;
00456 }
00457 }
00458 }
00459
00460 for (blk = 0; blk < num_blocks; blk++) {
00461
00462 if (blk & 1) {
00463 buf_offs += blk_size;
00464 } else if (blk == 2) {
00465 buf_offs -= blk_size;
00466 buf_offs += blk_size * band->pitch;
00467 }
00468
00469 if (cbp & 1) {
00470 if (!band->scan) {
00471 av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
00472 return AVERROR_INVALIDDATA;
00473 }
00474
00475 scan_pos = -1;
00476 memset(trvec, 0, num_coeffs*sizeof(trvec[0]));
00477 memset(col_flags, 0, sizeof(col_flags));
00478
00479 while (scan_pos <= num_coeffs) {
00480 sym = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00481 if (sym == rvmap->eob_sym)
00482 break;
00483
00484 if (sym == rvmap->esc_sym) {
00485 run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
00486 lo = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00487 hi = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
00488 val = IVI_TOSIGNED((hi << 6) | lo);
00489 } else {
00490 if (sym >= 256U) {
00491 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
00492 return -1;
00493 }
00494 run = rvmap->runtab[sym];
00495 val = rvmap->valtab[sym];
00496 }
00497
00498
00499 scan_pos += run;
00500 if (scan_pos >= (unsigned)num_coeffs)
00501 break;
00502 pos = band->scan[scan_pos];
00503
00504 if (!val)
00505 av_dlog(avctx, "Val = 0 encountered!\n");
00506
00507 q = (base_tab[pos] * quant) >> 9;
00508 if (q > 1)
00509 val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
00510 trvec[pos] = val;
00511 col_flags[pos & col_mask] |= !!val;
00512 }
00513
00514 if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
00515 return -1;
00516
00517
00518 if (is_intra && band->is_2d_trans) {
00519 prev_dc += trvec[0];
00520 trvec[0] = prev_dc;
00521 col_flags[0] |= !!prev_dc;
00522 }
00523 if(band->transform_size > band->blk_size){
00524 av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
00525 return AVERROR_INVALIDDATA;
00526 }
00527
00528 band->inv_transform(trvec, band->buf + buf_offs,
00529 band->pitch, col_flags);
00530
00531
00532 if (!is_intra)
00533 mc_with_delta_func(band->buf + buf_offs,
00534 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00535 band->pitch, mc_type);
00536 } else {
00537
00538
00539
00540 if (is_intra) {
00541 band->dc_transform(&prev_dc, band->buf + buf_offs,
00542 band->pitch, blk_size);
00543 } else
00544 mc_no_delta_func(band->buf + buf_offs,
00545 band->ref_buf + buf_offs + mv_y * band->pitch + mv_x,
00546 band->pitch, mc_type);
00547 }
00548
00549 cbp >>= 1;
00550 }
00551 }
00552
00553 align_get_bits(gb);
00554
00555 return 0;
00556 }
00557
00567 static int ivi_process_empty_tile(AVCodecContext *avctx, IVIBandDesc *band,
00568 IVITile *tile, int32_t mv_scale)
00569 {
00570 int x, y, need_mc, mbn, blk, num_blocks, mv_x, mv_y, mc_type;
00571 int offs, mb_offset, row_offset;
00572 IVIMbInfo *mb, *ref_mb;
00573 const int16_t *src;
00574 int16_t *dst;
00575 void (*mc_no_delta_func)(int16_t *buf, const int16_t *ref_buf, uint32_t pitch,
00576 int mc_type);
00577
00578 if (tile->num_MBs != IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size)) {
00579 av_log(avctx, AV_LOG_ERROR, "Allocated tile size %d mismatches "
00580 "parameters %d in ivi_process_empty_tile()\n",
00581 tile->num_MBs, IVI_MBs_PER_TILE(tile->width, tile->height, band->mb_size));
00582 return AVERROR_INVALIDDATA;
00583 }
00584
00585 offs = tile->ypos * band->pitch + tile->xpos;
00586 mb = tile->mbs;
00587 ref_mb = tile->ref_mbs;
00588 row_offset = band->mb_size * band->pitch;
00589 need_mc = 0;
00590
00591 for (y = tile->ypos; y < (tile->ypos + tile->height); y += band->mb_size) {
00592 mb_offset = offs;
00593
00594 for (x = tile->xpos; x < (tile->xpos + tile->width); x += band->mb_size) {
00595 mb->xpos = x;
00596 mb->ypos = y;
00597 mb->buf_offs = mb_offset;
00598
00599 mb->type = 1;
00600 mb->cbp = 0;
00601
00602 if (!band->qdelta_present && !band->plane && !band->band_num) {
00603 mb->q_delta = band->glob_quant;
00604 mb->mv_x = 0;
00605 mb->mv_y = 0;
00606 }
00607
00608 if (band->inherit_qdelta && ref_mb)
00609 mb->q_delta = ref_mb->q_delta;
00610
00611 if (band->inherit_mv && ref_mb) {
00612
00613 if (mv_scale) {
00614 mb->mv_x = ivi_scale_mv(ref_mb->mv_x, mv_scale);
00615 mb->mv_y = ivi_scale_mv(ref_mb->mv_y, mv_scale);
00616 } else {
00617 mb->mv_x = ref_mb->mv_x;
00618 mb->mv_y = ref_mb->mv_y;
00619 }
00620 need_mc |= mb->mv_x || mb->mv_y;
00621 {
00622 int dmv_x, dmv_y, cx, cy;
00623
00624 dmv_x = mb->mv_x >> band->is_halfpel;
00625 dmv_y = mb->mv_y >> band->is_halfpel;
00626 cx = mb->mv_x & band->is_halfpel;
00627 cy = mb->mv_y & band->is_halfpel;
00628
00629 if ( mb->xpos + dmv_x < 0
00630 || mb->xpos + dmv_x + band->mb_size + cx > band->pitch
00631 || mb->ypos + dmv_y < 0
00632 || mb->ypos + dmv_y + band->mb_size + cy > band->aheight) {
00633 av_log(avctx, AV_LOG_ERROR, "MV out of bounds\n");
00634 return AVERROR_INVALIDDATA;
00635 }
00636 }
00637 }
00638
00639 mb++;
00640 if (ref_mb)
00641 ref_mb++;
00642 mb_offset += band->mb_size;
00643 }
00644 offs += row_offset;
00645 }
00646
00647 if (band->inherit_mv && need_mc) {
00648 num_blocks = (band->mb_size != band->blk_size) ? 4 : 1;
00649 mc_no_delta_func = (band->blk_size == 8) ? ff_ivi_mc_8x8_no_delta
00650 : ff_ivi_mc_4x4_no_delta;
00651
00652 for (mbn = 0, mb = tile->mbs; mbn < tile->num_MBs; mb++, mbn++) {
00653 mv_x = mb->mv_x;
00654 mv_y = mb->mv_y;
00655 if (!band->is_halfpel) {
00656 mc_type = 0;
00657 } else {
00658 mc_type = ((mv_y & 1) << 1) | (mv_x & 1);
00659 mv_x >>= 1;
00660 mv_y >>= 1;
00661 }
00662
00663 for (blk = 0; blk < num_blocks; blk++) {
00664
00665 offs = mb->buf_offs + band->blk_size * ((blk & 1) + !!(blk & 2) * band->pitch);
00666 mc_no_delta_func(band->buf + offs,
00667 band->ref_buf + offs + mv_y * band->pitch + mv_x,
00668 band->pitch, mc_type);
00669 }
00670 }
00671 } else {
00672
00673 src = band->ref_buf + tile->ypos * band->pitch + tile->xpos;
00674 dst = band->buf + tile->ypos * band->pitch + tile->xpos;
00675 for (y = 0; y < tile->height; y++) {
00676 memcpy(dst, src, tile->width*sizeof(band->buf[0]));
00677 src += band->pitch;
00678 dst += band->pitch;
00679 }
00680 }
00681
00682 return 0;
00683 }
00684
00685
00686 #ifdef DEBUG
00687 static uint16_t ivi_calc_band_checksum(IVIBandDesc *band)
00688 {
00689 int x, y;
00690 int16_t *src, checksum;
00691
00692 src = band->buf;
00693 checksum = 0;
00694
00695 for (y = 0; y < band->height; src += band->pitch, y++)
00696 for (x = 0; x < band->width; x++)
00697 checksum += src[x];
00698
00699 return checksum;
00700 }
00701 #endif
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712 static void ivi_output_plane(IVIPlaneDesc *plane, uint8_t *dst, int dst_pitch)
00713 {
00714 int x, y;
00715 const int16_t *src = plane->bands[0].buf;
00716 uint32_t pitch = plane->bands[0].pitch;
00717
00718 if (!src)
00719 return;
00720
00721 for (y = 0; y < plane->height; y++) {
00722 for (x = 0; x < plane->width; x++)
00723 dst[x] = av_clip_uint8(src[x] + 128);
00724 src += pitch;
00725 dst += dst_pitch;
00726 }
00727 }
00728
00737 static int decode_band(IVI45DecContext *ctx,
00738 IVIBandDesc *band, AVCodecContext *avctx)
00739 {
00740 int result, i, t, idx1, idx2, pos;
00741 IVITile *tile;
00742
00743 band->buf = band->bufs[ctx->dst_buf];
00744 if (!band->buf) {
00745 av_log(avctx, AV_LOG_ERROR, "Band buffer points to no data!\n");
00746 return AVERROR_INVALIDDATA;
00747 }
00748 band->ref_buf = band->bufs[ctx->ref_buf];
00749 band->data_ptr = ctx->frame_data + (get_bits_count(&ctx->gb) >> 3);
00750
00751 result = ctx->decode_band_hdr(ctx, band, avctx);
00752 if (result) {
00753 av_log(avctx, AV_LOG_ERROR, "Error while decoding band header: %d\n",
00754 result);
00755 return result;
00756 }
00757
00758 if (band->is_empty) {
00759 av_log(avctx, AV_LOG_ERROR, "Empty band encountered!\n");
00760 return AVERROR_INVALIDDATA;
00761 }
00762
00763 band->rv_map = &ctx->rvmap_tabs[band->rvmap_sel];
00764
00765
00766 for (i = 0; i < band->num_corr; i++) {
00767 idx1 = band->corr[i * 2];
00768 idx2 = band->corr[i * 2 + 1];
00769 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00770 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00771 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
00772 band->rv_map->eob_sym ^= idx1 ^ idx2;
00773 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
00774 band->rv_map->esc_sym ^= idx1 ^ idx2;
00775 }
00776
00777 pos = get_bits_count(&ctx->gb);
00778
00779 for (t = 0; t < band->num_tiles; t++) {
00780 tile = &band->tiles[t];
00781
00782 if (tile->mb_size != band->mb_size) {
00783 av_log(avctx, AV_LOG_ERROR, "MB sizes mismatch: %d vs. %d\n",
00784 band->mb_size, tile->mb_size);
00785 return AVERROR_INVALIDDATA;
00786 }
00787 tile->is_empty = get_bits1(&ctx->gb);
00788 if (tile->is_empty) {
00789 result = ivi_process_empty_tile(avctx, band, tile,
00790 (ctx->planes[0].bands[0].mb_size >> 3) - (band->mb_size >> 3));
00791 if (result < 0)
00792 break;
00793 av_dlog(avctx, "Empty tile encountered!\n");
00794 } else {
00795 tile->data_size = ivi_dec_tile_data_size(&ctx->gb);
00796 if (!tile->data_size) {
00797 av_log(avctx, AV_LOG_ERROR, "Tile data size is zero!\n");
00798 result = AVERROR_INVALIDDATA;
00799 break;
00800 }
00801
00802 result = ctx->decode_mb_info(ctx, band, tile, avctx);
00803 if (result < 0)
00804 break;
00805
00806 result = ivi_decode_blocks(&ctx->gb, band, tile, avctx);
00807 if (result < 0 || ((get_bits_count(&ctx->gb) - pos) >> 3) != tile->data_size) {
00808 av_log(avctx, AV_LOG_ERROR, "Corrupted tile data encountered!\n");
00809 break;
00810 }
00811
00812 pos += tile->data_size << 3;
00813 }
00814 }
00815
00816
00817 for (i = band->num_corr-1; i >= 0; i--) {
00818 idx1 = band->corr[i*2];
00819 idx2 = band->corr[i*2+1];
00820 FFSWAP(uint8_t, band->rv_map->runtab[idx1], band->rv_map->runtab[idx2]);
00821 FFSWAP(int16_t, band->rv_map->valtab[idx1], band->rv_map->valtab[idx2]);
00822 if (idx1 == band->rv_map->eob_sym || idx2 == band->rv_map->eob_sym)
00823 band->rv_map->eob_sym ^= idx1 ^ idx2;
00824 if (idx1 == band->rv_map->esc_sym || idx2 == band->rv_map->esc_sym)
00825 band->rv_map->esc_sym ^= idx1 ^ idx2;
00826 }
00827
00828 #ifdef DEBUG
00829 if (band->checksum_present) {
00830 uint16_t chksum = ivi_calc_band_checksum(band);
00831 if (chksum != band->checksum) {
00832 av_log(avctx, AV_LOG_ERROR,
00833 "Band checksum mismatch! Plane %d, band %d, received: %x, calculated: %x\n",
00834 band->plane, band->band_num, band->checksum, chksum);
00835 }
00836 }
00837 #endif
00838
00839 align_get_bits(&ctx->gb);
00840
00841 return result;
00842 }
00843
00844 int ff_ivi_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
00845 AVPacket *avpkt)
00846 {
00847 IVI45DecContext *ctx = avctx->priv_data;
00848 const uint8_t *buf = avpkt->data;
00849 int buf_size = avpkt->size;
00850 int result, p, b;
00851
00852 init_get_bits(&ctx->gb, buf, buf_size * 8);
00853 ctx->frame_data = buf;
00854 ctx->frame_size = buf_size;
00855
00856 result = ctx->decode_pic_hdr(ctx, avctx);
00857 if (result) {
00858 av_log(avctx, AV_LOG_ERROR,
00859 "Error while decoding picture header: %d\n", result);
00860 return -1;
00861 }
00862 if (ctx->gop_invalid)
00863 return AVERROR_INVALIDDATA;
00864
00865 if (ctx->gop_flags & IVI5_IS_PROTECTED) {
00866 av_log(avctx, AV_LOG_ERROR, "Password-protected clip!\n");
00867 return -1;
00868 }
00869
00870 ctx->switch_buffers(ctx);
00871
00872
00873
00874 if (ctx->is_nonnull_frame(ctx)) {
00875 ctx->buf_invalid[ctx->dst_buf] = 1;
00876 for (p = 0; p < 3; p++) {
00877 for (b = 0; b < ctx->planes[p].num_bands; b++) {
00878 result = decode_band(ctx, &ctx->planes[p].bands[b], avctx);
00879 if (result) {
00880 av_log(avctx, AV_LOG_ERROR,
00881 "Error while decoding band: %d, plane: %d\n", b, p);
00882 return -1;
00883 }
00884 }
00885 }
00886 ctx->buf_invalid[ctx->dst_buf] = 0;
00887 }
00888 if (ctx->buf_invalid[ctx->dst_buf])
00889 return -1;
00890
00891
00892
00893
00894
00895
00896 if (avctx->codec_id == AV_CODEC_ID_INDEO4 && ctx->frame_type == 0) {
00897 while (get_bits(&ctx->gb, 8));
00898 skip_bits_long(&ctx->gb, 64);
00899 if (get_bits_left(&ctx->gb) > 18 && show_bits(&ctx->gb, 18) == 0x3FFF8)
00900 av_log(avctx, AV_LOG_ERROR, "Buffer contains IP frames!\n");
00901 }
00902
00903 if (!ctx->is_nonnull_frame(ctx))
00904 return buf_size;
00905
00906 if (ctx->frame.data[0])
00907 avctx->release_buffer(avctx, &ctx->frame);
00908
00909 ctx->frame.reference = 0;
00910 avcodec_set_dimensions(avctx, ctx->planes[0].width, ctx->planes[0].height);
00911 if ((result = ff_get_buffer(avctx, &ctx->frame)) < 0) {
00912 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
00913 return result;
00914 }
00915
00916 if (ctx->is_scalable) {
00917 if (avctx->codec_id == AV_CODEC_ID_INDEO4)
00918 ff_ivi_recompose_haar(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
00919 else
00920 ff_ivi_recompose53 (&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
00921 } else {
00922 ivi_output_plane(&ctx->planes[0], ctx->frame.data[0], ctx->frame.linesize[0]);
00923 }
00924
00925 ivi_output_plane(&ctx->planes[2], ctx->frame.data[1], ctx->frame.linesize[1]);
00926 ivi_output_plane(&ctx->planes[1], ctx->frame.data[2], ctx->frame.linesize[2]);
00927
00928 *got_frame = 1;
00929 *(AVFrame*)data = ctx->frame;
00930
00931 return buf_size;
00932 }
00933
00937 av_cold int ff_ivi_decode_close(AVCodecContext *avctx)
00938 {
00939 IVI45DecContext *ctx = avctx->priv_data;
00940
00941 ivi_free_buffers(&ctx->planes[0]);
00942
00943 if (ctx->mb_vlc.cust_tab.table)
00944 ff_free_vlc(&ctx->mb_vlc.cust_tab);
00945
00946 if (ctx->frame.data[0])
00947 avctx->release_buffer(avctx, &ctx->frame);
00948
00949 #if IVI4_STREAM_ANALYSER
00950 if (avctx->codec_id == AV_CODEC_ID_INDEO4) {
00951 if (ctx->is_scalable)
00952 av_log(avctx, AV_LOG_ERROR, "This video uses scalability mode!\n");
00953 if (ctx->uses_tiling)
00954 av_log(avctx, AV_LOG_ERROR, "This video uses local decoding!\n");
00955 if (ctx->has_b_frames)
00956 av_log(avctx, AV_LOG_ERROR, "This video contains B-frames!\n");
00957 if (ctx->has_transp)
00958 av_log(avctx, AV_LOG_ERROR, "Transparency mode is enabled!\n");
00959 if (ctx->uses_haar)
00960 av_log(avctx, AV_LOG_ERROR, "This video uses Haar transform!\n");
00961 if (ctx->uses_fullpel)
00962 av_log(avctx, AV_LOG_ERROR, "This video uses fullpel motion vectors!\n");
00963 }
00964 #endif
00965
00966 return 0;
00967 }
00968
00969
00976 const IVIHuffDesc ff_ivi_mb_huff_desc[8] = {
00977 {8, {0, 4, 5, 4, 4, 4, 6, 6}},
00978 {12, {0, 2, 2, 3, 3, 3, 3, 5, 3, 2, 2, 2}},
00979 {12, {0, 2, 3, 4, 3, 3, 3, 3, 4, 3, 2, 2}},
00980 {12, {0, 3, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2}},
00981 {13, {0, 4, 4, 3, 3, 3, 3, 2, 3, 3, 2, 1, 1}},
00982 {9, {0, 4, 4, 4, 4, 3, 3, 3, 2}},
00983 {10, {0, 4, 4, 4, 4, 3, 3, 2, 2, 2}},
00984 {12, {0, 4, 4, 4, 3, 3, 2, 3, 2, 2, 2, 2}}
00985 };
00986
00987 const IVIHuffDesc ff_ivi_blk_huff_desc[8] = {
00988 {10, {1, 2, 3, 4, 4, 7, 5, 5, 4, 1}},
00989 {11, {2, 3, 4, 4, 4, 7, 5, 4, 3, 3, 2}},
00990 {12, {2, 4, 5, 5, 5, 5, 6, 4, 4, 3, 1, 1}},
00991 {13, {3, 3, 4, 4, 5, 6, 6, 4, 4, 3, 2, 1, 1}},
00992 {11, {3, 4, 4, 5, 5, 5, 6, 5, 4, 2, 2}},
00993 {13, {3, 4, 5, 5, 5, 5, 6, 4, 3, 3, 2, 1, 1}},
00994 {13, {3, 4, 5, 5, 5, 6, 5, 4, 3, 3, 2, 1, 1}},
00995 {9, {3, 4, 4, 5, 5, 5, 6, 5, 5}}
00996 };
00997
00998
01002 const uint8_t ff_ivi_vertical_scan_8x8[64] = {
01003 0, 8, 16, 24, 32, 40, 48, 56,
01004 1, 9, 17, 25, 33, 41, 49, 57,
01005 2, 10, 18, 26, 34, 42, 50, 58,
01006 3, 11, 19, 27, 35, 43, 51, 59,
01007 4, 12, 20, 28, 36, 44, 52, 60,
01008 5, 13, 21, 29, 37, 45, 53, 61,
01009 6, 14, 22, 30, 38, 46, 54, 62,
01010 7, 15, 23, 31, 39, 47, 55, 63
01011 };
01012
01013 const uint8_t ff_ivi_horizontal_scan_8x8[64] = {
01014 0, 1, 2, 3, 4, 5, 6, 7,
01015 8, 9, 10, 11, 12, 13, 14, 15,
01016 16, 17, 18, 19, 20, 21, 22, 23,
01017 24, 25, 26, 27, 28, 29, 30, 31,
01018 32, 33, 34, 35, 36, 37, 38, 39,
01019 40, 41, 42, 43, 44, 45, 46, 47,
01020 48, 49, 50, 51, 52, 53, 54, 55,
01021 56, 57, 58, 59, 60, 61, 62, 63
01022 };
01023
01024 const uint8_t ff_ivi_direct_scan_4x4[16] = {
01025 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
01026 };
01027
01028
01032 const RVMapDesc ff_ivi_rvmap_tabs[9] = {
01033 {
01034 5,
01035 2,
01036
01037 {1, 1, 0, 1, 1, 0, 1, 1, 2, 2, 1, 1, 1, 1, 3, 3,
01038 1, 1, 2, 2, 1, 1, 4, 4, 1, 1, 1, 1, 2, 2, 5, 5,
01039 1, 1, 3, 3, 1, 1, 6, 6, 1, 2, 1, 2, 7, 7, 1, 1,
01040 8, 8, 1, 1, 4, 2, 1, 4, 2, 1, 3, 3, 1, 1, 1, 9,
01041 9, 1, 2, 1, 2, 1, 5, 5, 1, 1, 10, 10, 1, 1, 3, 3,
01042 2, 2, 1, 1, 11, 11, 6, 4, 4, 1, 6, 1, 2, 1, 2, 12,
01043 8, 1, 12, 7, 8, 7, 1, 16, 1, 16, 1, 3, 3, 13, 1, 13,
01044 2, 2, 1, 15, 1, 5, 14, 15, 1, 5, 14, 1, 17, 8, 17, 8,
01045 1, 4, 4, 2, 2, 1, 25, 25, 24, 24, 1, 3, 1, 3, 1, 8,
01046 6, 7, 6, 1, 18, 8, 18, 1, 7, 23, 2, 2, 23, 1, 1, 21,
01047 22, 9, 9, 22, 19, 1, 21, 5, 19, 5, 1, 33, 20, 33, 20, 8,
01048 4, 4, 1, 32, 2, 2, 8, 3, 32, 26, 3, 1, 7, 7, 26, 6,
01049 1, 6, 1, 1, 16, 1, 10, 1, 10, 2, 16, 29, 28, 2, 29, 28,
01050 1, 27, 5, 8, 5, 27, 1, 8, 3, 7, 3, 31, 41, 31, 1, 41,
01051 6, 1, 6, 7, 4, 4, 1, 1, 2, 1, 2, 11, 34, 30, 11, 1,
01052 30, 15, 15, 34, 36, 40, 36, 40, 35, 35, 37, 37, 39, 39, 38, 38},
01053
01054
01055 { 1, -1, 0, 2, -2, 0, 3, -3, 1, -1, 4, -4, 5, -5, 1, -1,
01056 6, -6, 2, -2, 7, -7, 1, -1, 8, -8, 9, -9, 3, -3, 1, -1,
01057 10, -10, 2, -2, 11, -11, 1, -1, 12, 4, -12, -4, 1, -1, 13, -13,
01058 1, -1, 14, -14, 2, 5, 15, -2, -5, -15, -3, 3, 16, -16, 17, 1,
01059 -1, -17, 6, 18, -6, -18, 2, -2, 19, -19, 1, -1, 20, -20, 4, -4,
01060 7, -7, 21, -21, 1, -1, 2, 3, -3, 22, -2, -22, 8, 23, -8, 1,
01061 2, -23, -1, 2, -2, -2, 24, 1, -24, -1, 25, 5, -5, 1, -25, -1,
01062 9, -9, 26, 1, -26, 3, 1, -1, 27, -3, -1, -27, 1, 3, -1, -3,
01063 28, -4, 4, 10, -10, -28, 1, -1, 1, -1, 29, 6, -29, -6, 30, -4,
01064 3, 3, -3, -30, 1, 4, -1, 31, -3, 1, 11, -11, -1, -31, 32, -1,
01065 -1, 2, -2, 1, 1, -32, 1, 4, -1, -4, 33, -1, 1, 1, -1, 5,
01066 5, -5, -33, -1, -12, 12, -5, -7, 1, 1, 7, 34, 4, -4, -1, 4,
01067 -34, -4, 35, 36, -2, -35, -2, -36, 2, 13, 2, -1, 1, -13, 1, -1,
01068 37, 1, -5, 6, 5, -1, 38, -6, -8, 5, 8, -1, 1, 1, -37, -1,
01069 5, 39, -5, -5, 6, -6, -38, -39, -14, 40, 14, 2, 1, 1, -2, -40,
01070 -1, -2, 2, -1, -1, -1, 1, 1, 1, -1, 1, -1, 1, -1, 1, -1}
01071 },{
01072
01073 0,
01074 38,
01075
01076 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 6, 8, 7,
01077 7, 9, 9, 10, 10, 11, 11, 1, 12, 1, 12, 13, 13, 16, 14, 16,
01078 14, 15, 15, 17, 17, 18, 0, 18, 19, 20, 21, 19, 22, 21, 20, 22,
01079 25, 24, 2, 25, 24, 23, 23, 2, 26, 28, 26, 28, 29, 27, 29, 27,
01080 33, 33, 1, 32, 1, 3, 32, 30, 36, 3, 36, 30, 31, 31, 35, 34,
01081 37, 41, 34, 35, 37, 4, 41, 4, 49, 8, 8, 49, 40, 38, 5, 38,
01082 40, 39, 5, 39, 42, 43, 42, 7, 57, 6, 43, 44, 6, 50, 7, 44,
01083 57, 48, 50, 48, 45, 45, 46, 47, 51, 46, 47, 58, 1, 51, 58, 1,
01084 52, 59, 53, 9, 52, 55, 55, 59, 53, 56, 54, 56, 54, 9, 64, 64,
01085 60, 63, 60, 63, 61, 62, 61, 62, 2, 10, 2, 10, 11, 1, 11, 13,
01086 12, 1, 12, 13, 16, 16, 8, 8, 14, 3, 3, 15, 14, 15, 4, 4,
01087 1, 17, 17, 5, 1, 7, 7, 5, 6, 1, 2, 2, 6, 22, 1, 25,
01088 21, 22, 8, 24, 1, 21, 25, 24, 8, 18, 18, 23, 9, 20, 23, 33,
01089 29, 33, 20, 1, 19, 1, 29, 36, 9, 36, 19, 41, 28, 57, 32, 3,
01090 28, 3, 1, 27, 49, 49, 1, 32, 26, 26, 2, 4, 4, 7, 57, 41,
01091 2, 7, 10, 5, 37, 16, 10, 27, 8, 8, 13, 16, 37, 13, 1, 5},
01092
01093
01094 {0, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, -1, 1,
01095 -1, 1, -1, 1, -1, 1, -1, 2, 1, -2, -1, 1, -1, 1, 1, -1,
01096 -1, 1, -1, 1, -1, 1, 0, -1, 1, 1, 1, -1, 1, -1, -1, -1,
01097 1, 1, 2, -1, -1, 1, -1, -2, 1, 1, -1, -1, 1, 1, -1, -1,
01098 1, -1, 3, 1, -3, 2, -1, 1, 1, -2, -1, -1, -1, 1, 1, 1,
01099 1, 1, -1, -1, -1, 2, -1, -2, 1, 2, -2, -1, 1, 1, 2, -1,
01100 -1, 1, -2, -1, 1, 1, -1, 2, 1, 2, -1, 1, -2, -1, -2, -1,
01101 -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -1, 1, 4, -1, -1, -4,
01102 1, 1, 1, 2, -1, -1, 1, -1, -1, 1, -1, -1, 1, -2, 1, -1,
01103 1, 1, -1, -1, 1, 1, -1, -1, 3, 2, -3, -2, 2, 5, -2, 2,
01104 2, -5, -2, -2, -2, 2, -3, 3, 2, 3, -3, 2, -2, -2, 3, -3,
01105 6, 2, -2, 3, -6, 3, -3, -3, 3, 7, -4, 4, -3, 2, -7, 2,
01106 2, -2, -4, 2, 8, -2, -2, -2, 4, 2, -2, 2, 3, 2, -2, -2,
01107 2, 2, -2, -8, -2, 9, -2, 2, -3, -2, 2, -2, 2, 2, 2, 4,
01108 -2, -4, 10, 2, 2, -2, -9, -2, 2, -2, 5, 4, -4, 4, -2, 2,
01109 -5, -4, -3, 4, 2, -3, 3, -2, -5, 5, 3, 3, -2, -3, -10, -4}
01110 },{
01111
01112 2,
01113 11,
01114
01115 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 0, 1, 1, 5, 5,
01116 2, 2, 6, 6, 7, 7, 1, 8, 1, 8, 3, 3, 9, 9, 1, 2,
01117 2, 1, 4, 10, 4, 10, 11, 11, 1, 5, 12, 12, 1, 5, 13, 13,
01118 3, 3, 6, 6, 2, 2, 14, 14, 16, 16, 15, 7, 15, 8, 8, 7,
01119 1, 1, 17, 17, 4, 4, 1, 1, 18, 18, 2, 2, 5, 5, 25, 3,
01120 9, 3, 25, 9, 19, 24, 19, 24, 1, 21, 20, 1, 21, 22, 20, 22,
01121 23, 23, 8, 6, 33, 6, 8, 33, 7, 7, 26, 26, 1, 32, 1, 32,
01122 28, 4, 28, 10, 29, 27, 27, 10, 41, 4, 29, 2, 2, 41, 36, 31,
01123 49, 31, 34, 30, 34, 36, 30, 35, 1, 49, 11, 5, 35, 11, 1, 3,
01124 3, 5, 37, 37, 8, 40, 8, 40, 12, 12, 42, 42, 1, 38, 16, 57,
01125 1, 6, 16, 39, 38, 6, 7, 7, 13, 13, 39, 43, 2, 43, 57, 2,
01126 50, 9, 44, 9, 50, 4, 15, 48, 44, 4, 1, 15, 48, 14, 14, 1,
01127 45, 45, 8, 3, 5, 8, 51, 47, 3, 46, 46, 47, 5, 51, 1, 17,
01128 17, 58, 1, 58, 2, 52, 52, 2, 53, 7, 59, 6, 6, 56, 53, 55,
01129 7, 55, 1, 54, 59, 56, 54, 10, 1, 10, 4, 60, 1, 60, 8, 4,
01130 8, 64, 64, 61, 1, 63, 3, 63, 62, 61, 5, 11, 5, 3, 11, 62},
01131
01132
01133 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 0, 3, -3, 1, -1,
01134 2, -2, 1, -1, 1, -1, 4, 1, -4, -1, 2, -2, 1, -1, 5, 3,
01135 -3, -5, 2, 1, -2, -1, 1, -1, 6, 2, 1, -1, -6, -2, 1, -1,
01136 3, -3, 2, -2, 4, -4, 1, -1, 1, -1, 1, 2, -1, 2, -2, -2,
01137 7, -7, 1, -1, 3, -3, 8, -8, 1, -1, 5, -5, 3, -3, 1, 4,
01138 2, -4, -1, -2, 1, 1, -1, -1, 9, 1, 1, -9, -1, 1, -1, -1,
01139 1, -1, 3, -3, 1, 3, -3, -1, 3, -3, 1, -1, 10, 1, -10, -1,
01140 1, 4, -1, 2, 1, -1, 1, -2, 1, -4, -1, 6, -6, -1, 1, 1,
01141 1, -1, 1, 1, -1, -1, -1, 1, 11, -1, -2, 4, -1, 2, -11, 5,
01142 -5, -4, -1, 1, 4, 1, -4, -1, -2, 2, 1, -1, 12, 1, -2, 1,
01143 -12, 4, 2, 1, -1, -4, 4, -4, 2, -2, -1, 1, 7, -1, -1, -7,
01144 -1, -3, 1, 3, 1, 5, 2, 1, -1, -5, 13, -2, -1, 2, -2, -13,
01145 1, -1, 5, 6, 5, -5, 1, 1, -6, 1, -1, -1, -5, -1, 14, 2,
01146 -2, 1, -14, -1, 8, 1, -1, -8, 1, 5, 1, 5, -5, 1, -1, 1,
01147 -5, -1, 15, 1, -1, -1, -1, 3, -15, -3, 6, 1, 16, -1, 6, -6,
01148 -6, 1, -1, 1, -16, 1, 7, -1, 1, -1, -6, -3, 6, -7, 3, -1}
01149 },{
01150
01151 0,
01152 35,
01153
01154 {0, 1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 5, 5, 6, 6, 7,
01155 7, 8, 8, 9, 9, 2, 2, 10, 10, 1, 1, 11, 11, 12, 12, 3,
01156 3, 13, 13, 0, 14, 14, 16, 15, 16, 15, 4, 4, 17, 1, 17, 1,
01157 5, 5, 18, 18, 2, 2, 6, 6, 8, 19, 7, 8, 7, 19, 20, 20,
01158 21, 21, 22, 24, 22, 24, 23, 23, 1, 1, 25, 25, 3, 3, 26, 26,
01159 9, 9, 27, 27, 28, 28, 33, 29, 4, 33, 29, 1, 4, 1, 32, 32,
01160 2, 2, 31, 10, 30, 10, 30, 31, 34, 34, 5, 5, 36, 36, 35, 41,
01161 35, 11, 41, 11, 37, 1, 8, 8, 37, 6, 1, 6, 40, 7, 7, 40,
01162 12, 38, 12, 39, 39, 38, 49, 13, 49, 13, 3, 42, 3, 42, 16, 16,
01163 43, 43, 14, 14, 1, 1, 44, 15, 44, 15, 2, 2, 57, 48, 50, 48,
01164 57, 50, 4, 45, 45, 4, 46, 47, 47, 46, 1, 51, 1, 17, 17, 51,
01165 8, 9, 9, 5, 58, 8, 58, 5, 52, 52, 55, 56, 53, 56, 55, 59,
01166 59, 53, 54, 1, 6, 54, 7, 7, 6, 1, 2, 3, 2, 3, 64, 60,
01167 60, 10, 10, 64, 61, 62, 61, 63, 1, 63, 62, 1, 18, 24, 18, 4,
01168 25, 4, 8, 21, 21, 1, 24, 22, 25, 22, 8, 11, 19, 11, 23, 1,
01169 20, 23, 19, 20, 5, 12, 5, 1, 16, 2, 12, 13, 2, 13, 1, 16},
01170
01171
01172 { 0, 1, -1, 1, -1, 1, -1, 1, -1, 2, -2, 1, -1, 1, -1, 1,
01173 -1, 1, -1, 1, -1, 2, -2, 1, -1, 3, -3, 1, -1, 1, -1, 2,
01174 -2, 1, -1, 0, 1, -1, 1, 1, -1, -1, 2, -2, 1, 4, -1, -4,
01175 2, -2, 1, -1, -3, 3, 2, -2, 2, 1, 2, -2, -2, -1, 1, -1,
01176 1, -1, 1, 1, -1, -1, 1, -1, 5, -5, 1, -1, 3, -3, 1, -1,
01177 2, -2, 1, -1, 1, -1, 1, 1, 3, -1, -1, 6, -3, -6, -1, 1,
01178 4, -4, 1, 2, 1, -2, -1, -1, 1, -1, 3, -3, 1, -1, 1, 1,
01179 -1, 2, -1, -2, 1, 7, -3, 3, -1, 3, -7, -3, 1, -3, 3, -1,
01180 2, 1, -2, 1, -1, -1, 1, 2, -1, -2, -4, -1, 4, 1, 2, -2,
01181 1, -1, -2, 2, 8, -8, -1, 2, 1, -2, -5, 5, 1, -1, -1, 1,
01182 -1, 1, 4, -1, 1, -4, -1, -1, 1, 1, 9, 1, -9, 2, -2, -1,
01183 -4, 3, -3, -4, -1, 4, 1, 4, 1, -1, 1, -1, 1, 1, -1, 1,
01184 -1, -1, -1, 10, 4, 1, 4, -4, -4, -10, 6, 5, -6, -5, 1, -1,
01185 1, 3, -3, -1, 1, -1, -1, -1, 11, 1, 1, -11, -2, -2, 2, 5,
01186 -2, -5, -5, 2, -2, 12, 2, -2, 2, 2, 5, -3, -2, 3, -2, -12,
01187 -2, 2, 2, 2, -5, 3, 5, 13, -3, 7, -3, -3, -7, 3, -13, 3}
01188 },{
01189
01190 0,
01191 34,
01192
01193 {0, 1, 1, 1, 2, 2, 1, 3, 3, 1, 1, 1, 4, 4, 1, 5,
01194 2, 1, 5, 2, 1, 1, 6, 6, 1, 1, 1, 1, 1, 7, 3, 1,
01195 2, 3, 0, 1, 2, 7, 1, 1, 1, 8, 1, 1, 8, 1, 1, 1,
01196 9, 1, 9, 1, 2, 1, 1, 2, 1, 1, 10, 4, 1, 10, 1, 4,
01197 1, 1, 1, 1, 1, 3, 1, 1, 1, 3, 2, 1, 5, 1, 1, 1,
01198 2, 5, 1, 11, 1, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
01199 2, 1, 6, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 12,
01200 3, 1, 12, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 1, 1,
01201 4, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 1, 2, 1,
01202 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 5,
01203 1, 1, 1, 1, 1, 7, 1, 7, 1, 1, 2, 3, 1, 1, 1, 1,
01204 5, 1, 1, 1, 1, 1, 1, 2, 13, 1, 1, 1, 1, 1, 1, 1,
01205 1, 1, 1, 1, 1, 1, 1, 1, 13, 2, 1, 1, 4, 1, 1, 1,
01206 3, 1, 6, 1, 1, 1, 14, 1, 1, 1, 1, 1, 14, 6, 1, 1,
01207 1, 1, 15, 2, 4, 1, 2, 3, 15, 1, 1, 1, 8, 1, 1, 8,
01208 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1},
01209
01210
01211 { 0, 1, -1, 2, 1, -1, -2, 1, -1, 3, -3, 4, 1, -1, -4, 1,
01212 2, 5, -1, -2, -5, 6, 1, -1, -6, 7, -7, 8, -8, 1, 2, 9,
01213 3, -2, 0, -9, -3, -1, 10, -10, 11, 1, -11, 12, -1, -12, 13, -13,
01214 1, 14, -1, -14, 4, 15, -15, -4, 16, -16, 1, 2, 17, -1, -17, -2,
01215 18, -18, 19, -19, 20, 3, -20, 21, -21, -3, 5, 22, 2, -22, -23, 23,
01216 -5, -2, 24, 1, -24, -1, 25, -25, 26, -26, -27, 27, 28, 29, -28, -29,
01217 6, 30, 2, -31, -2, -30, 31, -6, -32, 32, 33, -33, 34, -35, -34, 1,
01218 4, -36, -1, 35, 37, 36, 7, -37, 38, -4, -38, 39, 41, 40, -40, -39,
01219 3, 42, -43, -41, -7, -42, 43, -3, 44, -44, 45, -45, 46, 47, 8, -47,
01220 -48, -46, 50, -50, 48, 49, 51, -49, 52, -52, 5, -51, -8, -53, 53, 3,
01221 -56, 56, 55, 54, -54, 2, 60, -2, -55, 58, 9, -5, 59, 57, -57, -63,
01222 -3, -58, -60, -61, 61, -59, -62, -9, 1, 64, 62, 69, -64, 63, 65, -67,
01223 -68, 66, -65, 68, -66, -69, 67, -70, -1, 10, 71, -71, 4, 73, 72, 70,
01224 6, -76, -3, 74, -78, -74, 1, 78, 80, -72, -75, 76, -1, 3, -73, 79,
01225 75, 77, 1, 11, -4, -79, -10, -6, -1, -77, -83, -80, 2, 81, -84, -2,
01226 83, -81, 82, -82, 84, -87, -86, 85, -11, -85, 86, -89, 87, -88, 88, 89}
01227 },{
01228
01229 2,
01230 33,
01231
01232 {1, 1, 0, 2, 1, 2, 1, 3, 3, 1, 1, 4, 4, 2, 2, 1,
01233 1, 5, 5, 6, 1, 6, 1, 7, 7, 3, 3, 2, 8, 2, 8, 1,
01234 1, 0, 9, 9, 1, 1, 10, 4, 10, 4, 11, 11, 2, 1, 2, 1,
01235 12, 12, 3, 3, 1, 1, 13, 5, 5, 13, 14, 1, 1, 14, 2, 2,
01236 6, 6, 15, 1, 1, 15, 16, 4, 7, 16, 4, 7, 1, 1, 3, 3,
01237 8, 8, 2, 2, 1, 1, 17, 17, 1, 1, 18, 18, 5, 5, 2, 2,
01238 1, 1, 9, 19, 9, 19, 20, 3, 3, 20, 1, 10, 21, 1, 10, 4,
01239 4, 21, 22, 6, 6, 22, 1, 1, 23, 24, 2, 2, 23, 24, 11, 1,
01240 1, 11, 7, 25, 7, 1, 1, 25, 8, 8, 3, 26, 3, 1, 12, 2,
01241 2, 26, 1, 12, 5, 5, 27, 4, 1, 4, 1, 27, 28, 1, 28, 13,
01242 1, 13, 2, 29, 2, 1, 32, 6, 1, 30, 14, 29, 14, 6, 3, 31,
01243 3, 1, 30, 1, 32, 31, 33, 9, 33, 1, 1, 7, 9, 7, 2, 2,
01244 1, 1, 4, 36, 34, 4, 5, 10, 10, 5, 34, 1, 1, 35, 8, 8,
01245 36, 3, 35, 1, 15, 3, 2, 1, 16, 15, 16, 2, 37, 1, 37, 1,
01246 1, 1, 6, 6, 38, 1, 38, 11, 1, 39, 39, 40, 11, 2, 41, 4,
01247 40, 1, 2, 4, 1, 1, 1, 41, 3, 1, 3, 1, 5, 7, 5, 7},
01248
01249
01250 { 1, -1, 0, 1, 2, -1, -2, 1, -1, 3, -3, 1, -1, 2, -2, 4,
01251 -4, 1, -1, 1, 5, -1, -5, 1, -1, 2, -2, 3, 1, -3, -1, 6,
01252 -6, 0, 1, -1, 7, -7, 1, 2, -1, -2, 1, -1, 4, 8, -4, -8,
01253 1, -1, 3, -3, 9, -9, 1, 2, -2, -1, 1, 10, -10, -1, 5, -5,
01254 2, -2, 1, 11, -11, -1, 1, 3, 2, -1, -3, -2, 12, -12, 4, -4,
01255 2, -2, -6, 6, 13, -13, 1, -1, 14, -14, 1, -1, 3, -3, 7, -7,
01256 15, -15, 2, 1, -2, -1, 1, 5, -5, -1, -16, 2, 1, 16, -2, 4,
01257 -4, -1, 1, 3, -3, -1, 17, -17, 1, 1, -8, 8, -1, -1, 2, 18,
01258 -18, -2, 3, 1, -3, 19, -19, -1, 3, -3, 6, 1, -6, 20, 2, 9,
01259 -9, -1, -20, -2, 4, -4, 1, -5, 21, 5, -21, -1, 1, -22, -1, 2,
01260 22, -2, 10, 1, -10, 23, 1, 4, -23, 1, 2, -1, -2, -4, -7, 1,
01261 7, -24, -1, 24, -1, -1, 1, 3, -1, -25, 25, 4, -3, -4, 11, -11,
01262 26, -26, 6, 1, 1, -6, -5, -3, 3, 5, -1, -27, 27, 1, 4, -4,
01263 -1, -8, -1, 28, 2, 8, -12, -28, -2, -2, 2, 12, -1, 29, 1, -29,
01264 30, -30, 5, -5, 1, -31, -1, 3, 31, -1, 1, 1, -3, -13, 1, -7,
01265 -1, -32, 13, 7, 32, 33, -33, -1, -9, -34, 9, 34, -6, 5, 6, -5}
01266 },{
01267
01268 2,
01269 13,
01270
01271 {1, 1, 0, 1, 1, 2, 2, 1, 1, 3, 3, 1, 1, 0, 2, 2,
01272 4, 1, 4, 1, 1, 1, 5, 5, 1, 1, 6, 6, 2, 2, 1, 1,
01273 3, 3, 7, 7, 1, 1, 8, 8, 1, 1, 2, 2, 1, 9, 1, 9,
01274 4, 4, 10, 1, 1, 10, 1, 1, 11, 11, 3, 3, 1, 2, 1, 2,
01275 1, 1, 12, 12, 5, 5, 1, 1, 13, 1, 1, 13, 2, 2, 1, 1,
01276 6, 6, 1, 1, 4, 14, 4, 14, 3, 1, 3, 1, 1, 1, 15, 7,
01277 15, 2, 2, 7, 1, 1, 1, 8, 1, 8, 16, 16, 1, 1, 1, 1,
01278 2, 1, 1, 2, 1, 1, 3, 5, 5, 3, 4, 1, 1, 4, 1, 1,
01279 17, 17, 9, 1, 1, 9, 2, 2, 1, 1, 10, 10, 1, 6, 1, 1,
01280 6, 18, 1, 1, 18, 1, 1, 1, 2, 2, 3, 1, 3, 1, 1, 1,
01281 4, 1, 19, 1, 19, 7, 1, 1, 20, 1, 4, 20, 1, 7, 11, 2,
01282 1, 11, 21, 2, 8, 5, 1, 8, 1, 5, 21, 1, 1, 1, 22, 1,
01283 1, 22, 1, 1, 3, 3, 1, 23, 2, 12, 24, 1, 1, 2, 1, 1,
01284 12, 23, 1, 1, 24, 1, 1, 1, 4, 1, 1, 1, 2, 1, 6, 6,
01285 4, 2, 1, 1, 1, 1, 1, 1, 1, 14, 13, 3, 1, 25, 9, 25,
01286 14, 1, 9, 3, 13, 1, 1, 1, 1, 1, 10, 1, 1, 2, 10, 2},
01287
01288
01289 {-20, -1, 0, 2, -2, 1, -1, 3, -3, 1, -1, 4, -4, 0, 2, -2,
01290 1, 5, -1, -5, 6, -6, 1, -1, 7, -7, 1, -1, 3, -3, 8, -8,
01291 2, -2, 1, -1, 9, -9, 1, -1, 10, -10, 4, -4, 11, 1, -11, -1,
01292 2, -2, 1, 12, -12, -1, 13, -13, 1, -1, 3, -3, 14, 5, -14, -5,
01293 -15, 15, -1, 1, 2, -2, 16, -16, 1, 17, -17, -1, 6, -6, 18, -18,
01294 2, -2, -19, 19, -3, 1, 3, -1, 4, 20, -4, 1, -21, 21, 1, 2,
01295 -1, -7, 7, -2, 22, -22, 23, 2, -23, -2, 1, -1, -24, 24, -25, 25,
01296 -8, -26, 26, 8, -27, 27, 5, 3, -3, -5, -4, 28, -28, 4, 29, -29,
01297 1, -1, -2, -30, 30, 2, 9, -9, -31, 31, 2, -2, -32, 3, 32, -33,
01298 -3, 1, 33, -34, -1, 34, -35, 35, -10, 10, -6, 36, 6, -36, 37, -37,
01299 -5, 38, 1, -38, -1, 3, 39, -39, -1, 40, 5, 1, -40, -3, 2, -11,
01300 -41, -2, 1, 11, -3, -4, 41, 3, 42, 4, -1, -43, -42, 43, 1, -44,
01301 45, -1, 44, -45, -7, 7, -46, 1, -12, 2, 1, -47, 46, 12, 47, 48,
01302 -2, -1, -48, 49, -1, -50, -49, 50, -6, -51, 51, 52, -13, 53, -4, 4,
01303 6, 13, -53, -52, -54, 55, 54, -55, -56, -2, 2, -8, 56, 1, -3, -1,
01304 2, 58, 3, 8, -2, 57, -58, -60, -59, -57, -3, 60, 59, -14, 3, 14}
01305 },{
01306
01307 2,
01308 38,
01309
01310 {1, 1, 0, 2, 2, 1, 1, 3, 3, 4, 4, 5, 5, 1, 1, 6,
01311 6, 2, 2, 7, 7, 8, 8, 1, 1, 3, 3, 9, 9, 10, 10, 1,
01312 1, 2, 2, 4, 4, 11, 0, 11, 12, 12, 13, 13, 1, 1, 5, 5,
01313 14, 14, 15, 16, 15, 16, 3, 3, 1, 6, 1, 6, 2, 2, 7, 7,
01314 8, 8, 17, 17, 1, 1, 4, 4, 18, 18, 2, 2, 1, 19, 1, 20,
01315 19, 20, 21, 21, 3, 3, 22, 22, 5, 5, 24, 1, 1, 23, 9, 23,
01316 24, 9, 2, 2, 10, 1, 1, 10, 6, 6, 25, 4, 4, 25, 7, 7,
01317 26, 8, 1, 8, 3, 1, 26, 3, 11, 11, 27, 27, 2, 28, 1, 2,
01318 28, 1, 12, 12, 5, 5, 29, 13, 13, 29, 32, 1, 1, 33, 31, 30,
01319 32, 4, 30, 33, 4, 31, 3, 14, 1, 1, 3, 34, 34, 2, 2, 14,
01320 6, 6, 35, 36, 35, 36, 1, 15, 1, 16, 16, 15, 7, 9, 7, 9,
01321 37, 8, 8, 37, 1, 1, 39, 2, 38, 39, 2, 40, 5, 38, 40, 5,
01322 3, 3, 4, 4, 10, 10, 1, 1, 1, 1, 41, 2, 41, 2, 6, 6,
01323 1, 1, 11, 42, 11, 43, 3, 42, 3, 17, 4, 43, 1, 17, 7, 1,
01324 8, 44, 4, 7, 44, 5, 8, 2, 5, 1, 2, 48, 45, 1, 12, 45,
01325 12, 48, 13, 13, 1, 9, 9, 46, 1, 46, 47, 47, 49, 18, 18, 49},
01326
01327
01328 { 1, -1, 0, 1, -1, 2, -2, 1, -1, 1, -1, 1, -1, 3, -3, 1,
01329 -1, -2, 2, 1, -1, 1, -1, 4, -4, -2, 2, 1, -1, 1, -1, 5,
01330 -5, -3, 3, 2, -2, 1, 0, -1, 1, -1, 1, -1, 6, -6, 2, -2,
01331 1, -1, 1, 1, -1, -1, -3, 3, 7, 2, -7, -2, -4, 4, 2, -2,
01332 2, -2, 1, -1, 8, -8, 3, -3, 1, -1, -5, 5, 9, 1, -9, 1,
01333 -1, -1, 1, -1, -4, 4, 1, -1, 3, -3, 1, -10, 10, 1, 2, -1,
01334 -1, -2, 6, -6, 2, 11, -11, -2, 3, -3, 1, -4, 4, -1, 3, -3,
01335 1, 3, 12, -3, -5, -12, -1, 5, 2, -2, 1, -1, -7, 1, 13, 7,
01336 -1, -13, 2, -2, 4, -4, 1, 2, -2, -1, 1, 14, -14, 1, 1, 1,
01337 -1, -5, -1, -1, 5, -1, -6, 2, -15, 15, 6, 1, -1, -8, 8, -2,
01338 -4, 4, 1, 1, -1, -1, 16, 2, -16, -2, 2, -2, 4, 3, -4, -3,
01339 -1, -4, 4, 1, -17, 17, -1, -9, 1, 1, 9, 1, -5, -1, -1, 5,
01340 -7, 7, 6, -6, 3, -3, 18, -18, 19, -19, 1, -10, -1, 10, -5, 5,
01341 20, -20, -3, 1, 3, 1, 8, -1, -8, 2, 7, -1, -21, -2, 5, 21,
01342 5, -1, -7, -5, 1, -6, -5, -11, 6, 22, 11, 1, 1, -22, -3, -1,
01343 3, -1, 3, -3, -23, 4, -4, 1, 23, -1, 1, -1, 1, -2, 2, -1}
01344 },{
01345
01346 4,
01347 11,
01348
01349 {1, 1, 1, 1, 0, 2, 2, 1, 1, 3, 3, 0, 1, 1, 2, 2,
01350 4, 4, 1, 1, 5, 5, 1, 1, 2, 2, 3, 3, 6, 6, 1, 1,
01351 7, 7, 8, 1, 8, 2, 2, 1, 4, 4, 1, 3, 1, 3, 9, 9,
01352 2, 2, 1, 5, 1, 5, 10, 10, 1, 1, 11, 11, 3, 6, 3, 4,
01353 4, 6, 2, 2, 1, 12, 1, 12, 7, 13, 7, 13, 1, 1, 8, 8,
01354 2, 2, 14, 14, 16, 15, 16, 5, 5, 1, 3, 15, 1, 3, 4, 4,
01355 1, 1, 17, 17, 2, 2, 6, 6, 1, 18, 1, 18, 22, 21, 22, 21,
01356 25, 24, 25, 19, 9, 20, 9, 23, 19, 24, 20, 3, 23, 7, 3, 1,
01357 1, 7, 28, 26, 29, 5, 28, 26, 5, 8, 29, 4, 8, 27, 2, 2,
01358 4, 27, 1, 1, 10, 36, 10, 33, 33, 36, 30, 1, 32, 32, 1, 30,
01359 6, 31, 31, 35, 3, 6, 11, 11, 3, 2, 35, 2, 34, 1, 34, 1,
01360 37, 37, 12, 7, 12, 5, 41, 5, 4, 7, 1, 8, 13, 4, 1, 41,
01361 13, 38, 8, 38, 9, 1, 40, 40, 9, 1, 39, 2, 2, 49, 39, 42,
01362 3, 3, 14, 16, 49, 14, 16, 42, 43, 43, 6, 6, 15, 1, 1, 15,
01363 44, 44, 1, 1, 50, 48, 4, 5, 4, 7, 5, 2, 10, 10, 48, 7,
01364 50, 45, 2, 1, 45, 8, 8, 1, 46, 46, 3, 47, 47, 3, 1, 1},
01365
01366
01367 { 1, -1, 2, -2, 0, 1, -1, 3, -3, 1, -1, 0, 4, -4, 2, -2,
01368 1, -1, 5, -5, 1, -1, 6, -6, 3, -3, 2, -2, 1, -1, 7, -7,
01369 1, -1, 1, 8, -1, 4, -4, -8, 2, -2, 9, 3, -9, -3, 1, -1,
01370 5, -5, 10, 2, -10, -2, 1, -1, 11, -11, 1, -1, -4, 2, 4, 3,
01371 -3, -2, 6, -6, 12, 1, -12, -1, 2, 1, -2, -1, 13, -13, 2, -2,
01372 7, -7, 1, -1, 1, 1, -1, 3, -3, 14, 5, -1, -14, -5, 4, -4,
01373 15, -15, 1, -1, 8, -8, -3, 3, 16, 1, -16, -1, 1, 1, -1, -1,
01374 1, 1, -1, 1, 2, 1, -2, 1, -1, -1, -1, 6, -1, 3, -6, 17,
01375 -17, -3, 1, 1, 1, 4, -1, -1, -4, 3, -1, 5, -3, -1, -9, 9,
01376 -5, 1, 18, -18, 2, 1, -2, 1, -1, -1, 1, 19, -1, 1, -19, -1,
01377 4, 1, -1, 1, 7, -4, -2, 2, -7, 10, -1, -10, 1, 20, -1, -20,
01378 1, -1, 2, 4, -2, 5, 1, -5, 6, -4, 21, 4, 2, -6, -21, -1,
01379 -2, 1, -4, -1, -3, 22, -1, 1, 3, -22, -1, 11, -11, 1, 1, 1,
01380 8, -8, 2, 2, -1, -2, -2, -1, 1, -1, -5, 5, 2, 23, -23, -2,
01381 1, -1, 24, -24, -1, -1, 7, 6, -7, 5, -6, 12, -3, 3, 1, -5,
01382 1, 1, -12, 25, -1, -5, 5, -25, -1, 1, 9, 1, -1, -9, 26, -26}
01383 }
01384 };