'Provides'

def process_data(self, iterator, start_val=0, max_vals=None, **kwargs):

    filter_cols = loads(kwargs.get('filter_cols', '[]'))
    no_detail = ('no_detail' in kwargs)
    rval = []
    message = None
    def col_fn(col):
        return (None if (col is None) else (col - 1))
    start_col = (self.original_dataset.metadata.startCol - 1)
    end_col = (self.original_dataset.metadata.endCol - 1)
    strand_col = col_fn(self.original_dataset.metadata.strandCol)
    name_col = col_fn(self.original_dataset.metadata.nameCol)
    for (count, line) in enumerate(iterator):
        if (count < start_val):
            continue
        if (max_vals and ((count - start_val) >= max_vals)):
            message = (self.error_max_vals % (max_vals, 'features'))
            break
        feature = line.split()
        length = len(feature)
        payload = [hash(line), int(feature[start_col]), int(feature[end_col])]
        if no_detail:
            rval.append(payload)
            continue
        if name_col:
            payload.append(feature[name_col])
        if strand_col:
            if (not name_col):
                payload.append('')
            payload.append(feature[strand_col])
        if ((length >= 5) and filter_cols and (filter_cols[0] == 'Score')):
            try:
                payload.append(float(feature[4]))
            except:
                payload.append(feature[4])
        rval.append(payload)
    return {'data': rval, 'message': message}
