// Path: intellijad/src/java/net/stevechaloner/intellijad/decompilers/DecompilationContext.java
// public class DecompilationContext implements UserDataHolder
// {
//     /**
//      * The console context to use for reporting.
//      */
//     private final ConsoleContext consoleContext;
// 
//     /**
//      * The command to execute.
//      */
//     private final String command;
// 
//     /**
//      * The directory available for placing temporary files.
//      */
//     private final File targetDirectory;
// 
//     /**
//      * The project this decompiation is occurring in.
//      */
//     private final Project project;
// 
//     /**
//      * User data.
//      */
//     private final Map<Key, Object> userData = Maps.newConcurrentMap();
// 
//     private final DecompilationEngine engine;
// 
//     /**
//      * Initialises a new instance of this class.
//      *
//      * @param project the project
//      * @param consoleContext the reporting console context
//      */
//     public DecompilationContext(@NotNull Project project,
//                                 @NotNull ConsoleContext consoleContext,
//                                 @NotNull DecompilationEngine engine
//                                 )
//     {
//         this.project = Preconditions.checkNotNull(project);
//         this.consoleContext = Preconditions.checkNotNull(consoleContext);
//         this.engine = Preconditions.checkNotNull(engine);
//         command = Preconditions.checkNotNull(engine.prepareCommand(project));
//         this.targetDirectory = prepareTargetDir(project);
//         targetDirectory.mkdir();
//         targetDirectory.deleteOnExit();
// 
//     }
// 
//     private File prepareTargetDir(@NotNull Project project) {
//         Config config = PluginUtil.getConfig(project);
//         File tempDir;
//         if (config.isUseCustomTempDir()) {
//             tempDir = new File(config.getCustomTempDirPath());
//             if (!tempDir.exists()) {
//                 Preconditions.checkState(tempDir.mkdirs(), "Could not mkdirs: "+tempDir.getAbsolutePath());
//             }
//         } else {
//             tempDir = OsUtil.tempDir();
//         }
//         return new File(tempDir, "ij" + System.currentTimeMillis());
//     }
// 
//     // javadoc unnecessary
//     public ConsoleContext getConsoleContext()
//     {
//         return consoleContext;
//     }
// 
//     // javadoc unnecessary
//     public String getCommand()
//     {
//         return command;
//     }
// 
//     // javadoc unnecessary
//     public File getTargetDirectory()
//     {
//         return targetDirectory;
//     }
// 
//     // javadoc unnecessary
//     public Project getProject()
//     {
//         return project;
//     }
// 
//     public DecompilationEngine getEngine() {
//         return engine;
//     }
// 
//     // javadoc unnecessary
//     public Config getConfig()
//     {
//         return PluginUtil.getConfig(project);
//     }
// 
//     @Override
//     public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
//         userData.put(key, value);
//     }
// 
//     // javadoc unnecessary
//     public <T> T getUserData(@NotNull Key<T> key)
//     {
//         return (T)userData.get(key);
//     }
// 
//     // javadoc unnecessary
//     public <T> T removeUserData(@NotNull Key<T> key)
//     {
//         return (T)userData.remove(key);
//     }
// 
//     // javadoc unnecessary
//     public <T> boolean containsUserData(Key<T> key)
//     {
//         return userData.containsKey(key);
//     }
// }


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import com.intellij.openapi.diagnostic.Logger;
import net.stevechaloner.intellijad.console.ConsoleEntryType;
import net.stevechaloner.intellijad.decompilers.DecompilationContext;
import org.jetbrains.annotations.NotNull;
                if (pumped <= 0) {
                    Thread.sleep(5);
                }
            }
        } catch (InterruptedException e) {
            context.getConsoleContext().addMessage(ConsoleEntryType.DECOMPILATION_OPERATION,
                                                   "error",
                                                   e.getMessage());
        } catch (IOException e) {
            context.getConsoleContext().addMessage(ConsoleEntryType.DECOMPILATION_OPERATION,
                                                   "error",
                                                   e.getMessage());
        } finally {
            if (debug) {
                if (Thread.currentThread().isInterrupted()) {
                    LOG.info("["+name+"] interrupted");                    
                } else {
                    LOG.debug("["+name+"] finished");
                }
            }
        }
    }

    /**
     * Pumps chunk of the stream if content is available.
     *
     * @throws IOException if there is an error accessing one of the streams.
     */
    private int pump(byte[] buffer) throws IOException {
        
// Path: intellijad/src/java/net/stevechaloner/intellijad/decompilers/DecompilationContext.java
// public class DecompilationContext implements UserDataHolder
// {
//     /**
//      * The console context to use for reporting.
//      */
//     private final ConsoleContext consoleContext;
// 
//     /**
//      * The command to execute.
//      */
//     private final String command;
// 
//     /**
//      * The directory available for placing temporary files.
//      */
//     private final File targetDirectory;
// 
//     /**
//      * The project this decompiation is occurring in.
//      */
//     private final Project project;
// 
//     /**
//      * User data.
//      */
//     private final Map<Key, Object> userData = Maps.newConcurrentMap();
// 
//     private final DecompilationEngine engine;
// 
//     /**
//      * Initialises a new instance of this class.
//      *
//      * @param project the project
//      * @param consoleContext the reporting console context
//      */
//     public DecompilationContext(@NotNull Project project,
//                                 @NotNull ConsoleContext consoleContext,
//                                 @NotNull DecompilationEngine engine
//                                 )
//     {
//         this.project = Preconditions.checkNotNull(project);
//         this.consoleContext = Preconditions.checkNotNull(consoleContext);
//         this.engine = Preconditions.checkNotNull(engine);
//         command = Preconditions.checkNotNull(engine.prepareCommand(project));
//         this.targetDirectory = prepareTargetDir(project);
//         targetDirectory.mkdir();
//         targetDirectory.deleteOnExit();
// 
//     }
// 
//     private File prepareTargetDir(@NotNull Project project) {
//         Config config = PluginUtil.getConfig(project);
//         File tempDir;
//         if (config.isUseCustomTempDir()) {
//             tempDir = new File(config.getCustomTempDirPath());
//             if (!tempDir.exists()) {
//                 Preconditions.checkState(tempDir.mkdirs(), "Could not mkdirs: "+tempDir.getAbsolutePath());
//             }
//         } else {
//             tempDir = OsUtil.tempDir();
//         }
//         return new File(tempDir, "ij" + System.currentTimeMillis());
//     }
// 
//     // javadoc unnecessary
//     public ConsoleContext getConsoleContext()
//     {
//         return consoleContext;
//     }
// 
//     // javadoc unnecessary
//     public String getCommand()
//     {
//         return command;
//     }
// 
//     // javadoc unnecessary
//     public File getTargetDirectory()
//     {
//         return targetDirectory;
//     }
// 
//     // javadoc unnecessary
//     public Project getProject()
//     {
//         return project;
//     }
// 
//     public DecompilationEngine getEngine() {
//         return engine;
//     }
// 
//     // javadoc unnecessary
//     public Config getConfig()
//     {
//         return PluginUtil.getConfig(project);
//     }
// 
//     @Override
//     public <T> void putUserData(@NotNull Key<T> key, @Nullable T value) {
//         userData.put(key, value);
//     }
// 
//     // javadoc unnecessary
//     public <T> T getUserData(@NotNull Key<T> key)
//     {
//         return (T)userData.get(key);
//     }
// 
//     // javadoc unnecessary
//     public <T> T removeUserData(@NotNull Key<T> key)
//     {
//         return (T)userData.remove(key);
//     }
// 
//     // javadoc unnecessary
//     public <T> boolean containsUserData(Key<T> key)
//     {
//         return userData.containsKey(key);
//     }
// }


// Path: intellijad/src/java/net/stevechaloner/intellijad/util/StreamPumper.java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.atomic.AtomicBoolean;
import com.intellij.openapi.diagnostic.Logger;
import net.stevechaloner.intellijad.console.ConsoleEntryType;
import net.stevechaloner.intellijad.decompilers.DecompilationContext;
import org.jetbrains.annotations.NotNull;

                if (pumped <= 0) {
                    Thread.sleep(5);
                }
            }
        } catch (InterruptedException e) {
            context.getConsoleContext().addMessage(ConsoleEntryType.DECOMPILATION_OPERATION,
                                                   "error",
                                                   e.getMessage());
        } catch (IOException e) {
            context.getConsoleContext().addMessage(ConsoleEntryType.DECOMPILATION_OPERATION,
                                                   "error",
                                                   e.getMessage());
        } finally {
            if (debug) {
                if (Thread.currentThread().isInterrupted()) {
                    LOG.info("["+name+"] interrupted");                    
                } else {
                    LOG.debug("["+name+"] finished");
                }
            }
        }
    }

    /**
     * Pumps chunk of the stream if content is available.
     *
     * @throws IOException if there is an error accessing one of the streams.
     */
    private int pump(byte[] buffer) throws IOException {
        
        int bytesRead = in.read(buffer, 0, buffer.length);