// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Bond.java
// public interface Bond
// {
//   public int getIndex();
//   
//   public Atom getSource();
//   
//   public Atom getTarget();
//   
//   public Atom getMate(Atom atom);
//   
//   public boolean contains(Atom atom);
//   
//   public void setType(int type);
//   
//   public int getType();
//   
//   public void setStereo(int stereo);
//   
//   public int getStereo();
//   
//   public void reverse();
//   
//   public Molecule getMolecule();
//   
//   public Atom[] getNeighborAtoms();
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }
// 
// Path: src/com/metamolecular/mx/model/Superatom.java
// public interface Superatom
// {
//   public String getLabel();
// 
//   public void setLabel(String label);
// 
//   public int countAtoms();
// 
//   public int countCrossingBonds();
// 
//   public Atom getAtom(int index);
// 
//   public Bond getCrossingBond(int index);
// 
//   public boolean contains(Atom atom);
// 
//   public boolean contains(Bond bond);
// 
//   public void addAtom(Atom atom);
// 
//   public void removeAtom(Atom atom);
// 
//   public void addCrossingBond(Bond bond);
// 
//   public void removeCrossingBond(Bond bond);
// 
//   public void setCrossingVector(Bond bond, double x, double y);
// 
//   public double getCrossingVectorX(Bond bond);
// 
//   public double getCrossingVectorY(Bond bond);
// 
//   public int getIndex();
// 
//   public Molecule getMolecule();
// }


import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Bond;
import com.metamolecular.mx.model.Molecule;
import com.metamolecular.mx.model.Superatom;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.List;
import java.util.ArrayList;
    {
      writer.write(MDLStringKit.padLeft(String.valueOf(i + 1), 4));
      writer.write(MDLStringKit.padLeft(String.valueOf(i + 1), 4));
    }
    writer.writeLine();

  }

  private void writeSingleSgroup(Superatom substructure, Writer writer)
  {
    writer.write(M + "SAL" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + MDLStringKit.padLeft(String.valueOf(substructure.countAtoms()), 3));
    for (int i = 0; i < substructure.countAtoms(); i++)
    {
      writer.write(MDLStringKit.padLeft(String.valueOf(substructure.getAtom(i).getIndex() + 1), 4));
    }
    writer.writeLine();

    writer.write(M + "SBL" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + MDLStringKit.padLeft(String.valueOf(substructure.countCrossingBonds()), 3));
    for (int i = 0; i < substructure.countCrossingBonds(); i++)
    {
      writer.write(MDLStringKit.padLeft(String.valueOf(substructure.getCrossingBond(i).getIndex() + 1), 4));
    }
    writer.writeLine();

    writer.writeLine(M + "SMT" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + " " + substructure.getLabel());

    writer.writeLine(M + "SCL" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + "  ");

    for (int i = 0; i < substructure.countCrossingBonds(); i++)
    {
// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Bond.java
// public interface Bond
// {
//   public int getIndex();
//   
//   public Atom getSource();
//   
//   public Atom getTarget();
//   
//   public Atom getMate(Atom atom);
//   
//   public boolean contains(Atom atom);
//   
//   public void setType(int type);
//   
//   public int getType();
//   
//   public void setStereo(int stereo);
//   
//   public int getStereo();
//   
//   public void reverse();
//   
//   public Molecule getMolecule();
//   
//   public Atom[] getNeighborAtoms();
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }
// 
// Path: src/com/metamolecular/mx/model/Superatom.java
// public interface Superatom
// {
//   public String getLabel();
// 
//   public void setLabel(String label);
// 
//   public int countAtoms();
// 
//   public int countCrossingBonds();
// 
//   public Atom getAtom(int index);
// 
//   public Bond getCrossingBond(int index);
// 
//   public boolean contains(Atom atom);
// 
//   public boolean contains(Bond bond);
// 
//   public void addAtom(Atom atom);
// 
//   public void removeAtom(Atom atom);
// 
//   public void addCrossingBond(Bond bond);
// 
//   public void removeCrossingBond(Bond bond);
// 
//   public void setCrossingVector(Bond bond, double x, double y);
// 
//   public double getCrossingVectorX(Bond bond);
// 
//   public double getCrossingVectorY(Bond bond);
// 
//   public int getIndex();
// 
//   public Molecule getMolecule();
// }


// Path: src/com/metamolecular/mx/io/mdl/MolfileWriter.java
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Bond;
import com.metamolecular.mx.model.Molecule;
import com.metamolecular.mx.model.Superatom;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.List;
import java.util.ArrayList;

    {
      writer.write(MDLStringKit.padLeft(String.valueOf(i + 1), 4));
      writer.write(MDLStringKit.padLeft(String.valueOf(i + 1), 4));
    }
    writer.writeLine();

  }

  private void writeSingleSgroup(Superatom substructure, Writer writer)
  {
    writer.write(M + "SAL" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + MDLStringKit.padLeft(String.valueOf(substructure.countAtoms()), 3));
    for (int i = 0; i < substructure.countAtoms(); i++)
    {
      writer.write(MDLStringKit.padLeft(String.valueOf(substructure.getAtom(i).getIndex() + 1), 4));
    }
    writer.writeLine();

    writer.write(M + "SBL" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + MDLStringKit.padLeft(String.valueOf(substructure.countCrossingBonds()), 3));
    for (int i = 0; i < substructure.countCrossingBonds(); i++)
    {
      writer.write(MDLStringKit.padLeft(String.valueOf(substructure.getCrossingBond(i).getIndex() + 1), 4));
    }
    writer.writeLine();

    writer.writeLine(M + "SMT" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + " " + substructure.getLabel());

    writer.writeLine(M + "SCL" + MDLStringKit.padLeft(String.valueOf(substructure.getIndex() + 1), 4) + "  ");

    for (int i = 0; i < substructure.countCrossingBonds(); i++)
    {
      Bond crossingBond = substructure.getCrossingBond(i);