docs: private static boolean simpleWildcardMatch(final String pattern, final String candidate) {
          if (candidate == null && pattern == null) {
              return true;
          }
          if (candidate == null || pattern == null) {
              return false;
          }
  
          final String[] wcs = splitOnTokens(pattern);
          boolean anyChars = false;
          int textIdx = 0;
          int wcsIdx = 0;
          final Stack<int[]> backtrack = new Stack<>();
  
          // loop around a backtrack stack, to handle complex * matching
          do {
              if (backtrack.size() > 0) {
                  final int[] array = backtrack.pop();
                  wcsIdx = array[0];
                  textIdx = array[1];
                  anyChars = true;
              }
  
              // loop whilst tokens and text left to process
              while (wcsIdx < wcs.length) {
  
                  if (wcs[wcsIdx].equals("?")) {
                      // ? so move to next text char
                      textIdx++;
                      if (textIdx > candidate.length()) {
                          break;
                      }
                      anyChars = false;
  
                  } else if (wcs[wcsIdx].equals("*")) {
                      // set any chars status
                      anyChars = true;
                      if (wcsIdx == wcs.length - 1) {
                          textIdx = candidate.length();
                      }
  
                  } else {
                      // matching text token
                      if (anyChars) {
                          // any chars then try to locate text token
                          textIdx = checkIndexOf(candidate, textIdx, wcs[wcsIdx]);
                          if (textIdx == NOT_FOUND) {
                              // token not found
                              break;
                          }
                          final int repeat = checkIndexOf(candidate, textIdx + 1, wcs[wcsIdx]);
                          if (repeat >= 0) {
                              backtrack.push(new int[] {wcsIdx, repeat});
                          }
                      } else {
                          // matching from current position
                          if (!checkRegionMatches(candidate, textIdx, wcs[wcsIdx])) {
                              // couldnt match token
                              break;
                          }
                      }
  
                      // matched text token, move text index to end of matched token
                      textIdx += wcs[wcsIdx].length();
                      anyChars = false;
                  }
  
                  wcsIdx++;
              }
  
              // full match
              if (wcsIdx == wcs.length && textIdx == candidate.length()) {
                  return true;
              }
  
          } while (backtrack.size() > 0);
  
          return false;
      }