class TokenWithLanguages {
    private final String token;
    private final List<Language> langs;
    TokenWithLanguages(String token, Language... langs) {
      this.token = Objects.requireNonNull(token);
      this.langs = new ArrayList<>(Arrays.asList(Objects.requireNonNull(langs)));
    }
    TokenWithLanguages(String token, List<Language> langs) {
      this.token = Objects.requireNonNull(token);
      this.langs = Objects.requireNonNull(langs);
    }
    boolean ambiguous() {
      return langs.size() != 1;
    }
    @Override
    public String toString() {
      //return token + "/" + langs.stream().map(k -> k.getShortCodeWithCountryAndVariant()).collect(Collectors.joining("/"));
      if (isWord(token)) {
        return token + "/" + langs.stream().map(k -> k.getShortCodeWithCountryAndVariant()).collect(Collectors.joining("/"));
      } else {
        return token;
      }
    }
    String getToken() {
      return token;
    }
    @Override
    public boolean equals(Object o) {<FILL_FUNCTION_BODY>}
    @Override
    public int hashCode() {
      return Objects.hash(token, langs);
    }
  }

      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;
      TokenWithLanguages that = (TokenWithLanguages) o;
      return token.equals(that.token) && langs.equals(that.langs);
    
<no_super_class>