public final void run() throws RuntimeException {
        DeciphererInput input = this.getDeciphererInput();
        WavingContext ctx = this.getWavingContext();
        while (!queue.isEmpty()) {
            PendingEntryPoint entryPoint = queue.removeFirst();
            currentOffset = entryPoint.offset;
            sequencer.init(entryPoint.sequencerFrames);
            DECIPHERING_LOOP : do {
                if (haveProcessed(currentOffset, sequencer.getCurrentLang())) {
                    break DECIPHERING_LOOP;
                }
                try {
                    try {
                        int instructionSize = sequencer.getCurrentLang().decipher(input, ctx);
                        if (instructionSize < 1) {
                            instructionSize = 1;
                        }
                        addInstructionEntry(currentOffset, sequencer.getCurrentLang());
                        for (int i = 0; i < instructionSize; i++) {
                            undeciphered[currentOffset + i] = false;
                        }
                        currentOffset += instructionSize;
                        sequencer.advance();
                    } catch (ClassicLang.UnknownOpcode e) {
                        // FIXME: we should indicate to the user what the opcode
                        // is, and this should work in a reasonable way no
                        // matter its suboffset
                        this.recordProblem("unknown " + e.lang.name + " opcode");
                        break DECIPHERING_LOOP;
                    }
                } catch (IncompleteInstruction e) {
                    recordProblem("abrupt end of " + sequencer.getCurrentLang().name + " code");
                    break DECIPHERING_LOOP;
                }
            } while (sequencer.sequencerHasMore());
        }
    }