Changes between Initial Version and Version 1 of Styles/Enhanced_Lane_and_Road_Attributes


Ignore:
Timestamp:
2016-09-20T10:51:29+02:00 (9 years ago)
Author:
baditaflorin
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Styles/Enhanced_Lane_and_Road_Attributes

    v1 v1  
     1.
     2[[TranslatedPages]]
     3[[PageOutline(2-10)]]
     4= [[Image(icon.svg,36,middle,inline)]] Enhanced Lanes and Road Attributes mappaint style
     5
     6'''The differences between this and the normal style are :
     7* '''Ability to show the end segments as a square.'''
     8* '''All roads that are higher then unclassified will be showed with read, so you can easily find and fix them.'''
     9* '''Ability to see your edits with green''''''
     10
     11This style visualizes a number of lane and road specific attributes. Namely common variants of the following tags are considered:
     12* [[osmwiki:Key:lanes|lanes]]: Number of lanes for motorized traffic.
     13* [[osmwiki:Key:width|width]]: The width of the carriageway. Lane-dependent width using width:lanes is fully supported.
     14* [[osmwiki:Key:change|change]]: Allowed resp. forbidden lane changes.
     15* [[osmwiki:Key:turn|turn]]: Indication of turning lanes, including preliminary support for values hook_right and hook_left (this might change!)
     16* [[osmwiki:Key:cycleway|cycleway]]: Only cycle tracks are supported if specified with cycleway. Cycle lanes need bicycle:lanes=...|designated|... to be visible.
     17* [[osmwiki:Key:bicycle|bicycle:lanes]]: Dedicated bicycle lanes.
     18* [[osmwiki:Key:bus|bus:lanes]]: Dedicated bus lanes.
     19* [[osmwiki:Key:lanes:psv|psv:lanes]]: Dedicated PSV (public service vehicle) lanes.
     20* [[osmwiki:Key:placement|placement]]: Placement of the road relative to the OSM-way. The value transition is not supported.
     21* [[osmwiki:Tag:man_made=bridge|man_made=bridge]]: Used to indicate the outline of a bridge and group together all features of that bridge.
     22* [[osmwiki:Key:lit|lit]]: Indication if a road is lit or not.
     23* [[osmwiki:Tag:highway=street_lamp|highway=street_lamp]]: Street lamp
     24* [[osmwiki:Key:destination|destination]]: Signposted destination of a road. Only rudimentary support without lane-dependent values. The subkeys [[osmwiki:Key:destination:ref|destination:ref]] and [[osmwiki:Key:destination:country|destination:country]] are also supported.
     25* [[osmwiki:Proposed_features/highway=junction|highway=junction]]: Can be used to indicate the outline of a junction and group together all features of it.
     26* [[osmwiki:Relation:enforcement|Relation enforcement]]: The to and from members of such relations are highlighted
     27* [[osmwiki:Key:traffic_sign|traffic_sign]]: Traffic signs for speed limits and overtaking are displayed if tagged with traffic_sign=maxspeed/overtaking and maxspeed=<limit> resp. overtaking=yes/no. The value implicit for maxspeed is interpreted as the end of the speed limit. Combinations like traffic_sign=maxspeed;overtaking are also supported.
     28* [[osmwiki:Key:hov|hov:lanes]]: Dedicated HOV lanes. The minimum requirement can be specified by hov:minimum (supported values: 2 and 3)
     29* [[osmwiki:Relation:destination_sign|Relation destination_sign]]: Experimental and very limited support!
     30* [[osmwiki:Key:driving_side|driving_side]]: Used to specify the driving side of the traffic. This is only supported on ways.
     31* [[osmwiki:Key:railway|railway]]: Tracks of railways are rendered with limited support for gauge, embedded and electrified.
     32* [[osmwiki:Key:transit|transit]]: Specify how a lane continues in the next road segment. Only verification of valid values!
     33
     34Furthermore:
     35* Common suffixes like :forward, :backward, :left, :right: and :both as well as the proposed :both_ways (for lanes in both directions) are supported where appropriate.
     36* Some common tagging errors are detected and displayed, e.g. inconsistent number of lane-dependent values and typos in the keys turn and change.
     37* The style also supports '''left-hand traffic'''; see section Settings.
     38
     39Use the [[Help/Dialog/MapPaint|Map Style Dialog]] to download and activate the style. A good starting point to see it in action is the [osmwww:#map=14/47.0705/15.4353 area around Graz in Austria].
     40
     41To '''report bugs or provide feedback''' send [[osmwiki:User:Imagic|me a message]].
     42
     43== Settings
     44Some settings of the style can be configured using Edit -> Preferences -> Display settings -> Colours. All settings start with mappaint.lane.and.road.attributes. Settings that contain the text "boolean" treat white as yes and any other color as no. Settings that contain the text "opacity" use the lightness to specify the opacity (the values for transparency or alpha are completely ignored!)
     45* The settings '''carriage.way.backward''', '''carriage.way.forward''' and '''carriage.way.both_ways''' specify the colour of the respective lanes.
     46* The settings '''sidewalk''', '''cycletrack''' and '''combined.sidewalk.and.cycletrack''' specify the colour of the sidewalk, a cycletrack and a combined sidewalk and cycletrack
     47* If '''boolean.right.hand.traffic''' is set to white, lanes are rendered for right hand traffic, if set to black for left hand traffic and if set to anything else (which is now the default) the right- and left-hand traffic database from JOSM is used to automatically determine the side.
     48* If '''boolean.use.svg.for.turning.markings''' is set to white, the markings for turning lanes are rendered more precisely. '''If you run into memory problems, set this to black.''' If this is set to black, the setting '''integer.png.turn.variant''' can be used to specify which set of png images should be used for turn markings. Currently two sets are supplied (value 000000 and 000001).
     49* The settings '''opacity.lane''', '''opacity.markings''' and '''opacity.sidewalk''' specify the opacity of the lane background, road markings and the sidewalk background. If set to white they are opaque; if set to black they are completely transparent, any grey setting in between is treated an appropriate opacity.
     50
     51== Known limitations/bugs
     52* [[ticket:8429|A bug in JOSM]] leads sometimes to rendering artefacts.
     53* Left-hand traffic is nearly untested. Please provide feedback.
     54* Roads with oneway=-1 may lead to incorrect results. Please provide feedback.
     55* change:lanes without suffix is currently only supported on one-ways and for the special case of change:lanes=no|no.
     56* In forward and backward direction a maximum of eight lanes and for lanes in both directions a maximum of four lanes is displayed.
     57
     58== Acknowledgments
     59* To Wolfgang Hinsch who created a first style which visualizes many lane-specific features. Before I saw his style I wouldn't believe that this is possible.
     60* To Paul Hartmann who implemented some desperately needed extensions for JOSM which made the implementation of this style a lot easier and improved performance significantly.
     61* To all who provided valuable feedback during the creation of this style.
     62
     63== Preset
     64An appropriate preset for lane attributes is available at [wiki:Presets/LaneAttributes Lane Attributes].
     65
     66== Screenshot
     67[[Image(Screenshot_Style_Lane_and_Road_Attributes.jpeg)]]
     68[[Image(http://img.ctrlv.in/img/16/09/20/57e0f664d73c8.png)]]
     69[[Image(http://img.ctrlv.in/img/16/09/20/57e0f54bb5151.jpg)]]
     70
     71== Code
     72
     73{{{
     74#!style type="mapcss"
     75
     76 
     77meta
     78{
     79    title: "Enhanced Lane and road attributes";
     80    description: "Visualization of lanes, width, turn lanes, changing the lane, destination, lighting and street lamps, sidewalk, cycletracks, bicycle lanes, bus lanes, psv lanes.
     81        Added modification by Florin Badita :
     82        - You can see the end of each road segment as a square.
     83        - If you modify the lines from ~70 until ~80 and you add your own name, you will be able to see with green your modifications, so that you can inspect the other ways that already have lanes attributes, but were not made by you.
     84        - We only show lanes to road categoryes highwer then unclassified, residential.";
     85    original_link: "http://josm.openstreetmap.de/wiki/Styles/Lane_and_Road_Attributes";
     86    link: "http://josm.openstreetmap.de/wiki/Styles/Enhanced_Lane_and_Road_Attributes";
     87    author: "Martin Vonwald,Florin Badita";
     88    version: "2.10-61_2015-06-02";
     89    license: "CC-BY-SA";
     90    icon: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNyAxOCI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTM4NSAtNTI0LjM2KSI+PHBhdGggZmlsbD0iIzIwMmQyMCIgZD0ibSAzODUgNTI0LjM2IGggMTcgdiAxOCBoIC0xNyB6Ii8+PGcgZmlsbD0ibm9uZSI+PGcgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLXdpZHRoPSIxLjgiPjxwYXRoIGQ9Im0gMzg3LjUgNTI1LjI2IHYgMTYuMiIgc3Ryb2tlPSIjZTRlN2U0Ii8+PHBhdGggZD0ibSAzOTkuNSA1MjUuMjYgdiAxNi4yIiBzdHJva2U9IiNlNWU3ZTUiLz48L2c+PHBhdGggZD0ibSAzOTMuNSA1MjYuMzYgdiA0IiBzdHJva2U9IiNlNWU3ZTUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjciLz48L2c+PHBhdGggZD0ibSAzOTMuNSA1MzUuMzYgdiA0IiBmaWxsPSIjZTRlN2U0IiBzdHJva2U9IiNlNWU3ZTUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjciLz48L2c+PC9zdmc+";
     91    min-josm-version: "7287";
     92}
     93
     94meta[lang=de]
     95{
     96    title: "Fahrspur- und Straßenattribute";
     97    description: "Anzeige von Fahrspuren, Breite, Abbiegespuren, Spurwechsel, Zielangaben, Beleuchtung inkl. Straßenlampen, Gehsteig/Bürgersteig, Radwege, Fahrradspuren, Busspuren, Öffi-Spuren.";
     98    link: "http://josm.openstreetmap.de/wiki/De:Styles/Lane_and_Road_Attributes";
     99}
     100
     101
     102
     103/***************************************************************************************************************************************************/
     104/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     105/* Global settings and initialization                                                                                                              */
     106/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     107/***************************************************************************************************************************************************/
     108
     109/*TODO - Hide other types of highways/*
     110/* highlight boundary */
     111way[highway=residential][!lanes],
     112way[highway=unclassified][!lanes],
     113way[highway=tertiary][!lanes],
     114way[highway=tertiary_link][!lanes],
     115way[highway=secondary][!lanes],
     116way[highway=secondary_link][!lanes],
     117way[highway=primary][!lanes],
     118way[highway=primary_link][!lanes],
     119way[highway=trunk][!lanes],
     120way[highway=trunk_link][!lanes],
     121way[highway=motorway][!lanes],
     122way[highway=motorway_link][!lanes]          {
     123    z-index: -1;
     124    color: red;
     125    width: 3;
     126    opacity: 0.6;
     127    dashes: 12,12;
     128}
     129
     130way[highway=residential][lanes],
     131way[highway=unclassified][lanes],
     132way[highway=tertiary][lanes],
     133way[highway=tertiary_link][lanes],
     134way[highway=secondary][lanes],
     135way[highway=secondary_link][lanes],
     136way[highway=primary][lanes],
     137way[highway=primary_link][lanes],
     138way[highway=trunk][!lanes],
     139way[highway=trunk_link][lanes],
     140way[highway=motorway][lanes],
     141way[highway=motorway_link][lanes]          {
     142    z-index: -1;
     143    color: white;
     144    width: 2;
     145    opacity: 0.4;
     146
     147}
     148
     149
     150way[highway=residential][lanes][JOSM_search("user:hoream_telenav")]::my_edits,
     151way[highway=unclassified][lanes][!JOSM_search("user:hoream_telenav")],
     152way[highway=tertiary][lanes][!JOSM_search("user:hoream_telenav")],
     153way[highway=tertiary_link][lanes][!JOSM_search("user:hoream_telenav")],
     154way[highway=secondary][lanes][!JOSM_search("user:hoream_telenav")],
     155way[highway=secondary_link][lanes][!JOSM_search("user:hoream_telenav")],
     156way[highway=primary][lanes][!JOSM_search("user:hoream_telenav")],
     157way[highway=primary_link][lanes][!JOSM_search("user:hoream_telenav")],
     158way[highway=trunk][!lanes][!JOSM_search("user:hoream_telenav")],
     159way[highway=trunk_link][lanes][!JOSM_search("user:hoream_telenav")],
     160way[highway=motorway][lanes][!JOSM_search("user:hoream_telenav")],
     161way[highway=motorway_link][lanes][!JOSM_search("user:hoream_telenav")]          {
     162    z-index: -1;
     163    color: green;
     164    width: 12;
     165    opacity: 0.4;
     166
     167}
     168
     169
     170/* zoom out */
     171 node:connection|z-13{
     172    symbol-shape: square;
     173    symbol-size: 20;
     174    symbol-stroke-color: red;
     175    symbol-stroke-size: 20;
     176    z-index: 10;
     177}
     178
     179*/
     180
     181/* The last node of the way is square and grey,
     182so we can quickly select the end of a way and Unglue Ways in JOSM using the Keyboard letter "G" */
     183
     184way[highway] >[index=-1] node|z18-21 {  /* matches the last node of a way  */
     185   symbol-fill-color: grey;
     186    symbol-shape: square;
     187    symbol-stroke-color: white;
     188   symbol-size: 15;
     189 
     190}
     191
     192/* The last node of the way is square and grey,
     193so we can quickly select the end of a way and Unglue Ways in JOSM using the Keyboard letter "G" */
     194
     195way[highway] >[index=-1] node|z15-19 {  /* matches the last node of a way  */
     196   symbol-fill-color: grey;
     197    symbol-shape: square;
     198    symbol-stroke-color: white;
     199   symbol-size: 8;
     200 
     201}
     202
     203
     204way!:closed >[index=1] node!:connection,
     205way!:closed >[index=-1] node!:connection {   matches all single way end nodes 
     206   symbol-stroke-color: blue;
     207   symbol-size: 10;
     208}
     209
     210
     211
     212way
     213{
     214  /* Settings: change if necessary */
     215  style_right_hand_traffic: yes;  /* Will be overriden by ugly hack below */
     216  style_lane_opacity: 0.5;        /* Will be overriden by ugly hack below */
     217  style_sidewalk_opacity: 0.5;    /* Will be overriden by ugly hack below */
     218  style_markings_opacity: 0.8;    /* Will be overriden by ugly hack below */
     219  style_show_warnings: yes;       /* Will be overriden by ugly hack below */
     220  style_show_errors: yes;         /* Will be overriden by ugly hack below */
     221  style_show_disputed: no;        /* Will be overriden by ugly hack below */
     222  style_use_svg_turn: yes;        /* Will be overriden by ugly hack below */
     223 
     224  /* Ugly hack to make opacity configurable */
     225  ugly_lane_opacity: Opacity_lane#000000;
     226  style_lane_opacity: eval((red(prop(ugly_lane_opacity))+green(prop(ugly_lane_opacity))+blue(prop(ugly_lane_opacity)))/3);
     227  ugly_sidewalk_opacity: Opacity_sidewalk#808080;
     228  style_sidewalk_opacity: eval((red(prop(ugly_sidewalk_opacity))+green(prop(ugly_sidewalk_opacity))+blue(prop(ugly_sidewalk_opacity)))/3);
     229  ugly_markings_opacity: Opacity_markings#CCCCCC;
     230  style_markings_opacity: eval((red(prop(ugly_markings_opacity))+green(prop(ugly_markings_opacity))+blue(prop(ugly_markings_opacity)))/3);
     231
     232  /* Ugly hack to make boolean configurable */
     233  ugly_right_hand_traffic: Boolean_right_hand_traffic#888888;
     234  /*style_right_hand_traffic: eval(red(prop(ugly_right_hand_traffic)))=1;*/
     235  /*style_right_hand_traffic: eval(is_right_hand_traffic());*/
     236  style_right_hand_traffic: eval((red(prop(ugly_right_hand_traffic))=1)?yes:((red(prop(ugly_right_hand_traffic))=0)?no:is_right_hand_traffic()));
     237  ugly_show_warnings: Boolean_show_warnings#FFFFFF;
     238  style_show_warnings: eval(red(prop(ugly_show_warnings)))=1;
     239  ugly_show_errors: Boolean_show_errors#FFFFFF;
     240  style_show_errors: eval(red(prop(ugly_show_errors)))=1;
     241  ugly_show_disputed: Boolean_show_disputed#000000;
     242  style_show_disputed: eval(red(prop(ugly_show_disputed)))=1;
     243  ugly_use_svg_turn: Boolean_use_svg_for_turning_markings#FFFFFF;
     244  style_use_svg_turn: eval(red(prop(ugly_use_svg_turn)))=1;
     245  ugly_png_turn_variant: Integer_PNG_turn_variant#000000;
     246  style_png_turn_variant: eval(round(blue(prop((ugly_png_turn_variant)))*256));
     247  ugly_use_svg_destination: Boolean_use_svg_for_destination#FFFFFF;
     248  style_use_svg_destination: eval(red(prop(ugly_use_svg_destination)))=1;
     249
     250  /* Color of the sidewalk: none (ignored), sidewalk only, cycletrack only, sidewalk and cycletrack */
     251  style_sidewalk_color: eval(list(#000000,Sidewalk#808080,Cycletrack#8080C0,Combined_sidewalk_and_cycletrack#C08080));
     252
     253  /* Color of the dashes if lane is access=no */
     254  style_noaccess_color: No_access#FF0000;
     255}
     256
     257/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     258/* Decide which roads should be rendered                                                                                                           */
     259/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     260way[lanes][!leisure],
     261way[lanes:forward],
     262way[lanes:backward],
     263way[turn:lanes],way[turn:lanes:forward],way[turn:lanes:backward],way[turn:lanes:both_ways],
     264way[change:lanes],way[change:lanes:forward],way[change:lanes:backward],way[change:lanes:both_ways],
     265way[sidewalk][highway],
     266way[cycleway=track],way[cycleway:left],way[cycleway:right],way[cycleway:both],
     267way[destination],way[destination:forward],way[destination:backward]
     268{ ok: yes; }
     269
     270/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     271/* One-ways                                                                                                                                        */
     272/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     273way[is_prop_set(ok)]                                 { oneway_type:  0; }
     274way[is_prop_set(ok)][oneway?]                        { oneway_type:  1; }
     275way[is_prop_set(ok)][oneway=-1]                      { oneway_type: -1; }
     276way[is_prop_set(ok)][junction=roundabout][!oneway]   { oneway_type:  1; }
     277
     278/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     279/* Overrule left-hand/right-hand traffic                                                                                                           */
     280/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     281way[driving_side]
     282{
     283    style_right_hand_traffic: eval((tag(driving_side)="left")?no:yes);
     284}
     285
     286/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     287/* Pixel per metre (on average)                                                                                                                    */
     288/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     289*|z16  { pixel_per_metre: 0.625; }
     290*|z17  { pixel_per_metre: 1.25; }
     291*|z18  { pixel_per_metre: 2.5; }
     292*|z19  { pixel_per_metre: 5; }
     293*|z20  { pixel_per_metre: 10; }
     294*|z21  { pixel_per_metre: 20; }
     295*|z22  { pixel_per_metre: 40; }
     296*|z23  { pixel_per_metre: 80; }
     297*|z24  { pixel_per_metre: 160; }
     298*|z25  { pixel_per_metre: 320; }
     299*|z26- { pixel_per_metre: 640; }
     300
     301/***************************************************************************************************************************************************/
     302/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     303/* Colors                                                                                                                                          */
     304/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     305/***************************************************************************************************************************************************/
     306way[is_prop_set(ok)]
     307{
     308    /* Base color of the carriage way */
     309    /* TODO: obsolete - remove in future release: ground-color:   #404040; */
     310
     311    /* Individual colors for each direction */
     312    color_forward:  Carriage_way_forward#405A40;
     313    color_backward: Carriage_way_backward#5A4040;
     314    color_bothways: Carriage_way_bothways#40405A;
     315}
     316
     317/***************************************************************************************************************************************************/
     318/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     319/* Lane initializiation                                                                                                                            */
     320/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     321/***************************************************************************************************************************************************/
     322way|z17- {} /* ATTENTION: For whatever reason this is needed, otherwise the following won't be interpreted correctly */
     323way|z17-[is_prop_set(ok)]
     324{
     325    change_forward_1_left: yes;    change_forward_1_right: yes;
     326    change_forward_2_left: yes;    change_forward_2_right: yes;
     327    change_forward_3_left: yes;    change_forward_3_right: yes;
     328    change_forward_4_left: yes;    change_forward_4_right: yes;
     329    change_forward_5_left: yes;    change_forward_5_right: yes;
     330    change_forward_6_left: yes;    change_forward_6_right: yes;
     331    change_forward_7_left: yes;    change_forward_7_right: yes;
     332    change_forward_8_left: yes;    change_forward_8_right: yes;
     333
     334    change_backward_1_left: yes;    change_backward_1_right: yes;
     335    change_backward_2_left: yes;    change_backward_2_right: yes;
     336    change_backward_3_left: yes;    change_backward_3_right: yes;
     337    change_backward_4_left: yes;    change_backward_4_right: yes;
     338    change_backward_5_left: yes;    change_backward_5_right: yes;
     339    change_backward_6_left: yes;    change_backward_6_right: yes;
     340    change_backward_7_left: yes;    change_backward_7_right: yes;
     341    change_backward_8_left: yes;    change_backward_8_right: yes;
     342
     343    change_bothways_1_left: yes;    change_bothways_1_right: yes;
     344    change_bothways_2_left: yes;    change_bothways_2_right: yes;
     345    change_bothways_3_left: yes;    change_bothways_3_right: yes;
     346    change_bothways_4_left: yes;    change_bothways_4_right: yes;
     347
     348    color_forward_1: prop(color_forward);
     349    color_forward_2: prop(color_forward);
     350    color_forward_3: prop(color_forward);
     351    color_forward_4: prop(color_forward);
     352    color_forward_5: prop(color_forward);
     353    color_forward_6: prop(color_forward);
     354    color_forward_7: prop(color_forward);
     355    color_forward_8: prop(color_forward);
     356
     357    color_backward_1: prop(color_backward);
     358    color_backward_2: prop(color_backward);
     359    color_backward_3: prop(color_backward);
     360    color_backward_4: prop(color_backward);
     361    color_backward_5: prop(color_backward);
     362    color_backward_6: prop(color_backward);
     363    color_backward_7: prop(color_backward);
     364    color_backward_8: prop(color_backward);
     365   
     366    color_bothways_1: prop(color_bothways);
     367    color_bothways_2: prop(color_bothways);
     368    color_bothways_3: prop(color_bothways);
     369    color_bothways_4: prop(color_bothways);
     370
     371    sign_forward_1: "";         sign_backward_1: "";
     372    sign_forward_2: "";         sign_backward_2: "";
     373    sign_forward_3: "";         sign_backward_3: "";
     374    sign_forward_4: "";         sign_backward_4: "";
     375    sign_forward_5: "";         sign_backward_5: "";
     376    sign_forward_6: "";         sign_backward_6: "";
     377    sign_forward_7: "";         sign_backward_7: "";
     378    sign_forward_8: "";         sign_backward_8: "";
     379
     380    tag_lanes_all_min:  9999; tag_lanes_all_max: 0;
     381    tag_lanes_fwd_min:  9999; tag_lanes_fwd_max: 0;
     382    tag_lanes_bwd_min:  9999; tag_lanes_bwd_max: 0;
     383    tag_lanes_both_min: 9999; tag_lanes_both_max: 0;
     384}
     385
     386/***************************************************************************************************************************************************/
     387/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     388/* Determine allowed lane changes                                                                                                                  */
     389/* TODO: change:lanes without oneway, but only with values yes or no                                                                               */
     390/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     391/***************************************************************************************************************************************************/
     392/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     393/* Error checking                                                                                                                                  */
     394/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     395way["change"]
     396{
     397    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change"))?prop(data_error):"invalid change value");
     398}
     399way["change:forward"]
     400{
     401    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change:forward"))?prop(data_error):"invalid change:forward value");
     402}
     403way["change:backward"]
     404{
     405    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change:backward"))?prop(data_error):"invalid change:backward value");
     406}
     407way["change:both_ways"]
     408{
     409    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right)$",tag("change:both_ways"))?prop(data_error):"invalid change:both_ways value");
     410}
     411way["change:lanes"][!(prop(oneway_type)=0)]
     412{
     413    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes"))?prop(data_error):"invalid change:lanes value");
     414}
     415way["change:lanes"][prop(oneway_type)=0]
     416{
     417    data_error: eval(regexp_test("^(yes|no|\\|)*$",tag("change:lanes"))?prop(data_error):"invalid change:lanes value");
     418}
     419way["change:lanes:forward"]
     420{
     421    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes:forward"))?prop(data_error):"invalid change:lanes:forward value");
     422}
     423way["change:lanes:backward"]
     424{
     425    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes:backward"))?prop(data_error):"invalid change:lanes:backward value");
     426}
     427way["change:lanes:both_ways"]
     428{
     429    data_error: eval(regexp_test("^(yes|no|only_left|only_right|not_left|not_right|\\|)*$",tag("change:lanes:both_ways"))?prop(data_error):"invalid change:lanes:both_ways value");
     430}
     431
     432/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     433/* Forward lanes                                                                                                                                   */
     434/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     435way|z17-[is_prop_set(ok)]["change:lanes:forward"],
     436way|z17-[is_prop_set(ok)]["change:forward"],
     437way|z17-[is_prop_set(ok)]["change:lanes"][prop(oneway_type)=1],
     438way|z17-[is_prop_set(ok)]["change"][prop(oneway_type)=1]
     439{
     440    temp: eval(cond(has_tag_key("change:lanes"),tag("change:lanes"),cond(has_tag_key("change"),tag("change"),
     441                                cond(has_tag_key("change:lanes:forward"),tag("change:lanes:forward"),tag("change:forward")))));
     442    temp_list: eval(split("|",prop(temp)));
     443    temp_length: eval(length(prop(temp_list)));
     444    change_forward_1_left:  eval((prop(temp_length)>0) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),0)));
     445    change_forward_1_right: eval((prop(temp_length)>0) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),0)));
     446    change_forward_2_left:  eval((prop(temp_length)>1) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),1)));
     447    change_forward_2_right: eval((prop(temp_length)>1) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),1)));
     448    change_forward_3_left:  eval((prop(temp_length)>2) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),2)));
     449    change_forward_3_right: eval((prop(temp_length)>2) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),2)));
     450    change_forward_4_left:  eval((prop(temp_length)>3) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),3)));
     451    change_forward_4_right: eval((prop(temp_length)>3) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),3)));
     452    change_forward_5_left:  eval((prop(temp_length)>4) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),4)));
     453    change_forward_5_right: eval((prop(temp_length)>4) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),4)));
     454    change_forward_6_left:  eval((prop(temp_length)>5) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),5)));
     455    change_forward_6_right: eval((prop(temp_length)>5) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),5)));
     456    change_forward_7_left:  eval((prop(temp_length)>6) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),6)));
     457    change_forward_7_right: eval((prop(temp_length)>6) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),6)));
     458    change_forward_8_left:  eval((prop(temp_length)>7) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),7)));
     459    change_forward_8_right: eval((prop(temp_length)>7) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),7)));
     460
     461    /* Lane count based on :lanes values */
     462    tag_lanes_all_min: eval(has_tag_key("change:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     463    tag_lanes_all_max: eval(has_tag_key("change:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     464    tag_lanes_fwd_min: eval(has_tag_key("change:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     465    tag_lanes_fwd_max: eval(has_tag_key("change:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     466}
     467
     468/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     469/* Backward lanes                                                                                                                                   */
     470/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     471way|z17-[is_prop_set(ok)]["change:lanes:backward"],
     472way|z17-[is_prop_set(ok)]["change:backward"],
     473way|z17-[is_prop_set(ok)]["change:lanes"][prop(oneway_type)=(-1)],
     474way|z17-[is_prop_set(ok)]["change"][prop(oneway_type)=(-1)]
     475{
     476    temp: eval(cond(has_tag_key("change:lanes"),tag("change:lanes"),cond(has_tag_key("change"),tag("change"),
     477                                cond(has_tag_key("change:lanes:backward"),tag("change:lanes:backward"),tag("change:backward")))));
     478    temp_list: eval(split("|",prop(temp)));
     479    temp_length: eval(length(prop(temp_list)));
     480    change_lanes_bwd: eval(length(prop(temp_list)));
     481    change_backward_1_left:  eval((prop(temp_length)>0) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),0)));
     482    change_backward_1_right: eval((prop(temp_length)>0) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),0)));
     483    change_backward_2_left:  eval((prop(temp_length)>1) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),1)));
     484    change_backward_2_right: eval((prop(temp_length)>1) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),1)));
     485    change_backward_3_left:  eval((prop(temp_length)>2) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),2)));
     486    change_backward_3_right: eval((prop(temp_length)>2) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),2)));
     487    change_backward_4_left:  eval((prop(temp_length)>3) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),3)));
     488    change_backward_4_right: eval((prop(temp_length)>3) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),3)));
     489    change_backward_5_left:  eval((prop(temp_length)>4) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),4)));
     490    change_backward_5_right: eval((prop(temp_length)>4) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),4)));
     491    change_backward_6_left:  eval((prop(temp_length)>5) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),5)));
     492    change_backward_6_right: eval((prop(temp_length)>5) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),5)));
     493    change_backward_7_left:  eval((prop(temp_length)>6) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),6)));
     494    change_backward_7_right: eval((prop(temp_length)>6) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),6)));
     495    change_backward_8_left:  eval((prop(temp_length)>7) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),7)));
     496    change_backward_8_right: eval((prop(temp_length)>7) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),7)));
     497
     498    /* Lane count based on :lanes values */
     499    tag_lanes_bwd_min: eval(has_tag_key("change:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     500    tag_lanes_bwd_max: eval(has_tag_key("change:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     501}
     502
     503/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     504/* Bothways lanes                                                                                                                                  */
     505/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     506way|z17-[is_prop_set(ok)]["change:lanes:both_ways"],
     507way|z17-[is_prop_set(ok)]["change:both_ways"]
     508{
     509    temp: eval(cond(has_tag_key("change:lanes:both_ways"),tag("change:lanes:both_ways"),tag("change:both_ways")));
     510    temp_list: eval(split("|",prop(temp)));
     511    temp_length: eval(length(prop(temp_list)));
     512
     513    change_lanes_bth: eval(length(prop(temp_list)));
     514    change_bothways_1_left:  eval((prop(temp_length)>0) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),0)));
     515    change_bothways_1_right: eval((prop(temp_length)>0) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),0)));
     516    change_bothways_2_left:  eval((prop(temp_length)>1) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),1)));
     517    change_bothways_2_right: eval((prop(temp_length)>1) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),1)));
     518    change_bothways_3_left:  eval((prop(temp_length)>2) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),2)));
     519    change_bothways_3_right: eval((prop(temp_length)>2) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),2)));
     520    change_bothways_4_left:  eval((prop(temp_length)>3) && regexp_test("^(yes|only_left|not_right)$",get(prop(temp_list),3)));
     521    change_bothways_4_right: eval((prop(temp_length)>3) && regexp_test("^(yes|only_right|not_left)$",get(prop(temp_list),3)));
     522
     523    /* Lane count based on :lanes values */
     524    tag_lanes_both_min: eval(has_tag_key("change:lanes:both_ways")?min(prop(tag_lanes_both_min),prop(temp_length)):prop(tag_lanes_both_min));
     525    tag_lanes_both_max: eval(has_tag_key("change:lanes:both_ways")?max(prop(tag_lanes_both_max),prop(temp_length)):prop(tag_lanes_both_max));
     526}
     527
     528/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     529/* Extra support for change:lanes=no|no on twoway streets                                                                                          */
     530/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     531way|z17-[is_prop_set(ok)]["change:lanes"="no|no"][prop(oneway_type)=0]
     532{
     533    change_forward_1_left:   false;
     534    change_forward_1_right:  false;
     535    change_backward_1_left:  false;
     536    change_backward_1_right: false;
     537
     538    /* Lane count based on :lanes values */
     539    tag_lanes_all_min: eval(min(prop(tag_lanes_all_min),2));
     540    tag_lanes_all_max: eval(max(prop(tag_lanes_all_max),2));
     541    tag_lanes_fwd_min: eval(min(1,prop(tag_lanes_fwd_min)));
     542    tag_lanes_fwd_max: eval(max(1,prop(tag_lanes_fwd_max)));
     543    tag_lanes_bwd_min: eval(min(1,prop(tag_lanes_bwd_min)));
     544    tag_lanes_bwd_max: eval(max(1,prop(tag_lanes_bwd_max)));
     545}
     546
     547
     548/***************************************************************************************************************************************************/
     549/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     550/* Determine turning lanes                                                                                                                         */
     551/* Note: rendering of "reverse" only when using svg                                                                                                */
     552/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     553/***************************************************************************************************************************************************/
     554/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     555/* Error checking                                                                                                                                  */
     556/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     557way["turn"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn"))?prop(data_error):"invalid turn value"); }
     558way["turn:forward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn:forward"))?prop(data_error):"invalid turn:forward value"); }
     559way["turn:backward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn:backward"))?prop(data_error):"invalid turn:backward value"); }
     560way["turn:both_ways"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;)*$",tag("turn:both_ways"))?prop(data_error):"invalid turn:both_ways value"); }
     561way["turn:lanes"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes"))?prop(data_error):"invalid turn:lanes value"); }
     562way["turn:lanes:forward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes:forward"))?prop(data_error):"invalid turn:lanes:forward value"); }
     563way["turn:lanes:backward"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes:backward"))?prop(data_error):"invalid turn:lanes:backward value"); }
     564way["turn:lanes:both_ways"] { data_error: eval(regexp_test("^(none|through|left|slight_left|sharp_left|hook_left|right|slight_right|sharp_right|hook_right|merge_to_left|merge_to_right|reverse|;|\\|)*$",tag("turn:lanes:both_ways"))?prop(data_error):"invalid turn:lanes:both_ways value"); }
     565
     566/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     567/* Forward lanes (standard images)                                                                                                                 */
     568/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     569way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes:forward"],
     570way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:forward"],
     571way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=1],
     572way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn"][prop(oneway_type)=1]
     573{
     574    temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"),
     575                                cond(has_tag_key("turn"),tag("turn"),
     576                                cond(has_tag_key("turn:lanes:forward"),tag("turn:lanes:forward"),
     577                                     tag("turn:forward")
     578                                    ))));
     579    temp_list: eval(split("|",prop(temp)));
     580    temp_length: eval(length(prop(temp_list)));
     581
     582    t: eval(get(prop(temp_list),0));
     583    turn_image_forward_1: eval(
     584                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     585                                (
     586                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     587                                (
     588                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     589                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     590                                )
     591                                )
     592                            );
     593    t: eval(get(prop(temp_list),1));
     594    turn_image_forward_2: eval(
     595                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     596                                (
     597                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     598                                (
     599                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     600                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     601                                )
     602                                )
     603                            );
     604    t: eval(get(prop(temp_list),2));
     605    turn_image_forward_3: eval(
     606                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     607                                (
     608                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     609                                (
     610                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     611                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     612                                )
     613                                )
     614                            );
     615    t: eval(get(prop(temp_list),3));
     616    turn_image_forward_4: eval(
     617                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     618                                (
     619                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     620                                (
     621                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     622                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     623                                )
     624                                )
     625                            );
     626    t: eval(get(prop(temp_list),4));
     627    turn_image_forward_5: eval(
     628                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     629                                (
     630                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     631                                (
     632                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     633                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     634                                )
     635                                )
     636                            );
     637    t: eval(get(prop(temp_list),5));
     638    turn_image_forward_6: eval(
     639                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     640                                (
     641                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     642                                (
     643                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     644                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     645                                )
     646                                )
     647                            );
     648    t: eval(get(prop(temp_list),6));
     649    turn_image_forward_7: eval(
     650                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     651                                (
     652                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     653                                (
     654                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     655                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     656                                )
     657                                )
     658                            );
     659    t: eval(get(prop(temp_list),7));
     660    turn_image_forward_8: eval(
     661                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     662                                (
     663                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward reverse lefthand.png")):
     664                                (
     665                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     666                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn forward ",prop(t),".png")
     667                                )
     668                                )
     669                            );
     670
     671    /* Lane count based on :lanes values */
     672    tag_lanes_all_min: eval(has_tag_key("turn:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     673    tag_lanes_all_max: eval(has_tag_key("turn:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     674    tag_lanes_fwd_min: eval(has_tag_key("turn:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     675    tag_lanes_fwd_max: eval(has_tag_key("turn:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     676}
     677
     678
     679/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     680/* Backward lanes (standard images)                                                                                                                */
     681/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     682way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes:backward"],
     683way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:backward"],
     684way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=(-1)],
     685way|z17-[is_prop_set(ok)][!prop(style_use_svg_turn)]["turn"][prop(oneway_type)=(-1)]
     686{
     687    temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"),
     688                                cond(has_tag_key("turn"),tag("turn"),
     689                                cond(has_tag_key("turn:lanes:backward"),tag("turn:lanes:backward"),
     690                                     tag("turn:backward")
     691                                    ))));
     692    temp_list: eval(split("|",prop(temp)));
     693    temp_length: eval(length(prop(temp_list)));
     694
     695    t: eval(get(prop(temp_list),0));
     696    turn_image_backward_1: eval(
     697                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     698                                (
     699                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     700                                (
     701                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     702                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     703                                )
     704                                )
     705                            );
     706    t: eval(get(prop(temp_list),1));
     707    turn_image_backward_2: eval(
     708                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     709                                (
     710                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     711                                (
     712                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     713                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     714                                )
     715                                )
     716                            );
     717    t: eval(get(prop(temp_list),2));
     718    turn_image_backward_3: eval(
     719                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     720                                (
     721                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     722                                (
     723                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     724                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     725                                )
     726                                )
     727                            );
     728    t: eval(get(prop(temp_list),3));
     729    turn_image_backward_4: eval(
     730                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     731                                (
     732                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     733                                (
     734                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     735                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     736                                )
     737                                )
     738                            );
     739    t: eval(get(prop(temp_list),4));
     740    turn_image_backward_5: eval(
     741                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     742                                (
     743                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     744                                (
     745                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     746                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     747                                )
     748                                )
     749                            );
     750    t: eval(get(prop(temp_list),5));
     751    turn_image_backward_6: eval(
     752                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     753                                (
     754                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     755                                (
     756                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     757                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     758                                )
     759                                )
     760                            );
     761    t: eval(get(prop(temp_list),6));
     762    turn_image_backward_7: eval(
     763                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     764                                (
     765                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     766                                (
     767                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     768                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     769                                )
     770                                )
     771                            );
     772    t: eval(get(prop(temp_list),7));
     773    turn_image_backward_8: eval(
     774                                ((prop(t)="none") || (prop(t)=""))?prop(unset_property):
     775                                (
     776                                (prop(t)="reverse")?(prop(style_right_hand_traffic,"default")?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse righthand.png"):concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward reverse lefthand.png")):
     777                                (
     778                                    regexp_test(".*;.*",prop(t))?concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",regexp_test(".*left.*",prop(t))?"left":"",regexp_test(".*through.*",prop(t))?"through":"",regexp_test(".*right.*",prop(t))?"right":"",".png"):
     779                                    concat("images/png/turn-",prop(style_png_turn_variant),"/turn backward ",prop(t),".png")
     780                                )
     781                                )
     782                            );
     783
     784    /* Lane count based on :lanes values */
     785    tag_lanes_bwd_min: eval(has_tag_key("turn:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     786    tag_lanes_bwd_max: eval(has_tag_key("turn:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     787}
     788
     789/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     790/* SVG for turn images                                                                                                                             */
     791/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     792way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]
     793{
     794        turn_svg_through_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,67.5-5,0,7.5,32.5-10-32.5-10,0,7.5z'/>");
     795        turn_svg_slight_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,67.5-5c11.462-1.0193,18.459,10.285,20.46,13.902l-7.96,4.2,17.5,4.3683,2.5-15-7.753,4.1421c-2.247-4.5-6.12-15.4-24.747-16.6z'/>");
     796        turn_svg_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,67.5-5c6.31-0.505,17.5,5,17.5,10h-10l12.5,12.5,12.5-12.5h-10c0-5-8.43-13.3-22.5-15z'/>");
     797        turn_svg_sharp_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15l62.497-4.7c7.5026,0.7633,2.5026,7.1294,0.0026,11.156l-7.5-4.0271,2.5,15,17.5-4.3125-7.878-4.2954c4.3284-6.3921,6.7048-17.943-4.6246-19.263z'/>");
     798        turn_svg_slight_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_slight_right_forward),"</g>"));
     799        turn_svg_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_right_forward),"</g>"));
     800        turn_svg_sharp_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"));
     801        turn_svg_reverse_right_hand_forward: eval("<path fill='#FFF' d='m0,40,0-15,62.497,4.6294c12.503,0.4,15.003-10,0.003-12.1v5.4671l-16.238-7.9671,16.238-7.5v5c15-2.1079,22.5,22.5-0.003,22.871z'/>");
     802        turn_svg_reverse_left_hand_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_reverse_right_hand_forward),"</g>"));
     803        turn_svg_merge_to_right_forward: eval("<path fill='#FFF' d='m0,17.5,0,15,50.034-3.7063c7.4655-0.5212,13.016,2.3222,19.541,4.8112l-2.922,6.3951,33.347,5-25-22.5-3.2955,6.6794c-8.1542-5.6073-14.204-7.5071-21.734-7.9779z'/>");
     804        turn_svg_merge_to_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_merge_to_right_forward),"</g>"));
     805        turn_svg_hook_right_forward: eval("<path fill='#FFF' d='m0,22.5,0,15,37.474-2.7759c11.051-1.2406,20.026-5.8731,20.026-15.873,0-5,5-3.8509,13.359-3.8509,9.1412,0,14.141-1.3338,14.141,5v17.5h-10l12.5,12.5,12.5-12.5h-10v-17.5c0-11.271-2.5-12.5-19.23-12.5-15.77,0-20.77,1.351-20.77,11.351,0,5-6.8784,6.8562-12.531,6.4246z'/>");
     806        turn_svg_hook_left_forward: eval(concat("<g transform='translate(0,50) scale(1.0,-1.0)'>",prop(turn_svg_hook_right_forward),"</g>"));
     807}
     808
     809
     810/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     811/* Forward lanes (SVG)                                                                                                                             */
     812/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     813way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes:forward"],
     814way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:forward"],
     815way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=1],
     816way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn"][prop(oneway_type)=1]
     817{
     818    temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"),
     819                                cond(has_tag_key("turn"),tag("turn"),
     820                                cond(has_tag_key("turn:lanes:forward"),tag("turn:lanes:forward"),
     821                                     tag("turn:forward")
     822                                    ))));
     823    temp_list: eval(split("|",prop(temp)));
     824    temp_length: eval(length(prop(temp_list)));
     825
     826    turn_image_forward_1: ""; t: eval(get(prop(temp_list),0)); t_scale: 1.0;
     827    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_1: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     828    t_scale_after_through: eval(prop(t_scale));
     829    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     830    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     831    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     832    t_scale: eval(prop(t_scale_after_through));
     833    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     834    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     835    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_1: eval(prop(t_test)?concat(prop(turn_image_forward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     836    turn_image_forward_1: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_1));
     837    turn_image_forward_1: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_1));
     838    turn_image_forward_1: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_1));
     839    turn_image_forward_1: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_1));
     840    turn_image_forward_1: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_1),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_1));
     841    turn_image_forward_1: eval((prop(turn_image_forward_1)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_1),"</g></svg>"));
     842
     843    turn_image_forward_2: ""; t: eval(get(prop(temp_list),1)); t_scale: 1.0;
     844    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_2: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     845    t_scale_after_through: eval(prop(t_scale));
     846    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     847    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     848    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     849    t_scale: eval(prop(t_scale_after_through));
     850    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     851    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     852    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_2: eval(prop(t_test)?concat(prop(turn_image_forward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     853    turn_image_forward_2: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_2));
     854    turn_image_forward_2: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_2));
     855    turn_image_forward_2: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_2));
     856    turn_image_forward_2: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_2));
     857    turn_image_forward_2: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_2),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_2));
     858    turn_image_forward_2: eval((prop(turn_image_forward_2)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_2),"</g></svg>"));
     859
     860    turn_image_forward_3: ""; t: eval(get(prop(temp_list),2)); t_scale: 1.0;
     861    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_3: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     862    t_scale_after_through: eval(prop(t_scale));
     863    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     864    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     865    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     866    t_scale: eval(prop(t_scale_after_through));
     867    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     868    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     869    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_3: eval(prop(t_test)?concat(prop(turn_image_forward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     870    turn_image_forward_3: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_3));
     871    turn_image_forward_3: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_3));
     872    turn_image_forward_3: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_3));
     873    turn_image_forward_3: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_3));
     874    turn_image_forward_3: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_3),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_3));
     875    turn_image_forward_3: eval((prop(turn_image_forward_3)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_3),"</g></svg>"));
     876
     877    turn_image_forward_4: ""; t: eval(get(prop(temp_list),3)); t_scale: 1.0;
     878    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_4: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     879    t_scale_after_through: eval(prop(t_scale));
     880    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     881    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     882    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     883    t_scale: eval(prop(t_scale_after_through));
     884    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     885    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     886    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_4: eval(prop(t_test)?concat(prop(turn_image_forward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     887    turn_image_forward_4: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_4));
     888    turn_image_forward_4: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_4));
     889    turn_image_forward_4: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_4));
     890    turn_image_forward_4: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_4));
     891    turn_image_forward_4: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_4),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_4));
     892    turn_image_forward_4: eval((prop(turn_image_forward_4)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_4),"</g></svg>"));
     893
     894    turn_image_forward_5: ""; t: eval(get(prop(temp_list),4)); t_scale: 1.0;
     895    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_5: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     896    t_scale_after_through: eval(prop(t_scale));
     897    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     898    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     899    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     900    t_scale: eval(prop(t_scale_after_through));
     901    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     902    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     903    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_5: eval(prop(t_test)?concat(prop(turn_image_forward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     904    turn_image_forward_5: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_5));
     905    turn_image_forward_5: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_5));
     906    turn_image_forward_5: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_5));
     907    turn_image_forward_5: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_5));
     908    turn_image_forward_5: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_5),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_5));
     909    turn_image_forward_5: eval((prop(turn_image_forward_5)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_5),"</g></svg>"));
     910
     911    turn_image_forward_6: ""; t: eval(get(prop(temp_list),5)); t_scale: 1.0;
     912    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_6: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     913    t_scale_after_through: eval(prop(t_scale));
     914    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     915    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     916    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     917    t_scale: eval(prop(t_scale_after_through));
     918    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     919    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     920    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_6: eval(prop(t_test)?concat(prop(turn_image_forward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     921    turn_image_forward_6: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_6));
     922    turn_image_forward_6: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_6));
     923    turn_image_forward_6: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_6));
     924    turn_image_forward_6: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_6));
     925    turn_image_forward_6: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_6),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_6));
     926    turn_image_forward_6: eval((prop(turn_image_forward_6)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_6),"</g></svg>"));
     927
     928    turn_image_forward_7: ""; t: eval(get(prop(temp_list),6)); t_scale: 1.0;
     929    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_7: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     930    t_scale_after_through: eval(prop(t_scale));
     931    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     932    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     933    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     934    t_scale: eval(prop(t_scale_after_through));
     935    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     936    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     937    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_7: eval(prop(t_test)?concat(prop(turn_image_forward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     938    turn_image_forward_7: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_7));
     939    turn_image_forward_7: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_7));
     940    turn_image_forward_7: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_7));
     941    turn_image_forward_7: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_7));
     942    turn_image_forward_7: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_7),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_7));
     943    turn_image_forward_7: eval((prop(turn_image_forward_7)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_7),"</g></svg>"));
     944
     945    turn_image_forward_8: ""; t: eval(get(prop(temp_list),7)); t_scale: 1.0;
     946    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_forward_8: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     947    t_scale_after_through: eval(prop(t_scale));
     948    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     949    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     950    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     951    t_scale: eval(prop(t_scale_after_through));
     952    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     953    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     954    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_forward_8: eval(prop(t_test)?concat(prop(turn_image_forward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_forward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     955    turn_image_forward_8: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_forward_8));
     956    turn_image_forward_8: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_merge_to_right_forward)):prop(turn_image_forward_8));
     957    turn_image_forward_8: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_merge_to_left_forward)):prop(turn_image_forward_8));
     958    turn_image_forward_8: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_hook_right_forward)):prop(turn_image_forward_8));
     959    turn_image_forward_8: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_forward_8),prop(turn_svg_hook_left_forward)):prop(turn_image_forward_8));
     960    turn_image_forward_8: eval((prop(turn_image_forward_8)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_forward_8),"</g></svg>"));
     961
     962    /* Lane count based on :lanes values */
     963    tag_lanes_all_min: eval(has_tag_key("turn:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     964    tag_lanes_all_max: eval(has_tag_key("turn:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     965    tag_lanes_fwd_min: eval(has_tag_key("turn:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     966    tag_lanes_fwd_max: eval(has_tag_key("turn:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     967}
     968
     969
     970/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     971/* Backward lanes (SVG)                                                                                                                            */
     972/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     973way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes:backward"],
     974way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:backward"],
     975way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes"][prop(oneway_type)=(-1)],
     976way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn"][prop(oneway_type)=(-1)]
     977{
     978    temp: eval(cond(has_tag_key("turn:lanes"),tag("turn:lanes"),
     979                                cond(has_tag_key("turn"),tag("turn"),
     980                                cond(has_tag_key("turn:lanes:backward"),tag("turn:lanes:backward"),
     981                                     tag("turn:backward")
     982                                    ))));
     983    temp_list: eval(split("|",prop(temp)));
     984    temp_length: eval(length(prop(temp_list)));
     985
     986    turn_image_backward_1: ""; t: eval(get(prop(temp_list),0)); t_scale: 1.0;
     987    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_1: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     988    t_scale_after_through: eval(prop(t_scale));
     989    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     990    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     991    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     992    t_scale: eval(prop(t_scale_after_through));
     993    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     994    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     995    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_1: eval(prop(t_test)?concat(prop(turn_image_backward_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     996    turn_image_backward_1: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_1));
     997    turn_image_backward_1: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_1));
     998    turn_image_backward_1: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_1));
     999    turn_image_backward_1: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_1));
     1000    turn_image_backward_1: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_1),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_1));
     1001    turn_image_backward_1: eval((prop(turn_image_backward_1)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_1),"</g></svg>"));
     1002
     1003    turn_image_backward_2: ""; t: eval(get(prop(temp_list),1)); t_scale: 1.0;
     1004    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_2: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1005    t_scale_after_through: eval(prop(t_scale));
     1006    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1007    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1008    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1009    t_scale: eval(prop(t_scale_after_through));
     1010    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1011    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1012    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_2: eval(prop(t_test)?concat(prop(turn_image_backward_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1013    turn_image_backward_2: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_2));
     1014    turn_image_backward_2: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_2));
     1015    turn_image_backward_2: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_2));
     1016    turn_image_backward_2: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_2));
     1017    turn_image_backward_2: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_2),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_2));
     1018    turn_image_backward_2: eval((prop(turn_image_backward_2)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_2),"</g></svg>"));
     1019
     1020    turn_image_backward_3: ""; t: eval(get(prop(temp_list),2)); t_scale: 1.0;
     1021    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_3: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1022    t_scale_after_through: eval(prop(t_scale));
     1023    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1024    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1025    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1026    t_scale: eval(prop(t_scale_after_through));
     1027    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1028    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1029    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_3: eval(prop(t_test)?concat(prop(turn_image_backward_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1030    turn_image_backward_3: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_3));
     1031    turn_image_backward_3: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_3));
     1032    turn_image_backward_3: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_3));
     1033    turn_image_backward_3: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_3));
     1034    turn_image_backward_3: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_3),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_3));
     1035    turn_image_backward_3: eval((prop(turn_image_backward_3)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_3),"</g></svg>"));
     1036
     1037    turn_image_backward_4: ""; t: eval(get(prop(temp_list),3)); t_scale: 1.0;
     1038    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_4: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1039    t_scale_after_through: eval(prop(t_scale));
     1040    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1041    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1042    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1043    t_scale: eval(prop(t_scale_after_through));
     1044    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1045    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1046    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_4: eval(prop(t_test)?concat(prop(turn_image_backward_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1047    turn_image_backward_4: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_4));
     1048    turn_image_backward_4: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_4));
     1049    turn_image_backward_4: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_4));
     1050    turn_image_backward_4: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_4));
     1051    turn_image_backward_4: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_4),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_4));
     1052    turn_image_backward_4: eval((prop(turn_image_backward_4)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_4),"</g></svg>"));
     1053
     1054    turn_image_backward_5: ""; t: eval(get(prop(temp_list),4)); t_scale: 1.0;
     1055    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_5: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1056    t_scale_after_through: eval(prop(t_scale));
     1057    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1058    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1059    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1060    t_scale: eval(prop(t_scale_after_through));
     1061    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1062    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1063    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_5: eval(prop(t_test)?concat(prop(turn_image_backward_5),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_5));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1064    turn_image_backward_5: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_5));
     1065    turn_image_backward_5: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_5));
     1066    turn_image_backward_5: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_5));
     1067    turn_image_backward_5: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_5));
     1068    turn_image_backward_5: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_5),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_5));
     1069    turn_image_backward_5: eval((prop(turn_image_backward_5)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_5),"</g></svg>"));
     1070
     1071    turn_image_backward_6: ""; t: eval(get(prop(temp_list),5)); t_scale: 1.0;
     1072    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_6: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1073    t_scale_after_through: eval(prop(t_scale));
     1074    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1075    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1076    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1077    t_scale: eval(prop(t_scale_after_through));
     1078    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1079    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1080    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_6: eval(prop(t_test)?concat(prop(turn_image_backward_6),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_6));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1081    turn_image_backward_6: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_6));
     1082    turn_image_backward_6: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_6));
     1083    turn_image_backward_6: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_6));
     1084    turn_image_backward_6: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_6));
     1085    turn_image_backward_6: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_6),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_6));
     1086    turn_image_backward_6: eval((prop(turn_image_backward_6)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_6),"</g></svg>"));
     1087
     1088    turn_image_backward_7: ""; t: eval(get(prop(temp_list),6)); t_scale: 1.0;
     1089    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_7: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1090    t_scale_after_through: eval(prop(t_scale));
     1091    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1092    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1093    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1094    t_scale: eval(prop(t_scale_after_through));
     1095    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1096    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1097    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_7: eval(prop(t_test)?concat(prop(turn_image_backward_7),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_7));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1098    turn_image_backward_7: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_7));
     1099    turn_image_backward_7: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_7));
     1100    turn_image_backward_7: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_7));
     1101    turn_image_backward_7: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_7));
     1102    turn_image_backward_7: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_7),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_7));
     1103    turn_image_backward_7: eval((prop(turn_image_backward_7)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_7),"</g></svg>"));
     1104
     1105    turn_image_backward_8: ""; t: eval(get(prop(temp_list),7)); t_scale: 1.0;
     1106    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_backward_8: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1107    t_scale_after_through: eval(prop(t_scale));
     1108    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1109    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1110    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1111    t_scale: eval(prop(t_scale_after_through));
     1112    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1113    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1114    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_backward_8: eval(prop(t_test)?concat(prop(turn_image_backward_8),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_backward_8));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1115    turn_image_backward_8: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_backward_8));
     1116    turn_image_backward_8: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_merge_to_right_forward)):prop(turn_image_backward_8));
     1117    turn_image_backward_8: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_merge_to_left_forward)):prop(turn_image_backward_8));
     1118    turn_image_backward_8: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_hook_right_forward)):prop(turn_image_backward_8));
     1119    turn_image_backward_8: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_backward_8),prop(turn_svg_hook_left_forward)):prop(turn_image_backward_8));
     1120    turn_image_backward_8: eval((prop(turn_image_backward_8)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='100px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25)'>",prop(turn_image_backward_8),"</g></svg>"));
     1121
     1122    /* Lane count based on :lanes values */
     1123    tag_lanes_bwd_min: eval(has_tag_key("turn:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1124    tag_lanes_bwd_max: eval(has_tag_key("turn:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1125}
     1126
     1127/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1128/* Both-way lanes (SVG)                                                                                                                            */
     1129/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1130way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:lanes:both_ways"],
     1131way|z17-[is_prop_set(ok)][prop(style_use_svg_turn)]["turn:both_ways"]
     1132{
     1133    temp: eval(cond(has_tag_key("turn:lanes:both_ways"),tag("turn:lanes:both_ways"),tag("turn:both_ways")));
     1134    temp_list: eval(split("|",prop(temp)));
     1135    temp_length: eval(length(prop(temp_list)));
     1136
     1137    turn_image_bothways_1: ""; t: eval(get(prop(temp_list),0)); t_scale: 1.0;
     1138    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_bothways_1: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1139    t_scale_after_through: eval(prop(t_scale));
     1140    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1141    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1142    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1143    t_scale: eval(prop(t_scale_after_through));
     1144    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1145    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1146    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_bothways_1: eval(prop(t_test)?concat(prop(turn_image_bothways_1),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_bothways_1));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1147    turn_image_bothways_1: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_1));
     1148    turn_image_bothways_1: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_1));
     1149    turn_image_bothways_1: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_1));
     1150    turn_image_bothways_1: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_1));
     1151    turn_image_bothways_1: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_1),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_1));
     1152    turn_image_bothways_1: eval((prop(turn_image_bothways_1)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_1),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_1),"</g></svg>"));
     1153
     1154    turn_image_bothways_2: ""; t: eval(get(prop(temp_list),1)); t_scale: 1.0;
     1155    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_bothways_2: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1156    t_scale_after_through: eval(prop(t_scale));
     1157    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1158    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1159    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1160    t_scale: eval(prop(t_scale_after_through));
     1161    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1162    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1163    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_bothways_2: eval(prop(t_test)?concat(prop(turn_image_bothways_2),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_bothways_2));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1164    turn_image_bothways_2: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_2));
     1165    turn_image_bothways_2: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_2));
     1166    turn_image_bothways_2: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_2));
     1167    turn_image_bothways_2: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_2));
     1168    turn_image_bothways_2: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_2),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_2));
     1169    turn_image_bothways_2: eval((prop(turn_image_bothways_2)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_2),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_2),"</g></svg>"));
     1170
     1171    turn_image_bothways_3: ""; t: eval(get(prop(temp_list),2)); t_scale: 1.0;
     1172    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_bothways_3: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1173    t_scale_after_through: eval(prop(t_scale));
     1174    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1175    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1176    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1177    t_scale: eval(prop(t_scale_after_through));
     1178    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1179    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1180    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_bothways_3: eval(prop(t_test)?concat(prop(turn_image_bothways_3),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_bothways_3));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1181    turn_image_bothways_3: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_3));
     1182    turn_image_bothways_3: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_3));
     1183    turn_image_bothways_3: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_3));
     1184    turn_image_bothways_3: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_3));
     1185    turn_image_bothways_3: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_3),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_3));
     1186    turn_image_bothways_3: eval((prop(turn_image_bothways_3)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_3),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_3),"</g></svg>"));
     1187
     1188    turn_image_bothways_4: ""; t: eval(get(prop(temp_list),3)); t_scale: 1.0;
     1189    t_test: eval(regexp_test("^(.*;)*through(;.*)*$",prop(t)));         turn_image_bothways_4: eval(prop(t_test)?prop(turn_svg_through_forward):                                                                                              prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1190    t_scale_after_through: eval(prop(t_scale));
     1191    t_test: eval(regexp_test("^(.*;)*slight_right(;.*)*$",prop(t)));    turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_right_forward),"</g>"):prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1192    t_test: eval(regexp_test("^(.*;)*right(;.*)*$",prop(t)));           turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_right_forward),"</g>"):       prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1193    t_test: eval(regexp_test("^(.*;)*sharp_right(;.*)*$",prop(t)));     turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_right_forward),"</g>"): prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1194    t_scale: eval(prop(t_scale_after_through));
     1195    t_test: eval(regexp_test("^(.*;)*slight_left(;.*)*$",prop(t)));     turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_slight_left_forward),"</g>"): prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1196    t_test: eval(regexp_test("^(.*;)*left(;.*)*$",prop(t)));            turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_left_forward),"</g>"):        prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1197    t_test: eval(regexp_test("^(.*;)*sharp_left(;.*)*$",prop(t)));      turn_image_bothways_4: eval(prop(t_test)?concat(prop(turn_image_bothways_4),"<g transform='scale(",prop(t_scale)," 1.0)'>",prop(turn_svg_sharp_left_forward),"</g>"):  prop(turn_image_bothways_4));    t_scale: eval(prop(t_test)?(prop(t_scale)*0.666):prop(t_scale));
     1198    turn_image_bothways_4: eval(regexp_test("^(.*;)*reverse(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),(prop(style_right_hand_traffic)?prop(turn_svg_reverse_right_hand_forward):prop(turn_svg_reverse_left_hand_forward))):prop(turn_image_bothways_4));
     1199    turn_image_bothways_4: eval(regexp_test("^(.*;)*merge_to_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_merge_to_right_forward)):prop(turn_image_bothways_4));
     1200    turn_image_bothways_4: eval(regexp_test("^(.*;)*merge_to_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_merge_to_left_forward)):prop(turn_image_bothways_4));
     1201    turn_image_bothways_4: eval(regexp_test("^(.*;)*hook_right(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_hook_right_forward)):prop(turn_image_bothways_4));
     1202    turn_image_bothways_4: eval(regexp_test("^(.*;)*hook_left(;.*)*$",prop(t))?concat(prop(turn_image_bothways_4),prop(turn_svg_hook_left_forward)):prop(turn_image_bothways_4));
     1203    turn_image_bothways_4: eval((prop(turn_image_bothways_4)="")?prop(unset_property):concat("data:image/svg+xml,<svg width='200px' height='50px'><g fill-opacity='",prop(style_markings_opacity),"'>",prop(turn_image_bothways_4),"</g><g fill-opacity='",prop(style_markings_opacity),"' transform='rotate(180 50 25) translate(-100 0)'>",prop(turn_image_bothways_4),"</g></svg>"));
     1204}
     1205
     1206/***************************************************************************************************************************************************/
     1207/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1208/* Lane access                                                                                                                                     */
     1209/* The property restriction_color_xxx will be overwritten by later rules                                                                           */
     1210/* TODO: both_ways is not implemented                                                                                                              */
     1211/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1212/***************************************************************************************************************************************************/
     1213/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1214/* Access=no forward lanes                                                                                                                         */
     1215/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1216way|z17-[is_prop_set(ok)]["access:lanes:forward"],
     1217way|z17-[is_prop_set(ok)]["access:forward"],
     1218way|z17-[is_prop_set(ok)]["access:lanes"][prop(oneway_type)=1],
     1219way|z17-[is_prop_set(ok)]["access"][prop(oneway_type)=1]
     1220{
     1221    temp: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"),
     1222                                cond(has_tag_key("access"),tag("access"),
     1223                                cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"),
     1224                                     tag("access:forward")
     1225                                    ))));
     1226    temp_list: eval(split("|",prop(temp)));
     1227    temp_length: eval(length(prop(temp_list)));
     1228    restriction_color_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="no") || (get(prop(temp_list),0)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_1));
     1229    restriction_color_forward_2: eval(((prop(temp_length)>0) && ((get(prop(temp_list),1)="no") || (get(prop(temp_list),1)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_2));
     1230    restriction_color_forward_3: eval(((prop(temp_length)>0) && ((get(prop(temp_list),2)="no") || (get(prop(temp_list),2)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_3));
     1231    restriction_color_forward_4: eval(((prop(temp_length)>0) && ((get(prop(temp_list),3)="no") || (get(prop(temp_list),3)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_4));
     1232    restriction_color_forward_5: eval(((prop(temp_length)>0) && ((get(prop(temp_list),4)="no") || (get(prop(temp_list),4)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_5));
     1233    restriction_color_forward_6: eval(((prop(temp_length)>0) && ((get(prop(temp_list),5)="no") || (get(prop(temp_list),5)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_6));
     1234    restriction_color_forward_7: eval(((prop(temp_length)>0) && ((get(prop(temp_list),6)="no") || (get(prop(temp_list),6)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_7));
     1235    restriction_color_forward_8: eval(((prop(temp_length)>0) && ((get(prop(temp_list),7)="no") || (get(prop(temp_list),7)="private")))?prop(style_noaccess_color):prop(restriction_color_forward_8));
     1236
     1237    /* Lane count based on :lanes values */
     1238    tag_lanes_all_min: eval(has_tag_key("access:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1239    tag_lanes_all_max: eval(has_tag_key("access:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1240    tag_lanes_fwd_min: eval(has_tag_key("access:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     1241    tag_lanes_fwd_max: eval(has_tag_key("access:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     1242}
     1243
     1244/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1245/* Access=no backward lanes                                                                                                                        */
     1246/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1247way|z17-[is_prop_set(ok)]["access:lanes:backward"],
     1248way|z17-[is_prop_set(ok)]["access:backward"],
     1249way|z17-[is_prop_set(ok)]["access:lanes"][prop(oneway_type)=(-1)],
     1250way|z17-[is_prop_set(ok)]["access"][prop(oneway_type)=(-1)]
     1251{
     1252    temp: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"),
     1253                                cond(has_tag_key("access"),tag("access"),
     1254                                cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),
     1255                                     tag("access:backward")
     1256                                    ))));
     1257    temp_list: eval(split("|",prop(temp)));
     1258    temp_length: eval(length(prop(temp_list)));
     1259    restriction_color_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="no") || (get(prop(temp_list),0)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_1));
     1260    restriction_color_backward_2: eval(((prop(temp_length)>0) && ((get(prop(temp_list),1)="no") || (get(prop(temp_list),1)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_2));
     1261    restriction_color_backward_3: eval(((prop(temp_length)>0) && ((get(prop(temp_list),2)="no") || (get(prop(temp_list),2)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_3));
     1262    restriction_color_backward_4: eval(((prop(temp_length)>0) && ((get(prop(temp_list),3)="no") || (get(prop(temp_list),3)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_4));
     1263    restriction_color_backward_5: eval(((prop(temp_length)>0) && ((get(prop(temp_list),4)="no") || (get(prop(temp_list),4)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_5));
     1264    restriction_color_backward_6: eval(((prop(temp_length)>0) && ((get(prop(temp_list),5)="no") || (get(prop(temp_list),5)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_6));
     1265    restriction_color_backward_7: eval(((prop(temp_length)>0) && ((get(prop(temp_list),6)="no") || (get(prop(temp_list),6)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_7));
     1266    restriction_color_backward_8: eval(((prop(temp_length)>0) && ((get(prop(temp_list),7)="no") || (get(prop(temp_list),7)="private")))?prop(style_noaccess_color):prop(restriction_color_backward_8));
     1267
     1268    /* Lane count based on :lanes values */
     1269    tag_lanes_all_min: eval(has_tag_key("access:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1270    tag_lanes_all_max: eval(has_tag_key("access:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1271    tag_lanes_bwd_min: eval(has_tag_key("access:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1272    tag_lanes_bwd_max: eval(has_tag_key("access:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1273}
     1274
     1275/***************************************************************************************************************************************************/
     1276/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1277/* Lane designation                                                                                                                                */
     1278/* TODO: both_ways is not implemented                                                                                                              */
     1279/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1280/***************************************************************************************************************************************************/
     1281/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1282/* Bus forward lanes                                                                                                                               */
     1283/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1284way|z17-[is_prop_set(ok)]["bus:lanes:forward"],
     1285way|z17-[is_prop_set(ok)]["bus:forward"],
     1286way|z17-[is_prop_set(ok)]["bus:lanes"][prop(oneway_type)=1],
     1287way|z17-[is_prop_set(ok)]["bus"][prop(oneway_type)=1]
     1288{
     1289    temp: eval(cond(has_tag_key("bus:lanes"),tag("bus:lanes"),
     1290                                cond(has_tag_key("bus"),tag("bus"),
     1291                                cond(has_tag_key("bus:lanes:forward"),tag("bus:lanes:forward"),
     1292                                     tag("bus:forward")
     1293                                    ))));
     1294    temp_list: eval(split("|",prop(temp)));
     1295    temp_length: eval(length(prop(temp_list)));
     1296    tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"),
     1297                                cond(has_tag_key("access"),tag("access"),
     1298                                cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"),
     1299                                     tag("access:forward")
     1300                                    ))));
     1301    tempa_list: eval(split("|",prop(tempa)));
     1302    tempa_length: eval(length(prop(tempa_list)));
     1303
     1304    sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/bus forward.png"):prop(sign_forward_1));
     1305    sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/bus forward.png"):prop(sign_forward_2));
     1306    sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/bus forward.png"):prop(sign_forward_3));
     1307    sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/bus forward.png"):prop(sign_forward_4));
     1308    sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/bus forward.png"):prop(sign_forward_5));
     1309    sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/bus forward.png"):prop(sign_forward_6));
     1310    sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/bus forward.png"):prop(sign_forward_7));
     1311    sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/bus forward.png"):prop(sign_forward_8));
     1312
     1313    /* Lane count based on :lanes values */
     1314    tag_lanes_all_min: eval(has_tag_key("bus:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1315    tag_lanes_all_max: eval(has_tag_key("bus:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1316    tag_lanes_fwd_min: eval(has_tag_key("bus:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     1317    tag_lanes_fwd_max: eval(has_tag_key("bus:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     1318}
     1319
     1320/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1321/* Bus backward lanes                                                                                                                              */
     1322/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1323way|z17-[is_prop_set(ok)]["bus:lanes:backward"],
     1324way|z17-[is_prop_set(ok)]["bus:backward"],
     1325way|z17-[is_prop_set(ok)]["bus:lanes"][prop(oneway_type)=(-1)],
     1326way|z17-[is_prop_set(ok)]["bus"][prop(oneway_type)=(-1)]
     1327{
     1328    temp: eval(cond(has_tag_key("bus:lanes"),tag("bus:lanes"),
     1329                                cond(has_tag_key("bus"),tag("bus"),
     1330                                cond(has_tag_key("bus:lanes:backward"),tag("bus:lanes:backward"),
     1331                                     tag("bus:backward")
     1332                                    ))));
     1333    temp_list: eval(split("|",prop(temp)));
     1334    temp_length: eval(length(prop(temp_list)));
     1335    /* TODO: oneway=-1*/
     1336    tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward")));
     1337    tempa_list: eval(split("|",prop(tempa)));
     1338    tempa_length: eval(length(prop(tempa_list)));
     1339
     1340    sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/bus backward.png"):prop(sign_backward_1));
     1341    sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/bus backward.png"):prop(sign_backward_2));
     1342    sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/bus backward.png"):prop(sign_backward_3));
     1343    sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/bus backward.png"):prop(sign_backward_4));
     1344    sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/bus backward.png"):prop(sign_backward_5));
     1345    sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/bus backward.png"):prop(sign_backward_6));
     1346    sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/bus backward.png"):prop(sign_backward_7));
     1347    sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/bus backward.png"):prop(sign_backward_8));
     1348
     1349    /* Lane count based on :lanes values */
     1350    tag_lanes_bwd_min: eval(has_tag_key("bus:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1351    tag_lanes_bwd_max: eval(has_tag_key("bus:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1352}
     1353
     1354/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1355/* Taxi forward lanes                                                                                                                               */
     1356/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1357way|z17-[is_prop_set(ok)]["taxi:lanes:forward"],
     1358way|z17-[is_prop_set(ok)]["taxi:forward"],
     1359way|z17-[is_prop_set(ok)]["taxi:lanes"][prop(oneway_type)=1],
     1360way|z17-[is_prop_set(ok)]["taxi"][prop(oneway_type)=1]
     1361{
     1362    temp: eval(cond(has_tag_key("taxi:lanes"),tag("taxi:lanes"),
     1363                                cond(has_tag_key("taxi"),tag("taxi"),
     1364                                cond(has_tag_key("taxi:lanes:forward"),tag("taxi:lanes:forward"),
     1365                                     tag("taxi:forward")
     1366                                    ))));
     1367    temp_list: eval(split("|",prop(temp)));
     1368    temp_length: eval(length(prop(temp_list)));
     1369    tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"),
     1370                                cond(has_tag_key("access"),tag("access"),
     1371                                cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"),
     1372                                     tag("access:forward")
     1373                                    ))));
     1374    tempa_list: eval(split("|",prop(tempa)));
     1375    tempa_length: eval(length(prop(tempa_list)));
     1376
     1377    sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/taxi forward.png"):prop(sign_forward_1));
     1378    sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/taxi forward.png"):prop(sign_forward_2));
     1379    sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/taxi forward.png"):prop(sign_forward_3));
     1380    sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/taxi forward.png"):prop(sign_forward_4));
     1381    sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/taxi forward.png"):prop(sign_forward_5));
     1382    sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/taxi forward.png"):prop(sign_forward_6));
     1383    sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/taxi forward.png"):prop(sign_forward_7));
     1384    sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/taxi forward.png"):prop(sign_forward_8));
     1385
     1386    /* Lane count based on :lanes values */
     1387    tag_lanes_all_min: eval(has_tag_key("taxi:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1388    tag_lanes_all_max: eval(has_tag_key("taxi:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1389    tag_lanes_fwd_min: eval(has_tag_key("taxi:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     1390    tag_lanes_fwd_max: eval(has_tag_key("taxi:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     1391}
     1392
     1393/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1394/* Taxi backward lanes                                                                                                                              */
     1395/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1396way|z17-[is_prop_set(ok)]["taxi:lanes:backward"],
     1397way|z17-[is_prop_set(ok)]["taxi:backward"],
     1398way|z17-[is_prop_set(ok)]["taxi:lanes"][prop(oneway_type)=(-1)],
     1399way|z17-[is_prop_set(ok)]["taxi"][prop(oneway_type)=(-1)]
     1400{
     1401    temp: eval(cond(has_tag_key("taxi:lanes"),tag("taxi:lanes"),
     1402                                cond(has_tag_key("taxi"),tag("taxi"),
     1403                                cond(has_tag_key("taxi:lanes:backward"),tag("taxi:lanes:backward"),
     1404                                     tag("taxi:backward")
     1405                                    ))));
     1406    temp_list: eval(split("|",prop(temp)));
     1407    temp_length: eval(length(prop(temp_list)));
     1408    /* TODO: oneway=-1*/
     1409    tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward")));
     1410    tempa_list: eval(split("|",prop(tempa)));
     1411    tempa_length: eval(length(prop(tempa_list)));
     1412
     1413    sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/taxi backward.png"):prop(sign_backward_1));
     1414    sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/taxi backward.png"):prop(sign_backward_2));
     1415    sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/taxi backward.png"):prop(sign_backward_3));
     1416    sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/taxi backward.png"):prop(sign_backward_4));
     1417    sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/taxi backward.png"):prop(sign_backward_5));
     1418    sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/taxi backward.png"):prop(sign_backward_6));
     1419    sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/taxi backward.png"):prop(sign_backward_7));
     1420    sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/taxi backward.png"):prop(sign_backward_8));
     1421
     1422    /* Lane count based on :lanes values */
     1423    tag_lanes_bwd_min: eval(has_tag_key("taxi:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1424    tag_lanes_bwd_max: eval(has_tag_key("taxi:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1425}
     1426
     1427/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1428/* PSV forward lanes                                                                                                                               */
     1429/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1430way|z17-[is_prop_set(ok)]["psv:lanes:forward"],
     1431way|z17-[is_prop_set(ok)]["psv:forward"],
     1432way|z17-[is_prop_set(ok)]["psv:lanes"][prop(oneway_type)=1],
     1433way|z17-[is_prop_set(ok)]["psv"][prop(oneway_type)=1]
     1434{
     1435    temp: eval(cond(has_tag_key("psv:lanes"),tag("psv:lanes"),
     1436                                cond(has_tag_key("psv"),tag("psv"),
     1437                                cond(has_tag_key("psv:lanes:forward"),tag("psv:lanes:forward"),
     1438                                     tag("psv:forward")
     1439                                    ))));
     1440    temp_list: eval(split("|",prop(temp)));
     1441    temp_length: eval(length(prop(temp_list)));
     1442    tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"),
     1443                                cond(has_tag_key("access"),tag("access"),
     1444                                cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"),
     1445                                     tag("access:forward")
     1446                                    ))));
     1447    tempa_list: eval(split("|",prop(tempa)));
     1448    tempa_length: eval(length(prop(tempa_list)));
     1449
     1450    sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/psv forward.png"):prop(sign_forward_1));
     1451    sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/psv forward.png"):prop(sign_forward_2));
     1452    sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/psv forward.png"):prop(sign_forward_3));
     1453    sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/psv forward.png"):prop(sign_forward_4));
     1454    sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/psv forward.png"):prop(sign_forward_5));
     1455    sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/psv forward.png"):prop(sign_forward_6));
     1456    sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/psv forward.png"):prop(sign_forward_7));
     1457    sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/psv forward.png"):prop(sign_forward_8));
     1458
     1459    /* Lane count based on :lanes values */
     1460    tag_lanes_all_min: eval(has_tag_key("psv:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1461    tag_lanes_all_max: eval(has_tag_key("psv:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1462    tag_lanes_fwd_min: eval(has_tag_key("psv:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     1463    tag_lanes_fwd_max: eval(has_tag_key("psv:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     1464}
     1465
     1466/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1467/* PSV backward lanes                                                                                                                              */
     1468/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1469way|z17-[is_prop_set(ok)]["psv:lanes:backward"],
     1470way|z17-[is_prop_set(ok)]["psv:backward"],
     1471way|z17-[is_prop_set(ok)]["psv:lanes"][prop(oneway_type)=(-1)],
     1472way|z17-[is_prop_set(ok)]["psv"][prop(oneway_type)=(-1)]
     1473{
     1474    temp: eval(cond(has_tag_key("psv:lanes"),tag("psv:lanes"),
     1475                                cond(has_tag_key("psv"),tag("psv"),
     1476                                cond(has_tag_key("psv:lanes:backward"),tag("psv:lanes:backward"),
     1477                                     tag("psv:backward")
     1478                                    ))));
     1479    temp_list: eval(split("|",prop(temp)));
     1480    temp_length: eval(length(prop(temp_list)));
     1481    /* TODO: oneway=-1*/
     1482    tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward")));
     1483    tempa_list: eval(split("|",prop(tempa)));
     1484    tempa_length: eval(length(prop(tempa_list)));
     1485
     1486    sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/psv backward.png"):prop(sign_backward_1));
     1487    sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/psv backward.png"):prop(sign_backward_2));
     1488    sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/psv backward.png"):prop(sign_backward_3));
     1489    sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/psv backward.png"):prop(sign_backward_4));
     1490    sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/psv backward.png"):prop(sign_backward_5));
     1491    sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/psv backward.png"):prop(sign_backward_6));
     1492    sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/psv backward.png"):prop(sign_backward_7));
     1493    sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/psv backward.png"):prop(sign_backward_8));
     1494
     1495    /* Lane count based on :lanes values */
     1496    tag_lanes_bwd_min: eval(has_tag_key("psv:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1497    tag_lanes_bwd_max: eval(has_tag_key("psv:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1498}
     1499
     1500/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1501/* Bicycle forward lanes                                                                                                                           */
     1502/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1503way|z17-[is_prop_set(ok)]["bicycle:lanes:forward"],
     1504way|z17-[is_prop_set(ok)]["bicycle:forward"],
     1505way|z17-[is_prop_set(ok)]["bicycle:lanes"][prop(oneway_type)=1],
     1506way|z17-[is_prop_set(ok)]["bicycle"][prop(oneway_type)=1]
     1507{
     1508    temp: eval(cond(has_tag_key("bicycle:lanes"),tag("bicycle:lanes"),
     1509                                cond(has_tag_key("bicycle"),tag("bicycle"),
     1510                                cond(has_tag_key("bicycle:lanes:forward"),tag("bicycle:lanes:forward"),
     1511                                     tag("bicycle:forward")
     1512                                    ))));
     1513    temp_list: eval(split("|",prop(temp)));
     1514    temp_length: eval(length(prop(temp_list)));
     1515    tempa: eval(cond(has_tag_key("access:lanes"),tag("access:lanes"),
     1516                                cond(has_tag_key("access"),tag("access"),
     1517                                cond(has_tag_key("access:lanes:forward"),tag("access:lanes:forward"),
     1518                                     tag("access:forward")
     1519                                    ))));
     1520    tempa_list: eval(split("|",prop(tempa)));
     1521    tempa_length: eval(length(prop(tempa_list)));
     1522
     1523    sign_forward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_forward_1),";images/bicycle forward.png"):prop(sign_forward_1));
     1524    sign_forward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_forward_2),";images/bicycle forward.png"):prop(sign_forward_2));
     1525    sign_forward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_forward_3),";images/bicycle forward.png"):prop(sign_forward_3));
     1526    sign_forward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_forward_4),";images/bicycle forward.png"):prop(sign_forward_4));
     1527    sign_forward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_forward_5),";images/bicycle forward.png"):prop(sign_forward_5));
     1528    sign_forward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_forward_6),";images/bicycle forward.png"):prop(sign_forward_6));
     1529    sign_forward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_forward_7),";images/bicycle forward.png"):prop(sign_forward_7));
     1530    sign_forward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_forward_8),";images/bicycle forward.png"):prop(sign_forward_8));
     1531
     1532    /* Lane count based on :lanes values */
     1533    tag_lanes_all_min: eval(has_tag_key("bicycle:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1534    tag_lanes_all_max: eval(has_tag_key("bicycle:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1535    tag_lanes_fwd_min: eval(has_tag_key("bicycle:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     1536    tag_lanes_fwd_max: eval(has_tag_key("bicycle:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     1537}
     1538
     1539/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1540/* Bicycle backward lanes                                                                                                                          */
     1541/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1542way|z17-[is_prop_set(ok)]["bicycle:lanes:backward"],
     1543way|z17-[is_prop_set(ok)]["bicycle:backward"],
     1544way|z17-[is_prop_set(ok)]["bicycle:lanes"][prop(oneway_type)=(-1)],
     1545way|z17-[is_prop_set(ok)]["bicycle"][prop(oneway_type)=(-1)]
     1546{
     1547    temp: eval(cond(has_tag_key("bicycle:lanes"),tag("bicycle:lanes"),
     1548                                cond(has_tag_key("bicycle"),tag("bicycle"),
     1549                                cond(has_tag_key("bicycle:lanes:backward"),tag("bicycle:lanes:backward"),
     1550                                     tag("bicycle:backward")
     1551                                    ))));
     1552    temp_list: eval(split("|",prop(temp)));
     1553    temp_length: eval(length(prop(temp_list)));
     1554    /* TODO: oneway=-1*/
     1555    tempa: eval(cond(has_tag_key("access:lanes:backward"),tag("access:lanes:backward"),tag("access:backward")));
     1556    tempa_list: eval(split("|",prop(tempa)));
     1557    tempa_length: eval(length(prop(tempa_list)));
     1558
     1559    sign_backward_1: eval(((prop(temp_length)>0) && ((get(prop(temp_list),0)="designated") || ((get(prop(temp_list),0)="yes") && (get(prop(tempa_list),0)="no"))))?concat(prop(sign_backward_1),";images/bicycle backward.png"):prop(sign_backward_1));
     1560    sign_backward_2: eval(((prop(temp_length)>1) && ((get(prop(temp_list),1)="designated") || ((get(prop(temp_list),1)="yes") && (get(prop(tempa_list),1)="no"))))?concat(prop(sign_backward_2),";images/bicycle backward.png"):prop(sign_backward_2));
     1561    sign_backward_3: eval(((prop(temp_length)>2) && ((get(prop(temp_list),2)="designated") || ((get(prop(temp_list),2)="yes") && (get(prop(tempa_list),2)="no"))))?concat(prop(sign_backward_3),";images/bicycle backward.png"):prop(sign_backward_3));
     1562    sign_backward_4: eval(((prop(temp_length)>3) && ((get(prop(temp_list),3)="designated") || ((get(prop(temp_list),3)="yes") && (get(prop(tempa_list),3)="no"))))?concat(prop(sign_backward_4),";images/bicycle backward.png"):prop(sign_backward_4));
     1563    sign_backward_5: eval(((prop(temp_length)>4) && ((get(prop(temp_list),4)="designated") || ((get(prop(temp_list),4)="yes") && (get(prop(tempa_list),4)="no"))))?concat(prop(sign_backward_5),";images/bicycle backward.png"):prop(sign_backward_5));
     1564    sign_backward_6: eval(((prop(temp_length)>5) && ((get(prop(temp_list),5)="designated") || ((get(prop(temp_list),5)="yes") && (get(prop(tempa_list),5)="no"))))?concat(prop(sign_backward_6),";images/bicycle backward.png"):prop(sign_backward_6));
     1565    sign_backward_7: eval(((prop(temp_length)>6) && ((get(prop(temp_list),6)="designated") || ((get(prop(temp_list),6)="yes") && (get(prop(tempa_list),6)="no"))))?concat(prop(sign_backward_7),";images/bicycle backward.png"):prop(sign_backward_7));
     1566    sign_backward_8: eval(((prop(temp_length)>7) && ((get(prop(temp_list),7)="designated") || ((get(prop(temp_list),7)="yes") && (get(prop(tempa_list),7)="no"))))?concat(prop(sign_backward_8),";images/bicycle backward.png"):prop(sign_backward_8));
     1567
     1568    /* Lane count based on :lanes values */
     1569    tag_lanes_bwd_min: eval(has_tag_key("bicycle:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1570    tag_lanes_bwd_max: eval(has_tag_key("bicycle:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1571}
     1572
     1573
     1574/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1575/* HOV forward lanes                                                                                                                               */
     1576/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1577way|z17-[is_prop_set(ok)]["hov:lanes:forward"],
     1578way|z17-[is_prop_set(ok)]["hov:forward"],
     1579way|z17-[is_prop_set(ok)]["hov:lanes"][prop(oneway_type)=1],
     1580way|z17-[is_prop_set(ok)]["hov"][prop(oneway_type)=1]
     1581{
     1582    temp: eval(cond(has_tag_key("hov:lanes"),tag("hov:lanes"),
     1583                                cond(has_tag_key("hov:lanes:forward"),tag("hov:lanes:forward"),
     1584                                cond(has_tag_key("hov"),tag("hov"),
     1585                                     tag("hov:forward")
     1586                                    ))));
     1587    temp_list: eval(split("|",prop(temp)));
     1588    temp_length: eval(length(prop(temp_list)));
     1589    hov_minimum: eval(has_tag_key("hov:minimum:forward")?tag("hov:minimum:forward"):(has_tag_key("hov:minimum")?tag("hov:minimum"):0));
     1590    hov_image: eval((prop(hov_minimum)=2)?";images/hov2 forward.png":((prop(hov_minimum)=3)?";images/hov3 forward.png":";images/hov forward.png"));
     1591
     1592    t:              eval(get(prop(temp_list),0));
     1593    sign_forward_1: eval(((prop(temp_length)>0) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_1),prop(hov_image)):prop(sign_forward_1));
     1594    t:              eval(get(prop(temp_list),1));
     1595    sign_forward_2: eval(((prop(temp_length)>1) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_2),prop(hov_image)):prop(sign_forward_2));
     1596    t:              eval(get(prop(temp_list),2));
     1597    sign_forward_3: eval(((prop(temp_length)>2) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_3),prop(hov_image)):prop(sign_forward_3));
     1598    t:              eval(get(prop(temp_list),3));
     1599    sign_forward_4: eval(((prop(temp_length)>3) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_4),prop(hov_image)):prop(sign_forward_4));
     1600    t:              eval(get(prop(temp_list),4));
     1601    sign_forward_5: eval(((prop(temp_length)>4) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_5),prop(hov_image)):prop(sign_forward_5));
     1602    t:              eval(get(prop(temp_list),5));
     1603    sign_forward_6: eval(((prop(temp_length)>5) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_6),prop(hov_image)):prop(sign_forward_6));
     1604    t:              eval(get(prop(temp_list),6));
     1605    sign_forward_7: eval(((prop(temp_length)>6) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_7),prop(hov_image)):prop(sign_forward_7));
     1606    t:              eval(get(prop(temp_list),7));
     1607    sign_forward_8: eval(((prop(temp_length)>7) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_forward_8),prop(hov_image)):prop(sign_forward_8));
     1608
     1609    /* Lane count based on :lanes values */
     1610    tag_lanes_all_min: eval(has_tag_key("hov:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1611    tag_lanes_all_max: eval(has_tag_key("hov:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1612    tag_lanes_fwd_min: eval(has_tag_key("hov:lanes:forward")?min(prop(tag_lanes_fwd_min),prop(temp_length)):prop(tag_lanes_fwd_min));
     1613    tag_lanes_fwd_max: eval(has_tag_key("hov:lanes:forward")?max(prop(tag_lanes_fwd_max),prop(temp_length)):prop(tag_lanes_fwd_max));
     1614}
     1615
     1616/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1617/* HOV backward lanes                                                                                                                               */
     1618/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1619way|z17-[is_prop_set(ok)]["hov:lanes:backward"],
     1620way|z17-[is_prop_set(ok)]["hov:backward"],
     1621way|z17-[is_prop_set(ok)]["hov:lanes"][prop(oneway_type)=(-1)],
     1622way|z17-[is_prop_set(ok)]["hov"][prop(oneway_type)=(-1)]
     1623{
     1624    temp: eval(cond(has_tag_key("hov:lanes"),tag("hov:lanes"),
     1625                                cond(has_tag_key("hov"),tag("hov"),
     1626                                cond(has_tag_key("hov:lanes:backward"),tag("hov:lanes:backward"),
     1627                                     tag("hov:backward")
     1628                                    ))));
     1629    temp_list: eval(split("|",prop(temp)));
     1630    temp_length: eval(length(prop(temp_list)));
     1631    hov_minimum: eval(has_tag_key("hov:minimum:backward")?tag("hov:minimum:backward"):(has_tag_key("hov:minimum")?tag("hov:minimum"):0));
     1632    hov_image: eval((prop(hov_minimum)=2)?";images/hov2 backward.png":((prop(hov_minimum)=3)?";images/hov3 backward.png":";images/hov backward.png"));
     1633
     1634    t:              eval(get(prop(temp_list),0));
     1635    sign_backward_1: eval(((prop(temp_length)>0) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_1),prop(hov_image)):prop(sign_backward_1));
     1636    t:              eval(get(prop(temp_list),1));
     1637    sign_backward_2: eval(((prop(temp_length)>1) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_2),prop(hov_image)):prop(sign_backward_2));
     1638    t:              eval(get(prop(temp_list),2));
     1639    sign_backward_3: eval(((prop(temp_length)>2) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_3),prop(hov_image)):prop(sign_backward_3));
     1640    t:              eval(get(prop(temp_list),3));
     1641    sign_backward_4: eval(((prop(temp_length)>3) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_4),prop(hov_image)):prop(sign_backward_4));
     1642    t:              eval(get(prop(temp_list),4));
     1643    sign_backward_5: eval(((prop(temp_length)>4) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_5),prop(hov_image)):prop(sign_backward_5));
     1644    t:              eval(get(prop(temp_list),5));
     1645    sign_backward_6: eval(((prop(temp_length)>5) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_6),prop(hov_image)):prop(sign_backward_6));
     1646    t:              eval(get(prop(temp_list),6));
     1647    sign_backward_7: eval(((prop(temp_length)>6) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_7),prop(hov_image)):prop(sign_backward_7));
     1648    t:              eval(get(prop(temp_list),7));
     1649    sign_backward_8: eval(((prop(temp_length)>7) && ((prop(t)="designated") || (prop(t)="lane")))?concat(prop(sign_backward_8),prop(hov_image)):prop(sign_backward_8));
     1650
     1651    /* Lane count based on :lanes values */
     1652    tag_lanes_all_min: eval(has_tag_key("hov:lanes")?min(prop(tag_lanes_all_min),prop(temp_length)):prop(tag_lanes_all_min));
     1653    tag_lanes_all_max: eval(has_tag_key("hov:lanes")?max(prop(tag_lanes_all_max),prop(temp_length)):prop(tag_lanes_all_max));
     1654    tag_lanes_bwd_min: eval(has_tag_key("hov:lanes:backward")?min(prop(tag_lanes_bwd_min),prop(temp_length)):prop(tag_lanes_bwd_min));
     1655    tag_lanes_bwd_max: eval(has_tag_key("hov:lanes:backward")?max(prop(tag_lanes_bwd_max),prop(temp_length)):prop(tag_lanes_bwd_max));
     1656}
     1657
     1658/***************************************************************************************************************************************************/
     1659/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1660/* Check of the number of lane-dependent width                                                                                                     */
     1661/* The calculation itself depends on the lane count and therefore is done AFTER the determination of the lane count                                */
     1662/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1663/***************************************************************************************************************************************************/
     1664way|z17-["width:lanes:forward"],
     1665way|z17-["width:lanes"][prop(oneway_type)=1]
     1666{
     1667    temp: eval(cond(has_tag_key("width:lanes:forward"),tag("width:lanes:forward"),tag("width:lanes")));
     1668    temp_length: eval(length(split("|",prop(temp))));
     1669
     1670    /* Lane count based on :lanes values */
     1671    tag_lanes_fwd_min: eval(min(prop(tag_lanes_fwd_min),prop(temp_length)));
     1672    tag_lanes_fwd_max: eval(max(prop(tag_lanes_fwd_max),prop(temp_length)));
     1673}
     1674way|z17-["width:lanes:backward"],
     1675way|z17-["width:lanes"][prop(oneway_type)=(-1)]
     1676{
     1677    temp: eval(cond(has_tag_key("width:lanes:backward"),tag("width:lanes:backward"),tag("width:lanes")));
     1678    temp_length: eval(length(split("|",prop(temp))));
     1679
     1680    /* Lane count based on :lanes values */
     1681    tag_lanes_bwd_min: eval(min(prop(tag_lanes_bwd_min),prop(temp_length)));
     1682    tag_lanes_bwd_max: eval(max(prop(tag_lanes_bwd_max),prop(temp_length)));
     1683}
     1684way|z17-["width:lanes:both_ways"]
     1685{
     1686    temp: eval(tag("width:lanes:both_ways"));
     1687    temp_length: eval(length(split("|",prop(temp))));
     1688
     1689    /* Lane count based on :lanes values */
     1690    tag_lanes_both_min: eval(min(prop(tag_lanes_both_min),prop(temp_length)));
     1691    tag_lanes_both_max: eval(max(prop(tag_lanes_both_max),prop(temp_length)));
     1692}
     1693
     1694/***************************************************************************************************************************************************/
     1695/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1696/* Retrieve the lane count from the lanes key, its subkeys and the :lanes-tags                                                                     */
     1697/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1698/***************************************************************************************************************************************************/
     1699way[is_prop_set(ok)][lanes]             { lanes_all:  tag(lanes);}
     1700way[is_prop_set(ok)]["lanes:forward"]   { lanes_fwd:  tag("lanes:forward");}
     1701way[is_prop_set(ok)]["lanes:backward"]  { lanes_bwd:  tag("lanes:backward");}
     1702way[is_prop_set(ok)]["lanes:both_ways"] { lanes_both: tag("lanes:both_ways");}
     1703
     1704/* Nothing specified */
     1705way[is_prop_set(ok)][prop(oneway_type)=0][!lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"]
     1706        { lanes_all: 2; lanes_fwd: 1; lanes_bwd: 1; lanes_both: 0; }
     1707way[is_prop_set(ok)][prop(oneway_type)=1][!lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"]
     1708        { lanes_all: 1; lanes_fwd: 1; lanes_bwd: 0; lanes_both: 0; }
     1709way[is_prop_set(ok)][prop(oneway_type)=(-1)][!lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"]
     1710        { lanes_all: 1; lanes_fwd: 0; lanes_bwd: 1; lanes_both: 0; }
     1711
     1712/* One-ways */
     1713way[is_prop_set(ok)][lanes][!"lanes:forward"][!"lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=1]
     1714        { lanes_fwd: prop(lanes_all); lanes_bwd: 0; lanes_both: 0; }
     1715way[is_prop_set(ok)][lanes][!"lanes:forward"][!"lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=(-1)]
     1716        { lanes_bwd: prop(lanes_all); lanes_fwd: 0; lanes_both: 0; }
     1717
     1718way[is_prop_set(ok)][!lanes]["lanes:forward"][!"lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=1] 
     1719        { lanes_all: prop(lanes_fwd); lanes_bwd: 0; lanes_both: 0; }
     1720way[is_prop_set(ok)][!lanes][!"lanes:forward"]["lanes:backward"][!"lanes:both_ways"][prop(oneway_type)=(-1)]
     1721        { lanes_all: prop(lanes_bwd); lanes_fwd: 0; lanes_both: 0; }
     1722
     1723/* One count besides both_ways is missing  */
     1724way[is_prop_set(ok)][lanes][!"lanes:forward"]["lanes:backward"][!"lanes:both_ways"]
     1725        { lanes_fwd: eval((prop(lanes_all))-(prop(lanes_bwd))); lanes_both: 0; }
     1726way[is_prop_set(ok)][lanes]["lanes:forward"][!"lanes:backward"][!"lanes:both_ways"]
     1727        { lanes_bwd: eval((prop(lanes_all))-(prop(lanes_fwd))); lanes_both: 0;}
     1728way[is_prop_set(ok)][!lanes]["lanes:forward"]["lanes:backward"][!"lanes:both_ways"]
     1729        { lanes_all: eval((prop(lanes_fwd))+(prop(lanes_bwd))); lanes_both: 0; }
     1730
     1731/* One count is missing  */
     1732way[is_prop_set(ok)][lanes]["lanes:forward"]["lanes:backward"][!"lanes:both_ways"]
     1733        { lanes_both: eval((prop(lanes_all))-((prop(lanes_fwd))+(prop(lanes_bwd)))); }
     1734way[is_prop_set(ok)][lanes]["lanes:forward"][!"lanes:backward"]["lanes:both_ways"]
     1735        { lanes_bwd: eval((prop(lanes_all))-((prop(lanes_fwd))+(prop(lanes_both)))); }
     1736way[is_prop_set(ok)][lanes][!"lanes:forward"]["lanes:backward"]["lanes:both_ways"]
     1737        { lanes_fwd: eval((prop(lanes_all))-((prop(lanes_bwd))+(prop(lanes_both)))); }
     1738way[is_prop_set(ok)][!lanes]["lanes:forward"]["lanes:backward"]["lanes:both_ways"]
     1739        { lanes_all: eval((prop(lanes_fwd))+((prop(lanes_bwd))+(prop(lanes_both)))); }
     1740
     1741/* Only the lanes tag is set */
     1742way[is_prop_set(ok)][prop(oneway_type)=0][lanes][!"lanes:backward"][!"lanes:both_ways"][!"lanes:forward"]
     1743{
     1744
     1745    lanes_fwd:  eval(max(1,floor(tag(lanes)/2)));
     1746    lanes_bwd:  eval(floor(tag(lanes)/2));
     1747    lanes_both: eval((prop(lanes_all))-(prop(lanes_fwd))-(prop(lanes_bwd)));
     1748}
     1749
     1750/* Safety check and adding lanes for "non-motorized or non-general traffic" */
     1751way[is_prop_set(ok)]
     1752{
     1753    /* Check for errors */
     1754    data_error: eval(((prop(tag_lanes_all_max)>0) && (prop(tag_lanes_all_min)<prop(tag_lanes_all_max)))?"Inconsistent <tag>:lanes":prop(data_error));
     1755    data_error: eval(((prop(tag_lanes_fwd_max)>0) && (prop(tag_lanes_fwd_min)<prop(tag_lanes_fwd_max)))?"Inconsistent <tag>:lanes:forward":prop(data_error));
     1756    data_error: eval(((prop(tag_lanes_bwd_max)>0) && (prop(tag_lanes_bwd_min)<prop(tag_lanes_bwd_max)))?"Inconsistent <tag>:lanes:backward":prop(data_error));
     1757    data_error: eval(((prop(tag_lanes_both_max)>0) && (prop(tag_lanes_both_min)<prop(tag_lanes_both_max)))?"Inconsistent <tag>:lanes:both_ways":prop(data_error));
     1758
     1759    /* Safety check */
     1760    lanes_fwd: eval(cond((prop(lanes_fwd)<0),0,prop(lanes_fwd)));
     1761    lanes_bwd: eval(cond((prop(lanes_bwd)<0),0,prop(lanes_bwd)));
     1762    lanes_both: eval(cond((prop(lanes_both)<0),0,prop(lanes_both)));
     1763
     1764    /* In case of one-ways treat the number of all lanes as number of forward/backward lanes */
     1765    tag_lanes_fwd_min: eval((prop(oneway_type)=1)?min(prop(tag_lanes_all_min),prop(tag_lanes_fwd_min)):prop(tag_lanes_fwd_min));
     1766    tag_lanes_fwd_max: eval((prop(oneway_type)=1)?max(prop(tag_lanes_all_max),prop(tag_lanes_fwd_max)):prop(tag_lanes_fwd_max));
     1767    tag_lanes_bwd_min: eval((prop(oneway_type)=(-1))?min(prop(tag_lanes_all_min),prop(tag_lanes_bwd_min)):prop(tag_lanes_bwd_min));
     1768    tag_lanes_bwd_max: eval((prop(oneway_type)=(-1))?max(prop(tag_lanes_all_max),prop(tag_lanes_bwd_max)):prop(tag_lanes_bwd_max));
     1769
     1770    /* Difference to the lane count specified by :lanes-tags */
     1771    temp_add_fwd:  eval(max(0,prop(tag_lanes_fwd_max)-prop(lanes_fwd)));
     1772    temp_add_bwd:  eval(max(0,prop(tag_lanes_bwd_max)-prop(lanes_bwd)));
     1773    temp_add_both: eval(max(0,prop(tag_lanes_both_max)-prop(lanes_both)));
     1774
     1775    /* Add the difference */
     1776    lanes_fwd: eval(prop(lanes_fwd)+prop(temp_add_fwd));
     1777    lanes_bwd: eval(prop(lanes_bwd)+prop(temp_add_bwd));
     1778    lanes_both: eval(prop(lanes_both)+prop(temp_add_both));
     1779
     1780    /* Number of all lanes */
     1781    lanes_all: eval(max(1,((prop(lanes_fwd)+prop(lanes_bwd))+prop(lanes_both))));
     1782
     1783    /* Check for some more errors */
     1784    data_error: eval(((prop(tag_lanes_all_max)>0) && (prop(tag_lanes_all_min)<prop(lanes_all)))?"Missing <tag>:lanes values values":prop(data_error));
     1785    data_error: eval(((prop(tag_lanes_fwd_max)>0) && (prop(tag_lanes_fwd_min)<prop(lanes_fwd)))?"Missing <tag>:lanes:forward values":prop(data_error));
     1786    data_error: eval(((prop(tag_lanes_bwd_max)>0) && (prop(tag_lanes_bwd_min)<prop(lanes_bwd)))?"Missing <tag>:lanes:backward values":prop(data_error));
     1787    data_error: eval(((prop(tag_lanes_both_max)>0) && (prop(tag_lanes_both_min)<prop(lanes_both)))?"Missing <tag>:lanes:both_ways values":prop(data_error));
     1788}
     1789
     1790
     1791/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1792/* Determine the width of the lanes, road markings and the inner lane width                                                                        */
     1793/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1794way|z17[is_prop_set(ok)]
     1795{
     1796    lane_min_width: 4;
     1797    lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default")))));
     1798    change_allowed: list(6,9);
     1799    road_marking_width: 1;
     1800    road_marking_space: 0;
     1801}
     1802
     1803way|z18[is_prop_set(ok)]
     1804{
     1805    lane_min_width: 8;
     1806    lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default")))));
     1807    change_allowed: list(12,18);
     1808    road_marking_width: 2;
     1809    road_marking_space: 1;
     1810}
     1811
     1812way|z19[is_prop_set(ok)]
     1813{
     1814    lane_min_width: 8;
     1815    lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default")))));
     1816    change_allowed: list(24,36);
     1817    road_marking_width: 2;
     1818    road_marking_space: 1;
     1819}
     1820
     1821way|z20[is_prop_set(ok)]
     1822{
     1823    lane_min_width: 8;
     1824    lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default")))));
     1825    change_allowed: list(48,72);
     1826    road_marking_width: 2;
     1827    road_marking_space: 2;
     1828}
     1829
     1830way|z21-[is_prop_set(ok)]
     1831{
     1832    lane_min_width: 12;
     1833    lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default")))));
     1834    change_allowed: list(96,144);
     1835    road_marking_width: 4;
     1836    road_marking_space: 3;
     1837}
     1838
     1839way|z22-[is_prop_set(ok)]
     1840{
     1841    lane_min_width: 20;
     1842    lane_default_width: eval(max(prop(lane_min_width),(has_tag_key(width)?((prop(pixel_per_metre,"default")*tag(width))/prop(lanes_all)):(3*prop(pixel_per_metre,"default")))));
     1843    change_allowed: list(192,288);
     1844    road_marking_width: 6;
     1845    road_marking_space: 4;
     1846}
     1847
     1848/* Zoom indepedent variables and helpers */
     1849way|z17-[is_prop_set(ok)]
     1850{
     1851    lane_casing:  eval((2*prop(road_marking_width))+prop(road_marking_space));
     1852    change_forbidden: 0;
     1853    change_border: eval((has_tag_key("placement") && (tag("placement")="transition"))?list(1,2):prop(change_forbidden));
     1854}
     1855
     1856/***************************************************************************************************************************************************/
     1857/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1858/* Cleanup of allowed lane changes                                                                                                                 */
     1859/* This must be done AFTER the determination of the lanes count                                                                                    */
     1860/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1861/***************************************************************************************************************************************************/
     1862way|z17-[is_prop_set(ok)]
     1863{
     1864    change_forward_1_right:  eval(prop(change_forward_1_right)?prop(change_allowed):prop(change_forbidden));
     1865    change_forward_1_left:   eval(prop(change_forward_1_left)?prop(change_allowed):prop(change_forbidden));
     1866    change_forward_2_right:  eval(prop(change_forward_2_right)?prop(change_allowed):prop(change_forbidden));
     1867    change_forward_2_left:   eval(prop(change_forward_2_left)?prop(change_allowed):prop(change_forbidden));
     1868    change_forward_3_right:  eval(prop(change_forward_3_right)?prop(change_allowed):prop(change_forbidden));
     1869    change_forward_3_left:   eval(prop(change_forward_3_left)?prop(change_allowed):prop(change_forbidden));
     1870    change_forward_4_right:  eval(prop(change_forward_4_right)?prop(change_allowed):prop(change_forbidden));
     1871    change_forward_4_left:   eval(prop(change_forward_4_left)?prop(change_allowed):prop(change_forbidden));
     1872    change_forward_5_right:  eval(prop(change_forward_5_right)?prop(change_allowed):prop(change_forbidden));
     1873    change_forward_5_left:   eval(prop(change_forward_5_left)?prop(change_allowed):prop(change_forbidden));
     1874    change_forward_6_right:  eval(prop(change_forward_6_right)?prop(change_allowed):prop(change_forbidden));
     1875    change_forward_6_left:   eval(prop(change_forward_6_left)?prop(change_allowed):prop(change_forbidden));
     1876    change_forward_7_right:  eval(prop(change_forward_7_right)?prop(change_allowed):prop(change_forbidden));
     1877    change_forward_7_left:   eval(prop(change_forward_7_left)?prop(change_allowed):prop(change_forbidden));
     1878    change_forward_8_right:  eval(prop(change_forward_8_right)?prop(change_allowed):prop(change_forbidden));
     1879    change_forward_8_left:   eval(prop(change_forward_8_left)?prop(change_allowed):prop(change_forbidden));
     1880
     1881    change_backward_1_right:  eval(prop(change_backward_1_right)?prop(change_allowed):prop(change_forbidden));
     1882    change_backward_1_left:   eval(prop(change_backward_1_left)?prop(change_allowed):prop(change_forbidden));
     1883    change_backward_2_right:  eval(prop(change_backward_2_right)?prop(change_allowed):prop(change_forbidden));
     1884    change_backward_2_left:   eval(prop(change_backward_2_left)?prop(change_allowed):prop(change_forbidden));
     1885    change_backward_3_right:  eval(prop(change_backward_3_right)?prop(change_allowed):prop(change_forbidden));
     1886    change_backward_3_left:   eval(prop(change_backward_3_left)?prop(change_allowed):prop(change_forbidden));
     1887    change_backward_4_right:  eval(prop(change_backward_4_right)?prop(change_allowed):prop(change_forbidden));
     1888    change_backward_4_left:   eval(prop(change_backward_4_left)?prop(change_allowed):prop(change_forbidden));
     1889    change_backward_5_right:  eval(prop(change_backward_5_right)?prop(change_allowed):prop(change_forbidden));
     1890    change_backward_5_left:   eval(prop(change_backward_5_left)?prop(change_allowed):prop(change_forbidden));
     1891    change_backward_6_right:  eval(prop(change_backward_6_right)?prop(change_allowed):prop(change_forbidden));
     1892    change_backward_6_left:   eval(prop(change_backward_6_left)?prop(change_allowed):prop(change_forbidden));
     1893    change_backward_7_right:  eval(prop(change_backward_7_right)?prop(change_allowed):prop(change_forbidden));
     1894    change_backward_7_left:   eval(prop(change_backward_7_left)?prop(change_allowed):prop(change_forbidden));
     1895    change_backward_8_right:  eval(prop(change_backward_8_right)?prop(change_allowed):prop(change_forbidden));
     1896    change_backward_8_left:   eval(prop(change_backward_8_left)?prop(change_allowed):prop(change_forbidden));
     1897
     1898    change_bothways_1_right:  eval(prop(change_bothways_1_right)?prop(change_allowed):prop(change_forbidden));
     1899    change_bothways_1_left:   eval(prop(change_bothways_1_left)?prop(change_allowed):prop(change_forbidden));
     1900    change_bothways_2_right:  eval(prop(change_bothways_2_right)?prop(change_allowed):prop(change_forbidden));
     1901    change_bothways_2_left:   eval(prop(change_bothways_2_left)?prop(change_allowed):prop(change_forbidden));
     1902    change_bothways_3_right:  eval(prop(change_bothways_3_right)?prop(change_allowed):prop(change_forbidden));
     1903    change_bothways_3_left:   eval(prop(change_bothways_3_left)?prop(change_allowed):prop(change_forbidden));
     1904    change_bothways_4_right:  eval(prop(change_bothways_4_right)?prop(change_allowed):prop(change_forbidden));
     1905    change_bothways_4_left:   eval(prop(change_bothways_4_left)?prop(change_allowed):prop(change_forbidden));
     1906
     1907    /* If two adjacent road markings would look the same, remove one  */
     1908    change_forward_1_right:  eval(cond((prop(lanes_fwd)>1) && (prop(change_forward_2_left)=prop(change_forward_1_right)),list(0.1,999999),prop(change_forward_1_right)));
     1909    change_forward_2_right:  eval(cond((prop(lanes_fwd)>2) && (prop(change_forward_3_left)=prop(change_forward_2_right)),list(0.1,999999),prop(change_forward_2_right)));
     1910    change_forward_3_right:  eval(cond((prop(lanes_fwd)>3) && (prop(change_forward_4_left)=prop(change_forward_3_right)),list(0.1,999999),prop(change_forward_3_right)));
     1911    change_forward_4_right:  eval(cond((prop(lanes_fwd)>4) && (prop(change_forward_5_left)=prop(change_forward_4_right)),list(0.1,999999),prop(change_forward_4_right)));
     1912    change_forward_5_right:  eval(cond((prop(lanes_fwd)>5) && (prop(change_forward_6_left)=prop(change_forward_5_right)),list(0.1,999999),prop(change_forward_5_right)));
     1913    change_forward_6_right:  eval(cond((prop(lanes_fwd)>6) && (prop(change_forward_7_left)=prop(change_forward_6_right)),list(0.1,999999),prop(change_forward_6_right)));
     1914    change_forward_7_right:  eval(cond((prop(lanes_fwd)>7) && (prop(change_forward_8_left)=prop(change_forward_7_right)),list(0.1,999999),prop(change_forward_7_right)));
     1915
     1916    change_backward_2_left:  eval(cond((prop(lanes_bwd)>1) && (prop(change_backward_1_right)=prop(change_backward_2_left)),list(0.1,999999),prop(change_backward_2_left)));
     1917    change_backward_3_left:  eval(cond((prop(lanes_bwd)>2) && (prop(change_backward_2_right)=prop(change_backward_3_left)),list(0.1,999999),prop(change_backward_3_left)));
     1918    change_backward_4_left:  eval(cond((prop(lanes_bwd)>3) && (prop(change_backward_3_right)=prop(change_backward_4_left)),list(0.1,999999),prop(change_backward_4_left)));
     1919    change_backward_5_left:  eval(cond((prop(lanes_bwd)>4) && (prop(change_backward_4_right)=prop(change_backward_5_left)),list(0.1,999999),prop(change_backward_5_left)));
     1920    change_backward_6_left:  eval(cond((prop(lanes_bwd)>5) && (prop(change_backward_5_right)=prop(change_backward_6_left)),list(0.1,999999),prop(change_backward_6_left)));
     1921    change_backward_7_left:  eval(cond((prop(lanes_bwd)>6) && (prop(change_backward_6_right)=prop(change_backward_7_left)),list(0.1,999999),prop(change_backward_7_left)));
     1922    change_backward_8_left:  eval(cond((prop(lanes_bwd)>7) && (prop(change_backward_7_right)=prop(change_backward_8_left)),list(0.1,999999),prop(change_backward_8_left)));
     1923
     1924    change_bothways_1_right:  eval(cond((prop(lanes_fwd)>1) && (prop(change_bothways_2_left)=prop(change_bothways_1_right)),list(0.1,999999),prop(change_bothways_1_right)));
     1925    change_bothways_2_right:  eval(cond((prop(lanes_fwd)>2) && (prop(change_bothways_3_left)=prop(change_bothways_2_right)),list(0.1,999999),prop(change_bothways_2_right)));
     1926    change_bothways_3_right:  eval(cond((prop(lanes_fwd)>3) && (prop(change_bothways_4_left)=prop(change_bothways_3_right)),list(0.1,999999),prop(change_bothways_3_right)));
     1927}
     1928
     1929/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1930/* Make the borders always solid                                                                                                                   */
     1931/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1932way|z17-[is_prop_set(ok)][prop(style_right_hand_traffic)]
     1933{
     1934    change_forward_1_left:  eval(((prop(oneway_type)=1) || (prop(lanes_all)=1))?prop(change_border):prop(change_forward_1_left));
     1935    change_backward_1_left: eval((prop(oneway_type)=(-1))?prop(change_border):prop(change_backward_1_left));
     1936}
     1937way|z17-[is_prop_set(ok)][!prop(style_right_hand_traffic)]
     1938{
     1939    change_forward_1_left:  prop(change_border);
     1940    change_backward_1_left: prop(change_border);
     1941    change_forward_1_right:  eval((prop(lanes_all)=1)?prop(change_border):prop(change_forward_1_right));
     1942}
     1943way|z17-[is_prop_set(ok)][prop(style_right_hand_traffic)],
     1944way|z17-[is_prop_set(ok)][!prop(style_right_hand_traffic)][prop(oneway_type)=1]
     1945{
     1946    change_forward_1_right: eval((prop(lanes_fwd)=1)?prop(change_border):prop(change_forward_1_right)); 
     1947    change_forward_2_right: eval((prop(lanes_fwd)=2)?prop(change_border):prop(change_forward_2_right)); 
     1948    change_forward_3_right: eval((prop(lanes_fwd)=3)?prop(change_border):prop(change_forward_3_right)); 
     1949    change_forward_4_right: eval((prop(lanes_fwd)=4)?prop(change_border):prop(change_forward_4_right)); 
     1950    change_forward_5_right: eval((prop(lanes_fwd)=5)?prop(change_border):prop(change_forward_5_right)); 
     1951    change_forward_6_right: eval((prop(lanes_fwd)=6)?prop(change_border):prop(change_forward_6_right)); 
     1952    change_forward_7_right: eval((prop(lanes_fwd)=7)?prop(change_border):prop(change_forward_7_right)); 
     1953    change_forward_8_right: eval((prop(lanes_fwd)=8)?prop(change_border):prop(change_forward_8_right)); 
     1954}
     1955way|z17-[is_prop_set(ok)][prop(style_right_hand_traffic)],
     1956way|z17-[is_prop_set(ok)][!prop(style_right_hand_traffic)][prop(oneway_type)=(-1)]
     1957{
     1958    change_backward_1_right: eval((prop(lanes_bwd)=1)?prop(change_border):prop(change_backward_1_right)); 
     1959    change_backward_2_right: eval((prop(lanes_bwd)=2)?prop(change_border):prop(change_backward_2_right)); 
     1960    change_backward_3_right: eval((prop(lanes_bwd)=3)?prop(change_border):prop(change_backward_3_right)); 
     1961    change_backward_4_right: eval((prop(lanes_bwd)=4)?prop(change_border):prop(change_backward_4_right)); 
     1962    change_backward_5_right: eval((prop(lanes_bwd)=5)?prop(change_border):prop(change_backward_5_right)); 
     1963    change_backward_6_right: eval((prop(lanes_bwd)=6)?prop(change_border):prop(change_backward_6_right)); 
     1964    change_backward_7_right: eval((prop(lanes_bwd)=7)?prop(change_border):prop(change_backward_7_right)); 
     1965    change_backward_8_right: eval((prop(lanes_bwd)=8)?prop(change_border):prop(change_backward_8_right)); 
     1966}
     1967
     1968/***************************************************************************************************************************************************/
     1969/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1970/* Splitting the list of signs into separate properties                                                                                            */
     1971/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1972/***************************************************************************************************************************************************/
     1973way[!(prop(sign_forward_1)="")] { t: eval(split(";",prop(sign_forward_1))); sign_1_forward_1: eval(get(prop(t),1)); sign_2_forward_1: eval(get(prop(t),2)); sign_3_forward_1: eval(get(prop(t),3)); }
     1974way[!(prop(sign_forward_2)="")] { t: eval(split(";",prop(sign_forward_2))); sign_1_forward_2: eval(get(prop(t),1)); sign_2_forward_2: eval(get(prop(t),2)); sign_3_forward_2: eval(get(prop(t),3)); }
     1975way[!(prop(sign_forward_3)="")] { t: eval(split(";",prop(sign_forward_3))); sign_1_forward_3: eval(get(prop(t),1)); sign_2_forward_3: eval(get(prop(t),2)); sign_3_forward_3: eval(get(prop(t),3)); }
     1976way[!(prop(sign_forward_4)="")] { t: eval(split(";",prop(sign_forward_4))); sign_1_forward_4: eval(get(prop(t),1)); sign_2_forward_4: eval(get(prop(t),2)); sign_3_forward_4: eval(get(prop(t),3)); }
     1977way[!(prop(sign_forward_5)="")] { t: eval(split(";",prop(sign_forward_5))); sign_1_forward_5: eval(get(prop(t),1)); sign_2_forward_5: eval(get(prop(t),2)); sign_3_forward_5: eval(get(prop(t),3)); }
     1978way[!(prop(sign_forward_6)="")] { t: eval(split(";",prop(sign_forward_6))); sign_1_forward_6: eval(get(prop(t),1)); sign_2_forward_6: eval(get(prop(t),2)); sign_3_forward_6: eval(get(prop(t),3)); }
     1979way[!(prop(sign_forward_7)="")] { t: eval(split(";",prop(sign_forward_7))); sign_1_forward_7: eval(get(prop(t),1)); sign_2_forward_7: eval(get(prop(t),2)); sign_3_forward_7: eval(get(prop(t),3)); }
     1980way[!(prop(sign_forward_7)="")] { t: eval(split(";",prop(sign_forward_8))); sign_1_forward_8: eval(get(prop(t),1)); sign_2_forward_8: eval(get(prop(t),2)); sign_3_forward_8: eval(get(prop(t),3)); }
     1981
     1982way[!(prop(sign_backward_1)="")] { t: eval(split(";",prop(sign_backward_1))); sign_1_backward_1: eval(get(prop(t),1)); sign_2_backward_1: eval(get(prop(t),2)); sign_3_backward_1: eval(get(prop(t),3)); }
     1983way[!(prop(sign_backward_2)="")] { t: eval(split(";",prop(sign_backward_2))); sign_1_backward_2: eval(get(prop(t),1)); sign_2_backward_2: eval(get(prop(t),2)); sign_3_backward_2: eval(get(prop(t),3)); }
     1984way[!(prop(sign_backward_3)="")] { t: eval(split(";",prop(sign_backward_3))); sign_1_backward_3: eval(get(prop(t),1)); sign_2_backward_3: eval(get(prop(t),2)); sign_3_backward_3: eval(get(prop(t),3)); }
     1985way[!(prop(sign_backward_4)="")] { t: eval(split(";",prop(sign_backward_4))); sign_1_backward_4: eval(get(prop(t),1)); sign_2_backward_4: eval(get(prop(t),2)); sign_3_backward_4: eval(get(prop(t),3)); }
     1986way[!(prop(sign_backward_5)="")] { t: eval(split(";",prop(sign_backward_5))); sign_1_backward_5: eval(get(prop(t),1)); sign_2_backward_5: eval(get(prop(t),2)); sign_3_backward_5: eval(get(prop(t),3)); }
     1987way[!(prop(sign_backward_6)="")] { t: eval(split(";",prop(sign_backward_6))); sign_1_backward_6: eval(get(prop(t),1)); sign_2_backward_6: eval(get(prop(t),2)); sign_3_backward_6: eval(get(prop(t),3)); }
     1988way[!(prop(sign_backward_7)="")] { t: eval(split(";",prop(sign_backward_7))); sign_1_backward_7: eval(get(prop(t),1)); sign_2_backward_7: eval(get(prop(t),2)); sign_3_backward_7: eval(get(prop(t),3)); }
     1989way[!(prop(sign_backward_7)="")] { t: eval(split(";",prop(sign_backward_8))); sign_1_backward_8: eval(get(prop(t),1)); sign_2_backward_8: eval(get(prop(t),2)); sign_3_backward_8: eval(get(prop(t),3)); }
     1990
     1991
     1992/***************************************************************************************************************************************************/
     1993/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1994/* Lane-dependent width                                                                                                                            */
     1995/* This must be done AFTER the determination of the lanes count                                                                                    */
     1996/* Note: the number of values is calcuated BEFORE the determination of the lanes count                                                             */
     1997/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     1998/***************************************************************************************************************************************************/
     1999way|z17-[is_prop_set(ok)]
     2000{
     2001    lane_width_forward_1: eval(prop(lane_default_width));    lane_width_forward_2: eval(prop(lane_default_width));
     2002    lane_width_forward_3: eval(prop(lane_default_width));    lane_width_forward_4: eval(prop(lane_default_width));
     2003    lane_width_forward_5: eval(prop(lane_default_width));    lane_width_forward_6: eval(prop(lane_default_width));
     2004    lane_width_forward_7: eval(prop(lane_default_width));    lane_width_forward_8: eval(prop(lane_default_width));
     2005
     2006    lane_width_backward_1: eval(prop(lane_default_width));    lane_width_backward_2: eval(prop(lane_default_width));
     2007    lane_width_backward_3: eval(prop(lane_default_width));    lane_width_backward_4: eval(prop(lane_default_width));
     2008    lane_width_backward_5: eval(prop(lane_default_width));    lane_width_backward_6: eval(prop(lane_default_width));
     2009    lane_width_backward_7: eval(prop(lane_default_width));    lane_width_backward_8: eval(prop(lane_default_width));
     2010
     2011    lane_width_bothways_1: eval(prop(lane_default_width));    lane_width_bothways_2: eval(prop(lane_default_width));
     2012    lane_width_bothways_3: eval(prop(lane_default_width));    lane_width_bothways_4: eval(prop(lane_default_width));
     2013}
     2014
     2015/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2016/* Forward lanes                                                                                                                                   */
     2017/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2018way|z17-[is_prop_set(ok)]["width:lanes:forward"],
     2019way|z17-[is_prop_set(ok)]["width:lanes"][prop(oneway_type)=1]
     2020{
     2021    temp: eval(cond(has_tag_key("width:lanes:forward"),tag("width:lanes:forward"),tag("width:lanes")));
     2022    temp_list: eval(split("|",prop(temp)));
     2023    temp_length: eval(length(prop(temp_list)));
     2024
     2025    lane_width_forward_1: eval(((prop(temp_length)>0) && (get(prop(temp_list),0)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),0)))):prop(lane_default_width));
     2026    lane_width_forward_2: eval(((prop(temp_length)>1) && (get(prop(temp_list),1)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),1)))):prop(lane_default_width));
     2027    lane_width_forward_3: eval(((prop(temp_length)>2) && (get(prop(temp_list),2)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),2)))):prop(lane_default_width));
     2028    lane_width_forward_4: eval(((prop(temp_length)>3) && (get(prop(temp_list),3)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),3)))):prop(lane_default_width));
     2029    lane_width_forward_5: eval(((prop(temp_length)>4) && (get(prop(temp_list),4)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),4)))):prop(lane_default_width));
     2030    lane_width_forward_6: eval(((prop(temp_length)>5) && (get(prop(temp_list),5)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),5)))):prop(lane_default_width));
     2031    lane_width_forward_7: eval(((prop(temp_length)>6) && (get(prop(temp_list),6)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),6)))):prop(lane_default_width));
     2032    lane_width_forward_8: eval(((prop(temp_length)>7) && (get(prop(temp_list),7)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),7)))):prop(lane_default_width));
     2033}
     2034
     2035/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2036/* Backward lanes                                                                                                                                  */
     2037/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2038way|z17-[is_prop_set(ok)]["width:lanes:backward"],
     2039way|z17-[is_prop_set(ok)]["width:lanes"][prop(oneway_type)=(-1)]
     2040{
     2041    temp: eval(cond(has_tag_key("width:lanes:backward"),tag("width:lanes:backward"),tag("width:lanes")));
     2042    temp_list: eval(split("|",prop(temp)));
     2043    temp_length: eval(length(prop(temp_list)));
     2044
     2045    lane_width_backward_1: eval(((prop(temp_length)>0) && (get(prop(temp_list),0)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),0)))):prop(lane_default_width));
     2046    lane_width_backward_2: eval(((prop(temp_length)>1) && (get(prop(temp_list),1)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),1)))):prop(lane_default_width));
     2047    lane_width_backward_3: eval(((prop(temp_length)>2) && (get(prop(temp_list),2)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),2)))):prop(lane_default_width));
     2048    lane_width_backward_4: eval(((prop(temp_length)>3) && (get(prop(temp_list),3)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),3)))):prop(lane_default_width));
     2049    lane_width_backward_5: eval(((prop(temp_length)>4) && (get(prop(temp_list),4)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),4)))):prop(lane_default_width));
     2050    lane_width_backward_6: eval(((prop(temp_length)>5) && (get(prop(temp_list),5)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),5)))):prop(lane_default_width));
     2051    lane_width_backward_7: eval(((prop(temp_length)>6) && (get(prop(temp_list),6)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),6)))):prop(lane_default_width));
     2052    lane_width_backward_8: eval(((prop(temp_length)>7) && (get(prop(temp_list),7)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),7)))):prop(lane_default_width));
     2053}
     2054
     2055/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2056/* Bothways lanes                                                                                                                                  */
     2057/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2058way|z17-[is_prop_set(ok)]["width:lanes:both_ways"]
     2059{
     2060    temp: eval(tag("width:lanes:both_ways"));
     2061    temp_list: eval(split("|",prop(temp)));
     2062    temp_length: eval(length(prop(temp_list)));
     2063
     2064    lane_width_bothways_1: eval(((prop(temp_length)>0) && (get(prop(temp_list),0)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),0)))):prop(lane_default_width));
     2065    lane_width_bothways_2: eval(((prop(temp_length)>1) && (get(prop(temp_list),1)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),1)))):prop(lane_default_width));
     2066    lane_width_bothways_3: eval(((prop(temp_length)>2) && (get(prop(temp_list),2)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),2)))):prop(lane_default_width));
     2067    lane_width_bothways_4: eval(((prop(temp_length)>3) && (get(prop(temp_list),3)>0))?(max(prop(lane_min_width),(prop(pixel_per_metre)*get(prop(temp_list),3)))):prop(lane_default_width));
     2068}
     2069
     2070way|z17-[is_prop_set(ok)]
     2071{
     2072    lane_width_all_forward: eval(
     2073                                    ((prop(lanes_fwd)>0)?prop(lane_width_forward_1):0)+
     2074                                    ((prop(lanes_fwd)>1)?prop(lane_width_forward_2):0)+
     2075                                    ((prop(lanes_fwd)>2)?prop(lane_width_forward_3):0)+
     2076                                    ((prop(lanes_fwd)>3)?prop(lane_width_forward_4):0)+
     2077                                    ((prop(lanes_fwd)>4)?prop(lane_width_forward_5):0)+
     2078                                    ((prop(lanes_fwd)>5)?prop(lane_width_forward_6):0)+
     2079                                    ((prop(lanes_fwd)>6)?prop(lane_width_forward_7):0)+
     2080                                    ((prop(lanes_fwd)>7)?prop(lane_width_forward_8):0)
     2081                                );
     2082
     2083    lane_width_all_backward: eval(
     2084                                    ((prop(lanes_bwd)>0)?prop(lane_width_backward_1):0)+
     2085                                    ((prop(lanes_bwd)>1)?prop(lane_width_backward_2):0)+
     2086                                    ((prop(lanes_bwd)>2)?prop(lane_width_backward_3):0)+
     2087                                    ((prop(lanes_bwd)>3)?prop(lane_width_backward_4):0)+
     2088                                    ((prop(lanes_bwd)>4)?prop(lane_width_backward_5):0)+
     2089                                    ((prop(lanes_bwd)>5)?prop(lane_width_backward_6):0)+
     2090                                    ((prop(lanes_bwd)>6)?prop(lane_width_backward_7):0)+
     2091                                    ((prop(lanes_bwd)>7)?prop(lane_width_backward_8):0)
     2092                                );
     2093
     2094    lane_width_all_bothways: eval(
     2095                                    ((prop(lanes_both)>0)?prop(lane_width_bothways_1):0)+
     2096                                    ((prop(lanes_both)>1)?prop(lane_width_bothways_2):0)+
     2097                                    ((prop(lanes_both)>2)?prop(lane_width_bothways_3):0)+
     2098                                    ((prop(lanes_both)>3)?prop(lane_width_bothways_4):0)
     2099                                );
     2100
     2101    lane_width_all: eval((prop(lane_width_all_forward)+prop(lane_width_all_backward))+prop(lane_width_all_bothways));
     2102}
     2103
     2104/***************************************************************************************************************************************************/
     2105/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2106/* Offset of the road given by the placement tag                                                                                                   */
     2107/* It is assumed that only one of the placement tags is set, otherwise the result will most certainly be incorrect                                 */
     2108/* TODO: placement:both_ways is currently not supported, verify support for left-hand-traffic                                                      */
     2109/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2110/***************************************************************************************************************************************************/
     2111/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2112/* Error checking                                                                                                                                  */
     2113/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2114way["placement"]
     2115{
     2116    data_error: eval(regexp_test("^(transition|middle_of:[0-9]+|right_of:[0-9]+|left_of:[0-9]+)$",tag("placement"))?prop(data_error):"invalid placement value");
     2117}
     2118way["placement:forward"]
     2119{
     2120    data_error: eval(regexp_test("^(transition|middle_of:[0-9]+|right_of:[0-9]+|left_of:[0-9]+)$",tag("placement:forward"))?prop(data_error):"invalid placement:forward value");
     2121}
     2122way["placement:backward"]
     2123{
     2124    data_error: eval(regexp_test("^(transition|middle_of:[0-9]+|right_of:[0-9]+|left_of:[0-9]+)$",tag("placement:backward"))?prop(data_error):"invalid placement:backward value");
     2125}
     2126way["placement"]["placement:forward"], way["placement"]["placement:backward"], way["placement:forward"]["placement:backward"]
     2127{
     2128    data_error: eval("multiple placement tags");
     2129}
     2130
     2131/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2132/* 1. Calculate the borders without consideration of placement                                                                                     */
     2133/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2134way[is_prop_set(ok)]
     2135{
     2136    /* Determine the borders of the parts of the carriageway assuming no placement was specified */
     2137    placement_offset: 0;
     2138    placement_transition: eval(has_tag_key("placement") && (tag("placement")="transition"));
     2139    left_carriageway_border: eval(prop(lane_width_all)/2.0);
     2140    left_forward_border: eval(cond(prop(style_right_hand_traffic),
     2141                                   (prop(left_carriageway_border) - (prop(lane_width_all_backward)+prop(lane_width_all_bothways))),
     2142                                   prop(left_carriageway_border)
     2143                                  )
     2144                             );
     2145    right_backward_border: eval(cond(prop(style_right_hand_traffic),
     2146                                     (prop(left_carriageway_border) - prop(lane_width_all_backward)),
     2147                                     (prop(left_carriageway_border) - prop(lane_width_all))
     2148                                    )
     2149                               );
     2150    left_bothways_border: eval(cond(prop(style_right_hand_traffic),
     2151                                    (prop(left_carriageway_border) - prop(lane_width_all_backward)),
     2152                                    (prop(left_carriageway_border) - prop(lane_width_all_forward))
     2153                                   )
     2154                              );
     2155}
     2156
     2157/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2158/* 2.a. Offset of the forward lanes                                                                                                                */
     2159/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2160way|z17-[is_prop_set(ok)]
     2161{
     2162    lane_offset_forward_1: eval(prop(left_forward_border)-
     2163                                (prop(lane_width_forward_1)/2));
     2164    lane_offset_forward_2: eval(prop(lane_offset_forward_1)-
     2165                               ((prop(lane_width_forward_1)+
     2166                                 prop(lane_width_forward_2))/2));
     2167    lane_offset_forward_3: eval(prop(lane_offset_forward_2)-
     2168                               ((prop(lane_width_forward_2)+
     2169                                 prop(lane_width_forward_3))/2));
     2170    lane_offset_forward_4: eval(prop(lane_offset_forward_3)-
     2171                               ((prop(lane_width_forward_3)+
     2172                                 prop(lane_width_forward_4))/2));
     2173    lane_offset_forward_5: eval(prop(lane_offset_forward_4)-
     2174                               ((prop(lane_width_forward_4)+
     2175                                 prop(lane_width_forward_5))/2));
     2176    lane_offset_forward_6: eval(prop(lane_offset_forward_5)-
     2177                               ((prop(lane_width_forward_5)+
     2178                                 prop(lane_width_forward_6))/2));
     2179    lane_offset_forward_7: eval(prop(lane_offset_forward_6)-
     2180                               ((prop(lane_width_forward_6)+
     2181                                 prop(lane_width_forward_7))/2));
     2182    lane_offset_forward_8: eval(prop(lane_offset_forward_7)-
     2183                               ((prop(lane_width_forward_7)+
     2184                                 prop(lane_width_forward_8))/2));
     2185}
     2186
     2187/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2188/* 2.b. Offset of the backward lanes                                                                                                               */
     2189/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2190way|z17-[is_prop_set(ok)]
     2191{
     2192    lane_offset_backward_1: eval(prop(right_backward_border)+
     2193                                 (prop(lane_width_backward_1)/2));
     2194    lane_offset_backward_2: eval(prop(lane_offset_backward_1)+
     2195                                ((prop(lane_width_backward_1)+
     2196                                  prop(lane_width_backward_2))/2));
     2197    lane_offset_backward_3: eval(prop(lane_offset_backward_2)+
     2198                                ((prop(lane_width_backward_2)+
     2199                                  prop(lane_width_backward_3))/2));
     2200    lane_offset_backward_4: eval(prop(lane_offset_backward_3)+
     2201                                ((prop(lane_width_backward_3)+
     2202                                  prop(lane_width_backward_4))/2));
     2203    lane_offset_backward_5: eval(prop(lane_offset_backward_4)+
     2204                                ((prop(lane_width_backward_4)+
     2205                                  prop(lane_width_backward_5))/2));
     2206    lane_offset_backward_6: eval(prop(lane_offset_backward_5)+
     2207                                ((prop(lane_width_backward_5)+
     2208                                  prop(lane_width_backward_6))/2));
     2209    lane_offset_backward_7: eval(prop(lane_offset_backward_6)+
     2210                                ((prop(lane_width_backward_6)+
     2211                                  prop(lane_width_backward_7))/2));
     2212    lane_offset_backward_8: eval(prop(lane_offset_backward_7)+
     2213                                ((prop(lane_width_backward_7)+
     2214                                  prop(lane_width_backward_8))/2));
     2215}
     2216
     2217/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2218/* 2.c. Offset of the both_ways lanes                                                                                                                */
     2219/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2220way|z17-[is_prop_set(ok)]
     2221{
     2222    lane_offset_bothways_1: eval(prop(left_bothways_border)-
     2223                                 (prop(lane_width_bothways_1)/2));
     2224    lane_offset_bothways_2: eval(prop(lane_offset_bothways_1)-
     2225                                ((prop(lane_width_bothways_1)+
     2226                                  prop(lane_width_bothways_2))/2));
     2227    lane_offset_bothways_3: eval(prop(lane_offset_bothways_2)-
     2228                                ((prop(lane_width_bothways_2)+
     2229                                  prop(lane_width_bothways_3))/2));
     2230    lane_offset_bothways_4: eval(prop(lane_offset_bothways_3)-
     2231                                ((prop(lane_width_bothways_3)+
     2232                                  prop(lane_width_bothways_4))/2));
     2233}
     2234
     2235/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2236/* 3. Now determine the offset given by the placement tag                                                                                          */
     2237/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2238way[is_prop_set(ok)]["placement:forward"]["placement:forward"!=transition],
     2239way[is_prop_set(ok)][prop(oneway_type)=1][placement][placement!=transition]
     2240{
     2241    placement_value: eval(has_tag_key("placement")?tag("placement"):tag("placement:forward"));
     2242    placement_offset: eval(
     2243                cond(prop("placement_value")="right_of:1",eval((prop(lane_width_forward_1)/2)-prop(lane_offset_forward_1)),
     2244                cond(prop("placement_value")="right_of:2",eval((prop(lane_width_forward_2)/2)-prop(lane_offset_forward_2)),
     2245                cond(prop("placement_value")="right_of:3",eval((prop(lane_width_forward_3)/2)-prop(lane_offset_forward_3)),
     2246                cond(prop("placement_value")="right_of:4",eval((prop(lane_width_forward_4)/2)-prop(lane_offset_forward_4)),
     2247                cond(prop("placement_value")="right_of:5",eval((prop(lane_width_forward_5)/2)-prop(lane_offset_forward_5)),
     2248                cond(prop("placement_value")="right_of:6",eval((prop(lane_width_forward_6)/2)-prop(lane_offset_forward_6)),
     2249                cond(prop("placement_value")="right_of:7",eval((prop(lane_width_forward_7)/2)-prop(lane_offset_forward_7)),
     2250                cond(prop("placement_value")="right_of:8",eval((prop(lane_width_forward_8)/2)-prop(lane_offset_forward_8)),
     2251                cond(prop("placement_value")="left_of:1",eval(-(prop(lane_offset_forward_1)+(prop(lane_width_forward_1)/2))),
     2252                cond(prop("placement_value")="left_of:2",eval(-(prop(lane_offset_forward_2)+(prop(lane_width_forward_2)/2))),
     2253                cond(prop("placement_value")="left_of:3",eval(-(prop(lane_offset_forward_3)+(prop(lane_width_forward_3)/2))),
     2254                cond(prop("placement_value")="left_of:4",eval(-(prop(lane_offset_forward_4)+(prop(lane_width_forward_4)/2))),
     2255                cond(prop("placement_value")="left_of:5",eval(-(prop(lane_offset_forward_5)+(prop(lane_width_forward_5)/2))),
     2256                cond(prop("placement_value")="left_of:6",eval(-(prop(lane_offset_forward_6)+(prop(lane_width_forward_6)/2))),
     2257                cond(prop("placement_value")="left_of:7",eval(-(prop(lane_offset_forward_7)+(prop(lane_width_forward_7)/2))),
     2258                cond(prop("placement_value")="left_of:8",eval(-(prop(lane_offset_forward_8)+(prop(lane_width_forward_8)/2))),
     2259                cond(prop("placement_value")="middle_of:1",eval(-prop(lane_offset_forward_1)),
     2260                cond(prop("placement_value")="middle_of:2",eval(-prop(lane_offset_forward_2)),
     2261                cond(prop("placement_value")="middle_of:3",eval(-prop(lane_offset_forward_3)),
     2262                cond(prop("placement_value")="middle_of:4",eval(-prop(lane_offset_forward_4)),
     2263                cond(prop("placement_value")="middle_of:5",eval(-prop(lane_offset_forward_5)),
     2264                cond(prop("placement_value")="middle_of:6",eval(-prop(lane_offset_forward_6)),
     2265                cond(prop("placement_value")="middle_of:7",eval(-prop(lane_offset_forward_7)),
     2266                cond(prop("placement_value")="middle_of:8",eval(-prop(lane_offset_forward_8)),
     2267                0
     2268                ))))))))))))))))))))))))
     2269               );
     2270}
     2271way[is_prop_set(ok)]["placement:backward"]["placement:backward"!=transition],
     2272way[is_prop_set(ok)][prop(oneway_type)=(-1)][placement][placement!=transition]
     2273{
     2274    placement_value: eval(has_tag_key("placement")?tag("placement"):tag("placement:backward"));
     2275    placement_offset: eval(
     2276                cond(prop("placement_value")="right_of:1",eval(-(prop(lane_offset_backward_1)+(prop(lane_width_backward_1)/2))),
     2277                cond(prop("placement_value")="right_of:2",eval(-(prop(lane_offset_backward_2)+(prop(lane_width_backward_2)/2))),
     2278                cond(prop("placement_value")="right_of:3",eval(-(prop(lane_offset_backward_3)+(prop(lane_width_backward_3)/2))),
     2279                cond(prop("placement_value")="right_of:4",eval(-(prop(lane_offset_backward_4)+(prop(lane_width_backward_4)/2))),
     2280                cond(prop("placement_value")="right_of:5",eval(-(prop(lane_offset_backward_5)+(prop(lane_width_backward_5)/2))),
     2281                cond(prop("placement_value")="right_of:6",eval(-(prop(lane_offset_backward_6)+(prop(lane_width_backward_6)/2))),
     2282                cond(prop("placement_value")="right_of:7",eval(-(prop(lane_offset_backward_7)+(prop(lane_width_backward_7)/2))),
     2283                cond(prop("placement_value")="right_of:8",eval(-(prop(lane_offset_backward_8)+(prop(lane_width_backward_8)/2))),
     2284                cond(prop("placement_value")="left_of:1",eval((prop(lane_width_backward_1)/2)-prop(lane_offset_backward_1)),
     2285                cond(prop("placement_value")="left_of:2",eval((prop(lane_width_backward_2)/2)-prop(lane_offset_backward_2)),
     2286                cond(prop("placement_value")="left_of:3",eval((prop(lane_width_backward_3)/2)-prop(lane_offset_backward_3)),
     2287                cond(prop("placement_value")="left_of:4",eval((prop(lane_width_backward_4)/2)-prop(lane_offset_backward_4)),
     2288                cond(prop("placement_value")="left_of:5",eval((prop(lane_width_backward_5)/2)-prop(lane_offset_backward_5)),
     2289                cond(prop("placement_value")="left_of:6",eval((prop(lane_width_backward_6)/2)-prop(lane_offset_backward_6)),
     2290                cond(prop("placement_value")="left_of:7",eval((prop(lane_width_backward_7)/2)-prop(lane_offset_backward_7)),
     2291                cond(prop("placement_value")="left_of:8",eval((prop(lane_width_backward_8)/2)-prop(lane_offset_backward_8)),
     2292                cond(prop("placement_value")="middle_of:1",eval(-prop(lane_offset_backward_1)),
     2293                cond(prop("placement_value")="middle_of:2",eval(-prop(lane_offset_backward_2)),
     2294                cond(prop("placement_value")="middle_of:3",eval(-prop(lane_offset_backward_3)),
     2295                cond(prop("placement_value")="middle_of:4",eval(-prop(lane_offset_backward_4)),
     2296                cond(prop("placement_value")="middle_of:5",eval(-prop(lane_offset_backward_5)),
     2297                cond(prop("placement_value")="middle_of:6",eval(-prop(lane_offset_backward_6)),
     2298                cond(prop("placement_value")="middle_of:7",eval(-prop(lane_offset_backward_7)),
     2299                cond(prop("placement_value")="middle_of:8",eval(-prop(lane_offset_backward_8)),
     2300                0
     2301                ))))))))))))))))))))))))
     2302               );
     2303}
     2304way[is_prop_set(ok)]["placement:both_ways"]["placement:both_ways"!=transition]
     2305{
     2306    placement_value: eval(tag("placement:both_ways"));
     2307    placement_offset: eval(
     2308                cond(prop("placement_value")="right_of:1",eval((prop(lane_width_bothways_1)/2)-prop(lane_offset_bothways_1)),
     2309                cond(prop("placement_value")="right_of:2",eval((prop(lane_width_bothways_2)/2)-prop(lane_offset_bothways_2)),
     2310                cond(prop("placement_value")="right_of:3",eval((prop(lane_width_bothways_3)/2)-prop(lane_offset_bothways_3)),
     2311                cond(prop("placement_value")="right_of:4",eval((prop(lane_width_bothways_4)/2)-prop(lane_offset_bothways_4)),
     2312                cond(prop("placement_value")="left_of:1",eval(-(prop(lane_offset_bothways_1)+(prop(lane_width_bothways_1)/2))),
     2313                cond(prop("placement_value")="left_of:2",eval(-(prop(lane_offset_bothways_2)+(prop(lane_width_bothways_2)/2))),
     2314                cond(prop("placement_value")="left_of:3",eval(-(prop(lane_offset_bothways_3)+(prop(lane_width_bothways_3)/2))),
     2315                cond(prop("placement_value")="left_of:4",eval(-(prop(lane_offset_bothways_4)+(prop(lane_width_bothways_4)/2))),
     2316                cond(prop("placement_value")="middle_of:1",eval(-prop(lane_offset_bothways_1)),
     2317                cond(prop("placement_value")="middle_of:2",eval(-prop(lane_offset_bothways_2)),
     2318                cond(prop("placement_value")="middle_of:3",eval(-prop(lane_offset_bothways_3)),
     2319                cond(prop("placement_value")="middle_of:4",eval(-prop(lane_offset_bothways_4)),
     2320                0
     2321                ))))))))))))
     2322               );
     2323}
     2324
     2325/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2326/* 4. Move the carriageway and the lanes                                                                                                           */
     2327/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2328way[is_prop_set(ok)]
     2329{
     2330    /* Move the carriageway borders */
     2331    left_carriageway_border: eval((prop(left_carriageway_border) + prop(placement_offset)));
     2332    left_forward_border: eval((prop(left_forward_border) + prop(placement_offset)));
     2333    right_backward_border: eval((prop(right_backward_border) + prop(placement_offset)));
     2334    left_bothways_border: eval((prop(left_bothways_border) + prop(placement_offset))); 
     2335
     2336    /* Move the lanes */
     2337    lane_offset_forward_1: eval((prop(lane_offset_forward_1) + prop(placement_offset)));
     2338    lane_offset_forward_2: eval((prop(lane_offset_forward_2) + prop(placement_offset)));
     2339    lane_offset_forward_3: eval((prop(lane_offset_forward_3) + prop(placement_offset)));
     2340    lane_offset_forward_4: eval((prop(lane_offset_forward_4) + prop(placement_offset)));
     2341    lane_offset_forward_5: eval((prop(lane_offset_forward_5) + prop(placement_offset)));
     2342    lane_offset_forward_6: eval((prop(lane_offset_forward_6) + prop(placement_offset)));
     2343    lane_offset_forward_7: eval((prop(lane_offset_forward_7) + prop(placement_offset)));
     2344    lane_offset_forward_8: eval((prop(lane_offset_forward_8) + prop(placement_offset)));
     2345    lane_offset_backward_1: eval((prop(lane_offset_backward_1) + prop(placement_offset)));
     2346    lane_offset_backward_2: eval((prop(lane_offset_backward_2) + prop(placement_offset)));
     2347    lane_offset_backward_3: eval((prop(lane_offset_backward_3) + prop(placement_offset)));
     2348    lane_offset_backward_4: eval((prop(lane_offset_backward_4) + prop(placement_offset)));
     2349    lane_offset_backward_5: eval((prop(lane_offset_backward_5) + prop(placement_offset)));
     2350    lane_offset_backward_6: eval((prop(lane_offset_backward_6) + prop(placement_offset)));
     2351    lane_offset_backward_7: eval((prop(lane_offset_backward_7) + prop(placement_offset)));
     2352    lane_offset_backward_8: eval((prop(lane_offset_backward_8) + prop(placement_offset)));
     2353    lane_offset_bothways_1: eval((prop(lane_offset_bothways_1) + prop(placement_offset)));
     2354    lane_offset_bothways_2: eval((prop(lane_offset_bothways_2) + prop(placement_offset)));
     2355    lane_offset_bothways_3: eval((prop(lane_offset_bothways_3) + prop(placement_offset)));
     2356    lane_offset_bothways_4: eval((prop(lane_offset_bothways_4) + prop(placement_offset)));
     2357}
     2358
     2359/***************************************************************************************************************************************************/
     2360/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2361/* Render the carriageway                                                                                                                          */
     2362/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2363/***************************************************************************************************************************************************/
     2364way[is_prop_set(ok, "default")][is_prop_set(lanes_all, "default")]::Ground
     2365{
     2366    linecap: none;
     2367    /* The "ground" will be drawn by each lane, so that we can use different colors per lane */
     2368    opacity: 0.0;
     2369    width:   eval(prop(lane_width_all,"default"));
     2370    offset:  prop(placement_offset,"default");
     2371    major-z-index: -1.0;
     2372}
     2373
     2374/* Sidewalk and cycletrack */
     2375way|z17- {} /* ATTENTION: For whatever reason this is needed, otherwise the following won't be interpreted correctly */
     2376way|z17-[is_prop_set(ok, "default")][is_prop_set(lanes_all, "default")]::Ground
     2377{
     2378    /* Cycletrack in an one-way on the left side? */
     2379    temp_allow_cycleway_left: eval(!(
     2380                                      ((prop(oneway_type,"default")=1) && prop(style_right_hand_traffic,"default")) ||
     2381                                      ((prop(oneway_type,"default")=(-1)) && (!prop(style_right_hand_traffic,"default")))
     2382                                    ));
     2383
     2384    temp_allow_cycleway_left: eval(prop(temp_allow_cycleway_left) || (has_tag_key("oneway:bicycle") && (tag("oneway:bicycle")="no")));
     2385    /* Explicitely no cycletrack on the left side? */
     2386    temp_allow_cycleway_left: eval((has_tag_key("cycleway:left") && (tag("cycleway:left")="no"))?false:prop(temp_allow_cycleway_left));
     2387    /* Cycletrack on the left side */
     2388    temp_cycleway_left: eval(((has_tag_key(cycleway) && ((tag(cycleway)="track") && prop(temp_allow_cycleway_left))) ||
     2389                                (has_tag_key("cycleway:left") && (tag("cycleway:left")="track"))) ||
     2390                                (has_tag_key("cycleway:both") && (tag("cycleway:both")="track"))
     2391                            );
     2392
     2393    /* Sidewalk on the left side? */
     2394    templ:  eval((has_tag_key(sidewalk) && ((tag(sidewalk)="both") || (tag(sidewalk)="left")))?1:0);
     2395
     2396    /* Combine  sidewalk and cycletrack: 0=none; 1=sidewalk; 2=cycletrack; 3=sidewalk and cycletrack */
     2397    templ: eval(prop(templ)+(prop(temp_cycleway_left)?2:0));
     2398
     2399
     2400    /* Cycletrack in an one-way on the right side? */
     2401    temp_allow_cycleway_right: eval(!(
     2402                                      ((prop(oneway_type,"default")=(-1)) && prop(style_right_hand_traffic,"default")) ||
     2403                                      ((prop(oneway_type,"default")=1) && (!prop(style_right_hand_traffic,"default")))
     2404                                    ));
     2405
     2406    temp_allow_cycleway_right: eval(prop(temp_allow_cycleway_right) || (has_tag_key("oneway:bicycle") && (tag("oneway:bicycle")="no")));
     2407    /* Explicitely no cycletrack on the right side? */
     2408    temp_allow_cycleway_right: eval((has_tag_key("cycleway:right") && (tag("cycleway:right")="no"))?false:prop(temp_allow_cycleway_right));
     2409    /* Cycletrack on the right side */
     2410    temp_cycleway_right: eval(((has_tag_key(cycleway) && ((tag(cycleway)="track") && prop(temp_allow_cycleway_right))) ||
     2411                                (has_tag_key("cycleway:right") && (tag("cycleway:right")="track"))) ||
     2412                                (has_tag_key("cycleway:both") && (tag("cycleway:both")="track"))
     2413                            );
     2414
     2415    /* Sidewalk on the right side? */
     2416    tempr:  eval((has_tag_key(sidewalk) && ((tag(sidewalk)="both") || (tag(sidewalk)="right")))?1:0);
     2417
     2418    /* Combine  sidewalk and cycletrack: 0=none; 1=sidewalk; 2=cycletrack; 3=sidewalk and cycletrack */
     2419    tempr: eval(prop(tempr)+(prop(temp_cycleway_right)?2:0));
     2420
     2421
     2422    left-casing-linecap: none;
     2423    left-casing-width: eval((prop(templ)>0)?(prop(lane_default_width,"default")/2):0);
     2424    left-casing-color:  eval(get(prop(style_sidewalk_color,"default"),prop(templ)));
     2425    left-casing-opacity: prop(style_sidewalk_opacity,"default");
     2426
     2427    right-casing-linecap: none;
     2428    right-casing-width: eval((prop(tempr)>0)?(prop(lane_default_width,"default")/2):0);
     2429    right-casing-color:  eval(get(prop(style_sidewalk_color,"default"),prop(tempr)));
     2430    right-casing-opacity: prop(style_sidewalk_opacity,"default");
     2431}
     2432
     2433/***************************************************************************************************************************************************/
     2434/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2435/* Render the lanes                                                                                                                                */
     2436/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2437/***************************************************************************************************************************************************/
     2438/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2439/* Forward lanes                                                                                                                                   */
     2440/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2441way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 0]::Lane_Forward_1
     2442{
     2443    offset:                                          eval(prop(lane_offset_forward_1,"default"));
     2444    width:                                           eval((prop(lane_width_forward_1,"default")-prop(lane_casing,"default")));
     2445    right-casing-dashes:                                  eval(prop(change_forward_1_right,"default"));
     2446    left-casing-dashes:                                   eval(prop(change_forward_1_left,"default"));
     2447    repeat-image:                                     eval(prop(turn_image_forward_1,"default"));
     2448
     2449    opacity: 0.0; linecap: none;
     2450    repeat-image-offset: eval(prop(offset));
     2451    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2452    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2453    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2454    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2455    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2456}
     2457way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 0]::Lane_Forward_1_Color
     2458{
     2459    offset:                                          eval(prop(lane_offset_forward_1,"default"));
     2460    width:                                            eval(prop(lane_width_forward_1,"default"));
     2461    color:                                                      prop(color_forward_1,"default");
     2462    dashes:                              eval(is_prop_set(restriction_color_forward_1,"default")?list(20,20):prop(unset_property));
     2463    dashes-background-color:             eval(is_prop_set(restriction_color_forward_1,"default")?
     2464                                                     prop(restriction_color_forward_1,"default"):prop(unset_property));
     2465    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2466    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2467}
     2468way|z17-[is_prop_set(sign_1_forward_1,     "default")]::Lane_Forward_1_Sign_1
     2469{
     2470    repeat-image:                           eval(prop(sign_1_forward_1,"default"));
     2471    repeat-image-offset:               eval(prop(lane_offset_forward_1,"default"));
     2472    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_1"));
     2473    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2474}
     2475way|z17-[is_prop_set(sign_2_forward_1,     "default")]::Lane_Forward_1_Sign_2
     2476{
     2477    repeat-image:                           eval(prop(sign_2_forward_1,"default"));
     2478    repeat-image-offset:               eval(prop(lane_offset_forward_1,"default"));
     2479    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_1"));
     2480    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2481}
     2482way|z17-[is_prop_set(sign_3_forward_1,     "default")]::Lane_Forward_1_Sign_3
     2483{
     2484    repeat-image:                           eval(prop(sign_3_forward_1,"default"));
     2485    repeat-image-offset:               eval(prop(lane_offset_forward_1,"default"));
     2486    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_1"));
     2487    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2488}
     2489
     2490way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 1]::Lane_Forward_2
     2491{
     2492    offset:                                          eval(prop(lane_offset_forward_2,"default"));
     2493    width:                                           eval((prop(lane_width_forward_2,"default")-prop(lane_casing,"default")));
     2494    right-casing-dashes:                                  eval(prop(change_forward_2_right,"default"));
     2495    left-casing-dashes:                                   eval(prop(change_forward_2_left,"default"));
     2496    repeat-image:                                     eval(prop(turn_image_forward_2,"default"));
     2497
     2498    opacity: 0.0; linecap: none;
     2499    repeat-image-offset: eval(prop(offset));
     2500    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2501    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2502    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2503    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2504    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2505}
     2506way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 1]::Lane_Forward_2_Color
     2507{
     2508    offset:                                          eval(prop(lane_offset_forward_2,"default"));
     2509    width:                                            eval(prop(lane_width_forward_2,"default"));
     2510    color:                                                      prop(color_forward_2,"default");
     2511    dashes:                              eval(is_prop_set(restriction_color_forward_2,"default")?list(20,20):prop(unset_property));
     2512    dashes-background-color:             eval(is_prop_set(restriction_color_forward_2,"default")?
     2513                                                     prop(restriction_color_forward_2,"default"):prop(unset_property));
     2514    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2515    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2516}
     2517way|z17-[is_prop_set(sign_1_forward_2,     "default")]::Lane_Forward_2_Sign_1
     2518{
     2519    repeat-image:                           eval(prop(sign_1_forward_2,"default"));
     2520    repeat-image-offset:               eval(prop(lane_offset_forward_2,"default"));
     2521    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_2"));
     2522    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2523}
     2524way|z17-[is_prop_set(sign_2_forward_2,     "default")]::Lane_Forward_2_Sign_2
     2525{
     2526    repeat-image:                           eval(prop(sign_2_forward_2,"default"));
     2527    repeat-image-offset:               eval(prop(lane_offset_forward_2,"default"));
     2528    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_2"));
     2529    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2530}
     2531way|z17-[is_prop_set(sign_3_forward_2,     "default")]::Lane_Forward_2_Sign_3
     2532{
     2533    repeat-image:                           eval(prop(sign_3_forward_2,"default"));
     2534    repeat-image-offset:               eval(prop(lane_offset_forward_2,"default"));
     2535    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_2"));
     2536    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2537}
     2538
     2539way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 2]::Lane_Forward_3
     2540{
     2541    offset:                                          eval(prop(lane_offset_forward_3,"default"));
     2542    width:                                           eval((prop(lane_width_forward_3,"default")-prop(lane_casing,"default")));
     2543    right-casing-dashes:                                  eval(prop(change_forward_3_right,"default"));
     2544    left-casing-dashes:                                   eval(prop(change_forward_3_left,"default"));
     2545    repeat-image:                                     eval(prop(turn_image_forward_3,"default"));
     2546
     2547    opacity: 0.0; linecap: none;
     2548    repeat-image-offset: eval(prop(offset));
     2549    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2550    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2551    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2552    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2553    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2554}
     2555way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 2]::Lane_Forward_3_Color
     2556{
     2557    offset:                                          eval(prop(lane_offset_forward_3,"default"));
     2558    width:                                            eval(prop(lane_width_forward_3,"default"));
     2559    color:                                                      prop(color_forward_3,"default");
     2560    dashes:                              eval(is_prop_set(restriction_color_forward_3,"default")?list(20,20):prop(unset_property));
     2561    dashes-background-color:             eval(is_prop_set(restriction_color_forward_3,"default")?
     2562                                                     prop(restriction_color_forward_3,"default"):prop(unset_property));
     2563    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2564    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2565}
     2566way|z17-[is_prop_set(sign_1_forward_3,     "default")]::Lane_Forward_3_Sign_1
     2567{
     2568    repeat-image:                           eval(prop(sign_1_forward_3,"default"));
     2569    repeat-image-offset:               eval(prop(lane_offset_forward_3,"default"));
     2570    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_3"));
     2571    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2572}
     2573way|z17-[is_prop_set(sign_2_forward_3,     "default")]::Lane_Forward_3_Sign_2
     2574{
     2575    repeat-image:                           eval(prop(sign_2_forward_3,"default"));
     2576    repeat-image-offset:               eval(prop(lane_offset_forward_3,"default"));
     2577    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_3"));
     2578    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2579}
     2580way|z17-[is_prop_set(sign_3_forward_3,     "default")]::Lane_Forward_3_Sign_3
     2581{
     2582    repeat-image:                           eval(prop(sign_3_forward_3,"default"));
     2583    repeat-image-offset:               eval(prop(lane_offset_forward_3,"default"));
     2584    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_3"));
     2585    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2586}
     2587
     2588way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 3]::Lane_Forward_4
     2589{
     2590    offset:                                          eval(prop(lane_offset_forward_4,"default"));
     2591    width:                                           eval((prop(lane_width_forward_4,"default")-prop(lane_casing,"default")));
     2592    right-casing-dashes:                                  eval(prop(change_forward_4_right,"default"));
     2593    left-casing-dashes:                                   eval(prop(change_forward_4_left,"default"));
     2594    repeat-image:                                     eval(prop(turn_image_forward_4,"default"));
     2595
     2596    opacity: 0.0; linecap: none;
     2597    repeat-image-offset: eval(prop(offset));
     2598    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2599    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2600    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2601    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2602    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2603}
     2604way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 3]::Lane_Forward_4_Color
     2605{
     2606    offset:                                          eval(prop(lane_offset_forward_4,"default"));
     2607    width:                                            eval(prop(lane_width_forward_4,"default"));
     2608    color:                                                      prop(color_forward_4,"default");
     2609    dashes:                              eval(is_prop_set(restriction_color_forward_4,"default")?list(20,20):prop(unset_property));
     2610    dashes-background-color:             eval(is_prop_set(restriction_color_forward_4,"default")?
     2611                                                     prop(restriction_color_forward_4,"default"):prop(unset_property));
     2612    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2613    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2614}
     2615way|z17-[is_prop_set(sign_1_forward_4,     "default")]::Lane_Forward_4_Sign_1
     2616{
     2617    repeat-image:                           eval(prop(sign_1_forward_4,"default"));
     2618    repeat-image-offset:               eval(prop(lane_offset_forward_4,"default"));
     2619    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_4"));
     2620    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2621}
     2622way|z17-[is_prop_set(sign_2_forward_4,     "default")]::Lane_Forward_4_Sign_2
     2623{
     2624    repeat-image:                           eval(prop(sign_2_forward_4,"default"));
     2625    repeat-image-offset:               eval(prop(lane_offset_forward_4,"default"));
     2626    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_4"));
     2627    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2628}
     2629way|z17-[is_prop_set(sign_3_forward_4,     "default")]::Lane_Forward_4_Sign_3
     2630{
     2631    repeat-image:                           eval(prop(sign_3_forward_4,"default"));
     2632    repeat-image-offset:               eval(prop(lane_offset_forward_4,"default"));
     2633    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_4"));
     2634    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2635}
     2636
     2637way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 4]::Lane_Forward_5
     2638{
     2639    offset:                                          eval(prop(lane_offset_forward_5,"default"));
     2640    width:                                           eval((prop(lane_width_forward_5,"default")-prop(lane_casing,"default")));
     2641    right-casing-dashes:                                  eval(prop(change_forward_5_right,"default"));
     2642    left-casing-dashes:                                   eval(prop(change_forward_5_left,"default"));
     2643    repeat-image:                                     eval(prop(turn_image_forward_5,"default"));
     2644
     2645    opacity: 0.0; linecap: none;
     2646    repeat-image-offset: eval(prop(offset));
     2647    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2648    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2649    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2650    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2651    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2652}
     2653way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 4]::Lane_Forward_5_Color
     2654{
     2655    offset:                                          eval(prop(lane_offset_forward_5,"default"));
     2656    width:                                            eval(prop(lane_width_forward_5,"default"));
     2657    color:                                                      prop(color_forward_5,"default");
     2658    dashes:                              eval(is_prop_set(restriction_color_forward_5,"default")?list(20,20):prop(unset_property));
     2659    dashes-background-color:             eval(is_prop_set(restriction_color_forward_5,"default")?
     2660                                                     prop(restriction_color_forward_5,"default"):prop(unset_property));
     2661    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2662    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2663}
     2664way|z17-[is_prop_set(sign_1_forward_5,     "default")]::Lane_Forward_5_Sign_1
     2665{
     2666    repeat-image:                           eval(prop(sign_1_forward_5,"default"));
     2667    repeat-image-offset:               eval(prop(lane_offset_forward_5,"default"));
     2668    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_5"));
     2669    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2670}
     2671way|z17-[is_prop_set(sign_2_forward_5,     "default")]::Lane_Forward_5_Sign_2
     2672{
     2673    repeat-image:                           eval(prop(sign_2_forward_5,"default"));
     2674    repeat-image-offset:               eval(prop(lane_offset_forward_5,"default"));
     2675    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_5"));
     2676    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2677}
     2678way|z17-[is_prop_set(sign_3_forward_5,     "default")]::Lane_Forward_5_Sign_3
     2679{
     2680    repeat-image:                           eval(prop(sign_3_forward_5,"default"));
     2681    repeat-image-offset:               eval(prop(lane_offset_forward_5,"default"));
     2682    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_5"));
     2683    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2684}
     2685
     2686way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 5]::Lane_Forward_6
     2687{
     2688    offset:                                          eval(prop(lane_offset_forward_6,"default"));
     2689    width:                                           eval((prop(lane_width_forward_6,"default")-prop(lane_casing,"default")));
     2690    right-casing-dashes:                                  eval(prop(change_forward_6_right,"default"));
     2691    left-casing-dashes:                                   eval(prop(change_forward_6_left,"default"));
     2692    repeat-image:                                     eval(prop(turn_image_forward_6,"default"));
     2693
     2694    opacity: 0.0; linecap: none;
     2695    repeat-image-offset: eval(prop(offset));
     2696    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2697    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2698    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2699    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2700    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2701}
     2702way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 5]::Lane_Forward_6_Color
     2703{
     2704    offset:                                          eval(prop(lane_offset_forward_6,"default"));
     2705    width:                                            eval(prop(lane_width_forward_6,"default"));
     2706    color:                                                      prop(color_forward_6,"default");
     2707    dashes:                              eval(is_prop_set(restriction_color_forward_6,"default")?list(20,20):prop(unset_property));
     2708    dashes-background-color:             eval(is_prop_set(restriction_color_forward_6,"default")?
     2709                                                     prop(restriction_color_forward_6,"default"):prop(unset_property));
     2710    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2711    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2712}
     2713way|z17-[is_prop_set(sign_1_forward_6,     "default")]::Lane_Forward_6_Sign_1
     2714{
     2715    repeat-image:                           eval(prop(sign_1_forward_6,"default"));
     2716    repeat-image-offset:               eval(prop(lane_offset_forward_6,"default"));
     2717    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_6"));
     2718    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2719}
     2720way|z17-[is_prop_set(sign_2_forward_6,     "default")]::Lane_Forward_6_Sign_2
     2721{
     2722    repeat-image:                           eval(prop(sign_2_forward_6,"default"));
     2723    repeat-image-offset:               eval(prop(lane_offset_forward_6,"default"));
     2724    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_6"));
     2725    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2726}
     2727way|z17-[is_prop_set(sign_3_forward_6,     "default")]::Lane_Forward_6_Sign_3
     2728{
     2729    repeat-image:                           eval(prop(sign_3_forward_6,"default"));
     2730    repeat-image-offset:               eval(prop(lane_offset_forward_6,"default"));
     2731    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_6"));
     2732    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2733}
     2734
     2735way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 6]::Lane_Forward_7
     2736{
     2737    offset:                                          eval(prop(lane_offset_forward_7,"default"));
     2738    width:                                           eval((prop(lane_width_forward_7,"default")-prop(lane_casing,"default")));
     2739    right-casing-dashes:                                  eval(prop(change_forward_7_right,"default"));
     2740    left-casing-dashes:                                   eval(prop(change_forward_7_left,"default"));
     2741    repeat-image:                                     eval(prop(turn_image_forward_7,"default"));
     2742
     2743    opacity: 0.0; linecap: none;
     2744    repeat-image-offset: eval(prop(offset));
     2745    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2746    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2747    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2748    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2749    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2750}
     2751way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 6]::Lane_Forward_7_Color
     2752{
     2753    offset:                                          eval(prop(lane_offset_forward_7,"default"));
     2754    width:                                            eval(prop(lane_width_forward_7,"default"));
     2755    color:                                                      prop(color_forward_7,"default");
     2756    dashes:                              eval(is_prop_set(restriction_color_forward_7,"default")?list(20,20):prop(unset_property));
     2757    dashes-background-color:             eval(is_prop_set(restriction_color_forward_7,"default")?
     2758                                                     prop(restriction_color_forward_7,"default"):prop(unset_property));
     2759    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2760    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2761}
     2762way|z17-[is_prop_set(sign_1_forward_7,     "default")]::Lane_Forward_7_Sign_1
     2763{
     2764    repeat-image:                           eval(prop(sign_1_forward_7,"default"));
     2765    repeat-image-offset:               eval(prop(lane_offset_forward_7,"default"));
     2766    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_7"));
     2767    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2768}
     2769way|z17-[is_prop_set(sign_2_forward_7,     "default")]::Lane_Forward_7_Sign_2
     2770{
     2771    repeat-image:                           eval(prop(sign_2_forward_7,"default"));
     2772    repeat-image-offset:               eval(prop(lane_offset_forward_7,"default"));
     2773    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_7"));
     2774    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2775}
     2776way|z17-[is_prop_set(sign_3_forward_7,     "default")]::Lane_Forward_7_Sign_3
     2777{
     2778    repeat-image:                           eval(prop(sign_3_forward_7,"default"));
     2779    repeat-image-offset:               eval(prop(lane_offset_forward_7,"default"));
     2780    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_7"));
     2781    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2782}
     2783
     2784way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 7]::Lane_Forward_8
     2785{
     2786    offset:                                          eval(prop(lane_offset_forward_8,"default"));
     2787    width:                                           eval((prop(lane_width_forward_8,"default")-prop(lane_casing,"default")));
     2788    right-casing-dashes:                                  eval(prop(change_forward_8_right,"default"));
     2789    left-casing-dashes:                                   eval(prop(change_forward_8_left,"default"));
     2790    repeat-image:                                     eval(prop(turn_image_forward_8,"default"));
     2791
     2792    opacity: 0.0; linecap: none;
     2793    repeat-image-offset: eval(prop(offset));
     2794    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2795    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2796    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2797    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2798    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2799}
     2800way|z17-[is_prop_set(ok, "default")][prop(lanes_fwd, "default") > 7]::Lane_Forward_8_Color
     2801{
     2802    offset:                                          eval(prop(lane_offset_forward_8,"default"));
     2803    width:                                            eval(prop(lane_width_forward_8,"default"));
     2804    color:                                                      prop(color_forward_8,"default");
     2805    dashes:                              eval(is_prop_set(restriction_color_forward_8,"default")?list(20,20):prop(unset_property));
     2806    dashes-background-color:             eval(is_prop_set(restriction_color_forward_8,"default")?
     2807                                                     prop(restriction_color_forward_8,"default"):prop(unset_property));
     2808    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2809    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2810}
     2811way|z17-[is_prop_set(sign_1_forward_8,     "default")]::Lane_Forward_8_Sign_1
     2812{
     2813    repeat-image:                           eval(prop(sign_1_forward_8,"default"));
     2814    repeat-image-offset:               eval(prop(lane_offset_forward_8,"default"));
     2815    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_8"));
     2816    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2817}
     2818way|z17-[is_prop_set(sign_2_forward_8,     "default")]::Lane_Forward_8_Sign_2
     2819{
     2820    repeat-image:                           eval(prop(sign_2_forward_8,"default"));
     2821    repeat-image-offset:               eval(prop(lane_offset_forward_8,"default"));
     2822    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_8"));
     2823    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2824}
     2825way|z17-[is_prop_set(sign_3_forward_8,     "default")]::Lane_Forward_8_Sign_3
     2826{
     2827    repeat-image:                           eval(prop(sign_3_forward_8,"default"));
     2828    repeat-image-offset:               eval(prop(lane_offset_forward_8,"default"));
     2829    repeat-image-height: eval(prop(repeat-image-height,"Lane_Forward_8"));
     2830    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2831}
     2832
     2833/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2834/* Backward lanes                                                                                                                                  */
     2835/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     2836way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 0]::Lane_Backward_1
     2837{
     2838    offset:                                          eval(prop(lane_offset_backward_1,"default"));
     2839    width:                                           eval((prop(lane_width_backward_1,"default")-prop(lane_casing,"default")));
     2840    left-casing-dashes:                                   eval(prop(change_backward_1_right,"default"));
     2841    right-casing-dashes:                                  eval(prop(change_backward_1_left,"default"));
     2842    repeat-image:                                     eval(prop(turn_image_backward_1,"default"));
     2843
     2844    opacity: 0.0; linecap: none;
     2845    repeat-image-offset: eval(prop(offset));
     2846    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2847    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2848    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2849    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2850    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2851}
     2852way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 0]::Lane_Backward_1_Color
     2853{
     2854    offset:                                          eval(prop(lane_offset_backward_1,"default"));
     2855    width:                                            eval(prop(lane_width_backward_1,"default"));
     2856    color:                                                      prop(color_backward_1,"default");
     2857    dashes:                              eval(is_prop_set(restriction_color_backward_1,"default")?list(20,20):prop(unset_property));
     2858    dashes-background-color:             eval(is_prop_set(restriction_color_backward_1,"default")?
     2859                                                     prop(restriction_color_backward_1,"default"):prop(unset_property));
     2860    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2861    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2862}
     2863way|z17-[is_prop_set(sign_1_backward_1,     "default")]::Lane_Backward_1_Sign_1
     2864{
     2865    repeat-image:                           eval(prop(sign_1_backward_1,"default"));
     2866    repeat-image-offset:               eval(prop(lane_offset_backward_1,"default"));
     2867    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_1"));
     2868    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2869}
     2870way|z17-[is_prop_set(sign_2_backward_1,     "default")]::Lane_Backward_1_Sign_2
     2871{
     2872    repeat-image:                           eval(prop(sign_2_backward_1,"default"));
     2873    repeat-image-offset:               eval(prop(lane_offset_backward_1,"default"));
     2874    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_1"));
     2875    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2876}
     2877way|z17-[is_prop_set(sign_3_backward_1,     "default")]::Lane_Backward_1_Sign_3
     2878{
     2879    repeat-image:                           eval(prop(sign_3_backward_1,"default"));
     2880    repeat-image-offset:               eval(prop(lane_offset_backward_1,"default"));
     2881    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_1"));
     2882    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2883}
     2884
     2885way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 1]::Lane_Backward_2
     2886{
     2887    offset:                                          eval(prop(lane_offset_backward_2,"default"));
     2888    width:                                           eval((prop(lane_width_backward_2,"default")-prop(lane_casing,"default")));
     2889    left-casing-dashes:                                   eval(prop(change_backward_2_right,"default"));
     2890    right-casing-dashes:                                  eval(prop(change_backward_2_left,"default"));
     2891    repeat-image:                                     eval(prop(turn_image_backward_2,"default"));
     2892
     2893    opacity: 0.0; linecap: none;
     2894    repeat-image-offset: eval(prop(offset));
     2895    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2896    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2897    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2898    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2899    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2900}
     2901way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 1]::Lane_Backward_2_Color
     2902{
     2903    offset:                                          eval(prop(lane_offset_backward_2,"default"));
     2904    width:                                            eval(prop(lane_width_backward_2,"default"));
     2905    color:                                                      prop(color_backward_2,"default");
     2906    dashes:                              eval(is_prop_set(restriction_color_backward_2,"default")?list(20,20):prop(unset_property));
     2907    dashes-background-color:             eval(is_prop_set(restriction_color_backward_2,"default")?
     2908                                                     prop(restriction_color_backward_2,"default"):prop(unset_property));
     2909    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2910    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2911}
     2912way|z17-[is_prop_set(sign_1_backward_2,     "default")]::Lane_Backward_2_Sign_1
     2913{
     2914    repeat-image:                           eval(prop(sign_1_backward_2,"default"));
     2915    repeat-image-offset:               eval(prop(lane_offset_backward_2,"default"));
     2916    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_2"));
     2917    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2918}
     2919way|z17-[is_prop_set(sign_2_backward_2,     "default")]::Lane_Backward_2_Sign_2
     2920{
     2921    repeat-image:                           eval(prop(sign_2_backward_2,"default"));
     2922    repeat-image-offset:               eval(prop(lane_offset_backward_2,"default"));
     2923    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_2"));
     2924    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2925}
     2926way|z17-[is_prop_set(sign_3_backward_2,     "default")]::Lane_Backward_2_Sign_3
     2927{
     2928    repeat-image:                           eval(prop(sign_3_backward_2,"default"));
     2929    repeat-image-offset:               eval(prop(lane_offset_backward_2,"default"));
     2930    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_2"));
     2931    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2932}
     2933
     2934way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 2]::Lane_Backward_3
     2935{
     2936    offset:                                          eval(prop(lane_offset_backward_3,"default"));
     2937    width:                                           eval((prop(lane_width_backward_3,"default")-prop(lane_casing,"default")));
     2938    left-casing-dashes:                                   eval(prop(change_backward_3_right,"default"));
     2939    right-casing-dashes:                                  eval(prop(change_backward_3_left,"default"));
     2940    repeat-image:                                     eval(prop(turn_image_backward_3,"default"));
     2941
     2942    opacity: 0.0; linecap: none;
     2943    repeat-image-offset: eval(prop(offset));
     2944    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2945    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2946    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2947    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2948    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2949}
     2950way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 2]::Lane_Backward_3_Color
     2951{
     2952    offset:                                          eval(prop(lane_offset_backward_3,"default"));
     2953    width:                                            eval(prop(lane_width_backward_3,"default"));
     2954    color:                                                      prop(color_backward_3,"default");
     2955    dashes:                              eval(is_prop_set(restriction_color_backward_3,"default")?list(20,20):prop(unset_property));
     2956    dashes-background-color:             eval(is_prop_set(restriction_color_backward_3,"default")?
     2957                                                     prop(restriction_color_backward_3,"default"):prop(unset_property));
     2958    opacity: prop(style_lane_opacity,"default"); linecap: none;
     2959    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     2960}
     2961way|z17-[is_prop_set(sign_1_backward_3,     "default")]::Lane_Backward_3_Sign_1
     2962{
     2963    repeat-image:                           eval(prop(sign_1_backward_3,"default"));
     2964    repeat-image-offset:               eval(prop(lane_offset_backward_3,"default"));
     2965    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_3"));
     2966    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     2967}
     2968way|z17-[is_prop_set(sign_2_backward_3,     "default")]::Lane_Backward_3_Sign_2
     2969{
     2970    repeat-image:                           eval(prop(sign_2_backward_3,"default"));
     2971    repeat-image-offset:               eval(prop(lane_offset_backward_3,"default"));
     2972    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_3"));
     2973    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     2974}
     2975way|z17-[is_prop_set(sign_3_backward_3,     "default")]::Lane_Backward_3_Sign_3
     2976{
     2977    repeat-image:                           eval(prop(sign_3_backward_3,"default"));
     2978    repeat-image-offset:               eval(prop(lane_offset_backward_3,"default"));
     2979    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_3"));
     2980    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     2981}
     2982
     2983way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 3]::Lane_Backward_4
     2984{
     2985    offset:                                          eval(prop(lane_offset_backward_4,"default"));
     2986    width:                                           eval((prop(lane_width_backward_4,"default")-prop(lane_casing,"default")));
     2987    left-casing-dashes:                                   eval(prop(change_backward_4_right,"default"));
     2988    right-casing-dashes:                                  eval(prop(change_backward_4_left,"default"));
     2989    repeat-image:                                     eval(prop(turn_image_backward_4,"default"));
     2990
     2991    opacity: 0.0; linecap: none;
     2992    repeat-image-offset: eval(prop(offset));
     2993    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     2994    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     2995    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2996    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     2997    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     2998}
     2999way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 3]::Lane_Backward_4_Color
     3000{
     3001    offset:                                          eval(prop(lane_offset_backward_4,"default"));
     3002    width:                                            eval(prop(lane_width_backward_4,"default"));
     3003    color:                                                      prop(color_backward_4,"default");
     3004    dashes:                              eval(is_prop_set(restriction_color_backward_4,"default")?list(20,20):prop(unset_property));
     3005    dashes-background-color:             eval(is_prop_set(restriction_color_backward_4,"default")?
     3006                                                     prop(restriction_color_backward_4,"default"):prop(unset_property));
     3007    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3008    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3009}
     3010way|z17-[is_prop_set(sign_1_backward_4,     "default")]::Lane_Backward_4_Sign_1
     3011{
     3012    repeat-image:                           eval(prop(sign_1_backward_4,"default"));
     3013    repeat-image-offset:               eval(prop(lane_offset_backward_4,"default"));
     3014    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_4"));
     3015    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     3016}
     3017way|z17-[is_prop_set(sign_2_backward_4,     "default")]::Lane_Backward_4_Sign_2
     3018{
     3019    repeat-image:                           eval(prop(sign_2_backward_4,"default"));
     3020    repeat-image-offset:               eval(prop(lane_offset_backward_4,"default"));
     3021    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_4"));
     3022    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     3023}
     3024way|z17-[is_prop_set(sign_3_backward_4,     "default")]::Lane_Backward_4_Sign_3
     3025{
     3026    repeat-image:                           eval(prop(sign_3_backward_4,"default"));
     3027    repeat-image-offset:               eval(prop(lane_offset_backward_4,"default"));
     3028    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_4"));
     3029    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     3030}
     3031
     3032way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 4]::Lane_Backward_5
     3033{
     3034    offset:                                          eval(prop(lane_offset_backward_5,"default"));
     3035    width:                                           eval((prop(lane_width_backward_5,"default")-prop(lane_casing,"default")));
     3036    left-casing-dashes:                                   eval(prop(change_backward_5_right,"default"));
     3037    right-casing-dashes:                                  eval(prop(change_backward_5_left,"default"));
     3038    repeat-image:                                     eval(prop(turn_image_backward_5,"default"));
     3039
     3040    opacity: 0.0; linecap: none;
     3041    repeat-image-offset: eval(prop(offset));
     3042    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3043    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3044    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3045    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3046    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3047}
     3048way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 4]::Lane_Backward_5_Color
     3049{
     3050    offset:                                          eval(prop(lane_offset_backward_5,"default"));
     3051    width:                                            eval(prop(lane_width_backward_5,"default"));
     3052    color:                                                      prop(color_backward_5,"default");
     3053    dashes:                              eval(is_prop_set(restriction_color_backward_5,"default")?list(20,20):prop(unset_property));
     3054    dashes-background-color:             eval(is_prop_set(restriction_color_backward_5,"default")?
     3055                                                     prop(restriction_color_backward_5,"default"):prop(unset_property));
     3056    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3057    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3058}
     3059way|z17-[is_prop_set(sign_1_backward_5,     "default")]::Lane_Backward_5_Sign_1
     3060{
     3061    repeat-image:                           eval(prop(sign_1_backward_5,"default"));
     3062    repeat-image-offset:               eval(prop(lane_offset_backward_5,"default"));
     3063    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_5"));
     3064    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     3065}
     3066way|z17-[is_prop_set(sign_2_backward_5,     "default")]::Lane_Backward_5_Sign_2
     3067{
     3068    repeat-image:                           eval(prop(sign_2_backward_5,"default"));
     3069    repeat-image-offset:               eval(prop(lane_offset_backward_5,"default"));
     3070    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_5"));
     3071    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     3072}
     3073way|z17-[is_prop_set(sign_3_backward_5,     "default")]::Lane_Backward_5_Sign_3
     3074{
     3075    repeat-image:                           eval(prop(sign_3_backward_5,"default"));
     3076    repeat-image-offset:               eval(prop(lane_offset_backward_5,"default"));
     3077    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_5"));
     3078    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     3079}
     3080
     3081way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 5]::Lane_Backward_6
     3082{
     3083    offset:                                          eval(prop(lane_offset_backward_6,"default"));
     3084    width:                                           eval((prop(lane_width_backward_6,"default")-prop(lane_casing,"default")));
     3085    left-casing-dashes:                                   eval(prop(change_backward_6_right,"default"));
     3086    right-casing-dashes:                                  eval(prop(change_backward_6_left,"default"));
     3087    repeat-image:                                     eval(prop(turn_image_backward_6,"default"));
     3088
     3089    opacity: 0.0; linecap: none;
     3090    repeat-image-offset: eval(prop(offset));
     3091    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3092    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3093    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3094    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3095    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3096}
     3097way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 5]::Lane_Backward_6_Color
     3098{
     3099    offset:                                          eval(prop(lane_offset_backward_6,"default"));
     3100    width:                                            eval(prop(lane_width_backward_6,"default"));
     3101    color:                                                      prop(color_backward_6,"default");
     3102    dashes:                              eval(is_prop_set(restriction_color_backward_6,"default")?list(20,20):prop(unset_property));
     3103    dashes-background-color:             eval(is_prop_set(restriction_color_backward_6,"default")?
     3104                                                     prop(restriction_color_backward_6,"default"):prop(unset_property));
     3105    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3106    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3107}
     3108way|z17-[is_prop_set(sign_1_backward_6,     "default")]::Lane_Backward_6_Sign_1
     3109{
     3110    repeat-image:                           eval(prop(sign_1_backward_6,"default"));
     3111    repeat-image-offset:               eval(prop(lane_offset_backward_6,"default"));
     3112    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_6"));
     3113    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     3114}
     3115way|z17-[is_prop_set(sign_2_backward_6,     "default")]::Lane_Backward_6_Sign_2
     3116{
     3117    repeat-image:                           eval(prop(sign_2_backward_6,"default"));
     3118    repeat-image-offset:               eval(prop(lane_offset_backward_6,"default"));
     3119    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_6"));
     3120    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     3121}
     3122way|z17-[is_prop_set(sign_3_backward_6,     "default")]::Lane_Backward_6_Sign_3
     3123{
     3124    repeat-image:                           eval(prop(sign_3_backward_6,"default"));
     3125    repeat-image-offset:               eval(prop(lane_offset_backward_6,"default"));
     3126    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_6"));
     3127    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     3128}
     3129
     3130way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 6]::Lane_Backward_7
     3131{
     3132    offset:                                          eval(prop(lane_offset_backward_7,"default"));
     3133    width:                                           eval((prop(lane_width_backward_7,"default")-prop(lane_casing,"default")));
     3134    left-casing-dashes:                                   eval(prop(change_backward_7_right,"default"));
     3135    right-casing-dashes:                                  eval(prop(change_backward_7_left,"default"));
     3136    repeat-image:                                     eval(prop(turn_image_backward_7,"default"));
     3137
     3138    opacity: 0.0; linecap: none;
     3139    repeat-image-offset: eval(prop(offset));
     3140    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3141    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3142    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3143    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3144    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3145}
     3146way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 6]::Lane_Backward_7_Color
     3147{
     3148    offset:                                          eval(prop(lane_offset_backward_7,"default"));
     3149    width:                                            eval(prop(lane_width_backward_7,"default"));
     3150    color:                                                      prop(color_backward_7,"default");
     3151    dashes:                              eval(is_prop_set(restriction_color_backward_7,"default")?list(20,20):prop(unset_property));
     3152    dashes-background-color:             eval(is_prop_set(restriction_color_backward_7,"default")?
     3153                                                     prop(restriction_color_backward_7,"default"):prop(unset_property));
     3154    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3155    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3156}
     3157way|z17-[is_prop_set(sign_1_backward_7,     "default")]::Lane_Backward_7_Sign_1
     3158{
     3159    repeat-image:                           eval(prop(sign_1_backward_7,"default"));
     3160    repeat-image-offset:               eval(prop(lane_offset_backward_7,"default"));
     3161    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_7"));
     3162    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     3163}
     3164way|z17-[is_prop_set(sign_2_backward_7,     "default")]::Lane_Backward_7_Sign_2
     3165{
     3166    repeat-image:                           eval(prop(sign_2_backward_7,"default"));
     3167    repeat-image-offset:               eval(prop(lane_offset_backward_7,"default"));
     3168    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_7"));
     3169    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     3170}
     3171way|z17-[is_prop_set(sign_3_backward_7,     "default")]::Lane_Backward_7_Sign_3
     3172{
     3173    repeat-image:                           eval(prop(sign_3_backward_7,"default"));
     3174    repeat-image-offset:               eval(prop(lane_offset_backward_7,"default"));
     3175    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_7"));
     3176    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     3177}
     3178
     3179way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 7]::Lane_Backward_8
     3180{
     3181    offset:                                          eval(prop(lane_offset_backward_8,"default"));
     3182    width:                                           eval((prop(lane_width_backward_8,"default")-prop(lane_casing,"default")));
     3183    left-casing-dashes:                                   eval(prop(change_backward_8_right,"default"));
     3184    right-casing-dashes:                                  eval(prop(change_backward_8_left,"default"));
     3185    repeat-image:                                     eval(prop(turn_image_backward_8,"default"));
     3186
     3187    opacity: 0.0; linecap: none;
     3188    repeat-image-offset: eval(prop(offset));
     3189    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3190    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3191    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3192    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3193    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3194}
     3195way|z17-[is_prop_set(ok, "default")][prop(lanes_bwd, "default") > 7]::Lane_Backward_8_Color
     3196{
     3197    offset:                                          eval(prop(lane_offset_backward_8,"default"));
     3198    width:                                            eval(prop(lane_width_backward_8,"default"));
     3199    color:                                                      prop(color_backward_8,"default");
     3200    dashes:                              eval(is_prop_set(restriction_color_backward_8,"default")?list(20,20):prop(unset_property));
     3201    dashes-background-color:             eval(is_prop_set(restriction_color_backward_8,"default")?
     3202                                                     prop(restriction_color_backward_8,"default"):prop(unset_property));
     3203    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3204    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3205}
     3206way|z17-[is_prop_set(sign_1_backward_8,     "default")]::Lane_Backward_8_Sign_1
     3207{
     3208    repeat-image:                           eval(prop(sign_1_backward_8,"default"));
     3209    repeat-image-offset:               eval(prop(lane_offset_backward_8,"default"));
     3210    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_8"));
     3211    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 3);
     3212}
     3213way|z17-[is_prop_set(sign_2_backward_8,     "default")]::Lane_Backward_8_Sign_2
     3214{
     3215    repeat-image:                           eval(prop(sign_2_backward_8,"default"));
     3216    repeat-image-offset:               eval(prop(lane_offset_backward_8,"default"));
     3217    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_8"));
     3218    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 2);
     3219}
     3220way|z17-[is_prop_set(sign_3_backward_8,     "default")]::Lane_Backward_8_Sign_3
     3221{
     3222    repeat-image:                           eval(prop(sign_3_backward_8,"default"));
     3223    repeat-image-offset:               eval(prop(lane_offset_backward_8,"default"));
     3224    repeat-image-height: eval(prop(repeat-image-height,"Lane_Backward_8"));
     3225    repeat-image-spacing: eval(prop(repeat-image-height) * 4);    repeat-image-phase: eval(prop(repeat-image-height) * 4);
     3226}
     3227
     3228/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3229/* Bothways lanes                                                                                                                                   */
     3230/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3231way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 0]::Lane_Bothways_1
     3232{
     3233    offset:                                          eval(prop(lane_offset_bothways_1,"default"));
     3234    width:                                           eval((prop(lane_width_bothways_1,"default")-prop(lane_casing,"default")));
     3235    right-casing-dashes:                                  eval(prop(change_bothways_1_right,"default"));
     3236    left-casing-dashes:                                   eval(prop(change_bothways_1_left,"default"));
     3237    repeat-image:                                     eval(prop(turn_image_bothways_1,"default"));
     3238
     3239    opacity: 0.0; linecap: none;
     3240    repeat-image-offset: eval(prop(offset));
     3241    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3242    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3243    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3244    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3245    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3246}
     3247way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 0]::Lane_Bothways_1_Color
     3248{
     3249    offset:                                          eval(prop(lane_offset_bothways_1,"default"));
     3250    width:                                            eval(prop(lane_width_bothways_1,"default"));
     3251    color:                                                      prop(color_bothways_1,"default");
     3252    dashes:                              eval(is_prop_set(restriction_color_bothways_1,"default")?list(20,20):prop(unset_property));
     3253    dashes-background-color:             eval(is_prop_set(restriction_color_bothways_1,"default")?
     3254                                                     prop(restriction_color_bothways_1,"default"):prop(unset_property));
     3255    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3256    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3257}
     3258
     3259way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 1]::Lane_Bothways_2
     3260{
     3261    offset:                                          eval(prop(lane_offset_bothways_2,"default"));
     3262    width:                                           eval((prop(lane_width_bothways_2,"default")-prop(lane_casing,"default")));
     3263    right-casing-dashes:                                  eval(prop(change_bothways_2_right,"default"));
     3264    left-casing-dashes:                                   eval(prop(change_bothways_2_left,"default"));
     3265    repeat-image:                                     eval(prop(turn_image_bothways_2,"default"));
     3266
     3267    opacity: 0.0; linecap: none;
     3268    repeat-image-offset: eval(prop(offset));
     3269    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3270    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3271    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3272    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3273    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3274}
     3275way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 1]::Lane_Bothways_2_Color
     3276{
     3277    offset:                                          eval(prop(lane_offset_bothways_2,"default"));
     3278    width:                                            eval(prop(lane_width_bothways_2,"default"));
     3279    color:                                                      prop(color_bothways_2,"default");
     3280    dashes:                              eval(is_prop_set(restriction_color_bothways_2,"default")?list(20,20):prop(unset_property));
     3281    dashes-background-color:             eval(is_prop_set(restriction_color_bothways_2,"default")?
     3282                                                     prop(restriction_color_bothways_2,"default"):prop(unset_property));
     3283    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3284    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3285}
     3286
     3287way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 2]::Lane_Bothways_3
     3288{
     3289    offset:                                          eval(prop(lane_offset_bothways_3,"default"));
     3290    width:                                           eval((prop(lane_width_bothways_3,"default")-prop(lane_casing,"default")));
     3291    right-casing-dashes:                                  eval(prop(change_bothways_3_right,"default"));
     3292    left-casing-dashes:                                   eval(prop(change_bothways_3_left,"default"));
     3293    repeat-image:                                     eval(prop(turn_image_bothways_3,"default"));
     3294
     3295    opacity: 0.0; linecap: none;
     3296    repeat-image-offset: eval(prop(offset));
     3297    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3298    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3299    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3300    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3301    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3302}
     3303way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 2]::Lane_Bothways_3_Color
     3304{
     3305    offset:                                          eval(prop(lane_offset_bothways_3,"default"));
     3306    width:                                            eval(prop(lane_width_bothways_3,"default"));
     3307    color:                                                      prop(color_bothways_3,"default");
     3308    dashes:                              eval(is_prop_set(restriction_color_bothways_3,"default")?list(20,20):prop(unset_property));
     3309    dashes-background-color:             eval(is_prop_set(restriction_color_bothways_3,"default")?
     3310                                                     prop(restriction_color_bothways_3,"default"):prop(unset_property));
     3311    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3312    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3313}
     3314
     3315way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 3]::Lane_Bothways_4
     3316{
     3317    offset:                                          eval(prop(lane_offset_bothways_4,"default"));
     3318    width:                                           eval((prop(lane_width_bothways_4,"default")-prop(lane_casing,"default")));
     3319    right-casing-dashes:                                  eval(prop(change_bothways_4_right,"default"));
     3320    left-casing-dashes:                                   eval(prop(change_bothways_4_left,"default"));
     3321    repeat-image:                                     eval(prop(turn_image_bothways_4,"default"));
     3322
     3323    opacity: 0.0; linecap: none;
     3324    repeat-image-offset: eval(prop(offset));
     3325    repeat-image-height: eval(min(prop(lane_default_width,"default"),prop(width)));
     3326    repeat-image-spacing: eval(prop(repeat-image-height) * 3);
     3327    right-casing-width: prop(road_marking_width,"default"); right-casing-color: white; right-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3328    left-casing-width: prop(road_marking_width,"default"); left-casing-color: white; left-casing-opacity: eval(prop(style_markings_opacity,"default"));
     3329    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0));
     3330}
     3331way|z17-[is_prop_set(ok, "default")][prop(lanes_both, "default") > 3]::Lane_Bothways_4_Color
     3332{
     3333    offset:                                          eval(prop(lane_offset_bothways_4,"default"));
     3334    width:                                            eval(prop(lane_width_bothways_4,"default"));
     3335    color:                                                      prop(color_bothways_4,"default");
     3336    dashes:                              eval(is_prop_set(restriction_color_bothways_4,"default")?list(20,20):prop(unset_property));
     3337    dashes-background-color:             eval(is_prop_set(restriction_color_bothways_4,"default")?
     3338                                                     prop(restriction_color_bothways_4,"default"):prop(unset_property));
     3339    opacity: prop(style_lane_opacity,"default"); linecap: none;
     3340    major-z-index: eval(cond(prop(placement_transition,"default"),-0.1,0.0)); object-z-index: -0.1;
     3341}
     3342
     3343/***************************************************************************************************************************************************/
     3344/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3345/* Railway rendering                                                                                                                               */
     3346/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3347/***************************************************************************************************************************************************/
     3348way|z18-[railway=rail]::Railway_Way,
     3349way|z18-[railway=light_rail]::Railway_Way,
     3350way|z18-[railway=subway]::Railway_Way,
     3351way|z18-[railway=miniature]::Railway_Way,
     3352way|z18-[railway=tram]::Railway_Way
     3353{
     3354    /* Determine gauge (safety limits: 1 - 10000 mm) */
     3355    rail_gauge_list: eval(has_tag_key("gauge")?split(";",tag("gauge")):list(1435));
     3356    rail_gauge: eval(get(prop(rail_gauge_list),length(prop(rail_gauge_list))-1));
     3357    rail_gauge: eval(min(10000,cond(prop(rail_gauge)<1,1435,prop(rail_gauge))));
     3358 
     3359    /* Ties should be rendered in case standard and miniature railways; this might be override by the key embedded */
     3360    rail_show_ties: eval(cond(((tag("railway")=="rail") || (tag("railway")=="miniature")),yes,no));
     3361    rail_show_ties: eval(cond(has_tag_key("embedded"),cond(tag("embedded")=="no",yes,no),prop(rail_show_ties)));
     3362
     3363    /* Type of electrification:  */
     3364    /*    * rail -> show a yellow border on one rail */
     3365    /*    * contact_line -> show a contact line near the middle of the track */
     3366    rail_show_contact_line: eval(cond(has_tag_key("electrified"),cond(tag("electrified")="contact_line",yes,no),no));
     3367    rail_electrified_rail: eval(cond(has_tag_key("electrified"),cond(tag("electrified")="rail",yes,no),no));
     3368   
     3369    /* Make rails transparent within tunnels */
     3370    rail_image_opacity: eval(cond(((has_tag_key("tunnel")) && (tag("tunnel")=="yes")),0.2,0.8));
     3371   
     3372    /* Create image */
     3373    rail_image: eval(concat(
     3374                cond(prop(rail_show_ties),"<rect x='0' y='0' width='8' height='80' style='stroke:#301004; fill:#90300C;'/>",""),
     3375                "<line x1='0' y1= '8' x2='32' y2= '8' style='stroke:",cond(prop(rail_electrified_rail),"#FFFF00","#301004"),";'/>",
     3376                "<line x1='0' y1='10' x2='32' y2='10' style='stroke:#602008;stroke-width:3px'/>",
     3377                "<line x1='0' y1='12' x2='32' y2='12' style='stroke:#301004;'/>",
     3378                "<line x1='0' y1='67' x2='32' y2='67' style='stroke:#301004;'/>",
     3379                "<line x1='0' y1='69' x2='32' y2='69' style='stroke:#602008;stroke-width:3px'/>",
     3380                "<line x1='0' y1='71' x2='32' y2='71' style='stroke:#301004;'/>",
     3381                cond(prop(rail_show_contact_line),"<line x1='0' y1='35' x2='32' y2='35' style='stroke:#060200;'/>","")
     3382                ));   
     3383    repeat-image: concat("data:image/svg+xml,<svg width='32px' height='80px'><g fill-opacity='",prop(rail_image_opacity),"' opacity='",prop(rail_image_opacity),"'>",prop(rail_image),"</g></svg>");
     3384    repeat-image-height: eval(max(2,ceil((prop(rail_gauge)*prop(pixel_per_metre,"default"))*0.0012)));
     3385}
     3386
     3387/***************************************************************************************************************************************************/
     3388/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3389/* Extra rendering for footways/cycleways if not already rendered                                                                                  */
     3390/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3391/***************************************************************************************************************************************************/
     3392way|z17-[!is_prop_set(ok, "default")][highway=footway],
     3393way|z17-[!is_prop_set(ok, "default")][highway=cycleway]
     3394{
     3395    width: eval(2*prop(pixel_per_metre,"default"));
     3396    linecap: none;
     3397    opacity: eval(prop("style_lane_opacity","default"));
     3398    right-casing-width: eval(max(1,0.15*prop(pixel_per_metre,"default")));   right-casing-color: gray;
     3399    left-casing-width:  eval(max(1,0.15*prop(pixel_per_metre,"default")));   left-casing-color:  gray;   
     3400    casing-linecap: none;
     3401    temp: 0;
     3402    temp: eval(prop(temp)+(((tag("highway")="footway")  || ((has_tag_key("foot"))    && (tag("foot")   ="designated")))?1:0));
     3403    temp: eval(prop(temp)+(((tag("highway")="cycleway") || ((has_tag_key("bicycle")) && (tag("bicycle")="designated")))?2:0));
     3404    color: eval(get(prop(style_sidewalk_color,"default"),prop(temp)));
     3405}
     3406
     3407/***************************************************************************************************************************************************/
     3408/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3409/* Additional attributes/features                                                                                                                  */
     3410/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3411/***************************************************************************************************************************************************/
     3412/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3413/* Proposed man_made=bridge                                                                                                                        */
     3414/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3415area[man_made=bridge]
     3416{
     3417    fill-color: #808080;
     3418    fill-opacity: 0.5;
     3419    color: #404DA0;
     3420    width: 5;
     3421}
     3422
     3423/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3424/* Proposed highway=junction                                                                                                                       */
     3425/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3426area[highway=junction]
     3427{
     3428    fill-color: #808080;
     3429    fill-opacity: 0.5;
     3430    width: 2;
     3431    color: #505050;
     3432    opacity: 0.5;
     3433}
     3434
     3435/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3436/* Street lamp                                                                                                                                     */
     3437/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3438node|z17-[highway="street_lamp"]::Lighting_1
     3439{
     3440    symbol-shape: circle;
     3441    symbol-size: eval(12 * prop(pixel_per_metre,"default"));
     3442    symbol-fill-color: white;
     3443    symbol-fill-opacity: 0.07;
     3444}
     3445node|z17-[highway="street_lamp"]::Lighting_2
     3446{
     3447    symbol-shape: circle;
     3448    symbol-size: eval(18 * prop(pixel_per_metre,"default"));
     3449    symbol-fill-color: white;
     3450    symbol-fill-opacity: 0.05;
     3451}
     3452node|z17-[highway="street_lamp"]::Lighting_3
     3453{
     3454    symbol-shape: circle;
     3455    symbol-size: eval(25 * prop(pixel_per_metre,"default"));
     3456    symbol-fill-color: white;
     3457    symbol-fill-opacity: 0.05;
     3458}
     3459
     3460/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3461/* Lighting                                                                                                                                        */
     3462/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3463way|z17-[lit?][is_prop_set(width,"Ground")]::Lighting_1
     3464{
     3465        width: eval(prop(width,"Ground"));
     3466        width: eval(prop(width)+(is_prop_set(left-casing-width,"Ground")?prop(left-casing-width,"Ground"):0));
     3467        width: eval(prop(width)+(is_prop_set(right-casing-width,"Ground")?prop(right-casing-width,"Ground"):0));
     3468        opacity: 0.1;   color: white;   linecap: none;
     3469        major-z-index: eval(prop(major-z-index,"Ground")-0.1);
     3470        offset: eval(prop(offset,"Ground"));
     3471}
     3472way|z17-[lit?][is_prop_set(width,"Ground")]::Lighting_2
     3473{
     3474        width: eval(prop(width,"Lighting_1")+(3 * prop(pixel_per_metre,"default")));
     3475        opacity: 0.1;   color: white;   linecap: none;
     3476        major-z-index: eval(prop(major-z-index,"Lighting_1")); offset: eval(prop(offset,"Lighting_1"));
     3477}
     3478way|z17-[lit?][is_prop_set(width,"Ground")]::Lighting_3
     3479{
     3480        width: eval(prop(width,"Lighting_2")+(3 * prop(pixel_per_metre,"default")));
     3481        opacity: 0.1;   color: white;   linecap: none;
     3482        major-z-index: eval(prop(major-z-index,"Lighting_1")); offset: eval(prop(offset,"Lighting_1"));
     3483}
     3484
     3485/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3486/* Destination                                                                                                                                     */
     3487/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3488way|z17-[is_prop_set(ok, "default")][destination][!prop(style_use_svg_destination, "default")]::Destination
     3489{
     3490    text-offset: eval(prop("placement_offset","default"));
     3491    text: eval(get(split(";",tag(destination)),0));
     3492    text: eval(has_tag_key("destination:ref")?concat(prop(text)," (",get(split(";",tag("destination:ref")),0),")"):prop(text));
     3493    text: eval(has_tag_key("destination:country")?concat(prop(text)," [",get(split(";",tag("destination:country")),0),"]"):prop(text));
     3494    font-size: eval(prop(lane_default_width,"default"));          text-color: white;        text-opacity: 0.3;   
     3495    text-halo-radius: 2;    text-halo-color: blue;    text-halo-opacity: 0.3;
     3496}
     3497way|z17-[is_prop_set(ok, "default")]["destination:forward"][!prop(style_use_svg_destination, "default")]::Destination_Forward
     3498{
     3499    text-offset: eval(prop("placement_offset","default")+(eval(prop(lane_width_all,"default"))/4));
     3500    text: eval(get(split(";",tag("destination:forward")),0));
     3501    text: eval(has_tag_key("destination:ref:forward")?concat(prop(text)," (",get(split(";",tag("destination:ref:forward")),0),")"):prop(text));
     3502    text: eval(has_tag_key("destination:country:forward")?concat(prop(text)," [",get(split(";",tag("destination:country:forward")),0),"]"):prop(text));
     3503    font-size: eval(prop(lane_default_width,"default"));          text-color: white;        text-opacity: 0.3;   
     3504    text-halo-radius: 2;    text-halo-color: blue;    text-halo-opacity: 0.3;
     3505}
     3506way|z17-[is_prop_set(ok, "default")]["destination:backward"][!prop(style_use_svg_destination, "default")]::Destination_Backward
     3507{
     3508    text-offset: eval(prop("placement_offset","default")-(eval(prop(lane_width_all,"default"))/4));
     3509    text: eval(get(split(";",tag("destination:backward")),0));
     3510    text: eval(has_tag_key("destination:ref:backward")?concat(prop(text)," (",get(split(";",tag("destination:ref:backward")),0),")"):prop(text));
     3511    text: eval(has_tag_key("destination:country:backward")?concat(prop(text)," [",get(split(";",tag("destination:country:backward")),0),"]"):prop(text));
     3512    font-size: eval(prop(lane_default_width,"default"));          text-color: white;        text-opacity: 0.3;   
     3513    text-halo-radius: 2;    text-halo-color: blue;    text-halo-opacity: 0.3;
     3514}
     3515
     3516/* TODO: make opacity configurable */
     3517way{} /* If this is removed the following won't be interpreted */
     3518way|z17-[is_prop_set(ok, "default")][destination][prop(style_use_svg_destination, "default")]::Destination
     3519{
     3520    complete_destination: eval(get(split(";",tag(destination)),0));
     3521    complete_destination: eval(has_tag_key("destination:ref")?concat(prop(complete_destination)," (",get(split(";",tag("destination:ref")),0),")"):prop(complete_destination));
     3522    complete_destination: eval(has_tag_key("destination:int_ref")?concat(prop(complete_destination)," <",get(split(";",tag("destination:int_ref")),0),">"):prop(complete_destination));
     3523    complete_destination: eval(has_tag_key("destination:country")?concat(prop(complete_destination)," [",get(split(";",tag("destination:country")),0),"]"):prop(complete_destination));
     3524    /* complete_destination: eval(replace(replace(replace(replace(replace(prop(complete_destination),"&","&amp;"),"[","&#91;"),"]","&#93;"),"<","&lt;"),">","&gt;")); */
     3525    complete_destination: eval(XML_encode(replace(prop(complete_destination),"%","prc"))); /* CDATA blocks are not working, XML_encode is not sufficient, currently no idea how to escape % */
     3526
     3527    repeat-image: eval(concat("data:image/svg+xml,<svg height='70px'><g fill-opacity='0.3' stroke-opacity='0.3'><text x='0' y='50' font-size='50' fill='white' stroke='blue'>",prop(complete_destination),"</text></g></svg>"));
     3528    repeat-image-height: eval(prop(lane_default_width,"default")*prop(lanes_fwd,"default"));
     3529    repeat-image-offset: eval(prop("placement_offset","default"));
     3530    repeat-image-spacing: eval(prop(repeat-image-height));
     3531    repeat-image-phase: eval(prop(repeat-image-height));
     3532}
     3533way{} /* If this is removed the following won't be interpreted */
     3534way|z17-[is_prop_set(ok, "default")]["destination:forward"][prop(style_use_svg_destination, "default")]::Destination_Forward
     3535{
     3536    complete_destination: eval(get(split(";",tag("destination:forward")),0));
     3537    complete_destination: eval(has_tag_key("destination:ref:forward")?concat(prop(complete_destination)," (",get(split(";",tag("destination:ref:forward")),0),")"):prop(complete_destination));
     3538    complete_destination: eval(has_tag_key("destination:int_ref:forward")?concat(prop(complete_destination)," <",get(split(";",tag("destination:int_ref:forward")),0),">"):prop(complete_destination));
     3539    complete_destination: eval(has_tag_key("destination:country:forward")?concat(prop(complete_destination)," [",get(split(";",tag("destination:country:forward")),0),"]"):prop(complete_destination));
     3540    complete_destination: eval(XML_encode(replace(prop(complete_destination),"%","prc"))); /* CDATA blocks are not working, XML_encode is not sufficient, currently no idea how to escape % */
     3541
     3542    repeat-image: eval(concat("data:image/svg+xml,<svg height='70px'><g fill-opacity='0.3' stroke-opacity='0.3'><text x='0' y='50' font-size='50' fill='white' stroke='blue'>",prop(complete_destination),"</text></g></svg>"));
     3543    repeat-image-height: eval(prop(lane_default_width,"default")*prop(lanes_fwd,"default"));
     3544    repeat-image-offset: eval(prop("left_forward_border","default")-(prop("lane_width_all_forward","default")/2));
     3545    repeat-image-spacing: eval(prop(repeat-image-height));
     3546    repeat-image-phase: eval(prop(repeat-image-height));
     3547}
     3548way{} /* If this is removed the following won't be interpreted */
     3549way|z17-[is_prop_set(ok, "default")]["destination:backward"][prop(style_use_svg_destination, "default")]::Destination_Backward
     3550{
     3551    complete_destination: eval(get(split(";",tag("destination:backward")),0));
     3552    complete_destination: eval(has_tag_key("destination:ref:backward")?concat(prop(complete_destination)," (",get(split(";",tag("destination:ref:backward")),0),")"):prop(complete_destination));
     3553    complete_destination: eval(has_tag_key("destination:int_ref:backward")?concat(prop(complete_destination)," <",get(split(";",tag("destination:int_ref:backward")),0),">"):prop(complete_destination));
     3554    complete_destination: eval(has_tag_key("destination:country:backward")?concat(prop(complete_destination)," [",get(split(";",tag("destination:country:backward")),0),"]"):prop(complete_destination));
     3555    complete_destination: eval(XML_encode(replace(prop(complete_destination),"%","prc"))); /* CDATA blocks are not working, XML_encode is not sufficient, currently no idea how to escape % */
     3556   
     3557    repeat-image: eval(concat("data:image/svg+xml,<svg height='70px'><g fill-opacity='0.3' stroke-opacity='0.3'><text x='0' y='50' font-size='50' fill='white' stroke='blue'>",prop(complete_destination),"</text></g></svg>"));
     3558    repeat-image-height: eval(prop(lane_default_width,"default")*prop(lanes_bwd,"default"));
     3559    repeat-image-offset: eval(prop("right_backward_border","default")+(prop("lane_width_all_backward","default")/2));
     3560    repeat-image-spacing: eval(prop(repeat-image-height));
     3561    repeat-image-phase: eval(prop(repeat-image-height));
     3562}
     3563
     3564/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3565/* destination_sign relation (experimental support - only one sign per way is supported)                                                           */
     3566/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3567relation[is_prop_set(ok, "default")][type="destination_sign"] >[role="to"] way|z17-::Destination_Sign
     3568{   
     3569    sign_font_size: 50;
     3570    sign_border: 5;
     3571    sign_height: 70;
     3572    sign_opacity: 0.5;
     3573    sign_text: eval(parent_tag(destination));
     3574    sign_temp: eval(parent_tag("distance"));
     3575    sign_text: eval(is_prop_set(sign_temp)?concat(prop(sign_text),"  ",replace(replace(prop(sign_temp)," km","")," mi","")):prop(sign_text));
     3576    sign_ref: eval(parent_tag("destination:ref"));
     3577    sign_int_ref: eval(parent_tag("destination:int_ref"));
     3578
     3579    sign_text_width: eval(length(prop(sign_text))*prop(sign_font_size)); /* As font-family=monospace is not working, this value is just a guess*/
     3580    sign_text_x: eval((prop(sign_text_width)/2)+(2*prop(sign_border)));
     3581    sign_text_y: eval(prop(sign_font_size));
     3582   
     3583    sign_ref_width: eval(is_prop_set(sign_ref)?(length(prop(sign_ref))*prop(sign_font_size)*1.2):0);
     3584    sign_ref_x: eval(prop(sign_text_width)+(3*prop(sign_border)));
     3585    sign_ref_y: eval(prop(sign_border));
     3586    sign_ref_height: eval(prop(sign_height)-(2*prop(sign_border)));
     3587    sign_ref_text_x: eval(prop(sign_ref_x)+(prop(sign_ref_width)/2));
     3588    sign_ref_text_y: eval(prop(sign_font_size));
     3589
     3590    sign_int_ref_width: eval(is_prop_set(sign_int_ref)?(length(prop(sign_int_ref))*prop(sign_font_size)*1.2):0);
     3591    sign_int_ref_x: eval(prop(sign_ref_x)+prop(sign_ref_width));
     3592    sign_int_ref_y: eval(prop(sign_border));
     3593    sign_int_ref_height: eval(prop(sign_height)-(2*prop(sign_border)));
     3594    sign_int_ref_text_x: eval(prop(sign_int_ref_x)+(prop(sign_int_ref_width)/2));
     3595    sign_int_ref_text_y: eval(prop(sign_font_size));
     3596     
     3597    sign_width: eval(((prop(sign_text_width)+(4*prop(sign_border)))+prop(sign_ref_width))+prop(sign_int_ref_width));
     3598    sign_border_width: eval(prop(sign_width)-(prop(sign_border)*2));
     3599    sign_border_height: eval(prop(sign_height)-(prop(sign_border)*2));
     3600
     3601    sign_colour_back: eval(parent_tag("colour:back"));
     3602    sign_colour_back: eval(is_prop_set(sign_colour_back)?prop(sign_colour_back):"white");
     3603   
     3604    sign_colour_text: eval(parent_tag("colour:text"));
     3605    sign_colour_text: eval(is_prop_set(sign_colour_text)?prop(sign_colour_text):"blue");
     3606
     3607    sign_colour_arrow: eval(parent_tag("colour:arrow"));
     3608    sign_colour_arrow: eval(is_prop_set(sign_colour_arrow)?prop(sign_colour_arrow):"blue");
     3609
     3610    sign_colour_ref_text: eval(parent_tag("colour:text:ref"));
     3611    sign_colour_ref_text: eval(is_prop_set(sign_colour_ref)?prop(sign_colour_ref):"white");
     3612
     3613    sign_colour_ref_back: eval(parent_tag("colour:back:ref"));
     3614    sign_colour_ref_back: eval(is_prop_set(sign_colour_ref)?prop(sign_colour_ref):"blue");
     3615
     3616    sign_colour_int_ref_text: eval(parent_tag("colour:text:int_ref"));
     3617    sign_colour_int_ref_text: eval(is_prop_set(sign_colour_int_ref)?prop(sign_colour_int_ref):"white");
     3618
     3619    sign_colour_int_ref_back: eval(parent_tag("colour:back:int_ref"));
     3620    sign_colour_int_ref_back: eval(is_prop_set(sign_colour_int_ref)?prop(sign_colour_int_ref):"green");
     3621
     3622   
     3623    repeat-image: eval(concat("data:image/svg+xml,<svg height='",prop(sign_height),"px'><rect fill-opacity='",prop(sign_opacity),"' fill='",prop(sign_colour_back),"' stroke-opacity='",prop(sign_opacity),"' stroke='",prop(sign_colour_arrow),"' stroke-width='",prop(sign_border),"' x='",prop(sign_border),"' y='",prop(sign_border),"' width='",prop(sign_border_width),"' height='",prop(sign_border_height),"'/>",
     3624                              "<g fill-opacity='",prop(sign_opacity),"'><text text-anchor='middle' x='",prop(sign_text_x),"' y='",prop(sign_text_y),"' font-size='",prop(sign_font_size),"' fill='",prop(sign_colour_text),"'>",prop(sign_text),"</text></g>",
     3625                              "<rect fill-opacity='",prop(sign_opacity),"' fill='",prop(sign_colour_ref_back),"' x='",prop(sign_ref_x),"' y='",prop(sign_ref_y),"' width='",prop(sign_ref_width),"' height='",prop(sign_ref_height),"' />",
     3626                              "<g fill-opacity='",prop(sign_opacity),"'><text text-anchor='middle' x='",prop(sign_ref_text_x),"' y='",prop(sign_ref_text_y),"' font-size='",prop(sign_font_size),"' fill='",prop(sign_colour_ref_text),"'>",prop(sign_ref),"</text></g>",
     3627                              "<rect fill-opacity='",prop(sign_opacity),"' fill='",prop(sign_colour_int_ref_back),"' x='",prop(sign_int_ref_x),"' y='",prop(sign_int_ref_y),"' width='",prop(sign_int_ref_width),"' height='",prop(sign_int_ref_height),"' />",
     3628                              "<g fill-opacity='",prop(sign_opacity),"'><text text-anchor='middle' x='",prop(sign_int_ref_text_x),"' y='",prop(sign_int_ref_text_y),"' font-size='",prop(sign_font_size),"' fill='",prop(sign_colour_int_ref_text),"'>",prop(sign_int_ref),"</text></g>",
     3629                              "</svg>"));
     3630    repeat-image-spacing: 100000; /* It means: do not repeat! */
     3631    repeat-image-offset: eval((is_prop_set(left_carriageway_border,"default")?(prop(left_carriageway_border,"default")):0)+(prop(pixel_per_metre,"default")*3));
     3632    repeat-image-height: eval(prop(pixel_per_metre,"default")*3);
     3633}
     3634
     3635/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3636/* Traffic signs                                                                                                                                   */
     3637/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3638
     3639/* Disable rendering of traffic signs on low zoom levels */
     3640node|z-15[traffic_sign=~/^(.*;)*maxspeed(;.*)*$/],
     3641node|z-15[traffic_sign=~/^(.*;)*overtaking(;.*)*$/]
     3642{       icon-image: prop(unset_property);               }
     3643
     3644node|z16-[traffic_sign]
     3645{
     3646  traffic_sign_svg: "";
     3647  traffic_sign_top: 0;
     3648}
     3649
     3650/* Speed limit in km/h */
     3651node|z16-[traffic_sign~=maxspeed][maxspeed>0]
     3652{
     3653    t: eval((tag(maxspeed)<10)?1.0:((tag(maxspeed)<100)?0.8:((tag(maxspeed)<1000)?0.6:0.4)));
     3654    t_x: eval((tag(maxspeed)<10)?45:((tag(maxspeed)<100)?60:((tag(maxspeed)<1000)?80:120)));
     3655    t_z: eval((has_tag_key("source:maxspeed") && regexp_test(".*zone.*",tag("source:maxspeed")))?concat("<rect x='0' y='",(prop(traffic_sign_top)+0),"' width='100' height='140' fill='white' /><text style='font-size:40px; font-weight:bold;' x='60' y='",(prop(traffic_sign_top)+135),"' text-anchor='middle' transform='scale(0.8 1.0)'>ZONE</text>"):"");
     3656    traffic_sign_svg: eval(concat(prop(traffic_sign_svg),prop(t_z),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='45' stroke='red' stroke-width='10' fill='white' /><text style='font-size:60px; font-weight:bold;' x='",prop(t_x),"' y='",(prop(traffic_sign_top)+70),"' text-anchor='middle' transform='scale(",prop(t)," 1.0)'>",tag(maxspeed),"</text>"));
     3657    traffic_sign_top: eval(prop(traffic_sign_top)+((prop(t_z)="")?100:140));
     3658}
     3659
     3660/* Speed limit in mph */
     3661node|z16-[traffic_sign~=maxspeed][maxspeed=~/[0-9]+ mph/]
     3662{
     3663    t_speed: eval(get(split(" ",tag(maxspeed)),0));
     3664    t: eval((prop(t_speed)<10)?1.0:((prop(t_speed)<100)?0.8:((prop(t_speed)<1000)?0.6:0.4)));
     3665    t_x: eval((prop(t_speed)<10)?45:((prop(t_speed)<100)?60:((prop(t_speed)<1000)?80:120)));
     3666    t_z: eval((has_tag_key("source:maxspeed") && regexp_test(".*zone.*",tag("source:maxspeed")))?concat("<rect x='0' y='",(prop(traffic_sign_top)+0),"' width='100' height='140' fill='white' /><text style='font-size:40px; font-weight:bold;' x='60' y='",(prop(traffic_sign_top)+135),"' text-anchor='middle' transform='scale(0.8 1.0)'>ZONE</text>"):"");
     3667    traffic_sign_svg: eval(concat(prop(traffic_sign_svg),prop(t_z),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='45' stroke='red' stroke-width='10' fill='yellow' /><text style='font-size:60px; font-weight:bold;' x='",prop(t_x),"' y='",(prop(traffic_sign_top)+70),"' text-anchor='middle' transform='scale(",prop(t)," 1.0)'>",prop(t_speed),"</text>"));
     3668    traffic_sign_top: eval(prop(traffic_sign_top)+((prop(t_z)="")?100:140));
     3669}
     3670
     3671/* End of speed limit but not overtaking allowed (otherwise single traffic sign -> see below) */
     3672node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking!=yes],
     3673node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking=yes]["source:maxspeed"=~/.*zone.*/]
     3674{
     3675    t_z: eval((has_tag_key("source:maxspeed") && regexp_test(".*zone.*",tag("source:maxspeed")))?"<rect x='0' y='0' width='100' height='140' fill='white' /><text style='font-size:40px; font-weight:bold;' x='60' y='135' text-anchor='middle' transform='scale(0.8 1.0)'>ZONE</text>":"");
     3676    traffic_sign_svg: eval(concat(prop(traffic_sign_svg),prop(t_z),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='50' fill='white' /><circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='46' stroke='black' stroke-width='3' fill='white' /><text style='fill:#DDD; font-size:60px; font-weight:bold;' x='47' y='",(prop(traffic_sign_top)+70),"' text-anchor='middle'>XX</text><line x1='17' y1='",(prop(traffic_sign_top)+83),"' x2='83' y2='",(prop(traffic_sign_top)+17),"' stroke='black' stroke-width='15' />"));
     3677    traffic_sign_top: eval(prop(traffic_sign_top)+((prop(t_z)="")?100:140));
     3678}
     3679
     3680/* No overtaking */
     3681node|z16-[traffic_sign~=overtaking][overtaking=no]
     3682{
     3683    traffic_sign_svg: eval(concat(prop(traffic_sign_svg),"<g transform='translate(0,",prop(traffic_sign_top),")'><g transform='scale(0.137931)'><circle cx='362.5' cy='362.5' r='350' style='fill:white;stroke:black;stroke-width:2.5px' /><circle cx='362.5' cy='362.5' r='290' style='fill:white;stroke:#c00;stroke-width:93.75'/><path d='M 151.8,375.1 C 151.4,338.9 149.4,370.0 171.2,316.4 C 187.0,279.9 171.0,289.7 252.7,288.4 C 325.3,289.9 310.7,279.3 327.4,318.1 C 348.3,367.6 346.7,341.7 346.5,374.0 C 345.7,409.5 358.9,400.4 248.9,401.6 C 139.7,400.1 152.7,409.4 151.9,375.1 z M 174.0,340.1 L 188.9,305.6 C 191.7,299.5 190.8,300.4 197.3,300.4 L 301.8,300.4 C 307.4,300.4 306.6,300.0 308.9,305.4 L 323.8,339.7 L 174.0,340.1 z M 163.3,405.5 L 191.2,405.5 C 191.1,440.6 194.0,438.6 178.8,438.8 C 160.7,438.8 163.5,440.6 163.3,405.6 z M 307.2,405.8 L 335.2,405.8 C 335.0,440.9 337.5,438.5 321.7,438.6 C 305.3,438.4 307.4,441.0 307.2,405.8 z ' style='fill:#c00;fill-rule:evenodd' />",
     3684                                  "<path d='M 377.4,375.1 C 376.9,338.9 375.0,370.0 396.8,316.4 C 412.6,279.9 396.6,289.7 478.2,288.4 C 550.9,289.9 536.2,279.3 552.9,318.1 C 573.8,367.6 572.2,341.7 572.1,374.0 C 571.3,409.5 584.4,400.4 474.4,401.6 C 365.3,400.1 378.2,409.4 377.4,375.1 z M 399.5,340.1 L 414.5,305.6 C 417.2,299.5 416.4,300.4 422.9,300.4 L 527.3,300.4 C 533.0,300.4 532.2,300.0 534.5,305.4 L 549.3,339.7 L 399.5,340.1 z M 388.8,405.6 L 416.8,405.5 C 416.7,440.6 419.6,438.6 404.4,438.8 C 386.2,438.8 389.1,440.6 388.8,405.6 z M 532.7,405.8 L 560.7,405.8 C 560.5,440.9 563.1,438.5 547.2,438.6 C 530.9,438.4 532.9,441.0 532.7,405.8 z ' style='fill:black;fill-rule:evenodd' /></g></g>"));
     3685    traffic_sign_top: eval(prop(traffic_sign_top)+100);
     3686}
     3687
     3688/* Overtaking allowed and also not implicit speed limit (or implicit speed zone)*/
     3689node|z16-[traffic_sign~=overtaking][overtaking=yes][maxspeed!=implicit],
     3690node|z16-[traffic_sign~=overtaking][overtaking=yes][maxspeed=implicit]["source:maxspeed"=~/.*zone.*/]
     3691{
     3692    traffic_sign_svg: eval(concat(prop(traffic_sign_svg),"<g transform='translate(0,",prop(traffic_sign_top),")'><g transform='scale(0.137931)'><circle cx='362.5' cy='362.5' r='350' style='fill:white;stroke:black;stroke-width:2.5px' /><circle cx='362.5' cy='362.5' r='330' style='fill:white;stroke:black;stroke-width:20'/><path d='M 151.8,375.1 C 151.4,338.9 149.4,370.0 171.2,316.4 C 187.0,279.9 171.0,289.7 252.7,288.4 C 325.3,289.9 310.7,279.3 327.4,318.1 C 348.3,367.6 346.7,341.7 346.5,374.0 C 345.7,409.5 358.9,400.4 248.9,401.6 C 139.7,400.1 152.7,409.4 151.9,375.1 z M 174.0,340.1 L 188.9,305.6 C 191.7,299.5 190.8,300.4 197.3,300.4 L 301.8,300.4 C 307.4,300.4 306.6,300.0 308.9,305.4 L 323.8,339.7 L 174.0,340.1 z M 163.3,405.5 L 191.2,405.5 C 191.1,440.6 194.0,438.6 178.8,438.8 C 160.7,438.8 163.5,440.6 163.3,405.6 z M 307.2,405.8 L 335.2,405.8 C 335.0,440.9 337.5,438.5 321.7,438.6 C 305.3,438.4 307.4,441.0 307.2,405.8 z ' style='fill:gray;fill-rule:evenodd' />",
     3693                                  "<path d='M 377.4,375.1 C 376.9,338.9 375.0,370.0 396.8,316.4 C 412.6,279.9 396.6,289.7 478.2,288.4 C 550.9,289.9 536.2,279.3 552.9,318.1 C 573.8,367.6 572.2,341.7 572.1,374.0 C 571.3,409.5 584.4,400.4 474.4,401.6 C 365.3,400.1 378.2,409.4 377.4,375.1 z M 399.5,340.1 L 414.5,305.6 C 417.2,299.5 416.4,300.4 422.9,300.4 L 527.3,300.4 C 533.0,300.4 532.2,300.0 534.5,305.4 L 549.3,339.7 L 399.5,340.1 z M 388.8,405.6 L 416.8,405.5 C 416.7,440.6 419.6,438.6 404.4,438.8 C 386.2,438.8 389.1,440.6 388.8,405.6 z M 532.7,405.8 L 560.7,405.8 C 560.5,440.9 563.1,438.5 547.2,438.6 C 530.9,438.4 532.9,441.0 532.7,405.8 z ' style='fill:gray;fill-rule:evenodd' /></g><line x1='18' y1='82' x2='82' y2='18' stroke='black' stroke-width='15' /></g>"));
     3694    traffic_sign_top: eval(prop(traffic_sign_top)+100);
     3695}
     3696
     3697/* End of speed limit (not zone!) and also overtaking allowed -> single traffic sign*/
     3698node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking=yes][!"source:maxspeed"],
     3699node|z16-[traffic_sign~=maxspeed][maxspeed=implicit][overtaking=yes]["source:maxspeed"=~/^((?!zone).)*$/]
     3700{
     3701    traffic_sign_svg: eval(concat(prop(traffic_sign_svg),"<circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='50' fill='white' /><circle cx='50' cy='",(prop(traffic_sign_top)+50),"' r='46' stroke='black' stroke-width='3' fill='white' /><line x1='17' y1='",(prop(traffic_sign_top)+83),"' x2='83' y2='",(prop(traffic_sign_top)+17),"' stroke='black' stroke-width='15' />"));
     3702    traffic_sign_top: eval(prop(traffic_sign_top)+100);
     3703}
     3704
     3705/* Now render the traffic sign */
     3706node|z16-[!(prop(traffic_sign_svg,"default")="")]
     3707{
     3708    major-z-index: 5; /* JOSM added some default rendering, which interferes with this */
     3709    icon-image: eval(concat("data:image/svg+xml,<svg width='100px' height='",prop(traffic_sign_top),"'>",prop(traffic_sign_svg),"</svg>"));
     3710    icon-width: eval(max(12,prop(pixel_per_metre)));
     3711}
     3712
     3713/* Disable JOSMs default rendering (this is a hack and may fail at any time) */
     3714/* Make sure, that the selector is identical to the one that actually renders the traffic sign */
     3715node|z16-[!(prop(traffic_sign_svg,"default")="")]::core_maxnodebg
     3716{
     3717    symbol-shape: none;
     3718}
     3719node|z16-[!(prop(traffic_sign_svg,"default")="")]::core_maxnodefg
     3720{
     3721    text: none;
     3722    symbol-shape: none;
     3723}
     3724
     3725/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3726/* Member nodes of enforcement relations                                                                                                           */
     3727/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3728relation[type="enforcement"] >[role="from"] node
     3729{   
     3730    symbol-stroke-color: #00FF00; symbol-shape: square; symbol-size: 5; symbol-stroke-width: 2;
     3731}
     3732relation[type="enforcement"] >[role="to"] node
     3733{   
     3734    symbol-stroke-color: #FF0000; symbol-shape: square; symbol-size: 5; symbol-stroke-width: 2;
     3735}
     3736
     3737/***************************************************************************************************************************************************/
     3738/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3739/* Check for some common errors                                                                                                                    */
     3740/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3741/***************************************************************************************************************************************************/
     3742way{} /* Why-oh-why do I need this.... */
     3743
     3744/* Discouraged alternative values for oneway */
     3745way[oneway=true], way[oneway=1]                 { data_error:   "use oneway=yes"; }
     3746
     3747/* Rejected turn lanes proposal */
     3748way["lanes:turnright"], way["lanes:turnleft"],
     3749way["lanes:through"], way["lanes:merge"],
     3750way["lanes:turnright:forward"], way["lanes:turnleft:forward"],
     3751way["lanes:through:forward"], way["lanes:merge:forward"],       
     3752way["lanes:turnright:backward"], way["lanes:turnleft:backward"],
     3753way["lanes:through:backward"], way["lanes:merge:backward"]     
     3754                                                { data_error:   "lanes:<turn> rejected"; }
     3755
     3756/* Common typos in destination tags */
     3757way["destination:forward:ref"]                  { data_error:   "use destination:ref:forward"; }
     3758way["destination:backward:ref"]                 { data_error:   "use destination:ref:backward"; }
     3759way["destination:forward:int_ref"]              { data_error:   "use destination:int_ref:forward"; }
     3760way["destination:backward:int_ref"]             { data_error:   "use destination:int_ref:backward"; }
     3761way["destination:forward:symbol"]               { data_error:   "use destination:symbol:forward"; }
     3762way["destination:backward:symbol"]              { data_error:   "use destination:symbol:backward"; }
     3763way["destination:forward:country"]              { data_error:   "use destination:country:forward"; }
     3764way["destination:backward:country"]             { data_error:   "use destination:country:backward"; }
     3765
     3766way["destination:sign"]                         { data_error:   "use destination:symbol"; }
     3767way["destination:sign:forward"]                 { data_error:   "use destination:symbol"; }
     3768way["destination:sign:backward"]                { data_error:   "use destination:symbol"; }
     3769way["destination:sign:lanes"]                   { data_error:   "use destination:symbol"; }
     3770way["destination:sign:lanes:forward"]           { data_error:   "use destination:symbol"; }
     3771way["destination:sign:lanes:backward"]          { data_error:   "use destination:symbol"; }
     3772
     3773way[destination=~/:\S/]                         { data_error:   "use ; instead of : to separate values"; }
     3774way[destination:lanes=~/:\S/]                   { data_error:   "use ; instead of : to separate values"; }
     3775way[destination:lanes:forward=~/:\S/]           { data_error:   "use ; instead of : to separate values"; }
     3776way[destination:lanes:backward=~/:\S/]          { data_error:   "use ; instead of : to separate values"; }
     3777
     3778way[destination=~/,/]                           { data_error:   "use ; instead of , to separate values"; }
     3779way[destination:lanes=~/,/]                     { data_error:   "use ; instead of , to separate values"; }
     3780way[destination:lanes:forward=~/,/]             { data_error:   "use ; instead of , to separate values"; }
     3781way[destination:lanes:backward=~/,/]            { data_error:   "use ; instead of , to separate values"; }
     3782
     3783way["transit"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;)*$",tag("transit"))?prop(data_error):"invalid transit value"); }
     3784way["transit:forward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;)*$",tag("transit:forward"))?prop(data_error):"invalid transit:forward value"); }
     3785way["transit:backward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;)*$",tag("transit:backward"))?prop(data_error):"invalid transit:backward value"); }
     3786way["transit:lanes"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;|\\|)*$",tag("transit:lanes"))?prop(data_error):"invalid transit:lanes value"); }
     3787way["transit:lanes:forward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;|\\|)*$",tag("transit:lanes:forward"))?prop(data_error):"invalid transit:lanes:forward value"); }
     3788way["transit:lanes:backward"] { data_error: eval(regexp_test("^(continue|fork|fork:[3-9]|new_on_left|new_on_left:[2-9]|new_on_right|new_on_right:[2-9]|join_with_left|join_with_right|end|leave|;|\\|)*$",tag("transit:lanes:backward"))?prop(data_error):"invalid transit:lanes:backward value"); }
     3789way["transit:both_ways"]                        { data_error:   "use the relation instead of transit:both_ways"; }
     3790way["transit:lanes:both_ways"]                  { data_error:   "use the relation instead of transit:lanes:both_ways"; }
     3791
     3792/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3793/* Disputed checks: disabled by default                                                                                                            */
     3794/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3795/* maxspeed should be numerical (yes, this is disputed, I know, that's why this is disabled by default) */
     3796way[prop(style_show_disputed)][maxspeed] { data_error: eval(regexp_test("^[0-9]+(| mph| km/h)$",tag(maxspeed))?prop(data_error):"maxspeed not numerical"); }
     3797way[prop(style_show_disputed)]["maxspeed:forward"] { data_error: eval(regexp_test("^[0-9]+(| mph| km/h)$",tag("maxspeed:forward"))?prop(data_error):"maxspeed:forward not numerical"); }
     3798way[prop(style_show_disputed)]["maxspeed:backward"] { data_error: eval(regexp_test("^[0-9]+(| mph| km/h)$",tag("maxspeed:backward"))?prop(data_error):"maxspeed:backward not numerical"); }
     3799/* A source should be given for maxspeed */
     3800way[prop(style_show_disputed)][maxspeed][!"source:maxspeed"]            { data_warning: "source:maxspeed missing"; }
     3801/* Value of source:maxspeed should be <country code>:<context> */
     3802way[prop(style_show_disputed)]["source:maxspeed"] { data_warning: eval(regexp_test("^([A-Z][A-Z]:.+|zone|sign)$",tag("source:maxspeed"))?prop(data_warning):"verify source:maxspeed"); }
     3803
     3804/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3805/* Display warnings/errors                                                                                                                         */
     3806/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
     3807way[is_prop_set(data_warning)][prop(style_show_warnings)=yes]
     3808{
     3809    casing-width: 4;
     3810    casing-color: yellow;
     3811    text: eval(prop(data_warning));
     3812    font-size: 12;
     3813    text-halo-radius: 1;
     3814}
     3815way[is_prop_set(data_error)][prop(style_show_errors)=yes]
     3816{
     3817    casing-width: 5;
     3818    casing-color: red;
     3819    text: eval(prop(data_error));
     3820    font-size: 14;
     3821    text-halo-radius: 1;
     3822}
     3823               
     3824
     3825}}}