예제 #1
0
  /**
   * Gets the named range from this workbook. The Range object returns contains all the cells from
   * the top left to the bottom right of the range. If the named range comprises an adjacent range,
   * the Range[] will contain one object; for non-adjacent ranges, it is necessary to return an
   * array of length greater than one. If the named range contains a single cell, the top left and
   * bottom right cell will be the same cell
   *
   * @param name the name to find
   * @return the range of cells
   */
  public Range[] findByName(String name) {
    NameRecord nr = (NameRecord) namedRecords.get(name);

    if (nr == null) {
      return null;
    }

    NameRecord.NameRange[] ranges = nr.getRanges();

    Range[] cellRanges = new Range[ranges.length];

    for (int i = 0; i < ranges.length; i++) {
      cellRanges[i] =
          new RangeImpl(
              this,
              getExternalSheetIndex(ranges[i].getExternalSheet()),
              ranges[i].getFirstColumn(),
              ranges[i].getFirstRow(),
              getLastExternalSheetIndex(ranges[i].getExternalSheet()),
              ranges[i].getLastColumn(),
              ranges[i].getLastRow());
    }

    return cellRanges;
  }
예제 #2
0
 public void testReserialize() {
   byte[] data =
       HexRead.readFromString(
           ""
               + "20 00 00 01 0B 00 00 00 01 00 00 00 00 00 00 06 3B 00 00 00 00 02 00 00 00 09 00]");
   RecordInputStream in = TestcaseRecordInputStream.create(NameRecord.sid, data);
   NameRecord nr = new NameRecord(in);
   assertEquals(0x0020, nr.getOptionFlag());
   byte[] data2 = nr.serialize();
   TestcaseRecordInputStream.confirmRecordEncoding(NameRecord.sid, data, data2);
 }
예제 #3
0
 private void assert_bug50244(NameRecord nr) {
   assertEquals("wDataGruppeSerie.", nr.getNameText());
   Ptg[] ptg = nr.getNameDefinition();
   assertEquals(1, ptg.length);
   ArrayPtg arr = (ArrayPtg) ptg[0];
   assertEquals(696, arr.getRowCount());
   assertEquals(1, arr.getColumnCount());
   Object[][] vals = arr.getTokenArrayValues();
   assertEquals("1.T20.001", vals[0][0]);
   assertEquals("1.T20.010", vals[vals.length - 1][0]);
 }
예제 #4
0
  /**
   * Gets the named cell from this workbook. If the name refers to a range of cells, then the cell
   * on the top left is returned. If the name cannot be found, null is returned
   *
   * @param name the name of the cell/range to search for
   * @return the cell in the top left of the range if found, NULL otherwise
   */
  public Cell findCellByName(String name) {
    NameRecord nr = (NameRecord) namedRecords.get(name);

    if (nr == null) {
      return null;
    }

    NameRecord.NameRange[] ranges = nr.getRanges();

    // Go and retrieve the first cell in the first range
    Sheet s = getSheet(ranges[0].getExternalSheet());
    Cell cell = s.getCell(ranges[0].getFirstColumn(), ranges[0].getFirstRow());

    return cell;
  }
예제 #5
0
  /** Makes sure that additional name information is parsed properly such as menu/description */
  public void testFillExtras() {

    byte[] examples =
        HexRead.readFromString(
            ""
                + "88 03 67 06 07 00 00 00 00 00 00 23 00 00 00 4D "
                + "61 63 72 6F 31 3A 01 00 00 00 11 00 00 4D 61 63 "
                + "72 6F 20 72 65 63 6F 72 64 65 64 20 32 37 2D 53 "
                + "65 70 2D 39 33 20 62 79 20 41 4C 4C 57 4F 52");

    NameRecord name = new NameRecord(TestcaseRecordInputStream.create(NameRecord.sid, examples));
    String description = name.getDescriptionText();
    assertNotNull(description);
    assertTrue(description.endsWith("Macro recorded 27-Sep-93 by ALLWOR"));
  }
예제 #6
0
  public void testBug57923() {
    NameRecord record = new NameRecord();
    assertEquals(0, record.getExternSheetNumber());

    record.setNameDefinition(new Ptg[] {});
    assertEquals(0, record.getExternSheetNumber());

    record.setNameDefinition(new Ptg[] {new NamePtg(1)});
    assertEquals(0, record.getExternSheetNumber());

    record.setNameDefinition(new Ptg[] {new Area3DPtg("area", 1)});
    assertEquals(1, record.getExternSheetNumber());

    record.setNameDefinition(new Ptg[] {new Ref3DPtg("A1", 1)});
    assertEquals(1, record.getExternSheetNumber());
  }
예제 #7
0
  /**
   * Sets the element name.
   *
   * @param name the new name.
   * @throws NameException if the element name is not allowed to change.
   */
  public void setName(String name) throws NameException {
    name = StringUtil.trimString(name);

    // Ignore change to the current name.

    String oldName = element.getName();
    if ((name == null && oldName == null)
        || (name != null && oldName != null && name.equals(oldName))) return;

    // ignore change to the dimension that refers a shared dimension
    Dimension sharedDimension =
        TabularDimensionPropSearchStrategy.getSharedDimension(module, element);
    if (sharedDimension != null && !sharedDimension.getName().equals(name)) return;

    checkName(name);

    DesignElement tmpElement = element;
    // if a contentElement is not local, need to make a local copy before changing the name
    if (tmpElement instanceof ContentElement && !((ContentElement) tmpElement).isLocal()) {
      eventTarget = ((ContentElement) tmpElement).getValueContainer();
      tmpElement = copyTopCompositeValue();
    }

    // Record the change.

    ActivityStack stack = getActivityStack();
    NameRecord rename = new NameRecord(tmpElement, name);
    stack.startTrans(rename.getLabel());

    // Drop the old name from the name space.

    // Change the name.
    stack.execute(rename);

    // Add the new name to the name space.
    renameSymbolFrom(oldName);

    // change the name of the dimension that shares this element
    if (element instanceof Dimension) {
      updateDimensions(stack);
    }

    stack.commit();
  }
  /**
   * Gets the named cell from this workbook. If the name refers to a range of cells, then the cell
   * on the top left is returned. If the name cannot be found, null is returned
   *
   * @param name the name of the cell/range to search for
   * @return the cell in the top left of the range if found, NULL otherwise
   */
  public Cell findCellByName(String name) {
    NameRecord nr = (NameRecord) namedRecords.get(name);

    if (nr == null) {
      return null;
    }

    NameRecord.NameRange[] ranges = nr.getRanges();

    // Go and retrieve the first cell in the first range
    Sheet s = getSheet(getExternalSheetIndex(ranges[0].getExternalSheet()));
    int col = ranges[0].getFirstColumn();
    int row = ranges[0].getFirstRow();

    // If the sheet boundaries fall short of the named cell, then return
    // an empty cell to stop an exception being thrown
    if (col > s.getColumns() || row > s.getRows()) {
      return new EmptyCell(col, row);
    }

    Cell cell = s.getCell(col, row);

    return cell;
  }
