/* #9757, #10869, #18266 */
*["telecom:medium" =~ /.+;(.+)?/],
*["addr:street" =~ /.+;(.+)?/],
*[highway =~ /.+;(.+)?/],
*[lanes =~ /.+;(.+)?/],
*[maxspeed =~ /.+;(.+)?/],
*[name =~ /.+;(.+)?/],
*[surface =~ /.+;(.+)?/],
*[water =~ /.+;(.+)?/] {
  throwWarning: tr("{0} with multiple values", "{0.key}");
}

/* #19419 */
node[/^(amenity|barrier|building(:part)?|entrance|(high|rail|water)way|leisure)$/][access *=";"],
way[/^(amenity|building(:part)?|(high|rail|water)way|water|leisure)$/][access *=";"],
relation[type =~ /^(boundary|multipolygon)$/][access *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/]["4wd_only" *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][agricultural *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][bdouble *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][bicycle *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][bus *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][carriage *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][disabled *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][dog *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][emergency *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][foot *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][golf_cart *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][goods *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][hazmat *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][hgv *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][horse *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][hov *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][mofa *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][moped *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][motor_vehicle *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][motorcar *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][motorcycle *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][psv *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][snowmobile *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][ski *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][taxi *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][tourist_bus *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][vehicle *=";"],
*[/^(amenity|building(:part)?|entrance|highway|leisure)$/][wheelchair *=";"],
*[railway][train *=";"],
*[railway][tram *=";"],
*[railway][subway *=";"],
*[/^(leisure|water(way)?)$/][boat *=";"],
*[/^(leisure|water(way)?)$/][canoe *=";"],
*[/^(leisure|water(way)?)$/][cargo *=";"],
*[/^(leisure|water(way)?)$/][motorboat *=";"],
*[/^(leisure|water(way)?)$/][passenger *=";"],
*[/^(leisure|water(way)?)$/][ship *=";"],
*[/^(leisure|water(way)?)$/][swimming *=";"] {
  throwWarning: tr("{0} with multiple values", "{1.key}");
  group: tr("Multiple values in access tag");
  suggestAlternative: tr("only one value and additional {0}", "{1.key}:conditional");
  assertMatch:   "node barrier=block access=agricultural;forestry";
  assertNoMatch: "node barrier=block access=agricultural";
  assertMatch:   "way highway=trunk access=agricultural;forestry";
  assertNoMatch: "way highway=trunk access=agricultural";
  assertMatch:   "relation type=multipolygon water=lake access=boat;canoe";
  assertNoMatch: "relation type=multipolygon water=lake access=boat";
}

*[source              =~ /^(;.*|.*;;.*|.*;)$/],
*["source:addr"       =~ /^(;.*|.*;;.*|.*;)$/],
*["source:maxspeed"   =~ /^(;.*|.*;;.*|.*;)$/],
*["source:name"       =~ /^(;.*|.*;;.*|.*;)$/],
*["source:position"   =~ /^(;.*|.*;;.*|.*;)$/],
*["source:postcode"   =~ /^(;.*|.*;;.*|.*;)$/],
*[ref                 =~ /^(;.*|.*;;.*|.*;)$/],
*[int_ref             =~ /^(;.*|.*;;.*|.*;)$/],
*[old_ref             =~ /^(;.*|.*;;.*|.*;)$/],
*[source_ref          =~ /^(;.*|.*;;.*|.*;)$/],
*[route_ref           =~ /^(;.*|.*;;.*|.*;)$/],
*[attribution         =~ /^(;.*|.*;;.*|.*;)$/],
*[name                =~ /^(;.*|.*;;.*|.*;)$/],
*[alt_name            =~ /^(;.*|.*;;.*|.*;)$/],
*[note                =~ /^(;.*|.*;;.*|.*;)$/],
*[fixme               =~ /^(;.*|.*;;.*|.*;)$/],
*["addr:housenumber"  =~ /^(;.*|.*;;.*|.*;)$/],
*[destination         =~ /^(;.*|.*;;.*|.*;)$/],
*[exit_to             =~ /^(;.*|.*;;.*|.*;)$/],
*[surface             =~ /^(;.*|.*;;.*|.*;)$/],
*["building:use"      =~ /^(;.*|.*;;.*|.*;)$/],
*[traffic_sign        =~ /^(;.*|.*;;.*|.*;)$/],
*[voltage             =~ /^(;.*|.*;;.*|.*;)$/],
*[sport               =~ /^(;.*|.*;;.*|.*;)$/],
*[cuisine             =~ /^(;.*|.*;;.*|.*;)$/] {
  throwWarning: tr("empty value in semicolon-separated ''{0}''", "{0.key}");
  assertMatch: "node ref=;A1";
  assertMatch: "node ref=A1;";
  assertMatch: "node ref=;";
  assertMatch: "node ref=A1;;A2";
  assertNoMatch: "node ref=A1";
  assertNoMatch: "node ref=A1;A2";
}
