code: def infer_declared_from_conditions(conds, namespace=None):
      ''' like infer_declared except that it is passed a set of first party
      caveat conditions as a list of string rather than a set of macaroons.
      '''
      conflicts = []
      if namespace is None:
          namespace = Namespace()
      prefix = namespace.resolve(STD_NAMESPACE)
      if prefix is None:
          prefix = ''
      declared_cond = prefix + COND_DECLARED
      info = {}
      for cond in conds:
          try:
              name, rest = parse_caveat(cond)
          except ValueError:
              name, rest = '', ''
          if name != declared_cond:
              continue
          parts = rest.split(' ', 1)
          if len(parts) != 2:
              continue
          key, val = parts[0], parts[1]
          old_val = info.get(key)
          if old_val is not None and old_val != val:
              conflicts.append(key)
              continue
          info[key] = val
      for key in set(conflicts):
          del info[key]
      return info