예제 #9
0
  /**
   * Gets the index of the name record for the name
   *
   * @param name the name to search for
   * @return the index in the name table
   */
  public int getNameIndex(String name) {
    NameRecord nr = (NameRecord) namedRecords.get(name);

    return nr != null ? nr.getIndex() : 0;
  }
예제 #10
0
  /**
   * Does the hard work of building up the object graph from the excel bytes
   *
   * @exception BiffException
   * @exception PasswordException if the workbook is password protected
   */
  protected void parse() throws BiffException, PasswordException {
    Record r = null;

    BOFRecord bof = new BOFRecord(excelFile.next());
    workbookBof = bof;
    bofs++;

    if (!bof.isBiff8() && !bof.isBiff7()) {
      throw new BiffException(BiffException.unrecognizedBiffVersion);
    }

    if (!bof.isWorkbookGlobals()) {
      throw new BiffException(BiffException.expectedGlobals);
    }
    ArrayList continueRecords = new ArrayList();
    nameTable = new ArrayList();

    // Skip to the first worksheet
    while (bofs == 1) {
      r = excelFile.next();

      if (r.getType() == Type.SST) {
        continueRecords.clear();
        Record nextrec = excelFile.peek();
        while (nextrec.getType() == Type.CONTINUE) {
          continueRecords.add(excelFile.next());
          nextrec = excelFile.peek();
        }

        // cast the array
        Object[] rec = continueRecords.toArray();
        Record[] records = new Record[rec.length];
        System.arraycopy(rec, 0, records, 0, rec.length);

        sharedStrings = new SSTRecord(r, records, settings);
      } else if (r.getType() == Type.FILEPASS) {
        throw new PasswordException();
      } else if (r.getType() == Type.NAME) {
        NameRecord nr = null;

        if (bof.isBiff8()) {
          nr = new NameRecord(r, settings, namedRecords.size());
        } else {
          nr = new NameRecord(r, settings, namedRecords.size(), NameRecord.biff7);
        }

        namedRecords.put(nr.getName(), nr);
        nameTable.add(nr);
      } else if (r.getType() == Type.FONT) {
        FontRecord fr = null;

        if (bof.isBiff8()) {
          fr = new FontRecord(r, settings);
        } else {
          fr = new FontRecord(r, settings, FontRecord.biff7);
        }
        fonts.addFont(fr);
      } else if (r.getType() == Type.PALETTE) {
        PaletteRecord palette = new PaletteRecord(r);
        formattingRecords.setPalette(palette);
      } else if (r.getType() == Type.NINETEENFOUR) {
        NineteenFourRecord nr = new NineteenFourRecord(r);
        nineteenFour = nr.is1904();
      } else if (r.getType() == Type.FORMAT) {
        FormatRecord fr = null;
        if (bof.isBiff8()) {
          fr = new FormatRecord(r, settings, FormatRecord.biff8);
        } else {
          fr = new FormatRecord(r, settings, FormatRecord.biff7);
        }
        try {
          formattingRecords.addFormat(fr);
        } catch (NumFormatRecordsException e) {
          // This should not happen.  Bomb out
          Assert.verify(false, e.getMessage());
        }
      } else if (r.getType() == Type.XF) {
        XFRecord xfr = null;
        if (bof.isBiff8()) {
          xfr = new XFRecord(r, XFRecord.biff8);
        } else {
          xfr = new XFRecord(r, XFRecord.biff7);
        }

        try {
          formattingRecords.addStyle(xfr);
        } catch (NumFormatRecordsException e) {
          // This should not happen.  Bomb out
          Assert.verify(false, e.getMessage());
        }
      } else if (r.getType() == Type.BOUNDSHEET) {
        BoundsheetRecord br = null;

        if (bof.isBiff8()) {
          br = new BoundsheetRecord(r);
        } else {
          br = new BoundsheetRecord(r, BoundsheetRecord.biff7);
        }

        if (br.isSheet() || br.isChart()) {
          boundsheets.add(br);
        }
      } else if (r.getType() == Type.EXTERNSHEET) {
        if (bof.isBiff8()) {
          externSheet = new ExternalSheetRecord(r, settings);
        } else {
          externSheet = new ExternalSheetRecord(r, settings, ExternalSheetRecord.biff7);
        }
      } else if (r.getType() == Type.CODEPAGE) {
        CodepageRecord cr = new CodepageRecord(r);
        settings.setCharacterSet(cr.getCharacterSet());
      } else if (r.getType() == Type.SUPBOOK) {
        SupbookRecord sr = new SupbookRecord(r, settings);
        supbooks.add(sr);
      } else if (r.getType() == Type.PROTECT) {
        ProtectRecord pr = new ProtectRecord(r);
        wbProtected = pr.isProtected();
      } else if (r.getType() == Type.OBJPROJ) {
        containsMacros = true;
      } else if (r.getType() == Type.MSODRAWINGGROUP) {
        msoDrawingGroup = new MsoDrawingGroupRecord(r);

        if (drawingGroup == null) {
          drawingGroup = new DrawingGroup(DrawingGroup.READ);
        }

        drawingGroup.add(msoDrawingGroup);

        Record nextrec = excelFile.peek();
        while (nextrec.getType() == Type.CONTINUE) {
          drawingGroup.add(excelFile.next());
          nextrec = excelFile.peek();
        }
      } else if (r.getType() == Type.BUTTONPROPERTYSET) {
        buttonPropertySet = new ButtonPropertySetRecord(r);
      } else if (r.getType() == Type.EOF) {
        bofs--;
      }
    }

    bof = null;
    if (excelFile.hasNext()) {
      r = excelFile.next();

      if (r.getType() == Type.BOF) {
        bof = new BOFRecord(r);
      }
    }

    // Only get sheets for which there is a corresponding Boundsheet record
    while (bof != null && getNumberOfSheets() < boundsheets.size()) {
      if (!bof.isBiff8() && !bof.isBiff7()) {
        throw new BiffException(BiffException.unrecognizedBiffVersion);
      }

      if (bof.isWorksheet()) {
        // Read the sheet in
        SheetImpl s =
            new SheetImpl(
                excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this);

        BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets());
        s.setName(br.getName());
        s.setHidden(br.isHidden());
        addSheet(s);
      } else if (bof.isChart()) {
        // Read the sheet in
        SheetImpl s =
            new SheetImpl(
                excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this);

        BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets());
        s.setName(br.getName());
        s.setHidden(br.isHidden());
        addSheet(s);
      } else {
        logger.warn("BOF is unrecognized");

        while (excelFile.hasNext() && r.getType() != Type.EOF) {
          r = excelFile.next();
        }
      }

      // The next record will normally be a BOF or empty padding until
      // the end of the block is reached.  In exceptionally unlucky cases,
      // the last EOF  will coincide with a block division, so we have to
      // check there is more data to retrieve.
      // Thanks to liamg for spotting this
      bof = null;
      if (excelFile.hasNext()) {
        r = excelFile.next();

        if (r.getType() == Type.BOF) {
          bof = new BOFRecord(r);
        }
      }
    }
  }
