private ManifestParser parseManifestOverride(File pOverrideFile) 
  throws ExManifestBuilder {
    
    Logger.logDebug("Located manifest override file " + pOverrideFile.getName());
    
    //Parse the manifest override file
    ManifestParser lParser = new ManifestParser(pOverrideFile);
    try {
      lParser.parse();
    }
    catch(Throwable th){
      throw new ExManifestBuilder("Failed to parse manifest override file", th);
    }
    
    //Use a TreeMap to order the manifest entries with overriden positions
    TreeMap<Integer, ManifestEntry> lPositionOverrideMap = new TreeMap<Integer, ManifestEntry>();
    
    for(ManifestEntry lEntry : lParser.getManifestEntryList()){
      if(lEntry.isAugmentation()){
        //If this is an augmentation entry, add it to the augmentation entry map
        if(mManifestOverrideAugmentationMap.containsKey(lEntry.getFilePath())){
          throw new ExManifestBuilder("File " + lEntry.getFilePath() + " has more than one augmentation (~) entry - only 1 is allowed per file");
        }
        mManifestOverrideAugmentationMap.put(lEntry.getFilePath(), lEntry);
      }
      else {
        //Otherwise, this is a position override entry or forced duplicate entry - add it to the position override map
        lPositionOverrideMap.put(lEntry.getSequencePosition(), lEntry);
        //If this is not a forced duplicate, add it to the "globbed" set so it is no re-processed by config file entry rules
        if(!lEntry.isForcedDuplicate()){
          mGlobbedFilePathSet.add(lEntry.getFilePath());
        }
      }
    }
    
    //Add map values to list in correct order
    mManifestEntryPostionOverrideList.addAll(lPositionOverrideMap.values());
    
    return lParser;
  }