/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

/*
 * This package is based on the work done by Keiron Liddle, Aftex Software
 * <keiron@aftexsw.com> to whom the Ant project is very grateful for his
 * great code.
 */

package org.apache.hadoop.io.compress.bzip2;

/**
 * Base class for both the compress and decompress classes. Holds common arrays,
 * and static data.
 * <p>
 * This interface is public for historical purposes. You should have no need to
 * use it.
 * </p>
 */
public interface BZip2Constants {

  int baseBlockSize = 100000;
  int MAX_ALPHA_SIZE = 258;
  int MAX_CODE_LEN = 23;
  int RUNA = 0;
  int RUNB = 1;
  int N_GROUPS = 6;
  int G_SIZE = 50;
  int N_ITERS = 4;
  int MAX_SELECTORS = (2 + (900000 / G_SIZE));
  int NUM_OVERSHOOT_BYTES = 20;
  /**
   * End of a BZip2 block
   */
  public static final int END_OF_BLOCK = -2;
  /**
   * End of BZip2 stream.
   */
  public static final int END_OF_STREAM = -1;

  /**
  * This array really shouldn't be here. Again, for historical purposes it
  * is.
  *
  * <p>
  * FIXME: This array should be in a private or package private location,
  * since it could be modified by malicious code.
  * </p>
  */
  final int[] rNums = { 619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
    985, 724, 205, 454, 863, 491, 741, 242, 949, 214, 733, 859, 335,
    708, 621, 574, 73, 654, 730, 472, 419, 436, 278, 496, 867, 210,
    399, 680, 480, 51, 878, 465, 811, 169, 869, 675, 611, 697, 867,
    561, 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, 150, 238,
    59, 379, 684, 877, 625, 169, 643, 105, 170, 607, 520, 932, 727,
    476, 693, 425, 174, 647, 73, 122, 335, 530, 442, 853, 695, 249,
    445, 515, 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, 641,
    801, 220, 162, 819, 984, 589, 513, 495, 799, 161, 604, 958, 533,
    221, 400, 386, 867, 600, 782, 382, 596, 414, 171, 516, 375, 682,
    485, 911, 276, 98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
    227, 730, 475, 186, 263, 647, 537, 686, 600, 224, 469, 68, 770,
    919, 190, 373, 294, 822, 808, 206, 184, 943, 795, 384, 383, 461,
    404, 758, 839, 887, 715, 67, 618, 276, 204, 918, 873, 777, 604,
    560, 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, 652, 934, 970,
    447, 318, 353, 859, 672, 112, 785, 645, 863, 803, 350, 139, 93,
    354, 99, 820, 908, 609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
    653, 282, 762, 623, 680, 81, 927, 626, 789, 125, 411, 521, 938,
    300, 821, 78, 343, 175, 128, 250, 170, 774, 972, 275, 999, 639,
    495, 78, 352, 126, 857, 956, 358, 619, 580, 124, 737, 594, 701,
    612, 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, 944, 375,
    748, 52, 600, 747, 642, 182, 862, 81, 344, 805, 988, 739, 511, 655,
    814, 334, 249, 515, 897, 955, 664, 981, 649, 113, 974, 459, 893,
    228, 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, 686, 754,
    806, 760, 493, 403, 415, 394, 687, 700, 946, 670, 656, 610, 738,
    392, 760, 799, 887, 653, 978, 321, 576, 617, 626, 502, 894, 679,
    243, 440, 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, 707,
    151, 457, 449, 797, 195, 791, 558, 945, 679, 297, 59, 87, 824, 713,
    663, 412, 693, 342, 606, 134, 108, 571, 364, 631, 212, 174, 643,
    304, 329, 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, 140,
    206, 73, 263, 980, 736, 876, 478, 430, 305, 170, 514, 364, 692,
    829, 82, 855, 953, 676, 246, 369, 970, 294, 750, 807, 827, 150,
    790, 288, 923, 804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
    896, 831, 547, 261, 524, 462, 293, 465, 502, 56, 661, 821, 976,
    991, 658, 869, 905, 758, 745, 193, 768, 550, 608, 933, 378, 286,
    215, 979, 792, 961, 61, 688, 793, 644, 986, 403, 106, 366, 905,
    644, 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, 780, 773,
    635, 389, 707, 100, 626, 958, 165, 504, 920, 176, 193, 713, 857,
    265, 203, 50, 668, 108, 645, 990, 626, 197, 510, 357, 358, 850,
    858, 364, 936, 638 };
}
