code: protected void unfoldModules(JSONObject modules, Map<Integer, String> sparseArray) throws IOException, JSONException {
  		final String sourceMethod = "unfoldModules"; //$NON-NLS-1$
  		if (isTraceLogging) {
  			log.entering(RequestedModuleNames.class.getName(), sourceMethod, new Object[]{modules, sparseArray});
  		}
  		Iterator<?> it = modules.keys();
  		String[] prefixes = null;
  		if (modules.containsKey(PLUGIN_PREFIXES_PROP_NAME)) {
  			@SuppressWarnings("unchecked")
  			Map<String, String> oPrefixes = (Map<String, String>) modules.get(PLUGIN_PREFIXES_PROP_NAME);
  			prefixes = new String[oPrefixes.size()];
  			for (String key : oPrefixes.keySet()) {
  				prefixes[Integer.parseInt(oPrefixes.get(key))] = key;
  			}
  		}
  		while (it.hasNext()) {
  			String key = (String) it.next();
  			if (!NON_PATH_PROP_PATTERN.matcher(key).find()) {
  				unfoldModulesHelper(modules.get(key), key, prefixes, sparseArray);
  			}
  		}
  		if (isTraceLogging) {
  			log.exiting(RequestedModuleNames.class.getName(), sourceMethod, sparseArray);
  		}
  	}
docs: Unfolds a folded module name list into a String array of unfolded names
  <p>
  The returned list must be sorted the same way it was requested ordering
  modules in the same way as in the companion js extension to amd loader
  order provided in the folded module leaf
  
  @param modules
  The folded module name list
  @param sparseArray
  The result array.  Note that there may be holes in the result
  array when this method is done because some of the modules may
  have been specified using a different mechanism.
  @throws IOException
  @throws JSONException