private static @NotNull <T> T getCachedValueOrRethrowIO(@NotNull LoadingCache<String, ? extends T> cache, @NotNull String key) throws IOException {
    try {
      return cache.get(key);
    }
    catch (ExecutionException|UncheckedExecutionException e) {
      final Throwable cause = e.getCause();
      throw (cause instanceof IOException ? (IOException)cause : new IOException("Unexpected non-IO error", cause));
    }
  }
private static @NotNull <T> T getCachedValueOrRethrowIO(@NotNull LoadingCache<String, ? extends T> cache, @NotNull String key)