docs: private Set<String> readAparCsvFromArchiveInstall(File installLocation, CommandConsole console) throws ZipException, IOException {
          // Archive means the CSV will be in a zip within the zip, will need to iterate the content of the install ZIP to find files that match the right pattern
          ZipFile installZipFile = new ZipFile(installLocation);
          Enumeration<? extends ZipEntry> zipEntries = installZipFile.entries();
          Pattern pattern = Pattern.compile(APAR_FIX_PACK_ZIP_LOCATION_IN_ARCHIVE + "/" + APAR_FIX_PACK_ZIP_FILENAME_PATTERN);
  
          /*
           * Read each file that matches the pattern, note we need to iterate through the archive install location because there might not be a ZIP Entry for the folder containing
           * the apar IDs
           */
          Set<String> aparIds = new HashSet<String>();
          List<IFixInfo> ifixes = new ArrayList<IFixInfo>();
          ProductInfo info = null;
          while (zipEntries.hasMoreElements()) {
              ZipEntry entry = zipEntries.nextElement();
              String entryName = entry.getName();
              if (pattern.matcher(entryName).matches()) {
                  // Have a matching zip file so find the CSV file within it
                  ZipInputStream aparZipFileInputStream = new ZipInputStream(installZipFile.getInputStream(entry));
                  ZipEntry aparCsvEntry = null;
                  do {
                      aparCsvEntry = aparZipFileInputStream.getNextEntry();
                  } while (aparCsvEntry != null && !APAR_CSV_ENTRY_NAME.equals(aparCsvEntry.getName()));
  
                  // Null is invalid, if the zip file exists then it should contain this file
                  if (aparCsvEntry == null) {
                      throw new IllegalArgumentException(getMessage("compare.no.csv.entry", installLocation.getAbsolutePath(), entryName,
                                                                    APAR_CSV_ENTRY_NAME));
                  }
                  String csv = readLine(aparZipFileInputStream);
                  aparIds.addAll(convertCsvToSet(csv));
              } else if (entryName.startsWith("wlp/lib/fixes/")) {
                  IFixInfo ifix = IFixUtils.parseIFix(installZipFile.getInputStream(entry), entryName, console);
                  if (ifix != null) {
                      ifixes.add(ifix);
                  }
              } else if (entryName.startsWith("wlp/lib/versions/") && entryName.endsWith(".properties")) {
                  try {
                      ProductInfo pi = ProductInfo.parseProductInfo(new InputStreamReader(installZipFile.getInputStream(entry), "UTF-8"), null);
                      if (pi != null && "com.ibm.websphere.appserver".equals(pi.getId())) {
                          info = pi;
                      }
                  } catch (ProductInfoParseException e) {
                      // ignore this and move on, it probably wasn't a product info file.
                  }
              }
          }
          installZipFile.close();
  
          Version v = null;
          if (info == null) {
              console.printErrorMessage(getMessage("compare.no.was.properties.found"));
          } else {
              try {
                  v = convertVersion(info);
              } catch (VersionParsingException e) {
                  console.printErrorMessage(e.getMessage());
              }
          }
  
          for (IFixInfo fix : ifixes) {
              try {
                  if (v == null || isIFixApplicable(v, fix)) {
                      Resolves resolves = fix.getResolves();
                      if (resolves != null) {
                          List<Problem> problems = resolves.getProblems();
                          if (problems != null) {
                              for (Problem problem : resolves.getProblems()) {
                                  aparIds.add(problem.getDisplayId());
                              }
                          } else {
                              console.printErrorMessage(getMessage("compare.no.apar", fix.getId()));
                          }
                      } else {
                          console.printErrorMessage(getMessage("compare.no.apar", fix.getId()));
                      }
                  }
              } catch (VersionParsingException e) {
                  console.printErrorMessage(e.getMessage());
              }
          }
  
          // Read the csv entry
          return aparIds;
      }