{
              EStructuralFeature feature = eStructuralFeatures[--featureCursor];
              if (isIncluded(feature) && (!useIsSet() || eObject.eIsSet(feature)))
              {
                Object value = eObject.eGet(feature, resolve());
                isHandlingFeatureMap = FeatureMapUtil.isFeatureMap(feature);
                if (isHandlingFeatureMap || feature.isMany())
                {
                  if (resolve())
                  {
                    @SuppressWarnings("unchecked") List<E> newValueList = (List<E>)value;
                    valueList = newValueList;
                  }
                  else
                  {
                    @SuppressWarnings("unchecked") InternalEList<E> newValueList = (InternalEList<E>)value;
                    valueList = valueInternalEList = newValueList;
                  }
                  if (valueList instanceof RandomAccess)
                  {
                    valueListSize = valueList.size();
                    valueListIndex = valueListSize;
                  }
                  else
                  {
                    values = 
                      valueInternalEList == null ? 
                        valueList.listIterator(valueList.size()) : 
                        valueInternalEList.basicListIterator(valueList.size());
                  }
                  if (values == null ? scanPrevious() : scanPrevious(values))
                  {
                    Object result =
                      values == null ? 
                        valueInternalEList == null ? 
                          valueList.get(--valueListIndex) : 
                          valueInternalEList.basicGet(--valueListIndex) : 
                        values.previous();
                    if (isHandlingFeatureMap)
                    {
                      FeatureMap.Entry entry = (FeatureMap.Entry)result; 
                      preparedFeature = entry.getEStructuralFeature();
                      @SuppressWarnings("unchecked") E newPreparedResult = (E)entry.getValue();
                      preparedResult = newPreparedResult;
                    }
                    else
                    {
                      @SuppressWarnings("unchecked") E newPreparedResult = (E)result;
                      preparedResult = newPreparedResult;
                      preparedFeature = feature;
                    }
                    prepared = -3;
                    return true;
                  }
                }
                else if (value != null)
                {
                  valueList = null;
                  values = null;
                  @SuppressWarnings("unchecked") E newPreparedResult = (E)value;
                  preparedResult = newPreparedResult;
                  preparedFeature = feature;
                  prepared = -2;
                  return true;
                }
              }
            }