class ModifyingEntryProcessor implements EntryProcessor<Object, Object, Boolean> {
        /** Value to expect. */
        private final Object val;

        /** Action to perform on entry. */
        private final IgniteInClosure<MutableEntry<Object, Object>> entryModifier;

        /** */
        public ModifyingEntryProcessor(Object val, IgniteInClosure<MutableEntry<Object, Object>> entryModifier) {
            assert val != null;

            this.val = val;
            this.entryModifier = entryModifier;
        }

        /** {@inheritDoc} */
        @Override public Boolean process(MutableEntry<Object, Object> entry, Object... arguments)
            throws EntryProcessorException {
            if (!entry.exists())
                return null; // Someone got ahead of us and removed this entry, let's skip it.

            Object entryVal = entry.getValue();

            if (entryVal == null)
                return null;

            // Something happened to the cache while we were performing map-reduce.
            if (!F.eq(entryVal, val))
                return false;

            entryModifier.apply(entry);

            return null; // To leave out only erroneous keys - nulls are skipped on results' processing.
        }
    }

    /** Dummy anonymous class to advance RMV anonymous value to 5. */
    private static final Runnable DUMMY_1 = new Runnable() {
        @Override public void run() {
            // No-op.
        }
    };

    /** Dummy anonymous class to advance RMV anonymous value to 5. */
    private static final Runnable DUMMY_2 = new Runnable() {
        @Override public void run() {
            // No-op.
        }
    };

    /** Dummy anonymous class to advance RMV anonymous value to 5. */
    private static final Runnable DUMMY_3 = new Runnable() {
        @Override public void run() {
            // No-op.
        }
    };

    /** Remove updater for compatibility with < 2.7.0. Must not be moved around to keep at anonymous position 4. */
    private static final IgniteInClosure<MutableEntry<Object, Object>> RMV_OLD =
        new IgniteInClosure<MutableEntry<Object, Object>>() {
            @Override public void apply(MutableEntry<Object, Object> e) {
                e.remove();
            }
        };

    /** Remove updater. Must not be moved around to keep at anonymous position 5. */
    private static final IgniteInClosure<MutableEntry<Object, Object>> RMV =
        new IgniteInClosure<MutableEntry<Object, Object>>() {
            @Override public void apply(MutableEntry<Object, Object> e) {
                e.remove();
            }
        };

    /**
     * Returns the remove closure based on the version of the primary node.
     *
     * @param node Primary node.
     * @param key Key.
     * @return Remove closure.
     */
    public static IgniteInClosure<MutableEntry<Object, Object>> getRemoveClosure(ClusterNode node, Object key) {<FILL_FUNCTION_BODY>

        assert node != null;
        assert key != null;

        IgniteInClosure<MutableEntry<Object, Object>> rmvC = RMV;

        if (node.version().compareTo(RMV_ANON_CLS_POS_CHANGED_SINCE) < 0)
            rmvC = RMV_OLD;

        return rmvC;
    
<no_super_class>