code: def allowed(self) -> Set[int]:
          
          items = set()  # type: Set[int]
          # Add extensions of a started-but-incomplete sequential constraint
          if self.last_met != -1 and self.is_sequence[self.last_met] == 1:
              word_id = self.constraints[self.last_met + 1]
              if word_id != self.eos_id or self.num_needed() == 1:
                  items.add(word_id)
  
          # Add all constraints that aren't non-initial sequences
          else:
              for i, word_id in enumerate(self.constraints):
                  if not self.met[i] and (i == 0 or not self.is_sequence[i - 1]):
                      if word_id != self.eos_id or self.num_needed() == 1:
                          items.add(word_id)
  
          return items
docs: Returns the set of constrained words that could follow this one.
          For unfinished phrasal constraints, it is the next word in the phrase.
          In other cases, it is the list of all unmet constraints.
          If all constraints are met, an empty set is returned.
  
          :return: The ID of the next required word, or -1 if any word can follow