def i_att_cardinality(ss: Substrate, ocard: Optional(cardinality), qore: Quads_or_Error) -> Sctids_or_Error:
    if qore.inran('qerror'):
        rval = Sctids_or_Error(error=qore.qerror)
    elif ocard.is_empty:
        rval = Sctids_or_Error(ok=i_required_cardinality(N(1), many, qore))
    else:
        card = ocard.head
        rval = Sctids_or_Error(ok=i_required_cardinality(card.min_, card.max_, qore) if card.min_ > 0 else
                               i_optional_cardinality(ss, card.max_, qore))
    return rval
def i_att_group_cardinality(ss: Substrate, ocard: Optional(cardinality), qore: Quads_or_Error) -> sctIdGroups_or_Error:
    if qore.inran('qerror'):
        return sctIdGroups_or_Error(error=qore.qerror)
    qv = quads_for(qore)
    rf = quad_direction(qore) == source_direction
    if ocard.is_empty:
        rval = qv.i_required_att_group_cardinality(N(1), many, rf)
    else:
        card = ocard.head
        if card.min_ > 0:
            rval = qv.i_required_att_group_cardinality(card.min_, card.max_, rf)
        else:
            rval = qv.i_optional_att_group_cardinality(ss, card.max_, rf)
    return sctIdGroups_or_Error(group_value=rval)