// 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/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);
// }


import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.metamolecular.mx.query.*;
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Molecule;
import java.util.ArrayList;
  {
    DefaultState state = new DefaultState(query, target);

    maps.clear();

    return mapFirst(state);
  }

  public List<Map<Node, Atom>> getMaps(Molecule target)
  {
    DefaultState state = new DefaultState(query, target);

    maps.clear();

    mapAll(state);

    return new ArrayList<Map<Node, Atom>>(maps);
  }

  public Map<Node, Atom> getFirstMap(Molecule target)
  {
    DefaultState state = new DefaultState(query, target);

    maps.clear();

    mapFirst(state);

    return maps.isEmpty() ? new HashMap<Node, Atom>() : maps.get(0);
  }

// 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/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/map/DefaultMapper.java
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.metamolecular.mx.query.*;
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Molecule;
import java.util.ArrayList;

  {
    DefaultState state = new DefaultState(query, target);

    maps.clear();

    return mapFirst(state);
  }

  public List<Map<Node, Atom>> getMaps(Molecule target)
  {
    DefaultState state = new DefaultState(query, target);

    maps.clear();

    mapAll(state);

    return new ArrayList<Map<Node, Atom>>(maps);
  }

  public Map<Node, Atom> getFirstMap(Molecule target)
  {
    DefaultState state = new DefaultState(query, target);

    maps.clear();

    mapFirst(state);

    return maps.isEmpty() ? new HashMap<Node, Atom>() : maps.get(0);
  }

  public int countMaps(Molecule target)