@Override
	protected void run() throws Exception {
		pathelement = new String[MASTER_DEPTH + 1];
		service = new FidService();
		File askFile = null;

		try {
			askFile = askFile("Duplicate Results File", "OK");
			outlog = new FileOutputStream(askFile);
		}
		catch (CancelledException ex) {
			// ignore, means we use console
		}
		if (askYesNo("Do Duplication Detection", "Do you want to detect duplicates")) {
			duplicatemap = new TreeMap<>();
		}

		List<FidFile> nonInstallationFidFiles = FidFileManager.getInstance().getUserAddedFiles();
		if (nonInstallationFidFiles.isEmpty()) {
			throw new FileNotFoundException("Could not find any fidb files that can be populated");
		}
		fidFile = askChoice("Choose destination FidDB",
			"Please choose the destination FidDB for population", nonInstallationFidFiles,
			nonInstallationFidFiles.get(0));

		rootFolder =
			askProjectFolder("Select root folder containing all libraries (at a depth of " +
				Integer.toString(MASTER_DEPTH) + "):");

		try {
			commonSymbolsFile = askFile("Common symbols file (optional):", "OK");
		}
		catch (CancelledException e) {
			commonSymbolsFile = null;	// Common symbols file may be null
		}
		String lang = askString("Enter LanguageID To Process", "Language ID: ");
		languageID = new LanguageID(lang);

		parseSymbols();
		reporter = new MyFidPopulateResultReporter();
		fidDb = fidFile.getFidDB(true);

		countLibraries(MASTER_DEPTH, rootFolder);
		monitor.initialize(totalLibraries);
		try {
			generate(MASTER_DEPTH, rootFolder);
			fidDb.saveDatabase("Saving", monitor);
		}
		finally {
			fidDb.close();
		}

		if (outlog != null) {
			outlog.close();
		}
	}
Recursively finds all domain objects that are program files under a domain folder.
@param programs the "return" value; found programs are placed in this collection
@param myFolder the domain folder to search
@throws CancelledException if the user cancels
Ghidra/Features/FunctionID/ghidra_scripts/CreateMultipleLibraries.java