diff --git a/.circleci/config.yml b/.circleci/config.yml
deleted file mode 100644
index 2000b669..00000000
--- a/.circleci/config.yml
+++ /dev/null
@@ -1,70 +0,0 @@
-version: 2.1
-jobs:
- build:
- docker:
- - image: cimg/openjdk:17.0.2
- working_directory: /tmp
- steps:
- - run:
- name: Download Apache Tomcat
- command: |
- wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
- tar -xzf apache-tomcat-9.0.34.tar.gz
- mv apache-tomcat-9.0.34 tomcat
- rm -rf tomcat/webapps/ROOT
- rm -rf tomcat/webapps/docs
- rm -rf tomcat/webapps/examples
- rm -rf tomcat/webapps/host-manager
- rm -rf tomcat/webapps/manager
- rm -f apache-tomcat-9.0.34.tar.gz
- - checkout:
- path: /tmp/carma-cloud
- - run:
- name: Compile source
- command: |
- mkdir -p tomcat/webapps/carmacloud/ROOT/WEB-INF/classes
- find ./carma-cloud/src -name "*.java" > sources.txt
- javac -cp "tomcat/lib/servlet-api.jar:carma-cloud/lib/*" -d tomcat/webapps/carmacloud/ROOT/WEB-INF/classes @sources.txt
- rm -f sources.txt
- - run:
- name: Configure webapp
- command: |
- mv carma-cloud/end_cc.sh tomcat
- mv carma-cloud/start_cc.sh tomcat
- mkdir -p tomcat/work/carmacloud/xodr
- mkdir -p tomcat/work/carmacloud/validate/xodr
- mv carma-cloud/web/WEB-INF/web.xml tomcat/webapps/carmacloud/ROOT/WEB-INF/
- mv carma-cloud/web/WEB-INF/log4j2.properties tomcat/webapps/carmacloud/ROOT/WEB-INF/classes/
- mv -n carma-cloud/web/* tomcat/webapps/carmacloud/ROOT/
- sudo mv carma-cloud/lib/libcs2cswrapper.so /usr/lib/
- mv carma-cloud/lib tomcat/webapps/carmacloud/ROOT/WEB-INF/
- touch tomcat/webapps/carmacloud/event.csv
- mv carma-cloud/osmbin/rop.csv tomcat/webapps/carmacloud/
- mv carma-cloud/osmbin/storm.csv tomcat/webapps/carmacloud/
- mv carma-cloud/osmbin/units.csv tomcat/webapps/carmacloud/
- gunzip carma-cloud/osmbin/*.gz
- mv carma-cloud/osmbin tomcat/webapps/carmacloud/
- java -cp tomcat/webapps/carmacloud/ROOT/WEB-INF/classes/:tomcat/lib/servlet-api.jar cc.ws.UserMgr ccadmin admin_testpw > tomcat/webapps/carmacloud/user.csv
- rm -rf carma-cloud
- - run:
- name: Configure network and set privileges
- command: |
- sed -i '/<\/Engine>/ i \ \ \ \ \ \n ' tomcat/conf/server.xml
- echo -e '127.0.0.1\tcarmacloud' | sudo tee -a /etc/hosts
- sudo groupadd tomcat
- sudo useradd -g tomcat -m tomcat
- chmod g+r tomcat/conf/*
- chmod -R o-rwx tomcat/webapps/*
- sudo chown -R root:tomcat tomcat
- sudo chown -R tomcat:tomcat tomcat/logs
- sudo chown -R tomcat:tomcat tomcat/temp
- sudo chown -R tomcat:tomcat tomcat/work
- sudo mv tomcat /opt/
- - run:
- name: Start Tomcat and verify deployment
- command: |
- sudo /opt/tomcat/bin/catalina.sh start
- sleep 10
- if [[ `sudo grep "startup in" /opt/tomcat/logs/catalina.out | wc -l` -ne "1" ]]; then exit 1; fi
- if [[ `wget -O - http://carmacloud:8080 | grep "CARMAcloud Login" | wc -l` -ne "1" ]]; then exit 2; fi
- if [[ `wget -O - --post-data="uname=ccadmin&pword=admin_testpw" http://carmacloud:8080/api/auth/login | grep "token" | wc -l` -ne "1" ]]; then exit 3; fi
diff --git a/.github/workflows/deployment_test.yml b/.github/workflows/deployment_test.yml
new file mode 100644
index 00000000..ef9c9b0f
--- /dev/null
+++ b/.github/workflows/deployment_test.yml
@@ -0,0 +1,59 @@
+on:
+ push:
+ branches:
+ - develop
+ - master
+ - "release/*"
+ pull_request:
+ types: [opened, synchronize, reopened]
+name: Deployment Test
+jobs:
+ deployment_test:
+ runs-on: ubuntu-latest
+ container:
+ image: ubuntu:22.04
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - name: Install git
+ # Installing git for checkout action
+ run: |
+ apt update
+ export DEBIAN_FRONTEND=noninteractive
+ apt-get install -y git
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ # Disabling shallow clone is recommended for improving relevancy of reporting
+ fetch-depth: 0
+ path: ${{ github.event.repository.name }}
+ submodules: recursive
+ - name: Move source code
+ run: mv $GITHUB_WORKSPACE/${{ github.event.repository.name }} /home/carma-cloud
+ - name: Install dependencies
+ run: |
+ cd /home/carma-cloud/scripts
+ ./install_dependencies.sh
+ - name: Build
+ run: |
+ cd /home/carma-cloud/scripts
+ ./build.sh
+ - name: Configure network and set privileges
+ run: |
+ echo -e '127.0.0.1\tcarmacloud' | tee -a /etc/hosts
+ groupadd tomcat
+ useradd -g tomcat -m tomcat
+ chmod g+r /opt/tomcat/conf/*
+ chmod -R o-rwx /opt/tomcat/webapps/*
+ chown -R root:tomcat /opt/tomcat
+ chown -R tomcat:tomcat /opt/tomcat/logs
+ chown -R tomcat:tomcat /opt/tomcat/temp
+ chown -R tomcat:tomcat /opt/tomcat/work
+ - name: Start Tomcat and verify deployment
+ run: |
+ /opt/tomcat/bin/catalina.sh start
+ sleep 10
+ if [[ `grep "startup in" /opt/tomcat/logs/catalina.out | wc -l` -ne "1" ]]; then exit 1; fi
+ if [[ `wget -O - http://carmacloud:8080 | grep "CARMAcloud Login" | wc -l` -ne "1" ]]; then exit 2; fi
+ if [[ `wget -O - --post-data="uname=ccadmin&pword=admin_testpw" http://carmacloud:8080/api/auth/login | grep "token" | wc -l` -ne "1" ]]; then exit 3; fi
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 00000000..6af6ad1b
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,9 @@
+name: Docker build
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+jobs:
+ docker:
+ uses: usdot-fhwa-stol/actions/.github/workflows/docker.yml@main
+ with:
+ runner: ubuntu-latest
diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml
new file mode 100644
index 00000000..3056aca7
--- /dev/null
+++ b/.github/workflows/dockerhub.yml
@@ -0,0 +1,17 @@
+name: Docker Hub build
+on:
+ push:
+ branches:
+ - develop
+ - master
+ - "release/*"
+ tags:
+ - "carma-system-*"
+jobs:
+ dockerhub:
+ uses: usdot-fhwa-stol/actions/.github/workflows/dockerhub.yml@main
+ secrets:
+ DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
+ DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
+ with:
+ runner: ubuntu-latest
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..b9ec0e61
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,15 @@
+FROM ubuntu:22.04
+# update package manager and install prerequisites
+COPY scripts/install_dependencies.sh /home/carma-cloud/scripts/install_dependencies.sh
+RUN /home/carma-cloud/scripts/install_dependencies.sh
+COPY src /home/carma-cloud/src
+COPY lib /home/carma-cloud/lib
+COPY web /home/carma-cloud/web
+COPY osmbin /home/carma-cloud/osmbin
+COPY *.sh /home/carma-cloud/
+COPY scripts/build.sh /home/carma-cloud/scripts/build.sh
+
+# download carma-cloud source
+RUN /home/carma-cloud/scripts/build.sh
+ENTRYPOINT [ "/opt/tomcat/bin/catalina.sh", "run" ]
+
diff --git a/README.md b/README.md
index a5e5e423..0db937d7 100644
--- a/README.md
+++ b/README.md
@@ -122,6 +122,22 @@ Example:
> x(n-2)0,y(n-2)0,x(n-2)1,y(n-2)1,x(n-2)2,y(n-2)2,x(n-2)3,y(n-2)3
> x(n-1)0,y(n-1)0,x(n-1)1,y(n-1)1,x(n-1)2,y(n-1)2,x(n-1)3,y(n-1)3
+## Testing Considerations
+
+Upon startup, CARMA Cloud automatically creates traffic controls for later sending to CARMA platform by reading XML OpenDrive files placed in its XODR work folder, e.g. /work/xodr. This can result in thousands of traffic controls that are mostly uninteresting for testing purposes. The cc.util.FilterControls command-line application accepts a list of traffic control identifiers, and creates a much smaller and more manageable subset of traffic controls that can be saved along with their respective testing scenarios.
+
+After CARMA Cloud has been started for the first time in a testing scenario, XODR files will have been processed, and the tester can login to CARMA Cloud to add traffic controls for his testing needs. Executing an ls -lrt in the traffic controls folder, typically /work/carmacloud/traf_ctrls, will put the newly created traffic controls at the bottom of the list. The hexadecimal encoded text for the 16-byte traffic control ids to be kept can then be derived from three levels of folder paths and the traffic control filename.
+
+The FilterControls application takes the source work folder name, the destination work folder name, and a space-separated list of at least one 16-byte hexadecimal encoded text traffic control id.
+```
+/bin/java -cp :/keccakj.jar cc.util.FilterControls ...
+```
+For example:
+```
+/bin/java -cp :/keccakj.jar cc.util.FilterControls /work/carmacloud /work/filtered 00109ab6d542f12ca8942b436c9c9d8d
+```
+FilterControls creates the destination folder structure containing geolanes, linearcs, td, and traf_ctrls subfolders. The filtered traffic control files can then be saved with the appropriate testing scenarios. Both the td and traf_ctrls folders should always contain at least one file, and it is also normal under some circumstances that the geolanes and linearcs folders may contain no files.
+
## Contribution
Welcome to the CARMA contributing guide. Please read this guide to learn about our development process, how to propose pull requests and improvements, and how to build and test your changes to this project. [CARMA Contributing Guide](Contributing.md)
diff --git a/SendTimeSyncMessage.py b/SendTimeSyncMessage.py
new file mode 100644
index 00000000..56fc46a1
--- /dev/null
+++ b/SendTimeSyncMessage.py
@@ -0,0 +1,18 @@
+import http.client
+import json
+import requests
+
+connection = http.client.HTTPConnection("localhost:8080")
+# headers = {'Content-type': 'application/json'}
+foo = {'timestep': 100, 'seq': 1}
+
+connection.request("POST", "/carmacloud/simulation/dumb", json.dumps(foo))
+x = requests.post("http://127.0.0.1:8080/carmacloud/simulation/dumb", json.dumps(foo))
+print(x)
+
+response = connection.getresponse()
+print(response.read().decode())
+
+connection.request("GET", '/api/rop/details')
+response = connection.getresponse()
+print(response.read().decode())
\ No newline at end of file
diff --git a/carma-cloud-config/log4j2.properties b/carma-cloud-config/log4j2.properties
new file mode 100644
index 00000000..642c6e80
--- /dev/null
+++ b/carma-cloud-config/log4j2.properties
@@ -0,0 +1,18 @@
+status = warn
+monitorInterval = 300
+
+appender.rolling.type = RollingFile
+appender.rolling.name = LogToRollingFile
+appender.rolling.fileName = /opt/tomcat/logs/carmacloud.log
+appender.rolling.filePattern = /opt/tomcat/logs/carmacloud-%d{yyyyMMdd}.log.gz
+appender.rolling.layout.type = PatternLayout
+appender.rolling.layout.pattern = [%-5level %d{HH:mm:ss.SSS} [%c{1}] - %msg%n
+appender.rolling.policies.type = Policies
+appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
+appender.rolling.policies.time.interval = 1
+appender.rolling.policies.time.modulate = false
+appender.rolling.strategy.type = DefaultRolloverStrategy
+appender.rolling.strategy.max = 366
+
+rootLogger.level = debug
+rootLogger.appenderRef.stdout.ref = LogToRollingFile
diff --git a/carma-cloud-config/web.xml b/carma-cloud-config/web.xml
new file mode 100644
index 00000000..7fd91667
--- /dev/null
+++ b/carma-cloud-config/web.xml
@@ -0,0 +1,345 @@
+
+
+
+
+CARMAcloud
+
+ login.html
+
+
+
+ login.html
+
+
+
+ RegHub
+ cc.ws.RegHub
+
+ -1
+
+
+
+ RegHub
+ /carmacloud/v2xhub/*
+
+
+
+
+ SimFederate
+ cc.ws.SimFederate
+
+
+ OPTIONAL: Logical flag to specify real world time or simulation time mode. Not present or false indicates real world time mode.
+ simulation
+ true
+
+
+
+ OPTIONAL: Required when simulation is true. Network address for simulation ambassador.
+ ambassador
+ 172.2.0.2
+
+
+
+ OPTIONAL: Required when simulation is true. Simulation identifier for this CARMA Cloud instance.
+ id
+ carma-cloud-sim1
+
+
+
+ OPTIONAL: Required when simulation is true. URL where ambassador sends time sync messages.
+ url
+ http://172.2.0.47:8080/carmacloud/simulation
+
+
+ 1
+
+
+
+ SimFederate
+ /carmacloud/simulation/*
+
+
+
+
+ SessMgr
+ cc.ws.SessMgr
+
+
+ OPTIONAL: session timeout in milliseconds
+ timeout
+ 18000000
+
+
+ 2
+
+
+
+
+ UserMgr
+ cc.ws.UserMgr
+
+
+ REQUIRED: path to user credential file
+ pwdfile
+ /opt/tomcat/webapps/carmacloud/user.csv
+
+
+ 3
+
+
+
+ UserMgr
+ /api/auth/*
+
+
+
+
+ CtrlTiles
+ cc.ws.CtrlTiles
+
+
+ REQUIRED: path to .xodr file containing road defintions
+ xodrdir
+ /opt/tomcat/work/carmacloud/xodr/
+
+
+
+ REQUIRED:
+ linearcdir
+ /opt/tomcat/work/carmacloud/linearcs/
+
+
+
+ REQUIRED: format string for tiled data filenames
+ tileddataformat
+ /opt/tomcat/work/carmacloud/td/%d/ctrls_%d_%d_%d.bin
+
+
+
+ REQUIRED: format string for tiled data filenames
+ ctrldir
+ /opt/tomcat/work/carmacloud/traf_ctrls
+
+
+
+ REQUIRED: zoom level used to create tiled data
+ zoom
+ 17
+
+
+
+ REQUIRED: zoom level used to create tiled data
+ explodestep
+ 0.06
+
+
+
+ REQUIRED: zoom level used to create tiled data
+ combinetol
+ 0.1
+
+
+
+ REQUIRED: file path for units
+ units
+ /opt/tomcat/webapps/carmacloud/units.csv
+
+
+
+ REQUIRED: file path for units
+ units
+ /opt/tomcat/webapps/carmacloud/units.csv
+
+
+ 4
+
+
+
+ CtrlTiles
+ /api/ctrl/*
+
+
+
+
+ TcmReq
+ cc.ws.TcmReqServlet
+
+
+ OPTIONAL: number of cm desired inbetween each point in xml
+ xmldist
+ 1500
+
+
+ 4
+
+
+
+ TcmReq
+ /carmacloud/tcmreq/*
+
+
+
+
+ TcmAck
+ cc.ws.TcmAckServlet
+
+ 4
+
+
+
+ TcmAck
+ /carmacloud/tcmack/*
+
+
+
+
+ GeoLanes
+ cc.ws.GeoLanes
+
+
+ dir
+ /opt/tomcat/work/carmacloud/geolanes
+
+
+ 4
+
+
+
+ GeoLanes
+ /api/geolanes/*
+
+
+
+
+ WxPoly
+ cc.ws.WxPoly
+
+ 4
+
+
+
+ WxPoly
+ /api/wxpoly/*
+
+
+
+ ValidateXodrTiles
+ cc.ws.ValidateXodrTiles
+
+
+ REQUIRED: path to .xodr file containing road defintions
+ xodrdir
+ /opt/tomcat/work/carmacloud/validate/xodr/
+
+
+
+ REQUIRED:
+ linearcdir
+ /opt/tomcat/work/carmacloud/validate/linearcs/
+
+
+
+ REQUIRED: format string for tiled data filenames
+ tileddataformat
+ /opt/tomcat/work/carmacloud/validate/td/%d/ctrls_%d_%d_%d.bin
+
+
+
+ REQUIRED: format string for tiled data filenames
+ ctrldir
+ /opt/tomcat/work/carmacloud/validate/traf_ctrls
+
+
+
+ REQUIRED: zoom level used to create tiled data
+ zoom
+ 17
+
+
+
+ REQUIRED: zoom level used to create tiled data
+ explodestep
+ 0.06
+
+
+
+ REQUIRED: zoom level used to create tiled data
+ combinetol
+ 0.1
+
+
+ 4
+
+
+
+ ValidateXodrTiles
+ /api/vctrl/*
+
+
+
+
+ IHP
+ cc.ihp.IHP
+
+
+ pfile
+ /opt/tomcat/work/carmacloud/ihp/parameters.csv
+
+
+
+ cfile
+ /opt/tomcat/work/carmacloud/ihp/corridor.csv
+
+
+
+ dfile
+ /opt/tomcat/work/carmacloud/ihp/detectors.json
+
+
+
+ basedir
+ /opt/tomcat/work/carmacloud/ihp/
+
+
+ 4
+
+
+
+ IHP
+ /api/ihp/*
+
+
+
+
+ RSU
+ cc.ws.RSUServlet
+
+
+ REQUIRED: Duration to store the received BSM request. Unit of second
+ bsmReqDuration
+ 5
+
+
+
+ REQUIRED: Periodically checking if the BSM is stored longer than the specified duration. Unit of second
+ bsmReqCheckPeriod
+ 2
+
+
+
+ REQUIRED: Bounding box radius in meters
+ boundingBoxRadius
+ 20
+
+
+ 4
+
+
+
+ RSU
+ /carmacloud/rsu/*
+
+
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 00000000..b5cdce01
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,14 @@
+version: "2"
+services:
+ carma-cloud:
+ image: test
+ network_mode: host
+ extra_hosts:
+ carmacloud: "127.0.0.1"
+ container_name: carma-cloud
+ volumes:
+ - ./carmacloudvol/logs:/opt/tomcat/logs
+ - ./carmacloudvol/work/carmacloud/validate/xodr:/opt/tomcat/work/carmacloud/validate/xodr
+ - ./carmacloudvol/work/carmacloud/xodr:/opt/tomcat/work/carmacloud/xodr
+ - ./carma-cloud-config/server.xml:/opt/tomcat/conf/server.xml
+ - ./carma-cloud-config/log4j2.properties:/opt/tomcat/webapps/carmacloud/ROOT/WEB-INF/log4j2.properties
diff --git a/lib/libcs2cswrapper.so b/lib/libcs2cswrapper.so
deleted file mode 100644
index 6f498389..00000000
Binary files a/lib/libcs2cswrapper.so and /dev/null differ
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100755
index 00000000..1cf502ff
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# exit on errors
+set -ex
+export JAVA_HOME="/opt/jdk"
+export TOMCAT_HOME="/opt/tomcat"
+
+
+cd /home/carma-cloud/src/cc/geosrv
+gcc -c -std=c11 -fPIC -Wall -I "${JAVA_HOME}/include/" -I "${JAVA_HOME}/include/linux/" -I /tmp/proj/src/ cs2cswrapper.c
+gcc -shared cs2cswrapper.o -lproj -o /usr/local/lib/libcs2cswrapper.so
+
+mkdir -p "${TOMCAT_HOME}/webapps/carmacloud/ROOT"
+cd /home
+mv carma-cloud/web/* ${TOMCAT_HOME}/webapps/carmacloud/ROOT
+mkdir -p ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes
+cd /home/carma-cloud
+find ./src -name "*.java" > sources.txt
+/opt/jdk/bin/javac -cp ${TOMCAT_HOME}/lib/servlet-api.jar:lib/commons-compress-1.18.jar:lib/javax.json.jar:lib/json-20210307.jar:lib/keccakj.jar:lib/log4j-api-2.16.0.jar:lib/vector_tile.jar -d ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes @sources.txt
+rm sources.txt
+gunzip osmbin/*.gz
+mv lib ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF
+mv osmbin/rop.csv ${TOMCAT_HOME}/webapps/carmacloud
+mv osmbin/storm.csv ${TOMCAT_HOME}/webapps/carmacloud
+mv osmbin/units.csv ${TOMCAT_HOME}/webapps/carmacloud
+mv osmbin ${TOMCAT_HOME}/webapps/carmacloud
+mv ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/log4j2.properties ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes
+touch ${TOMCAT_HOME}/webapps/carmacloud/event.csv
+mkdir -p ${TOMCAT_HOME}/work/carmacloud/xodr
+mkdir -p ${TOMCAT_HOME}/work/carmacloud/validate/xodr
+/opt/jdk/bin/java -cp ${TOMCAT_HOME}/webapps/carmacloud/ROOT/WEB-INF/classes/:${TOMCAT_HOME}/lib/servlet-api.jar cc.ws.UserMgr ccadmin admin_testpw > ${TOMCAT_HOME}/webapps/carmacloud/user.csv
+sed -i 's/appBase="webapps"/appBase="webapps\/carmacloud"/g' ${TOMCAT_HOME}/conf/server.xml
+echo "JAVA_HOME=${JAVA_HOME}" > ${TOMCAT_HOME}/bin/setenv.sh
diff --git a/scripts/install_dependencies.sh b/scripts/install_dependencies.sh
new file mode 100755
index 00000000..ef1a5836
--- /dev/null
+++ b/scripts/install_dependencies.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+# exit on errors
+set -ex
+apt-get update -y
+apt-get install -y build-essential cmake git wget pkg-config sqlite3 libcurl4-openssl-dev libsqlite3-dev libtiff5-dev openjdk-21-jdk
+# download geodesy projection library source and build
+cd /tmp
+wget -q https://download.osgeo.org/proj/proj-9.3.0.tar.gz
+tar -xzf proj-9.3.0.tar.gz
+rm proj-9.3.0.tar.gz
+mv proj-9.3.0 proj
+mkdir -p proj/build
+cd /tmp/proj/build
+cmake ..
+cmake --build . && \
+cmake --build . --target install && \
+ldconfig
+# download apache tomcat
+cd /tmp
+wget -q https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.83/bin/apache-tomcat-9.0.83.tar.gz
+tar -xzf apache-tomcat-9.0.83.tar.gz
+rm apache-tomcat-9.0.83.tar.gz
+mv apache-tomcat-9.0.83 tomcat
+#sed -i 's/appBase="webapps"/appBase="webapps\/carmacloud"/g' tomcat/conf/server.xml
+rm -r tomcat/webapps/*
+mv tomcat /opt
+
+# download and install JDK 21
+cd /tmp
+wget --no-check-certificate -q https://download.java.net/java/GA/jdk21.0.1/415e3f918a1f4062a0074a2794853d0d/12/GPL/openjdk-21.0.1_linux-x64_bin.tar.gz
+tar -xzf openjdk-21.0.1_linux-x64_bin.tar.gz
+mv jdk-21.0.1 /opt/jdk
+rm openjdk-21.0.1_linux-x64_bin.tar.gz
diff --git a/src/cc/ctrl/TcmReqParser2.java b/src/cc/ctrl/TcmReqParser2.java
index 201322d0..782655bf 100644
--- a/src/cc/ctrl/TcmReqParser2.java
+++ b/src/cc/ctrl/TcmReqParser2.java
@@ -32,6 +32,14 @@ public void startElement(String sUri, String sLocalName,
{
switch (sQname)
{
+ case "TrafficControlRequest":
+ {
+ String sVal;
+ m_nPort = (sVal = iAtt.getValue("port")) != null ? Integer.parseInt(sVal) : m_nPort;
+ m_bList = (sVal = iAtt.getValue("list")) != null ? Boolean.parseBoolean(sVal) : m_bList;
+ break;
+ }
+
case "bounds":
{
m_oBounds = new TcBounds();
@@ -40,11 +48,8 @@ public void startElement(String sUri, String sLocalName,
m_oReq.m_oBounds = new ArrayList();
break;
}
-
default:
-
-
}
}
@@ -113,8 +118,8 @@ public void endElement(String sUri, String sLocalName, String sQname)
default:
break;
}
-
}
+
public TcmReq parseRequest(InputStream oIn)
throws Exception
diff --git a/src/cc/geosrv/xodr/rdmk/RoadMark.java b/src/cc/geosrv/xodr/rdmk/RoadMark.java
index 9ff6b8e6..4fba8307 100644
--- a/src/cc/geosrv/xodr/rdmk/RoadMark.java
+++ b/src/cc/geosrv/xodr/rdmk/RoadMark.java
@@ -80,6 +80,9 @@ public static RoadMark getRoadMark(double dDist, ArrayList oRoadMarks)
public static int getColor(String sColor)
{
+ if (sColor == null)
+ return 0;
+
int nIndex = COLORS.length;
while (nIndex-- > 0)
{
diff --git a/src/cc/util/FilterControls.java b/src/cc/util/FilterControls.java
new file mode 100644
index 00000000..136ea9d2
--- /dev/null
+++ b/src/cc/util/FilterControls.java
@@ -0,0 +1,165 @@
+package cc.util;
+
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.io.IOException;
+import cc.ctrl.proc.TdFeature;
+import cc.ctrl.proc.TdLayer;
+import cc.ctrl.CtrlIndex;
+import cc.ctrl.TrafCtrl;
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+/**
+ *
+ * @author Federal Highway Administration
+ */
+public class FilterControls
+{
+ public static void main(String[] sArgs)
+ throws Exception
+ {
+ String sInputDir = sArgs[0];
+ if (!sInputDir.endsWith("/"))
+ sInputDir += "/";
+ String sOutputDir = sArgs[1];
+ if (!sOutputDir.endsWith("/"))
+ sOutputDir += "/";
+ Files.createDirectories(Paths.get(sOutputDir));
+ Files.createDirectories(Paths.get(sOutputDir + "linearcs/direction"));
+ Files.createDirectories(Paths.get(sOutputDir + "linearcs/rdmks"));
+ Files.createDirectories(Paths.get(sOutputDir + "linearcs/pavement"));
+ Files.createDirectories(Paths.get(sOutputDir + "xodr/"));
+ Files.createDirectories(Paths.get(sOutputDir + "td/"));
+ Files.createDirectories(Paths.get(sOutputDir + "geolanes/"));
+ Files.createDirectories(Paths.get(sOutputDir + "traf_ctrls/"));
+ ArrayList oIds = new ArrayList();
+ StringBuilder sBuf = new StringBuilder();
+ for (int n = 2; n < sArgs.length; n++)
+ {
+ String sId = sArgs[n];
+ sBuf.setLength(0);
+ sBuf.append(sId);
+ oIds.add(Text.fromHexString(sBuf));
+ }
+
+ Collections.sort(oIds, TrafCtrl.ID_COMP);
+
+ Path oTdDir = Paths.get(sInputDir + "td/");
+ Path oOutputTdDir = Paths.get(sOutputDir + "td/");
+ Path oOutputGeoLanes = Paths.get(sOutputDir + "geolanes");
+ Path oOutputCtrl = Paths.get(sOutputDir + "traf_ctrls");
+
+ List oPaths = Files.walk(oTdDir).filter(Files::isRegularFile).collect(Collectors.toList());
+ byte[] yIdBuf = new byte[16];
+ for (Path oFile : oPaths)
+ {
+ String sFilename = oFile.toString();
+ ByteArrayOutputStream oBaos = new ByteArrayOutputStream();
+ if (sFilename.endsWith(".bin")) // td file
+ {
+ try (DataOutputStream oOut = new DataOutputStream(new BufferedOutputStream(oBaos));
+ DataInputStream oIn = new DataInputStream(new BufferedInputStream(Files.newInputStream(oFile))))
+ {
+ while (oIn.available() > 0)
+ {
+ TdLayer oTemp = new TdLayer(oIn, false);
+ int nFeatures = oIn.readInt();
+ for (int nIndex = 0; nIndex < nFeatures; nIndex++)
+ {
+ oIn.read(yIdBuf);
+ int nBytesToSkip = oIn.readInt();
+ int nSearch = Collections.binarySearch(oIds, yIdBuf, TrafCtrl.ID_COMP);
+ if (nSearch < 0)
+ oIn.skipBytes(nBytesToSkip);
+ else
+ oTemp.add(new TdFeature(oIn, oTemp.m_oKeys.length * 2, yIdBuf));
+ }
+ oTemp.write(oOut);
+ }
+ }
+
+ }
+ else if (sFilename.endsWith(".ndx")) // index file
+ {
+ try (DataOutputStream oOut = new DataOutputStream(new BufferedOutputStream(oBaos));
+ DataInputStream oIn = new DataInputStream(new BufferedInputStream(Files.newInputStream(oFile))))
+ {
+
+ while (oIn.available() > 0)
+ {
+ CtrlIndex oIndex = new CtrlIndex(oIn);
+ int nSearch = Collections.binarySearch(oIds, oIndex.m_yId, TrafCtrl.ID_COMP);
+ if (nSearch >= 0)
+ writeIndex(oIndex, oOut);
+ }
+ }
+ }
+
+ if (oBaos.size() > 0)
+ {
+ String sPath = oOutputTdDir.toString() + "/" + oFile.subpath(oFile.getNameCount() - 2, oFile.getNameCount()).toString();
+ Path oPath = Paths.get(sPath);
+ Files.createDirectories(oPath.getParent());
+ try (BufferedOutputStream oOut = new BufferedOutputStream(Files.newOutputStream(oPath)))
+ {
+ oOut.write(oBaos.toByteArray());
+ }
+ }
+ }
+
+ for (byte[] yId : oIds)
+ {
+ createFilePath(sBuf, yId);
+
+ Path oInTraf = Paths.get(sInputDir + "traf_ctrls/" + sBuf.toString() + ".bin");
+ Path oOutTraf = Paths.get(oOutputCtrl.toString() + "/" + sBuf.toString() + ".bin");
+ Files.createDirectories(oOutTraf.getParent());
+ Files.copy(oInTraf, oOutTraf);
+
+ oInTraf = Paths.get(sInputDir + "traf_ctrls/" + sBuf.toString() + ".bin.json");
+ oOutTraf = Paths.get(oOutputCtrl.toString() + "/" + sBuf.toString() + ".bin.json");
+ Files.copy(oInTraf, oOutTraf);
+ }
+ }
+
+
+ public static void createFilePath(StringBuilder sBuf, byte[] oId)
+ {
+ sBuf.setLength(0);
+ int nOffset = 0;
+ int nCount = 3;
+ while (nCount-- > 0)
+ {
+ Text.toHexString(oId, nOffset, nOffset + 4, sBuf);
+ nOffset += 4;
+ sBuf.append("/");
+ }
+ Text.toHexString(oId, nOffset, nOffset + 4, sBuf);
+ }
+
+ public static void writeIndex(CtrlIndex oIndex, DataOutputStream oOut)
+ throws IOException
+ {
+ oOut.writeInt(oIndex.m_nType);
+ oOut.write(oIndex.m_yId);
+ oOut.writeLong(oIndex.m_lStart);
+ oOut.writeLong(oIndex.m_lEnd);
+ for (int nIndex = 0; nIndex < oIndex.m_dBB.length; nIndex++)
+ oOut.writeInt((int)(oIndex.m_dBB[nIndex] * 100.0 + 0.5));
+ }
+}
diff --git a/src/cc/ws/CtrlTiles.java b/src/cc/ws/CtrlTiles.java
index 182c4ff9..d9d9fa97 100644
--- a/src/cc/ws/CtrlTiles.java
+++ b/src/cc/ws/CtrlTiles.java
@@ -89,7 +89,7 @@ public class CtrlTiles extends HttpServlet
18, //{"maxaxles"},
18, //{"minvehocc"},
17, //{"pavement"},
- 17, //{"debug"}
+ 17, //{"debug"}
18, // maxplatoonsize
18 // minplatoonhdwy
};
@@ -158,7 +158,7 @@ public void init(ServletConfig oConfig)
protected void doGet(HttpServletRequest oRequest, HttpServletResponse oResponse)
throws ServletException, IOException
{
- long lNow = System.currentTimeMillis();
+ long lNow = TimeSource.getInstance().currentTimeMillis();
String[] sUriParts = oRequest.getRequestURI().split("/");
int nZ = Integer.parseInt(sUriParts[sUriParts.length - 3]);
int nX = Integer.parseInt(sUriParts[sUriParts.length - 2]);
@@ -191,7 +191,6 @@ protected void doGet(HttpServletRequest oRequest, HttpServletResponse oResponse)
double[] dClipBounds = TileUtil.getClippingBounds(nZ, nX, nY, dBounds);
int nExtent = 4096;
-// int nExtent = Mercator.getExtent(nZ);
VectorTile.Tile.Layer.Builder oLayerBuilder = VectorTile.Tile.Layer.newBuilder();
oLayerBuilder.setVersion(2);
oLayerBuilder.setExtent(nExtent);
@@ -449,7 +448,7 @@ private void addControl(HttpServletRequest oReq, HttpServletResponse oRes)
{
try
{
- long lNow = System.currentTimeMillis() - 10;
+ long lNow = TimeSource.getInstance().currentTimeMillis() - 10;
int nType = Integer.parseInt(oReq.getParameter("type"));
String[] sVtypes = oReq.getParameterValues("vtypes[]");
ArrayList nVtypes = new ArrayList(sVtypes.length);
@@ -523,12 +522,6 @@ private void addControl(HttpServletRequest oReq, HttpServletResponse oRes)
ArrayList oCtrls = new ArrayList();
oCtrls.add(oCtrl);
ProcCtrl.renderCtrls(sType, oCtrls, oCtrl.m_oFullGeo.m_oTiles);
-// StringBuilder sBuf = new StringBuilder();
-// try (BufferedWriter oOut = Files.newBufferedWriter(Paths.get("/opt/tomcat/work/carmacloud/sample_tcm.xml")))
-// {
-// oCtrl.getXml(sBuf, "cb9353e606e5aafa", 1, 1, 1, "1.0", true, 0);
-// oOut.append(sBuf);
-// }
}
catch (Exception oEx)
{
@@ -561,7 +554,7 @@ private void saveEdit(HttpServletRequest oReq, HttpServletResponse oRes)
{
try
{
- long lNow = System.currentTimeMillis();
+ long lNow = TimeSource.getInstance().currentTimeMillis();
int nType = Integer.parseInt(oReq.getParameter("type"));
String[] sVtypes = oReq.getParameterValues("vtypes[]");
ArrayList nVtypes = new ArrayList(sVtypes.length);
@@ -635,7 +628,6 @@ private void saveEdit(HttpServletRequest oReq, HttpServletResponse oRes)
{
for (int[] nTile : oOriginalCtrl.m_oFullGeo.m_oTiles)
{
- // ProcCtrl.writeIndexFile(oCtrls, nTile[0], nTile[1]);
String sIndex = String.format(g_sTdFileFormat, nTile[0], g_nZoom, nTile[0], nTile[1]) + ".ndx";
ProcCtrl.updateIndex(sIndex, oOriginalCtrl, oNewCtrl.m_lStart);
}
diff --git a/src/cc/ws/SimFederate.java b/src/cc/ws/SimFederate.java
new file mode 100644
index 00000000..ac269ecd
--- /dev/null
+++ b/src/cc/ws/SimFederate.java
@@ -0,0 +1,137 @@
+package cc.ws;
+
+import java.io.BufferedInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.json.JSONWriter;
+
+
+public class SimFederate extends HttpServlet implements Runnable
+{
+ protected static final Logger LOGGER = LogManager.getRootLogger();
+
+ private long m_lRetryInterval = 60000L; // default registration retry 60 seconds
+ private String m_sAmbassadorAddress;
+ private String m_sCarmaCloudId = "carma-cloud";
+ private String m_sCarmaCloudUrl = "";
+ private TimeSource m_oTs;
+
+
+ public SimFederate()
+ {
+ }
+
+
+ @Override
+ public void init()
+ {
+ ServletConfig oConf = getServletConfig();
+
+ String sRetry = oConf.getInitParameter("retry");
+ if (sRetry != null)
+ m_lRetryInterval = Integer.parseInt(sRetry) * 1000L;
+
+ String sSim = oConf.getInitParameter("simulation");
+ if (sSim != null && sSim.compareToIgnoreCase("true") == 0)
+ {
+ String sAddress = oConf.getInitParameter("ambassador");
+ try
+ {
+ InetAddress.getByName(sAddress); // validate network address
+ m_sAmbassadorAddress = sAddress;
+ m_oTs = new TimeSource(true); // create simulation time source
+
+ String sId = oConf.getInitParameter("id");
+ if (sId != null)
+ m_sCarmaCloudId = sId;
+
+ String sUrl = oConf.getInitParameter("url");
+ if (sUrl != null)
+ m_sCarmaCloudUrl = sUrl;
+
+ new Thread(this).start(); // begin registration cycle
+ }
+ catch (Exception oEx)
+ {
+ LOGGER.error("SimFederate init invalid ambassador network address");
+ }
+ }
+
+ if (m_oTs == null) // create real world time source
+ m_oTs = new TimeSource(false);
+ }
+
+
+ @Override
+ public void doPost(HttpServletRequest oReq, HttpServletResponse oRes)
+ throws ServletException, IOException
+ {
+ JSONObject oJson;
+ try (BufferedInputStream oIn = new BufferedInputStream(oReq.getInputStream()))
+ {
+ oJson = new JSONObject(new JSONTokener(oIn));
+ }
+
+ long lSeq = -1L;
+ long lStep = -1L;
+ if (oJson.has("seq") && oJson.has("timestep"))
+ {
+ lSeq = oJson.getLong("seq");
+ lStep = oJson.getLong("timestep");
+ m_oTs.m_lSimTime = lStep;
+ }
+ LOGGER.debug(String.format("seq: %d timestep: %d timesource: %d", lSeq, lStep, m_oTs.currentTimeMillis()));
+ }
+
+
+ @Override
+ public void run()
+ {
+ boolean bRegistered = false;
+ while (!bRegistered)
+ {
+ try (Socket oSock = new Socket())
+ {
+ StringBuilder sBuf = new StringBuilder(); // use JSON library to build registration message
+ new JSONWriter(sBuf).object().key("id").value(m_sCarmaCloudId).key("url").value(m_sCarmaCloudUrl).endObject();
+
+ oSock.connect(new InetSocketAddress(m_sAmbassadorAddress, 1617), 10000);
+ DataOutputStream oOut = new DataOutputStream(oSock.getOutputStream());
+ oOut.writeUTF(sBuf.toString());
+ bRegistered = true;
+ }
+ catch (Exception oEx)
+ {
+ LOGGER.error(oEx);
+ }
+
+ if (!bRegistered)
+ {
+ try
+ {
+ Thread.sleep(m_lRetryInterval);
+ }
+ catch (InterruptedException oEx)
+ {
+ bRegistered = true; // container thread interrupts on shutdown
+ }
+ catch (IllegalArgumentException oEx)
+ {
+ LOGGER.error(oEx.toString()); // invalid, possibly negative, delay specified
+ }
+ }
+ }
+ }
+}
diff --git a/src/cc/ws/TcmReqServlet.java b/src/cc/ws/TcmReqServlet.java
index a7611c14..069e7e26 100644
--- a/src/cc/ws/TcmReqServlet.java
+++ b/src/cc/ws/TcmReqServlet.java
@@ -90,6 +90,7 @@ public void doPost(HttpServletRequest oReq, HttpServletResponse oRes)
throws ServletException, IOException
{
StringBuilder sReq = new StringBuilder(1024);
+ sReq.append(oReq.getRemoteAddr());
try (BufferedInputStream oIn = new BufferedInputStream(oReq.getInputStream()))
{
int nByte;
@@ -107,10 +108,14 @@ public void run()
{
try
{
- long lNow = System.currentTimeMillis();
+ long lNow = TimeSource.getInstance().currentTimeMillis();
String sReq = Thread.currentThread().getName();
+ int nPos = sReq.indexOf('<');
+ String sHost = sReq.substring(0, nPos);
+ sReq = sReq.substring(nPos);
+
TcmReqParser oReqParser;
- if (sReq.indexOf("") >= 0)
+ if (sReq.contains(""))
oReqParser = new TcmReqParser();
else
oReqParser = new TcmReqParser2();
@@ -233,7 +238,7 @@ public void run()
if (!oReqParser.m_bList)
{
- HttpURLConnection oHttpClient = (HttpURLConnection)new URL(String.format("http://tcmreplyhost:%d/tcmreply", oReqParser.m_nPort)).openConnection();
+ HttpURLConnection oHttpClient = (HttpURLConnection)new URL(String.format("http://%s:%d/tcmreply", sHost, oReqParser.m_nPort)).openConnection();
oHttpClient.setFixedLengthStreamingMode(sBuf.length());
oHttpClient.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
oHttpClient.setDoOutput(true);
@@ -262,7 +267,8 @@ public void run()
if (oReqParser.m_bList)
{
- HttpURLConnection oHttpClient = (HttpURLConnection)new URL(String.format("http://tcmreplyhost:%d/tcmreply", oReqParser.m_nPort)).openConnection();
+ String sUrl = String.format("http://%s:%d/tcmreply", sHost, oReqParser.m_nPort);
+ HttpURLConnection oHttpClient = (HttpURLConnection)new URL(sUrl).openConnection();
oHttpClient.setRequestProperty("Content-Encoding", "gzip");
oHttpClient.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
oHttpClient.setDoOutput(true);
@@ -287,7 +293,7 @@ public void run()
}
catch (Exception oEx)
{
- oEx.printStackTrace();
+ LOGGER.error(sUrl, oEx);
}
}
sBuf.insert(0, "");
diff --git a/src/cc/ws/TimeSource.java b/src/cc/ws/TimeSource.java
new file mode 100644
index 00000000..204f6162
--- /dev/null
+++ b/src/cc/ws/TimeSource.java
@@ -0,0 +1,37 @@
+package cc.ws;
+
+
+public class TimeSource
+{
+ private static TimeSource g_oInstance;
+
+ private boolean m_bSim; // determines if instance is in simulation mode
+ long m_lSimTime; // package private time set by simulation federate
+
+
+ protected TimeSource()
+ {
+ }
+
+
+ TimeSource(boolean bSim)
+ {
+ m_bSim = bSim;
+ g_oInstance = this;
+ }
+
+
+ public static TimeSource getInstance()
+ {
+ return g_oInstance;
+ }
+
+
+ public long currentTimeMillis()
+ {
+ if (m_bSim)
+ return m_lSimTime;
+
+ return System.currentTimeMillis();
+ }
+}
diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml
index 4f6e164b..ed3594d5 100644
--- a/web/WEB-INF/web.xml
+++ b/web/WEB-INF/web.xml
@@ -25,6 +25,43 @@
+
+ SimFederate
+ cc.ws.SimFederate
+
+
+ OPTIONAL: Logical flag to specify real world time or simulation time mode. Not present or false indicates real world time mode.
+ simulation
+ false
+
+
+
+ OPTIONAL: Required when simulation is true. Network address for simulation ambassador.
+ ambassador
+ ambassador-address
+
+
+
+ OPTIONAL: Required when simulation is true. Simulation identifier for this CARMA Cloud instance.
+ id
+ simulation-id
+
+
+
+ OPTIONAL: Required when simulation is true. URL where ambassador sends time sync messages.
+ url
+ simulation-url
+
+
+ 0
+
+
+
+ SimFederate
+ /carmacloud/simulation/*
+
+
+
SessMgr
cc.ws.SessMgr
@@ -241,54 +278,7 @@
/api/vctrl/*
-
- RsmServlet
- cc.ws.RsmServlet
-
-
- user
- bryan
-
-
-
- pw
-
- 0816119b-3ea5-42ba-8a68-559875833aa1
-
-
-
- url
- https://wzdc-published-rest-api.azurewebsites.net
-
-
-
- period
- 1
-
-
-
- file
- /opt/tomcat/work/carmacloud/rsm/current.csv
-
-
-
- defaultoffsets
- 0.0,-0.00006
-
-
-
- rsm-rsm-xml--tfhrc-carma-test-21--innovation-road
- 0.0,-0.000031
-
-
- 2
-
-
-
- RsmServlet
- /api/rsm/*
-
-
+
IHP
cc.ihp.IHP
diff --git a/web/mapbox/satellite-streets-v11.json b/web/mapbox/satellite-streets-v11.json
index 3421935b..1786d463 100644
--- a/web/mapbox/satellite-streets-v11.json
+++ b/web/mapbox/satellite-streets-v11.json
@@ -1 +1 @@
-{"version":8,"name":"Mapbox Satellite Streets","metadata":{"mapbox:type":"default","mapbox:origin":"satellite-streets-v11","mapbox:autocomposite":true,"mapbox:groups":{"1444855786460.0557":{"name":"Roads","collapsed":true},"1444934295202.7542":{"name":"Admin boundaries","collapsed":true},"1444855799204.86":{"name":"Bridges","collapsed":true},"1444855769305.6016":{"name":"Tunnels","collapsed":true}},"mapbox:sdk-support":{"js":"0.49.0","android":"6.5.0","ios":"4.4.0"},"mapbox:trackposition":true},"sources":{"mapbox://mapbox.satellite":{"url":"mapbox://mapbox.satellite","type":"raster","tileSize":256},"composite":{"url":"mapbox://mapbox.mapbox-streets-v8","type":"vector"}},"center":[-74.0053,40.7123],"zoom":14,"sprite":"https://cctest.data-env.com/images/sprite","glyphs":"https://cctest.data-env.com/mapbox/{fontstack}/{range}.pbf","layers":[{"id":"background","type":"background","layout":{},"paint":{"background-color":"hsl(222, 56%, 4%)"}},{"id":"satellite","type":"raster","source":"mapbox://mapbox.satellite","layout":{},"paint":{}},{"id":"tunnel-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-dasharray":[3,3],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-major-link-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-path","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-color":"hsl(0, 0%, 86%)","line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-steps","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-major-link","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 78%)","trunk_link","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-pedestrian","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","street","street_limited","tertiary"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"tunnel-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 78%)","trunk","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","motorway_link","trunk","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"ferry","type":"line","source":"composite","source-layer":"road","minzoom":8,"filter":["==",["get","type"],"ferry"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-dasharray":["step",["zoom"],["literal",[1,0]],13,["literal",[12,4]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"ferry-auto","type":"line","source":"composite","source-layer":"road","filter":["==",["get","type"],"ferry_auto"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-low","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,0.75,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],6,0.25,8,0.6,13,1,15,0]}},{"id":"road-major-link-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-path","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"path"],["step",["zoom"],["!",["match",["get","type"],["steps","sidewalk","crossing"],true,false]],16,["!=",["get","type"],"steps"]],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],13,0.5,14,1,15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-steps","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-major-link","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-pedestrian","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-street","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["interpolate",["exponential",1],["zoom"],8,"hsl(0, 0%, 96%)",10,"hsl(0, 0%, 89%)"],"line-opacity":["interpolate",["exponential",1.25],["zoom"],6,0.25,13,1,15,0]}},{"id":"road-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"road-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["step",["zoom"],["match",["get","class"],"motorway","hsl(26, 87%, 62%)","trunk","hsl(46, 80%, 60%)","hsl(46, 80%, 60%)"],9,["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"]],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","oneway"],"true"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"bridge-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["step",["zoom"],0,14,1]}},{"id":"bridge-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-major-link-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-path","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-steps","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["==",["get","structure"],"bridge"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-major-link","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-pedestrian","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","track","service"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"bridge-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"aerialway","type":"line","source":"composite","source-layer":"road","minzoom":13,"filter":["==",["get","class"],"aerialway"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(230, 10%, 74%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1]}},{"id":"admin-1-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"bevel"},"paint":{"line-color":["interpolate",["linear"],["zoom"],8,"hsl(35, 12%, 89%)",16,"hsl(230, 49%, 90%)"],"line-width":["interpolate",["linear"],["zoom"],7,3.75,12,5.5],"line-opacity":["interpolate",["linear"],["zoom"],7,0,8,0.75],"line-dasharray":[1,0],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,8,3]}},{"id":"admin-0-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{},"paint":{"line-width":["interpolate",["linear"],["zoom"],3,3.5,10,8],"line-color":["interpolate",["linear"],["zoom"],6,"hsl(35, 12%, 89%)",8,"hsl(230, 49%, 90%)"],"line-opacity":["interpolate",["linear"],["zoom"],3,0,4,0.5],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,10,2]}},{"id":"admin-1-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-dasharray":["step",["zoom"],["literal",[2,0]],7,["literal",[2,2,6,2]]],"line-width":["interpolate",["linear"],["zoom"],7,0.75,12,1.5],"line-opacity":["interpolate",["linear"],["zoom"],2,0,3,1],"line-color":"hsl(0, 0%, 0%)"}},{"id":"admin-0-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","disputed"],"false"],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"admin-0-boundary-disputed","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","disputed"],"true"],["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round"},"paint":{"line-dasharray":[1.5,1.5],"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"road-label","type":"symbol","source":"composite","source-layer":"road","minzoom":10,"filter":["step",["zoom"],["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],true,false],12,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary","pedestrian","street","street_limited"],true,false],15,["match",["get","class"],["golf","path"],false,true]],"layout":{"text-size":["interpolate",["linear"],["zoom"],10,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],10,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],9,6.5],18,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],16,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],14,13]],"text-max-angle":30,"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line","text-padding":1,"text-rotation-alignment":"map","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":0.01},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"road-number-shield","type":"symbol","source":"composite","source-layer":"road","minzoom":6,"filter":["all",["has","reflen"],["<=",["get","reflen"],6],["step",["zoom"],["==",["geometry-type"],"Point"],11,[">",["get","len"],5000],12,[">",["get","len"],2500],13,[">",["get","len"],1000],14,true]],"layout":{"text-size":9,"icon-image":["concat",["get","shield"],"-",["to-string",["get","reflen"]]],"icon-rotation-alignment":"viewport","text-max-angle":38,"symbol-spacing":["interpolate",["linear"],["zoom"],11,150,14,200],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"symbol-placement":["step",["zoom"],"point",11,"line"],"text-rotation-alignment":"viewport","text-field":["get","ref"],"text-letter-spacing":0.05},"paint":{"text-color":["match",["get","shield_text_color"],"white","hsl(0, 0%, 100%)","black","hsl(0, 0%, 7%)","yellow","hsl(50, 100%, 70%)","orange","hsl(25, 100%, 75%)","blue","hsl(230, 48%, 34%)","hsl(0, 0%, 100%)"]}},{"id":"road-exit-shield","type":"symbol","metadata":{},"source":"composite","source-layer":"motorway_junction","minzoom":14,"filter":["all",["has","reflen"],["<=",["get","reflen"],9]],"layout":{"text-field":["get","ref"],"text-size":9,"icon-image":["concat","motorway-exit-",["to-string",["get","reflen"]]],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"]},"paint":{"text-color":"hsl(0, 0%, 100%)","text-translate":[0,0]}},{"id":"waterway-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":13,"filter":["all",["match",["get","class"],["canal","river","stream"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-max-angle":30,"symbol-spacing":["interpolate",["linear",1],["zoom"],15,250,17,400],"text-size":["interpolate",["linear"],["zoom"],13,12,18,16],"symbol-placement":"line","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"natural-line-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["glacier","landform"],true,false],["==",["geometry-type"],"LineString"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"text-max-angle":30,"text-field":["coalesce",["get","name_en"],["get","name"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport"},"paint":{"text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5,"text-color":["step",["zoom"],["step",["get","sizerank"],"hsl(26, 20%, 42%)",5,"hsl(26, 25%, 32%)"],17,["step",["get","sizerank"],"hsl(26, 20%, 42%)",13,"hsl(26, 25%, 32%)"]]}},{"id":"natural-point-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["dock","glacier","landform","water_feature","wetland"],true,false],["==",["geometry-type"],"Point"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-blur":0.5,"text-color":"hsl(0, 0%, 100%)"}},{"id":"water-line-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12],18,["step",["get","sizerank"],18,9,16]],"text-max-angle":30,"text-letter-spacing":["match",["get","class"],"ocean",0.25,["sea","bay"],0.15,0],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"water-point-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"Point"]],"layout":{"text-line-height":1.3,"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12]],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":["match",["get","class"],"ocean",0.25,["bay","sea"],0.15,0.01],"text-max-width":["match",["get","class"],"ocean",4,"sea",5,["bay","water"],7,10]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"poi-label","type":"symbol","source":"composite","source-layer":"poi_label","minzoom":6,"filter":["<=",["get","filterrank"],["+",["step",["zoom"],0,16,1,17,2],3]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-color":["match",["get","class"],["park_like"],"hsl(95, 75%, 72%)","hsl(0, 0%, 100%)"],"text-halo-blur":0.5,"text-halo-width":["step",["zoom"],["step",["get","sizerank"],1,5,1.5],17,["step",["get","sizerank"],1.25,13,1.5]]}},{"id":"transit-label","type":"symbol","source":"composite","source-layer":"transit_stop_label","minzoom":12,"filter":["step",["zoom"],["all",["match",["get","mode"],["rail","metro_rail"],true,false],["!=",["get","stop_type"],"entrance"]],15,["all",["match",["get","mode"],["rail","metro_rail","ferry","light_rail"],true,false],["!=",["get","stop_type"],"entrance"]],16,["all",["!=",["get","mode"],"bus"],["!=",["get","stop_type"],"entrance"]],17,["!=",["get","stop_type"],"entrance"],19,true],"layout":{"text-size":12,"icon-image":["get","network"],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["match",["get","stop_type"],"entrance","left","center"],"text-offset":["match",["get","stop_type"],"entrance",["literal",[1,0]],["literal",[0,0.8]]],"text-anchor":["match",["get","stop_type"],"entrance","left","top"],"text-field":["step",["zoom"],"",14,["match",["get","mode"],["rail","metro_rail"],["coalesce",["get","name_en"],["get","name"]],""],16,["match",["get","mode"],["bus","bicycle"],"",["coalesce",["get","name_en"],["get","name"]]],18,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.01,"text-max-width":["match",["get","stop_type"],"entrance",15,9]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"airport-label","type":"symbol","source":"composite","source-layer":"airport_label","minzoom":8,"layout":{"text-line-height":1.1,"text-size":["step",["get","sizerank"],18,9,12],"icon-image":["step",["get","sizerank"],["concat",["get","maki"],"-15"],9,["concat",["get","maki"],"-11"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":[0,0.75],"text-rotation-alignment":"viewport","text-anchor":"top","text-field":["step",["get","sizerank"],["coalesce",["get","name_en"],["get","name"]],15,["get","ref"]],"text-letter-spacing":0.01,"text-max-width":9},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"settlement-subdivision-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":10,"maxzoom":15,"filter":["all",["==",["get","class"],"settlement_subdivision"],["<=",["get","filterrank"],4]],"layout":{"text-field":["coalesce",["get","name_en"],["get","name"]],"text-transform":"uppercase","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-letter-spacing":["match",["get","type"],"suburb",0.15,["quarter","neighborhood"],0.1,0.1],"text-max-width":7,"text-padding":3,"text-size":["interpolate",["cubic-bezier",0.5,0,1,1],["zoom"],11,["match",["get","type"],"suburb",11,["quarter","neighborhood"],10.5,10.5],15,["match",["get","type"],"suburb",17,["quarter","neighborhood"],16,16]]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"text-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5}},{"id":"settlement-label","type":"symbol","source":"composite","source-layer":"place_label","maxzoom":15,"filter":["all",["<=",["get","filterrank"],3],["==",["get","class"],"settlement"],["step",["zoom"],true,13,[">=",["get","symbolrank"],11],14,[">=",["get","symbolrank"],13]]],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.9,1],["zoom"],3,["step",["get","symbolrank"],12,9,11,10,10.5,12,9.5,14,8.5,16,6.5,17,4],15,["step",["get","symbolrank"],28,9,26,10,23,11,21,12,20,13,19,15,17]],"icon-image":["case",["==",["get","capital"],2],"border-dot-13",["step",["get","symbolrank"],"dot-11",9,"dot-10",11,"dot-9"]],"text-font":["step",["zoom"],["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]],8,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],11,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],10,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],12,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],11,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],13,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],12,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],15,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],13,["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]]],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],8,"center"],"text-offset":["step",["zoom"],["match",["get","capital"],2,["match",["get","text_anchor"],"bottom",["literal",[0,-0.3]],"bottom-left",["literal",[0.3,-0.1]],"left",["literal",[0.45,0.1]],"top-left",["literal",[0.3,0.1]],"top",["literal",[0,0.3]],"top-right",["literal",[-0.3,0.1]],"right",["literal",[-0.45,0]],"bottom-right",["literal",[-0.3,-0.1]],["literal",[0,-0.3]]],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]]],8,["literal",[0,0]]],"text-anchor":["step",["zoom"],["get","text_anchor"],8,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":7},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"icon-opacity":["step",["zoom"],1,8,0],"text-halo-blur":1}},{"id":"state-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":3,"maxzoom":9,"filter":["==",["get","class"],"state"],"layout":{"text-size":["interpolate",["cubic-bezier",0.85,0.7,0.65,1],["zoom"],4,["step",["get","symbolrank"],10,6,9.5,7,9],9,["step",["get","symbolrank"],24,6,18,7,14]],"text-transform":"uppercase","text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"text-field":["step",["zoom"],["step",["get","symbolrank"],["coalesce",["get","name_en"],["get","name"]],5,["coalesce",["get","abbr"],["get","name_en"],["get","name"]]],5,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.15,"text-max-width":6},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1}},{"id":"country-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":1,"maxzoom":10,"filter":["==",["get","class"],"country"],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.7,1],["zoom"],1,["step",["get","symbolrank"],11,4,9,5,8],9,["step",["get","symbolrank"],28,4,22,5,21]],"icon-image":"dot-11","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],7,"center"],"text-offset":["step",["zoom"],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]],7,["literal",[0,0]]],"text-anchor":["step",["zoom"],["coalesce",["get","text_anchor"],"center"],7,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":6},"paint":{"icon-opacity":["step",["zoom"],["case",["has","text_anchor"],1,0],7,0],"text-color":"hsl(0, 0%, 100%)","text-halo-color":["interpolate",["exponential",1],["zoom"],0,"hsl(224, 2%, 18%)",4,"hsl(224, 1%, 12%)",8,"hsl(224, 1%, 2%)"],"text-halo-width":1.25}}],"visibility":"public","created":"1970-01-01T00:00:00.000Z","modified":"1970-01-01T00:00:00.000Z","owner":"mapbox","id":"satellite-streets-v11","draft":false}
+{"version":8,"name":"Mapbox Satellite Streets","metadata":{"mapbox:type":"default","mapbox:origin":"satellite-streets-v11","mapbox:autocomposite":true,"mapbox:groups":{"1444855786460.0557":{"name":"Roads","collapsed":true},"1444934295202.7542":{"name":"Admin boundaries","collapsed":true},"1444855799204.86":{"name":"Bridges","collapsed":true},"1444855769305.6016":{"name":"Tunnels","collapsed":true}},"mapbox:sdk-support":{"js":"0.49.0","android":"6.5.0","ios":"4.4.0"},"mapbox:trackposition":true},"sources":{"mapbox://mapbox.satellite":{"url":"mapbox://mapbox.satellite","type":"raster","tileSize":256},"composite":{"url":"mapbox://mapbox.mapbox-streets-v8","type":"vector"}},"center":[-74.0053,40.7123],"zoom":14,"sprite":"http://carma-cloud:8080/images/sprite","glyphs":"http://carma-cloud:8080/mapbox/{fontstack}/{range}.pbf","layers":[{"id":"background","type":"background","layout":{},"paint":{"background-color":"hsl(222, 56%, 4%)"}},{"id":"satellite","type":"raster","source":"mapbox://mapbox.satellite","layout":{},"paint":{}},{"id":"tunnel-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-dasharray":[3,3],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-major-link-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-dasharray":[3,3],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-path","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-color":"hsl(0, 0%, 86%)","line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-steps","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-major-link","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 78%)","trunk_link","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-pedestrian","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"tunnel-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"tunnel-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"tunnel"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","street","street_limited","tertiary"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"tunnel-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 78%)","trunk","hsl(46, 77%, 78%)","hsl(46, 77%, 78%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"tunnel-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855769305.6016"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"tunnel"],["match",["get","class"],["motorway","motorway_link","trunk","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"ferry","type":"line","source":"composite","source-layer":"road","minzoom":8,"filter":["==",["get","type"],"ferry"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-dasharray":["step",["zoom"],["literal",[1,0]],13,["literal",[12,4]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"ferry-auto","type":"line","source":"composite","source-layer":"road","filter":["==",["get","type"],"ferry_auto"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(0, 0%, 86%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-low","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-street-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,0.75,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],6,0.25,8,0.6,13,1,15,0]}},{"id":"road-major-link-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-path","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"path"],["step",["zoom"],["!",["match",["get","type"],["steps","sidewalk","crossing"],true,false]],16,["!=",["get","type"],"steps"]],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],13,0.5,14,1,15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-steps","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-major-link","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":10,"filter":["all",["match",["get","class"],["motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-pedestrian","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":12,"filter":["all",["==",["get","class"],"pedestrian"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"road-street","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":11,"filter":["all",["match",["get","class"],["street","street_limited","primary_link"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["secondary","tertiary"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.1,18,26],"line-color":"hsl(0, 1%, 17%)","line-opacity":["interpolate",["exponential",1.2],["zoom"],12,0,14,0.5,15,0]}},{"id":"road-primary","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["==",["get","class"],"primary"],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["interpolate",["exponential",1],["zoom"],8,"hsl(0, 0%, 96%)",10,"hsl(0, 0%, 89%)"],"line-opacity":["interpolate",["exponential",1.25],["zoom"],6,0.25,13,1,15,0]}},{"id":"road-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","service","track"],true,false]],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"road-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","filter":["all",["match",["get","class"],["motorway","trunk"],true,false],["match",["get","structure"],["none","ford"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["step",["zoom"],["match",["get","class"],"motorway","hsl(26, 87%, 62%)","trunk","hsl(46, 80%, 60%)","hsl(46, 80%, 60%)"],9,["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"]],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"road-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855786460.0557"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","oneway"],"true"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["match",["get","structure"],["none","ford"],true,false]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"bridge-pedestrian-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,2,18,14.5],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-opacity":["step",["zoom"],0,14,1]}},{"id":"bridge-primary-secondary-tertiary-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,["match",["get","class"],"primary",1,["secondary","tertiary"],0.75,0.75],18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-major-link-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-path","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"path"],["!=",["get","type"],"steps"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,18,4],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[1,0.5]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-steps","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":14,"filter":["all",["==",["get","type"],"steps"],["==",["get","structure"],"bridge"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],15,1,16,1.6,18,6],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.75,1]],16,["literal",[1,0.75]],17,["literal",[0.3,0.3]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-major-link","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway_link","trunk_link"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-pedestrian","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","class"],"pedestrian"],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round"},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,18,12],"line-color":"hsl(0, 0%, 86%)","line-dasharray":["step",["zoom"],["literal",[1,0]],15,["literal",[1.5,0.4]],16,["literal",[1,0.2]]],"line-opacity":["interpolate",["exponential",1],["zoom"],7.5,0,8,0.15,16,0.5]}},{"id":"bridge-primary-secondary-tertiary","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["primary","secondary","tertiary"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,["match",["get","class"],"primary",0.75,["secondary","tertiary"],0.1,0.1],18,["match",["get","class"],"primary",32,["secondary","tertiary"],26,26]],"line-color":["interpolate",["linear"],["zoom"],8,["match",["get","class"],["primary"],"hsl(0, 0%, 96%)","hsl(0, 1%, 17%)"],10,["match",["get","class"],["primary"],"hsl(0, 2%, 83%)","hsl(0, 1%, 17%)"]],"line-opacity":["interpolate",["linear"],["zoom"],6,["match",["get","class"],["primary"],0.25,0],8,["match",["get","class"],["primary"],0.6,0],12,["match",["get","class"],["primary"],1,0.6],15,0]}},{"id":"bridge-oneway-arrow-blue","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":15,"filter":["all",["==",["get","structure"],"bridge"],["==",["get","oneway"],"true"],["step",["zoom"],["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],true,false],16,["match",["get","class"],["primary","secondary","tertiary","street","street_limited","primary_link","secondary_link","tertiary_link","path","pedestrian","track","service"],true,false]]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-small",17,["match",["get","class"],["primary","secondary","tertiary","street","street_limited"],"oneway-large","oneway-small"],18,"oneway-large"],"symbol-spacing":200,"icon-rotation-alignment":"map"},"paint":{}},{"id":"bridge-motorway-trunk","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk"],true,false],["<=",["get","layer"],1],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.75,20,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2-case","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],10,1,18,2],"line-color":["interpolate",["exponential",1],["zoom"],9,"hsl(0, 1%, 26%)",12,"hsl(0, 1%, 31%)"],"line-gap-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-major-link-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway_link","trunk_link"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],12,0.5,14,2,18,18],"line-color":["match",["get","class"],"motorway_link","hsl(26, 100%, 68%)","trunk_link","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-motorway-trunk-2","type":"line","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":13,"filter":["all",["==",["get","structure"],"bridge"],[">=",["get","layer"],2],["match",["get","class"],["motorway","trunk"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"line-join":"round","line-cap":["step",["zoom"],"round",12,"butt"]},"paint":{"line-width":["interpolate",["exponential",1.5],["zoom"],5,0.75,18,32],"line-color":["match",["get","class"],"motorway","hsl(26, 100%, 68%)","trunk","hsl(46, 85%, 67%)","hsl(46, 85%, 67%)"],"line-opacity":["interpolate",["exponential",1],["zoom"],13,1,15,0]}},{"id":"bridge-oneway-arrow-white","type":"symbol","metadata":{"mapbox:group":"1444855799204.86"},"source":"composite","source-layer":"road","minzoom":16,"filter":["all",["==",["get","structure"],"bridge"],["match",["get","class"],["motorway","trunk","motorway_link","trunk_link"],true,false],["==",["get","oneway"],"true"]],"layout":{"symbol-placement":"line","icon-image":["step",["zoom"],"oneway-white-small",17,"oneway-white-large"],"symbol-spacing":200},"paint":{}},{"id":"aerialway","type":"line","source":"composite","source-layer":"road","minzoom":13,"filter":["==",["get","class"],"aerialway"],"layout":{"line-join":"round"},"paint":{"line-color":"hsl(230, 10%, 74%)","line-width":["interpolate",["exponential",1.5],["zoom"],14,0.5,20,1]}},{"id":"admin-1-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"bevel"},"paint":{"line-color":["interpolate",["linear"],["zoom"],8,"hsl(35, 12%, 89%)",16,"hsl(230, 49%, 90%)"],"line-width":["interpolate",["linear"],["zoom"],7,3.75,12,5.5],"line-opacity":["interpolate",["linear"],["zoom"],7,0,8,0.75],"line-dasharray":[1,0],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,8,3]}},{"id":"admin-0-boundary-bg","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{},"paint":{"line-width":["interpolate",["linear"],["zoom"],3,3.5,10,8],"line-color":["interpolate",["linear"],["zoom"],6,"hsl(35, 12%, 89%)",8,"hsl(230, 49%, 90%)"],"line-opacity":["interpolate",["linear"],["zoom"],3,0,4,0.5],"line-translate":[0,0],"line-blur":["interpolate",["linear"],["zoom"],3,0,10,2]}},{"id":"admin-1-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","filter":["all",["==",["get","admin_level"],1],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-dasharray":["step",["zoom"],["literal",[2,0]],7,["literal",[2,2,6,2]]],"line-width":["interpolate",["linear"],["zoom"],7,0.75,12,1.5],"line-opacity":["interpolate",["linear"],["zoom"],2,0,3,1],"line-color":"hsl(0, 0%, 0%)"}},{"id":"admin-0-boundary","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","admin_level"],0],["==",["get","disputed"],"false"],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round","line-cap":"round"},"paint":{"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"admin-0-boundary-disputed","type":"line","metadata":{"mapbox:group":"1444934295202.7542"},"source":"composite","source-layer":"admin","minzoom":1,"filter":["all",["==",["get","disputed"],"true"],["==",["get","admin_level"],0],["==",["get","maritime"],"false"],["match",["get","worldview"],["all","US"],true,false]],"layout":{"line-join":"round"},"paint":{"line-dasharray":[1.5,1.5],"line-color":"hsl(0, 0%, 0%)","line-width":["interpolate",["linear"],["zoom"],3,0.5,10,2]}},{"id":"road-label","type":"symbol","source":"composite","source-layer":"road","minzoom":10,"filter":["step",["zoom"],["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],true,false],12,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary","pedestrian","street","street_limited"],true,false],15,["match",["get","class"],["golf","path"],false,true]],"layout":{"text-size":["interpolate",["linear"],["zoom"],10,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],10,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],9,6.5],18,["match",["get","class"],["motorway","trunk","primary","secondary","tertiary"],16,["motorway_link","trunk_link","primary_link","secondary_link","tertiary_link","pedestrian","street","street_limited"],14,13]],"text-max-angle":30,"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line","text-padding":1,"text-rotation-alignment":"map","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":0.01},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"road-number-shield","type":"symbol","source":"composite","source-layer":"road","minzoom":6,"filter":["all",["has","reflen"],["<=",["get","reflen"],6],["step",["zoom"],["==",["geometry-type"],"Point"],11,[">",["get","len"],5000],12,[">",["get","len"],2500],13,[">",["get","len"],1000],14,true]],"layout":{"text-size":9,"icon-image":["concat",["get","shield"],"-",["to-string",["get","reflen"]]],"icon-rotation-alignment":"viewport","text-max-angle":38,"symbol-spacing":["interpolate",["linear"],["zoom"],11,150,14,200],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"symbol-placement":["step",["zoom"],"point",11,"line"],"text-rotation-alignment":"viewport","text-field":["get","ref"],"text-letter-spacing":0.05},"paint":{"text-color":["match",["get","shield_text_color"],"white","hsl(0, 0%, 100%)","black","hsl(0, 0%, 7%)","yellow","hsl(50, 100%, 70%)","orange","hsl(25, 100%, 75%)","blue","hsl(230, 48%, 34%)","hsl(0, 0%, 100%)"]}},{"id":"road-exit-shield","type":"symbol","metadata":{},"source":"composite","source-layer":"motorway_junction","minzoom":14,"filter":["all",["has","reflen"],["<=",["get","reflen"],9]],"layout":{"text-field":["get","ref"],"text-size":9,"icon-image":["concat","motorway-exit-",["to-string",["get","reflen"]]],"text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"]},"paint":{"text-color":"hsl(0, 0%, 100%)","text-translate":[0,0]}},{"id":"waterway-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":13,"filter":["all",["match",["get","class"],["canal","river","stream"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-max-angle":30,"symbol-spacing":["interpolate",["linear",1],["zoom"],15,250,17,400],"text-size":["interpolate",["linear"],["zoom"],13,12,18,16],"symbol-placement":"line","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"natural-line-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["glacier","landform"],true,false],["==",["geometry-type"],"LineString"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"text-max-angle":30,"text-field":["coalesce",["get","name_en"],["get","name"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport"},"paint":{"text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5,"text-color":["step",["zoom"],["step",["get","sizerank"],"hsl(26, 20%, 42%)",5,"hsl(26, 25%, 32%)"],17,["step",["get","sizerank"],"hsl(26, 20%, 42%)",13,"hsl(26, 25%, 32%)"]]}},{"id":"natural-point-label","type":"symbol","source":"composite","source-layer":"natural_label","minzoom":4,"filter":["all",["match",["get","class"],["dock","glacier","landform","water_feature","wetland"],true,false],["==",["geometry-type"],"Point"],["<=",["get","filterrank"],2]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5],"text-halo-blur":0.5,"text-color":"hsl(0, 0%, 100%)"}},{"id":"water-line-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"LineString"]],"layout":{"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12],18,["step",["get","sizerank"],18,9,16]],"text-max-angle":30,"text-letter-spacing":["match",["get","class"],"ocean",0.25,["sea","bay"],0.15,0],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"symbol-placement":"line-center","text-pitch-alignment":"viewport","text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"water-point-label","type":"symbol","source":"composite","source-layer":"natural_label","filter":["all",["match",["get","class"],["bay","ocean","reservoir","sea","water"],true,false],["==",["geometry-type"],"Point"]],"layout":{"text-line-height":1.3,"text-size":["interpolate",["linear"],["zoom"],7,["step",["get","sizerank"],24,6,18,12,12],10,["step",["get","sizerank"],18,9,12]],"text-font":["DIN Offc Pro Italic","Arial Unicode MS Regular"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-letter-spacing":["match",["get","class"],"ocean",0.25,["bay","sea"],0.15,0.01],"text-max-width":["match",["get","class"],"ocean",4,"sea",5,["bay","water"],7,10]},"paint":{"text-color":"hsl(196, 80%, 70%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"poi-label","type":"symbol","source":"composite","source-layer":"poi_label","minzoom":6,"filter":["<=",["get","filterrank"],["+",["step",["zoom"],0,16,1,17,2],3]],"layout":{"text-size":["step",["zoom"],["step",["get","sizerank"],18,5,12],17,["step",["get","sizerank"],18,13,12]],"icon-image":["step",["zoom"],["concat",["get","maki"],"-11"],15,["concat",["get","maki"],"-15"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":["step",["zoom"],["step",["get","sizerank"],["literal",[0,0]],5,["literal",[0,0.75]]],17,["step",["get","sizerank"],["literal",[0,0]],13,["literal",[0,0.75]]]],"text-anchor":["step",["zoom"],["step",["get","sizerank"],"center",5,"top"],17,["step",["get","sizerank"],"center",13,"top"]],"text-field":["coalesce",["get","name_en"],["get","name"]]},"paint":{"icon-opacity":["step",["zoom"],["step",["get","sizerank"],0,5,1],17,["step",["get","sizerank"],0,13,1]],"text-halo-color":"hsl(0, 0%, 17%)","text-color":["match",["get","class"],["park_like"],"hsl(95, 75%, 72%)","hsl(0, 0%, 100%)"],"text-halo-blur":0.5,"text-halo-width":["step",["zoom"],["step",["get","sizerank"],1,5,1.5],17,["step",["get","sizerank"],1.25,13,1.5]]}},{"id":"transit-label","type":"symbol","source":"composite","source-layer":"transit_stop_label","minzoom":12,"filter":["step",["zoom"],["all",["match",["get","mode"],["rail","metro_rail"],true,false],["!=",["get","stop_type"],"entrance"]],15,["all",["match",["get","mode"],["rail","metro_rail","ferry","light_rail"],true,false],["!=",["get","stop_type"],"entrance"]],16,["all",["!=",["get","mode"],"bus"],["!=",["get","stop_type"],"entrance"]],17,["!=",["get","stop_type"],"entrance"],19,true],"layout":{"text-size":12,"icon-image":["get","network"],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["match",["get","stop_type"],"entrance","left","center"],"text-offset":["match",["get","stop_type"],"entrance",["literal",[1,0]],["literal",[0,0.8]]],"text-anchor":["match",["get","stop_type"],"entrance","left","top"],"text-field":["step",["zoom"],"",14,["match",["get","mode"],["rail","metro_rail"],["coalesce",["get","name_en"],["get","name"]],""],16,["match",["get","mode"],["bus","bicycle"],"",["coalesce",["get","name_en"],["get","name"]]],18,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.01,"text-max-width":["match",["get","stop_type"],"entrance",15,9]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-color":"hsl(0, 0%, 100%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"airport-label","type":"symbol","source":"composite","source-layer":"airport_label","minzoom":8,"layout":{"text-line-height":1.1,"text-size":["step",["get","sizerank"],18,9,12],"icon-image":["step",["get","sizerank"],["concat",["get","maki"],"-15"],9,["concat",["get","maki"],"-11"]],"text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-offset":[0,0.75],"text-rotation-alignment":"viewport","text-anchor":"top","text-field":["step",["get","sizerank"],["coalesce",["get","name_en"],["get","name"]],15,["get","ref"]],"text-letter-spacing":0.01,"text-max-width":9},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":["interpolate",["exponential",1],["zoom"],14,1.25,15,1.5]}},{"id":"settlement-subdivision-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":10,"maxzoom":15,"filter":["all",["==",["get","class"],"settlement_subdivision"],["<=",["get","filterrank"],4]],"layout":{"text-field":["coalesce",["get","name_en"],["get","name"]],"text-transform":"uppercase","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-letter-spacing":["match",["get","type"],"suburb",0.15,["quarter","neighborhood"],0.1,0.1],"text-max-width":7,"text-padding":3,"text-size":["interpolate",["cubic-bezier",0.5,0,1,1],["zoom"],11,["match",["get","type"],"suburb",11,["quarter","neighborhood"],10.5,10.5],15,["match",["get","type"],"suburb",17,["quarter","neighborhood"],16,16]]},"paint":{"text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"text-color":"hsl(0, 0%, 100%)","text-halo-blur":0.5}},{"id":"settlement-label","type":"symbol","source":"composite","source-layer":"place_label","maxzoom":15,"filter":["all",["<=",["get","filterrank"],3],["==",["get","class"],"settlement"],["step",["zoom"],true,13,[">=",["get","symbolrank"],11],14,[">=",["get","symbolrank"],13]]],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.9,1],["zoom"],3,["step",["get","symbolrank"],12,9,11,10,10.5,12,9.5,14,8.5,16,6.5,17,4],15,["step",["get","symbolrank"],28,9,26,10,23,11,21,12,20,13,19,15,17]],"icon-image":["case",["==",["get","capital"],2],"border-dot-13",["step",["get","symbolrank"],"dot-11",9,"dot-10",11,"dot-9"]],"text-font":["step",["zoom"],["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]],8,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],11,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],10,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],12,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],11,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],13,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],12,["step",["get","symbolrank"],["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]],15,["literal",["DIN Offc Pro Regular","Arial Unicode MS Regular"]]],13,["literal",["DIN Offc Pro Medium","Arial Unicode MS Regular"]]],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],8,"center"],"text-offset":["step",["zoom"],["match",["get","capital"],2,["match",["get","text_anchor"],"bottom",["literal",[0,-0.3]],"bottom-left",["literal",[0.3,-0.1]],"left",["literal",[0.45,0.1]],"top-left",["literal",[0.3,0.1]],"top",["literal",[0,0.3]],"top-right",["literal",[-0.3,0.1]],"right",["literal",[-0.45,0]],"bottom-right",["literal",[-0.3,-0.1]],["literal",[0,-0.3]]],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]]],8,["literal",[0,0]]],"text-anchor":["step",["zoom"],["get","text_anchor"],8,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":7},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1,"icon-opacity":["step",["zoom"],1,8,0],"text-halo-blur":1}},{"id":"state-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":3,"maxzoom":9,"filter":["==",["get","class"],"state"],"layout":{"text-size":["interpolate",["cubic-bezier",0.85,0.7,0.65,1],["zoom"],4,["step",["get","symbolrank"],10,6,9.5,7,9],9,["step",["get","symbolrank"],24,6,18,7,14]],"text-transform":"uppercase","text-font":["DIN Offc Pro Bold","Arial Unicode MS Bold"],"text-field":["step",["zoom"],["step",["get","symbolrank"],["coalesce",["get","name_en"],["get","name"]],5,["coalesce",["get","abbr"],["get","name_en"],["get","name"]]],5,["coalesce",["get","name_en"],["get","name"]]],"text-letter-spacing":0.15,"text-max-width":6},"paint":{"text-color":"hsl(0, 0%, 100%)","text-halo-color":"hsl(0, 0%, 17%)","text-halo-width":1}},{"id":"country-label","type":"symbol","source":"composite","source-layer":"place_label","minzoom":1,"maxzoom":10,"filter":["==",["get","class"],"country"],"layout":{"text-line-height":1.1,"text-size":["interpolate",["cubic-bezier",0.2,0,0.7,1],["zoom"],1,["step",["get","symbolrank"],11,4,9,5,8],9,["step",["get","symbolrank"],28,4,22,5,21]],"icon-image":"dot-11","text-font":["DIN Offc Pro Medium","Arial Unicode MS Regular"],"text-justify":["step",["zoom"],["match",["get","text_anchor"],["bottom","top"],"center",["left","bottom-left","top-left"],"left",["right","bottom-right","top-right"],"right","center"],7,"center"],"text-offset":["step",["zoom"],["match",["get","text_anchor"],"bottom",["literal",[0,-0.25]],"bottom-left",["literal",[0.2,-0.05]],"left",["literal",[0.4,0.05]],"top-left",["literal",[0.2,0.05]],"top",["literal",[0,0.25]],"top-right",["literal",[-0.2,0.05]],"right",["literal",[-0.4,0.05]],"bottom-right",["literal",[-0.2,-0.05]],["literal",[0,-0.25]]],7,["literal",[0,0]]],"text-anchor":["step",["zoom"],["coalesce",["get","text_anchor"],"center"],7,"center"],"text-field":["coalesce",["get","name_en"],["get","name"]],"text-max-width":6},"paint":{"icon-opacity":["step",["zoom"],["case",["has","text_anchor"],1,0],7,0],"text-color":"hsl(0, 0%, 100%)","text-halo-color":["interpolate",["exponential",1],["zoom"],0,"hsl(224, 2%, 18%)",4,"hsl(224, 1%, 12%)",8,"hsl(224, 1%, 2%)"],"text-halo-width":1.25}}],"visibility":"public","created":"1970-01-01T00:00:00.000Z","modified":"1970-01-01T00:00:00.000Z","owner":"mapbox","id":"satellite-streets-v11","draft":false}
diff --git a/web/mapbox/sourcelayers.json b/web/mapbox/sourcelayers.json
index 36e7f997..1dd3763d 100644
--- a/web/mapbox/sourcelayers.json
+++ b/web/mapbox/sourcelayers.json
@@ -1,7 +1,7 @@
{
"ctrl":
{
- "source": {"type": "vector", "tiles": ["https://www.carma-cloud.com/api/ctrl/{z}/{x}/{y}"], "minzoom": 17},
+ "source": {"type": "vector", "tiles": ["http://carma-cloud:8080/api/ctrl/{z}/{x}/{y}"], "minzoom": 17},
"layers":
[
{"type": "fill", "source-layer": "pavement", "paint":{"fill-color": ["match", ["get", "type"], "d", "#666", "s", "#999", "#666"]}},
diff --git a/web/mapbox/validatexodr_sourcelayers.json b/web/mapbox/validatexodr_sourcelayers.json
index 5f8cf03b..d5ef9b17 100644
--- a/web/mapbox/validatexodr_sourcelayers.json
+++ b/web/mapbox/validatexodr_sourcelayers.json
@@ -1,7 +1,7 @@
{
"ctrl":
{
- "source": {"type": "vector", "tiles": ["https://carma-cloud.com/api/vctrl/{z}/{x}/{y}"], "minzoom": 18},
+ "source": {"type": "vector", "tiles": ["http://carma-cloud:8080/api/vctrl/{z}/{x}/{y}"], "minzoom": 18},
"layers":
[
{"type": "fill", "source-layer": "pavement", "paint":{"fill-color":"#999", "fill-opacity": 0}},
diff --git a/web/script/rsu.js b/web/script/rsu.js
index 878bb480..5bb177be 100644
--- a/web/script/rsu.js
+++ b/web/script/rsu.js
@@ -42,7 +42,7 @@ async function initMap() {
//Init Map
oMap = new mapboxgl.Map({
'container': 'mapid', 'style': 'mapbox/satellite-streets-v11.json', 'attributionControl': false,
- 'minZoom': 4, 'maxZoom': 24, 'center': [-81.83067386, 28.1195796], 'zoom': 15, 'accessToken': 'pk.eyJ1IjoiZGR1MjAyMCIsImEiOiJjbDJyeHJob2YwYnhwM2xtaG9zaDdnYTR4In0.Rh2bSS44c99BoDj2W7jjfw'
+ 'minZoom': 4, 'maxZoom': 24, 'center': [-81.83067386, 28.1195796], 'zoom': 15, 'accessToken': 'pk.eyJ1Ijoia3J1ZWdlcmIiLCJhIjoiY2tuajlwYWZ5MGI0ZTJ1cGV1bTk5emtsaCJ9.En7O3cNsbmy7Gk555ZjmVQ'
});
window.mymap = oMap;
oMap.dragRotate.disable(); // disable map rotation using right click + drag