docs: public List<LibertyFeature> getRequiredFeatures(LibertyFeature feature, Map<String, LibertyFeature> allFeatures)
  			throws MavenRepoGeneratorException {
  		List<LibertyFeature> dependencies = new ArrayList<LibertyFeature>();
  		Map<String, Collection<String>> requiredFeaturesWithTolerates = feature.getRequiredFeaturesWithTolerates();
  		if (requiredFeaturesWithTolerates != null) {
  			for (String requireFeature : requiredFeaturesWithTolerates.keySet()) {
  				Collection<String> toleratesVersions = null;
  				if (allFeatures.containsKey(requireFeature)) {
  					dependencies.add(allFeatures.get(requireFeature));
  				} else if ((toleratesVersions = requiredFeaturesWithTolerates.get(requireFeature)) != null) {
  					log("For feature " + feature.getSymbolicName() + ", cannot find direct dependency to required feature " + requireFeature + " so it must use tolerates list: " + toleratesVersions, LogLevel.WARN.getLevel());
  					boolean tolerateFeatureFound = false;
  					for (String version : toleratesVersions) {
  						String tolerateFeatureAndVersion = requireFeature.substring(0, requireFeature.lastIndexOf("-")) + "-" + version;
  						if (allFeatures.containsKey(tolerateFeatureAndVersion)) {
  							dependencies.add(allFeatures.get(tolerateFeatureAndVersion));
  							log("For feature " + feature.getSymbolicName() + ", found tolerated dependency " + tolerateFeatureAndVersion, LogLevel.DEBUG.getLevel());
  							tolerateFeatureFound = true;
  							break;
  						}
  					}
  					if (!tolerateFeatureFound) {
  						throw new MavenRepoGeneratorException(
  								"For feature " + feature.getSymbolicName() + ", cannot find required feature " + requireFeature + " or any of its tolerated versions: " + toleratesVersions);
  					}
  				} else {
  					throw new MavenRepoGeneratorException(
  							"For feature " + feature.getSymbolicName() + ", cannot find required feature " + requireFeature);
  				}
  			}
  		}
  		return dependencies;
  	}