private void swapNodesGroup( GroupNode<K, V> group, Node<K, V> a, Node<K, V> b ) {

        if( a.mGroupParent == b ) {
            swapNodesGroup( group, b, a );
            return;
        }

        {
            boolean tempColor = a.mGroupColor;
            a.mGroupColor = b.mGroupColor;
            b.mGroupColor = tempColor;
        }

        Node<K, V> tempNode;

        if( a.mGroupLeft == b ) {

            a.mGroupLeft = b.mGroupLeft;
            b.mGroupLeft = a;
            if( a.mGroupLeft != null ) { a.mGroupLeft.mGroupParent = a; }

            tempNode = a.mGroupRight;
            a.mGroupRight = b.mGroupRight;
            b.mGroupRight = tempNode;
            if( a.mGroupRight != null ) { a.mGroupRight.mGroupParent = a; }
            if( b.mGroupRight != null ) { b.mGroupRight.mGroupParent = b; }

            b.mGroupParent = a.mGroupParent;
            a.mGroupParent = b;

            if( b.mGroupParent == null ) {
                group.mRoot = b;
            } else if( b.mGroupParent.mGroupLeft == a ) {
                b.mGroupParent.mGroupLeft = b;
            } else {
                b.mGroupParent.mGroupRight = b;
            }

        } else if( a.mGroupRight == b ) {
            a.mGroupRight = b.mGroupRight;
            b.mGroupRight = a;
            if( a.mGroupRight != null ) { a.mGroupRight.mGroupParent = a; }

            tempNode = a.mGroupLeft;
            a.mGroupLeft = b.mGroupLeft;
            b.mGroupLeft = tempNode;
            if( a.mGroupLeft != null ) { a.mGroupLeft.mGroupParent = a; }
            if( b.mGroupLeft != null ) { b.mGroupLeft.mGroupParent = b; }

            b.mGroupParent = a.mGroupParent;
            a.mGroupParent = b;

            if( b.mGroupParent == null ) {
                group.mRoot = b;
            } else if( b.mGroupParent.mGroupLeft == a ) {
                b.mGroupParent.mGroupLeft = b;
            } else {
                b.mGroupParent.mGroupRight = b;
            }

        } else {
            tempNode = a.mGroupLeft;
            a.mGroupLeft = b.mGroupLeft;
            b.mGroupLeft = tempNode;
            if( a.mGroupLeft != null ) { a.mGroupLeft.mGroupParent = a; }
            if( b.mGroupLeft != null ) { b.mGroupLeft.mGroupParent = b; }

            tempNode = a.mGroupRight;
            a.mGroupRight = b.mGroupRight;
            b.mGroupRight = tempNode;
            if( a.mGroupRight != null ) { a.mGroupRight.mGroupParent = a; }
            if( b.mGroupRight != null ) { b.mGroupRight.mGroupParent = b; }

            tempNode = a.mGroupParent;
            a.mGroupParent = b.mGroupParent;
            b.mGroupParent = tempNode;

            if( a.mGroupParent == null ) {
                group.mRoot = a;
            } else if( a.mGroupParent.mGroupLeft == b ) {
                a.mGroupParent.mGroupLeft = a;
            } else {
                a.mGroupParent.mGroupRight = a;
            }

            if( b.mGroupParent == null ) {
                group.mRoot = b;
            } else if( b.mGroupParent.mGroupLeft == a ) {
                b.mGroupParent.mGroupLeft = b;
            } else {
                b.mGroupParent.mGroupRight = b;
            }
        }
    }