예제 #11
0
  /** A NameRecord followed by a ContinueRecord. See Bugzilla 50244 */
  public void test50244() {
    String record_0x0018 =
        "                                          18 00 "
            + "21 1E 00 00 00 11 08 00 00 00 03 00 00 00 00 00 "
            + "00 77 44 61 74 61 47 72 75 70 70 65 53 65 72 69 "
            + "65 2E 60 00 B7 02 0C 00 57 03 00 B7 02 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 30 31 02 09 00 00 31 2E "
            + "54 32 30 2E 30 30 31 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 30 31 02 09 00 00 31 2E 54 32 30 2E 30 30 "
            + "32 02 09 00 00 31 2E 54 32 30 2E 30 30 32 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 30 32 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 30 33 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 30 33 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "30 33 02 09 00 00 31 2E 54 32 30 2E 30 31 33 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 31 33 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 31 33 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 31 34 02 09 00 00 31 2E 54 32 30 2E "
            + "30 31 34 02 09 00 00 31 2E 54 32 30 2E 30 31 34 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 31 35 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 31 35 02 09 00 00 31 2E "
            + "54 32 30 2E 30 31 35 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 32 35 02 09 00 00 31 2E 54 32 30 2E 30 32 "
            + "35 02 09 00 00 31 2E 54 32 30 2E 30 32 35 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 32 36 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 32 36 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 32 36 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "32 37 02 09 00 00 31 2E 54 32 30 2E 30 32 37 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 32 37 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 33 37 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 33 37 02 09 00 00 31 2E 54 32 30 2E "
            + "30 33 37 02 09 00 00 31 2E 54 32 30 2E 30 33 38 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 33 38 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 33 38 02 09 00 00 31 2E "
            + "54 32 30 2E 30 33 39 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 33 39 02 09 00 00 31 2E 54 32 30 2E 30 33 "
            + "39 02 09 00 00 31 2E 54 32 30 2E 30 34 39 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 34 39 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 34 39 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 35 30 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "35 30 02 09 00 00 31 2E 54 32 30 2E 30 35 30 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 35 31 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 35 31 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 35 31 02 09 00 00 31 2E 54 32 30 2E "
            + "30 36 31 02 09 00 00 31 2E 54 32 30 2E 30 36 31 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 36 31 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 36 32 02 09 00 00 31 2E "
            + "54 32 30 2E 30 36 32 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 36 32 02 09 00 00 31 2E 54 32 30 2E 30 36 "
            + "33 02 09 00 00 31 2E 54 32 30 2E 30 36 33 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 36 33 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 37 33 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 37 33 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "37 33 02 09 00 00 31 2E 54 32 30 2E 30 37 34 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 37 34 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 37 34 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 37 35 02 09 00 00 31 2E 54 32 30 2E "
            + "30 37 35 02 09 00 00 31 2E 54 32 30 2E 30 37 35 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 38 35 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 38 35 02 09 00 00 31 2E "
            + "54 32 30 2E 30 38 35 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 38 36 02 09 00 00 31 2E 54 32 30 2E 30 38 "
            + "36 02 09 00 00 31 2E 54 32 30 2E 30 38 36 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 38 37 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 38 37 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 38 37 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "39 37 02 09 00 00 31 2E 54 32 30 2E 30 39 37 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 39 37 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 39 38 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 39 38 02 09 00 00 31 2E 54 32 30 2E "
            + "30 39 38 02 09 00 00 31 2E 54 32 30 2E 30 39 39 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 39 39 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 39 39 02 09 00 00 31 2E "
            + "54 32 30 2E 31 30 39 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 30 39 02 09 00 00 31 2E 54 32 30 2E 31 30 "
            + "39 02 09 00 00 31 2E 54 32 30 2E 31 31 30 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 31 30 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 31 30 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 31 31 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "31 31 02 09 00 00 31 2E 54 32 30 2E 31 31 31 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 32 31 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 32 31 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 32 31 02 09 00 00 31 2E 54 32 30 2E "
            + "31 32 32 02 09 00 00 31 2E 54 32 30 2E 31 32 32 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 32 32 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 32 33 02 09 00 00 31 2E "
            + "54 32 30 2E 31 32 33 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 32 33 02 09 00 00 31 2E 54 32 30 2E 31 33 "
            + "33 02 09 00 00 31 2E 54 32 30 2E 31 33 33 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 33 33 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 33 34 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 33 34 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "33 34 02 09 00 00 31 2E 54 32 30 2E 31 33 35 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 33 35 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 33 35 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 34 35 02 09 00 00 31 2E 54 32 30 2E "
            + "31 34 35 02 09 00 00 31 2E 54 32 30 2E 31 34 35 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 34 36 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 34 36 02 09 00 00 31 2E "
            + "54 32 30 2E 31 34 36 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 34 37 02 09 00 00 31 2E 54 32 30 2E 31 34 "
            + "37 02 09 00 00 31 2E 54 32 30 2E 31 34 37 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 35 37 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 35 37 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 35 37 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "35 38 02 09 00 00 31 2E 54 32 30 2E 31 35 38 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 35 38 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 35 39 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 35 39 02 09 00 00 31 2E 54 32 30 2E "
            + "31 35 39 02 09 00 00 31 2E 54 32 30 2E 31 36 39 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 36 39 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 36 39 02 09 00 00 31 2E "
            + "54 32 30 2E 31 37 30 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 37 30 02 09 00 00 31 2E 54 32 30 2E 31 37 "
            + "30 02 09 00 00 31 2E 54 32 30 2E 31 37 31 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 37 31 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 37 31 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 30 39 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "30 39 02 09 00 00 31 2E 54 36 30 2E 30 30 39 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 31 30 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 31 30 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 31 30 02 09 00 00 31 2E 54 36 30 2E "
            + "30 31 31 02 09 00 00 31 2E 54 36 30 2E 30 31 31 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 31 31 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 32 31 02 09 00 00 31 2E "
            + "54 36 30 2E 30 32 31 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 32 31 02 09 00 00 31 2E 54 36 30 2E 30 32 "
            + "32 02 09 00 00 31 2E 54 36 30 2E 30 32 32 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 32 32 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 32 33 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 32 33 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "32 33 02 09 00 00 31 2E 54 36 30 2E 30 33 33 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 33 33 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 33 33 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 33 34 02 09 00 00 31 2E 54 36 30 2E "
            + "30 33 34 02 09 00 00 31 2E 54 36 30 2E 30 33 34 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 33 35 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 33 35 02 09 00 00 31 2E "
            + "54 36 30 2E 30 33 35 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 34 35 02 09 00 00 31 2E 54 36 30 2E 30 34 "
            + "35 02 09 00 00 31 2E 54 36 30 2E 30 34 35 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 34 36 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 34 36 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 34 36 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "34 37 02 09 00 00 31 2E 54 36 30 2E 30 34 37 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 34 37 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 35 37 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 35 37 02 09 00 00 31 2E 54 36 30 2E "
            + "30 35 37 02 09 00 00 31 2E 54 36 30 2E 30 35 38 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 35 38 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 35 38 02 09 00 00 31 2E "
            + "54 36 30 2E 30 35 39 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 35 39 02 09 00 00 31 2E 54 36 30 2E 30 35 "
            + "39 02 09 00 00 31 2E 54 36 30 2E 30 36 30 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 36 30 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 36 30 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 35 30 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "35 30 02 09 00 00 31 2E 54 36 30 2E 30 35 30 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 34 39 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 34 39 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 34 39 02 09 00 00 31 2E 54 36 30 2E "
            + "30 34 38 02 09 00 00 31 2E 54 36 30 2E 30 34 38 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 34 38 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 33 38 02 09 00 00 31 2E "
            + "54 36 30 2E 30 33 38 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 33 38 02 09 00 00 31 2E 54 36 30 2E 30 33 "
            + "37 02 09 00 00 31 2E 54 36 30 2E 30 33 37 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 33 37 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 33 36 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 33 36 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "33 36 02 09 00 00 31 2E 54 36 30 2E 30 32 36 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 32 36 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 32 36 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 32 35 02 09 00 00 31 2E 54 36 30 2E "
            + "30 32 35 02 09 00 00 31 2E 54 36 30 2E 30 32 35 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 32 34 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 32 34 02 09 00 00 31 2E "
            + "54 36 30 2E 30 32 34 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 31 34 02 09 00 00 31 2E 54 36 30 2E 30 31 "
            + "34 02 09 00 00 31 2E 54 36 30 2E 30 31 34 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 31 33 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 31 33 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 31 33 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "31 32 02 09 00 00 31 2E 54 36 30 2E 30 31 32 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 31 32 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 30 32 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 30 32 02 09 00 00 31 2E 54 36 30 2E "
            + "30 30 32 02 09 00 00 31 2E 54 36 30 2E 30 30 31 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 30 31 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 30 31 02 09 00 00 31 2E "
            + "54 32 30 2E 31 37 32 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 37 32 02 09 00 00 31 2E 54 32 30 2E 31 37 "
            + "32 02 09 00 00 31 2E 54 32 30 2E 31 36 32 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 36 32 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 36 32 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 36 31 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "36 31 02 09 00 00 31 2E 54 32 30 2E 31 36 31 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 36 30 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 36 30 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 36 30 02 09 00 00 31 2E 54 32 30 2E "
            + "31 35 30 02 09 00 00 31 2E 54 32 30 2E 31 35 30 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 35 30 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 34 39 02 09 00 00 31 2E "
            + "54 32 30 2E 31 34 39 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 34 39 02 09 00 00 31 2E 54 32 30 2E 31 34 "
            + "38 02 09 00 00 31 2E 54 32 30 2E 31 34 38 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 34 38 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 33 38 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 33 38 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "33 38 02 09 00 00 31 2E 54 32 30 2E 31 33 37 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 33 37 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 33 37 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 33 36 02 09 00 00 31 2E 54 32 30 2E "
            + "31 33 36 02 09 00 00 31 2E 54 32 30 2E 31 33 36 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 32 36 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 32 36 02 09 00 00 31 2E "
            + "54 32 30 2E 31 32 36 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 32 35 02 09 00 00 31 2E 54 32 30 2E 31 32 "
            + "35 02 09 00 00 31 2E 54 32 30 2E 31 32 35 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 32 34 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 32 34 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 32 34 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "31 34 02 09 00 00 31 2E 54 32 30 2E 31 31 34 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 31 34 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 31 33 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 31 33 02 09 00 00 31 2E 54 32 30 2E "
            + "31 31 33 02 09 00 00 31 2E 54 32 30 2E 31 31 32 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 31 32 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 31 32 02 09 00 00 31 2E "
            + "54 32 30 2E 31 30 32 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 30 32 02 09 00 00 31 2E 54 32 30 2E 31 30 "
            + "32 02 09 00 00 31 2E 54 32 30 2E 31 30 31 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 30 31 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 30 31 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 30 30 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "30 30 02 09 00 00 31 2E 54 32 30 2E 31 30 30 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 39 30 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 39 30 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 39 30 02 09 00 00 31 2E 54 32 30 2E "
            + "30 38 39 02 09 00 00 31 2E 54 32 30 2E 30 38 39 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 38 39 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 38 38 02 09 00 00 31 2E "
            + "54 32 30 2E 30 38 38 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 38 38 02 09 00 00 31 2E 54 32 30 2E 30 37 "
            + "38 02 09 00 00 31 2E 54 32 30 2E 30 37 38 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 37 38 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 37 37 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 37 37 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "37 37 02 09 00 00 31 2E 54 32 30 2E 30 37 36 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 37 36 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 37 36 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 36 36 02 09 00 00 31 2E 54 32 30 2E "
            + "30 36 36 02 09 00 00 31 2E 54 32 30 2E 30 36 36 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 36 35 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 36 35 02 09 00 00 31 2E "
            + "54 32 30 2E 30 36 35 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 36 34 02 09 00 00 31 2E 54 32 30 2E 30 36 "
            + "34 02 09 00 00 31 2E 54 32 30 2E 30 36 34 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 35 34 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 35 34 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 35 34 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "35 33 02 09 00 00 31 2E 54 32 30 2E 30 35 33 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 35 33 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 35 32 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 35 32 02 09 00 00 31 2E 54 32 30 2E "
            + "30 35 32 02 09 00 00 31 2E 54 32 30 2E 30 34 32 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 34 32 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 34 32 02 09 00 00 31 2E "
            + "54 32 30 2E 30 34 31 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 34 31 02 09 00 00 31 2E 54 32 30 2E 30 34 "
            + "31 02 09 00 00 31 2E 54 32 30 2E 30 34 30 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 34 30 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 34 30 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 33 30 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "33 30 02 09 00 00 31 2E 54 32 30 2E 30 33 30 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 32 39 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 32 39 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 32 39 02 09 00 00 31 2E 54 32 30 2E "
            + "30 32 38 02 09 00 00 31 2E 54 32 30 2E 30 32 38 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 32 38 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 31 38 02 09 00 00 31 2E "
            + "54 32 30 2E 30 31 38 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 31 38 02 09 00 00 31 2E 54 32 30 2E 30 31 "
            + "37 02 09 00 00 31 2E 54 32 30 2E 30 31 37 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 31 37 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 31 36 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 31 36 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "31 36 02 09 00 00 31 2E 54 32 30 2E 30 30 36 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 30 36 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 30 36 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 30 35 02 09 00 00 31 2E 54 32 30 2E "
            + "30 30 35 02 09 00 00 31 2E 54 32 30 2E 30 30 35 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 30 34 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 30 34 02 09 00 00 31 2E "
            + "54 32 30 2E 30 30 34 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 30 37 02 09 00 00 31 2E 54 32 30 2E 30 30 "
            + "37 02 09 00 00 31 2E 54 32 30 2E 30 30 37 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 30 38 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 30 38 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 30 38 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "30 39 02 09 00 00 31 2E 54 32 30 2E 30 30 39 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 30 39 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 31 39 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 31 39 02 09 00 00 31 2E 54 32 30 2E "
            + "30 31 39 02 09 00 00 31 2E 54 32 30 2E 30 32 30 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 32 30 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 32 30 02 09 00 00 31 2E "
            + "54 32 30 2E 30 32 31 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 32 31 02 09 00 00 31 2E 54 32 30 2E 30 32 "
            + "31 02 09 00 00 31 2E 54 32 30 2E 30 33 31 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 33 31 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 33 31 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 33 32 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "33 32 02 09 00 00 31 2E 54 32 30 2E 30 33 32 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 33 33 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 33 33 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 33 33 02 09 00 00 31 2E 54 32 30 2E "
            + "30 34 33 02 09 00 00 31 2E 54 32 30 2E 30 34 33 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 34 33 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 34 34 02 09 00 00 31 2E "
            + "54 32 30 2E 30 34 34 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 34 34 02 09 00 00 31 2E 54 32 30 2E 30 34 "
            + "35 02 09 00 00 31 2E 54 32 30 2E 30 34 35 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 34 35 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 35 35 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 35 35 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "35 35 02 09 00 00 31 2E 54 32 30 2E 30 35 36 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 35 36 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 35 36 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 35 37 02 09 00 00 31 2E 54 32 30 2E "
            + "30 35 37 02 09 00 00 31 2E 54 32 30 2E 30 35 37 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 36 37 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 36 37 02 09 00 00 31 2E "
            + "54 32 30 2E 30 36 37 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 36 38 02 09 00 00 31 2E 54 32 30 2E 30 36 "
            + "38 02 09 00 00 31 2E 54 32 30 2E 30 36 38 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 36 39 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 36 39 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 36 39 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "37 39 02 09 00 00 31 2E 54 32 30 2E 30 37 39 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 37 39 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 38 30 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 38 30 02 09 00 00 31 2E 54 32 30 2E "
            + "30 38 30 02 09 00 00 31 2E 54 32 30 2E 30 38 31 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 38 31 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 38 31 02 09 00 00 31 2E "
            + "54 32 30 2E 30 39 31 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 39 31 02 09 00 00 31 2E 54 32 30 2E 30 39 "
            + "31 02 09 00 00 31 2E 54 32 30 2E 30 39 32 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 39 32 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 39 32 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 39 33 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "39 33 02 09 00 00 31 2E 54 32 30 2E 30 39 33 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 30 33 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 30 33 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 30 33 02 09 00 00 31 2E 54 32 30 2E "
            + "31 30 34 02 09 00 00 31 2E 54 32 30 2E 31 30 34 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 30 34 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 30 35 02 09 00 00 31 2E "
            + "54 32 30 2E 31 30 35 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 30 35 02 09 00 00 31 2E 54 32 30 2E 31 31 "
            + "35 02 09 00 00 31 2E 54 32 30 2E 31 31 35 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 31 35 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 31 36 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 31 36 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "31 36 02 09 00 00 31 2E 54 32 30 2E 31 31 37 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 31 37 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 31 37 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 32 37 02 09 00 00 31 2E 54 32 30 2E "
            + "31 32 37 02 09 00 00 31 2E 54 32 30 2E 31 32 37 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 32 38 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 32 38 02 09 00 00 31 2E "
            + "54 32 30 2E 31 32 38 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 32 39 02 09 00 00 31 2E 54 32 30 2E 31 32 "
            + "39 02 09 00 00 31 2E 54 32 30 2E 31 32 39 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 33 39 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 33 39 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 33 39 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "34 30 02 09 00 00 31 2E 54 32 30 2E 31 34 30 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 34 30 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 34 31 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 34 31 02 09 00 00 31 2E 54 32 30 2E "
            + "31 34 31 02 09 00 00 31 2E 54 32 30 2E 31 35 31 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 35 31 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 35 31 02 09 00 00 31 2E "
            + "54 32 30 2E 31 35 32 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 35 32 02 09 00 00 31 2E 54 32 30 2E 31 35 "
            + "32 02 09 00 00 31 2E 54 32 30 2E 31 35 33 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 35 33 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 35 33 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 36 33 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "36 33 02 09 00 00 31 2E 54 32 30 2E 31 36 33 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 36 34 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 36 34 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 36 34 02 09 00 00 31 2E 54 32 30 2E "
            + "31 36 35 02 09 00 00 31 2E 54 32 30 2E 31 36 35 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 36 35 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 30 33 02 09 00 00 31 2E "
            + "54 36 30 2E 30 30 33 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 30 33 02 09 00 00 31 2E 54 36 30 2E 30 30 "
            + "34 02 09 00 00 31 2E 54 36 30 2E 30 30 34 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 30 34 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 30 35 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 30 35 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "30 35 02 09 00 00 31 2E 54 36 30 2E 30 31 35 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 31 35 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 31 35 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 31 36 02 09 00 00 31 2E 54 36 30 2E "
            + "30 31 36 02 09 00 00 31 2E 54 36 30 2E 30 31 36 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 31 37 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 31 37 02 09 00 00 31 2E "
            + "54 36 30 2E 30 31 37 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 32 37 02 09 00 00 31 2E 54 36 30 2E 30 32 "
            + "37 02 09 00 00 31 2E 54 36 30 2E 30 32 37 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 32 38 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 32 38 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 32 38 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "32 39 02 09 00 00 31 2E 54 36 30 2E 30 32 39 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 32 39 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 33 39 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 33 39 02 09 00 00 31 2E 54 36 30 2E "
            + "30 33 39 02 09 00 00 31 2E 54 36 30 2E 30 34 30 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 34 30 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 34 30 02 09 00 00 31 2E "
            + "54 36 30 2E 30 34 31 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 34 31 02 09 00 00 31 2E 54 36 30 2E 30 34 "
            + "31 02 09 00 00 31 2E 54 36 30 2E 30 35 31 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 35 31 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 35 31 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 35 32 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "35 32 02 09 00 00 31 2E 54 36 30 2E 30 35 32 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 35 33 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 35 33 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 35 33 02 09 00 00 31 2E 54 36 30 2E "
            + "30 35 36 02 09 00 00 31 2E 54 36 30 2E 30 35 36 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 35 36 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 35 35 02 09 00 00 31 2E "
            + "54 36 30 2E 30 35 35 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 35 35 02 09 00 00 31 2E 54 36 30 2E 30 35 "
            + "34 02 09 00 00 31 2E 54 36 30 2E 30 35 34 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 35 34 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 34 34 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 34 34 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "34 34 02 09 00 00 31 2E 54 36 30 2E 30 34 33 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 34 33 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 34 33 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 34 32 02 09 00 00 31 2E 54 36 30 2E "
            + "30 34 32 02 09 00 00 31 2E 54 36 30 2E 30 34 32 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 33 32 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 33 32 02 09 00 00 31 2E "
            + "54 36 30 2E 30 33 32 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 33 31 02 09 00 00 31 2E 54 36 30 2E 30 33 "
            + "31 02 09 00 00 31 2E 54 36 30 2E 30 33 31 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 33 30 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 33 30 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 33 30 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "32 30 02 09 00 00 31 2E 54 36 30 2E 30 32 30 02 "
            + "09 00 00 31 2E 54 36 30 2E 30 32 30 02 09 00 00 "
            + "31 2E 54 36 30 2E 30 31 39 02 09 00 00 31 2E 54 "
            + "36 30 2E 30 31 39 02 09 00 00 31 2E 54 36 30 2E "
            + "30 31 39 02 09 00 00 31 2E 54 36 30 2E 30 31 38 "
            + "02 09 00 00 31 2E 54 36 30 2E 30 31 38 02 09 00 "
            + "00 31 2E 54 36 30 2E 30 31 38 02 09 00 00 31 2E "
            + "54 36 30 2E 30 30 38 02 09 00 00 31 2E 54 36 30 "
            + "2E 30 30 38 02 09 00 00 31 2E 54 36 30 2E 30 30 "
            + "38 02 09 00 00 31 2E 54 36 30 2E 30 30 37 02 09 "
            + "00 00 31 2E 54 36 30 2E 30 30 37 02 09 00 00 31 "
            + "2E 54 36 30 2E 30 30 37 02 09 00 00 31 2E 54 36 "
            + "30 2E 30 30 36 02 09 00 00 31 2E 54 36 30 2E 30 "
            + "30 36 02 09 00 00 31 2E 54 36 30 2E 30 30 36 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 36 38 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 36 38 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 36 38 02 09 00 00 31 2E 54 32 30 2E "
            + "31 36 37 02 09 00 00 31 2E 54 32 30 2E 31 36 37 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 36 37 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 36 36 02 09 00 00 31 2E "
            + "54 32 30 2E 31 36 36 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 36 36 02 09 00 00 31 2E 54 32 30 2E 31 35 "
            + "36 02 09 00 00 31 2E 54 32 30 2E 31 35 36 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 35 36 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 35 35 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 35 35 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "35 35 02 09 00 00 31 2E 54 32 30 2E 31 35 34 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 35 34 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 35 34 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 34 34 02 09 00 00 31 2E 54 32 30 2E "
            + "31 34 34                                       ";

    String record_0x03C =
        "         3C 00 62 05 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 34 34 02 09 00 00 31 2E 54 32 30 2E 31 34 "
            + "33 02 09 00 00 31 2E 54 32 30 2E 31 34 33 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 34 33 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 34 32 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 34 32 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "34 32 02 09 00 00 31 2E 54 32 30 2E 31 33 32 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 33 32 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 33 32 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 33 31 02 09 00 00 31 2E 54 32 30 2E "
            + "31 33 31 02 09 00 00 31 2E 54 32 30 2E 31 33 31 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 33 30 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 33 30 02 09 00 00 31 2E "
            + "54 32 30 2E 31 33 30 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 32 30 02 09 00 00 31 2E 54 32 30 2E 31 32 "
            + "30 02 09 00 00 31 2E 54 32 30 2E 31 32 30 02 09 "
            + "00 00 31 2E 54 32 30 2E 31 31 39 02 09 00 00 31 "
            + "2E 54 32 30 2E 31 31 39 02 09 00 00 31 2E 54 32 "
            + "30 2E 31 31 39 02 09 00 00 31 2E 54 32 30 2E 31 "
            + "31 38 02 09 00 00 31 2E 54 32 30 2E 31 31 38 02 "
            + "09 00 00 31 2E 54 32 30 2E 31 31 38 02 09 00 00 "
            + "31 2E 54 32 30 2E 31 30 38 02 09 00 00 31 2E 54 "
            + "32 30 2E 31 30 38 02 09 00 00 31 2E 54 32 30 2E "
            + "31 30 38 02 09 00 00 31 2E 54 32 30 2E 31 30 37 "
            + "02 09 00 00 31 2E 54 32 30 2E 31 30 37 02 09 00 "
            + "00 31 2E 54 32 30 2E 31 30 37 02 09 00 00 31 2E "
            + "54 32 30 2E 31 30 36 02 09 00 00 31 2E 54 32 30 "
            + "2E 31 30 36 02 09 00 00 31 2E 54 32 30 2E 31 30 "
            + "36 02 09 00 00 31 2E 54 32 30 2E 30 39 36 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 39 36 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 39 36 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 39 35 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "39 35 02 09 00 00 31 2E 54 32 30 2E 30 39 35 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 39 34 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 39 34 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 39 34 02 09 00 00 31 2E 54 32 30 2E "
            + "30 38 34 02 09 00 00 31 2E 54 32 30 2E 30 38 34 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 38 34 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 38 33 02 09 00 00 31 2E "
            + "54 32 30 2E 30 38 33 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 38 33 02 09 00 00 31 2E 54 32 30 2E 30 38 "
            + "32 02 09 00 00 31 2E 54 32 30 2E 30 38 32 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 38 32 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 37 32 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 37 32 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "37 32 02 09 00 00 31 2E 54 32 30 2E 30 37 31 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 37 31 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 37 31 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 37 30 02 09 00 00 31 2E 54 32 30 2E "
            + "30 37 30 02 09 00 00 31 2E 54 32 30 2E 30 37 30 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 36 30 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 36 30 02 09 00 00 31 2E "
            + "54 32 30 2E 30 36 30 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 35 39 02 09 00 00 31 2E 54 32 30 2E 30 35 "
            + "39 02 09 00 00 31 2E 54 32 30 2E 30 35 39 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 35 38 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 35 38 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 35 38 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "34 38 02 09 00 00 31 2E 54 32 30 2E 30 34 38 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 34 38 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 34 37 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 34 37 02 09 00 00 31 2E 54 32 30 2E "
            + "30 34 37 02 09 00 00 31 2E 54 32 30 2E 30 34 36 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 34 36 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 34 36 02 09 00 00 31 2E "
            + "54 32 30 2E 30 33 36 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 33 36 02 09 00 00 31 2E 54 32 30 2E 30 33 "
            + "36 02 09 00 00 31 2E 54 32 30 2E 30 33 35 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 33 35 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 33 35 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 33 34 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "33 34 02 09 00 00 31 2E 54 32 30 2E 30 33 34 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 32 34 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 32 34 02 09 00 00 31 2E 54 "
            + "32 30 2E 30 32 34 02 09 00 00 31 2E 54 32 30 2E "
            + "30 32 33 02 09 00 00 31 2E 54 32 30 2E 30 32 33 "
            + "02 09 00 00 31 2E 54 32 30 2E 30 32 33 02 09 00 "
            + "00 31 2E 54 32 30 2E 30 32 32 02 09 00 00 31 2E "
            + "54 32 30 2E 30 32 32 02 09 00 00 31 2E 54 32 30 "
            + "2E 30 32 32 02 09 00 00 31 2E 54 32 30 2E 30 31 "
            + "32 02 09 00 00 31 2E 54 32 30 2E 30 31 32 02 09 "
            + "00 00 31 2E 54 32 30 2E 30 31 32 02 09 00 00 31 "
            + "2E 54 32 30 2E 30 31 31 02 09 00 00 31 2E 54 32 "
            + "30 2E 30 31 31 02 09 00 00 31 2E 54 32 30 2E 30 "
            + "31 31 02 09 00 00 31 2E 54 32 30 2E 30 31 30 02 "
            + "09 00 00 31 2E 54 32 30 2E 30 31 30 02 09 00 00 "
            + "31 2E 54 32 30 2E 30 31 30                     ";

    byte[] data1 = HexRead.readFromString(record_0x0018 + record_0x03C);
    RecordInputStream in1 = TestcaseRecordInputStream.create(data1);
    NameRecord nr1 = new NameRecord(in1);
    assert_bug50244(nr1);

    byte[] data2 = nr1.serialize();

    assertEquals(data1.length, data2.length);
    RecordInputStream in2 = TestcaseRecordInputStream.create(data2);
    NameRecord nr2 = new NameRecord(in2);
    assert_bug50244(nr2);
  }
