/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
<#macro m\-a data\-color><#local \.namespace = 123><a-b>${data\-color}<#nested \.namespace></a-b></#macro><#macro m\-b2></#macro><#macro "m/b2"></#macro>
<@m\-a data\-color="red"; loop\-var, loopVar2>${loop\-var}</@m\-a>

<#function f\-a(p\-a)><#return p\-a + " works"/></#function>${f\-a("f-a")}

<#assign \-\-\-\.\: = "dash-dash-dash etc.">${\-\-\-\.\:}
${.vars["---.:"]}
<#assign hash = {"--moz-prop": "propVal"}>${hash.\-\-moz\-prop}
${hash["--moz-prop"]}

<#assign ls\:a = 1..3>List: <#list ls\:a as \:i>${\:i}</#list>

<#assign sw\-a = 1>Switch: <#switch sw\-a><#case 1>OK<#break/>
    <#default>Fails
</#switch>
<#escape \-x as \-x?upper_case>${"escaped"}</#escape>

<#if false && sw\-a == 1><#visit x\-y2 using x\-y1/><#recurse x\-y2 using x\-y1/><#import i\-a as i\-b/><#include i\-c/></#if>
<#assign @as@_a = "as1">${@as@_a}
<#assign as\-c = "as2">${.vars["as-c"]}
<#assign "as/b" = "as3">${.vars["as/b"]}
<#assign "as'c" = "as4">${.vars["as'c"]}
<#assign 'as"d' = "as5">${.vars['as"d']}

<#global g\-a = 1, g\-b = 2, g\-c = 3><#macro dumpNS><#list .namespace?keys?sort as k>${k} = <#local v = .namespace[k]><#if v?is_string>${v}<#else>...</#if>
</#list></#macro><@dumpNS/>