private void showMergePanel(final IDGroup idGroup, TaskMonitor monitor) {
		this.currentIDGroup = idGroup;
		this.currentMonitor = monitor;

		try {
			final ChangeListener changeListener = e -> {
				conflictOption = conflictPanel.getSelectedOptions();
				if (conflictOption == ASK_USER || conflictOption == CANCELED) {
					if (mergeManager != null) {
						mergeManager.setApplyEnabled(false);
					}
					return;
				}
				if (mergeManager != null) {
					mergeManager.clearStatusText();
				}
				merge(idGroup, conflictOption, currentMonitor);
				if (mergeManager != null) {
					mergeManager.setApplyEnabled(true);
				}
			};
			SwingUtilities.invokeAndWait(() -> conflictPanel =
				getConflictPanel(ExternalProgramMerger.this.currentIDGroup, changeListener));
		}
		catch (InterruptedException | InvocationTargetException e) {
			Msg.error(this,
				"Unexpected error showing merge panel for external program " + idGroup.getName(),
				e);
		}
		if (mergeManager != null) {
			mergeManager.setApplyEnabled(false);

			boolean useForAll = (externalProgramChoice != ASK_USER);
			conflictPanel.setUseForAll(useForAll);
			conflictPanel.setConflictType("External Program");

			mergeManager.showComponent(conflictPanel, "ExternalProgramMerge",
				new HelpLocation(HelpTopics.REPOSITORY, "ExternalConflict"));
		}
		// block until the user either cancels or hits the "Apply" button
		// on the merge dialog...
		// when the "Apply" button is hit, get the user's selection
		// and continue.
	}
Displays the external program name conflict panel to the user.
@param idGroup the symbol ID group for the external program (Library) being merged.
@param monitor task monitor to provide merge status to the user and allow canceling.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalProgramMerger.java