예제 #12
0
  /** Reads in the contents of this sheet */
  final void readSheet() {
    // If this sheet contains only a chart, then set everything to
    // empty and do not bother parsing the sheet
    // Thanks to steve.brophy for spotting this
    if (!sheetBof.isWorksheet()) {
      numRows = 0;
      numCols = 0;
      cells = new Cell[0][0];
      //      return;
    }

    SheetReader reader =
        new SheetReader(
            excelFile,
            sharedStrings,
            formattingRecords,
            sheetBof,
            workbookBof,
            nineteenFour,
            workbook,
            startPosition,
            this);
    reader.read();

    // Take stuff that was read in
    numRows = reader.getNumRows();
    numCols = reader.getNumCols();
    cells = reader.getCells();
    rowProperties = reader.getRowProperties();
    columnInfosArray = reader.getColumnInfosArray();
    hyperlinks = reader.getHyperlinks();
    conditionalFormats = reader.getConditionalFormats();
    autoFilter = reader.getAutoFilter();
    charts = reader.getCharts();
    drawings = reader.getDrawings();
    dataValidation = reader.getDataValidation();
    mergedCells = reader.getMergedCells();
    settings = reader.getSettings();
    settings.setHidden(hidden);
    rowBreaks = reader.getRowBreaks();
    columnBreaks = reader.getColumnBreaks();
    workspaceOptions = reader.getWorkspaceOptions();
    plsRecord = reader.getPLS();
    buttonPropertySet = reader.getButtonPropertySet();
    maxRowOutlineLevel = reader.getMaxRowOutlineLevel();
    maxColumnOutlineLevel = reader.getMaxColumnOutlineLevel();

    reader = null;

    if (!workbookSettings.getGCDisabled()) {
      System.gc();
    }

    if (columnInfosArray.size() > 0) {
      ColumnInfoRecord cir = (ColumnInfoRecord) columnInfosArray.get(columnInfosArray.size() - 1);
      columnInfos = new ColumnInfoRecord[cir.getEndColumn() + 1];
    } else {
      columnInfos = new ColumnInfoRecord[0];
    }

    // Add any local names
    if (localNames != null) {
      for (Iterator it = localNames.iterator(); it.hasNext(); ) {
        NameRecord nr = (NameRecord) it.next();
        if (nr.getBuiltInName() == BuiltInName.PRINT_AREA) {
          if (nr.getRanges().length > 0) {
            NameRecord.NameRange rng = nr.getRanges()[0];
            settings.setPrintArea(
                rng.getFirstColumn(), rng.getFirstRow(), rng.getLastColumn(), rng.getLastRow());
          }
        } else if (nr.getBuiltInName() == BuiltInName.PRINT_TITLES) {
          // There can be 1 or 2 entries.
          // Row entries have hardwired column entries (first and last
          //  possible column)
          // Column entries have hardwired row entries (first and last
          // possible row)
          for (int i = 0; i < nr.getRanges().length; i++) {
            NameRecord.NameRange rng = nr.getRanges()[i];
            if (rng.getFirstColumn() == 0 && rng.getLastColumn() == 255) {
              settings.setPrintTitlesRow(rng.getFirstRow(), rng.getLastRow());
            } else {
              settings.setPrintTitlesCol(rng.getFirstColumn(), rng.getLastColumn());
            }
          }
        }
      }
    }
  }
  /**
   * Does the hard work of building up the object graph from the excel bytes
   *
   * @exception BiffException
   * @exception PasswordException if the workbook is password protected
   */
  public void parse() throws BiffException, PasswordException {
    Record r = null;

    BOFRecord bof = new BOFRecord(excelFile.next());
    workbookBof = bof;
    bofs++;

    if (!bof.isBiff8() && !bof.isBiff7()) {
      throw new BiffException(BiffException.unrecognizedBiffVersion);
    }

    if (!bof.isWorkbookGlobals()) {
      throw new BiffException(BiffException.expectedGlobals);
    }
    ArrayList continueRecords = new ArrayList();
    ArrayList localNames = new ArrayList();
    nameTable = new ArrayList();
    addInFunctions = new ArrayList();

    // Skip to the first worksheet
    while (bofs == 1) {
      r = excelFile.next();

      if (r.getType() == Type.SST) {
        continueRecords.clear();
        Record nextrec = excelFile.peek();
        while (nextrec.getType() == Type.CONTINUE) {
          continueRecords.add(excelFile.next());
          nextrec = excelFile.peek();
        }

        // cast the array
        Record[] records = new Record[continueRecords.size()];
        records = (Record[]) continueRecords.toArray(records);

        sharedStrings = new SSTRecord(r, records, settings);
      } else if (r.getType() == Type.FILEPASS) {
        throw new PasswordException();
      } else if (r.getType() == Type.NAME) {
        NameRecord nr = null;

        if (bof.isBiff8()) {
          nr = new NameRecord(r, settings, nameTable.size());

        } else {
          nr = new NameRecord(r, settings, nameTable.size(), NameRecord.biff7);
        }

        // Add all local and global names to the name table in order to
        // preserve the indexing
        nameTable.add(nr);

        if (nr.isGlobal()) {
          namedRecords.put(nr.getName(), nr);
        } else {
          localNames.add(nr);
        }
      } else if (r.getType() == Type.FONT) {
        FontRecord fr = null;

        if (bof.isBiff8()) {
          fr = new FontRecord(r, settings);
        } else {
          fr = new FontRecord(r, settings, FontRecord.biff7);
        }
        fonts.addFont(fr);
      } else if (r.getType() == Type.PALETTE) {
        PaletteRecord palette = new PaletteRecord(r);
        formattingRecords.setPalette(palette);
      } else if (r.getType() == Type.NINETEENFOUR) {
        NineteenFourRecord nr = new NineteenFourRecord(r);
        nineteenFour = nr.is1904();
      } else if (r.getType() == Type.FORMAT) {
        FormatRecord fr = null;
        if (bof.isBiff8()) {
          fr = new FormatRecord(r, settings, FormatRecord.biff8);
        } else {
          fr = new FormatRecord(r, settings, FormatRecord.biff7);
        }
        try {
          formattingRecords.addFormat(fr);
        } catch (NumFormatRecordsException e) {
          // This should not happen.  Bomb out
          Assert.verify(false, e.getMessage());
        }
      } else if (r.getType() == Type.XF) {
        XFRecord xfr = null;
        if (bof.isBiff8()) {
          xfr = new XFRecord(r, settings, XFRecord.biff8);
        } else {
          xfr = new XFRecord(r, settings, XFRecord.biff7);
        }

        try {
          formattingRecords.addStyle(xfr);
        } catch (NumFormatRecordsException e) {
          // This should not happen.  Bomb out
          Assert.verify(false, e.getMessage());
        }
      } else if (r.getType() == Type.BOUNDSHEET) {
        BoundsheetRecord br = null;

        if (bof.isBiff8()) {
          br = new BoundsheetRecord(r, settings);
        } else {
          br = new BoundsheetRecord(r, BoundsheetRecord.biff7);
        }

        if (br.isSheet()) {
          boundsheets.add(br);
        } else if (br.isChart() && !settings.getDrawingsDisabled()) {
          boundsheets.add(br);
        }
      } else if (r.getType() == Type.EXTERNSHEET) {
        if (bof.isBiff8()) {
          externSheet = new ExternalSheetRecord(r, settings);
        } else {
          externSheet = new ExternalSheetRecord(r, settings, ExternalSheetRecord.biff7);
        }
      } else if (r.getType() == Type.XCT) {
        XCTRecord xctr = new XCTRecord(r);
        xctRecords.add(xctr);
      } else if (r.getType() == Type.CODEPAGE) {
        CodepageRecord cr = new CodepageRecord(r);
        settings.setCharacterSet(cr.getCharacterSet());
      } else if (r.getType() == Type.SUPBOOK) {
        Record nextrec = excelFile.peek();
        while (nextrec.getType() == Type.CONTINUE) {
          r.addContinueRecord(excelFile.next());
          nextrec = excelFile.peek();
        }

        SupbookRecord sr = new SupbookRecord(r, settings);
        supbooks.add(sr);
      } else if (r.getType() == Type.EXTERNNAME) {
        ExternalNameRecord enr = new ExternalNameRecord(r, settings);

        if (enr.isAddInFunction()) {
          addInFunctions.add(enr.getName());
        }
      } else if (r.getType() == Type.PROTECT) {
        ProtectRecord pr = new ProtectRecord(r);
        wbProtected = pr.isProtected();
      } else if (r.getType() == Type.OBJPROJ) {
        containsMacros = true;
      } else if (r.getType() == Type.COUNTRY) {
        countryRecord = new CountryRecord(r);
      } else if (r.getType() == Type.MSODRAWINGGROUP) {
        if (!settings.getDrawingsDisabled()) {
          msoDrawingGroup = new MsoDrawingGroupRecord(r);

          if (drawingGroup == null) {
            drawingGroup = new DrawingGroup(Origin.READ);
          }

          drawingGroup.add(msoDrawingGroup);

          Record nextrec = excelFile.peek();
          while (nextrec.getType() == Type.CONTINUE) {
            drawingGroup.add(excelFile.next());
            nextrec = excelFile.peek();
          }
        }
      } else if (r.getType() == Type.BUTTONPROPERTYSET) {
        buttonPropertySet = new ButtonPropertySetRecord(r);
      } else if (r.getType() == Type.EOF) {
        bofs--;
      } else if (r.getType() == Type.REFRESHALL) {
        RefreshAllRecord rfm = new RefreshAllRecord(r);
        settings.setRefreshAll(rfm.getRefreshAll());
      } else if (r.getType() == Type.TEMPLATE) {
        TemplateRecord rfm = new TemplateRecord(r);
        settings.setTemplate(rfm.getTemplate());
      } else if (r.getType() == Type.EXCEL9FILE) {
        Excel9FileRecord e9f = new Excel9FileRecord(r);
        settings.setExcel9File(e9f.getExcel9File());
      } else if (r.getType() == Type.WINDOWPROTECT) {
        WindowProtectedRecord winp = new WindowProtectedRecord(r);
        settings.setWindowProtected(winp.getWindowProtected());
      } else if (r.getType() == Type.HIDEOBJ) {
        HideobjRecord hobj = new HideobjRecord(r);
        settings.setHideobj(hobj.getHideMode());
      } else if (r.getType() == Type.WRITEACCESS) {
        WriteAccessRecord war = new WriteAccessRecord(r, bof.isBiff8(), settings);
        settings.setWriteAccess(war.getWriteAccess());
      } else {
        // logger.info("Unsupported record type: " +
        //            Integer.toHexString(r.getCode())+"h");
      }
    }

    bof = null;
    if (excelFile.hasNext()) {
      r = excelFile.next();

      if (r.getType() == Type.BOF) {
        bof = new BOFRecord(r);
      }
    }

    // Only get sheets for which there is a corresponding Boundsheet record
    while (bof != null && getNumberOfSheets() < boundsheets.size()) {
      if (!bof.isBiff8() && !bof.isBiff7()) {
        throw new BiffException(BiffException.unrecognizedBiffVersion);
      }

      if (bof.isWorksheet()) {
        // Read the sheet in
        SheetImpl s =
            new SheetImpl(
                excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this);

        BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets());
        s.setName(br.getName());
        s.setHidden(br.isHidden());
        addSheet(s);
      } else if (bof.isChart()) {
        // Read the sheet in
        SheetImpl s =
            new SheetImpl(
                excelFile, sharedStrings, formattingRecords, bof, workbookBof, nineteenFour, this);

        BoundsheetRecord br = (BoundsheetRecord) boundsheets.get(getNumberOfSheets());
        s.setName(br.getName());
        s.setHidden(br.isHidden());
        addSheet(s);
      } else {
        logger.warn("BOF is unrecognized");

        while (excelFile.hasNext() && r.getType() != Type.EOF) {
          r = excelFile.next();
        }
      }

      // The next record will normally be a BOF or empty padding until
      // the end of the block is reached.  In exceptionally unlucky cases,
      // the last EOF  will coincide with a block division, so we have to
      // check there is more data to retrieve.
      // Thanks to liamg for spotting this
      bof = null;
      if (excelFile.hasNext()) {
        r = excelFile.next();

        if (r.getType() == Type.BOF) {
          bof = new BOFRecord(r);
        }
      }
    }

    // Add all the local names to the specific sheets
    for (Iterator it = localNames.iterator(); it.hasNext(); ) {
      NameRecord nr = (NameRecord) it.next();

      if (nr.getBuiltInName() == null) {
        logger.warn("Usage of a local non-builtin name");
      } else if (nr.getBuiltInName() == BuiltInName.PRINT_AREA
          || nr.getBuiltInName() == BuiltInName.PRINT_TITLES) {
        // appears to use the internal tab number rather than the
        // external sheet index
        SheetImpl s = (SheetImpl) sheets.get(nr.getSheetRef() - 1);
        s.addLocalName(nr);
      }
    }
  }