diff --git a/build_release b/build_release
index 4d6d412..1f4df74 100755
--- a/build_release
+++ b/build_release
@@ -19,8 +19,7 @@ node-sass --output css scss/main.scss
cd ..
# copy additional folders
-cp tracks.json release/v$1/tracks.json
-cp cars.json release/v$1/cars.json
+cp -r config release/v$1/config
cp -r db release/v$1/db
cp README.md release/v$1/README.md
cp LICENSE release/v$1/LICENSE
diff --git a/release/v1.1.0/CHANGELOG.md b/release/v1.1.0/CHANGELOG.md
new file mode 100644
index 0000000..b28f634
--- /dev/null
+++ b/release/v1.1.0/CHANGELOG.md
@@ -0,0 +1,32 @@
+# Changelog
+
+## 1.0.4
+
+* fixed: some default config values
+* fixed: missing system and content directories for checksum calculation
+* added changing dynamic track conditions
+* added wind parameters
+* added pitstop window configuration
+* added fixed setups
+* added ability to download configuration files of configurations and running instances
+* added automatic calculation of sun angle
+* added better logging and log level configuration
+
+Note that you have to update the database schema. A migration script can be found within the db/ directory.
+
+## 1.0.3
+
+Now providing a docker image! Configuration is now done via environment variables, see README.md for details.
+
+## 1.0.2
+
+* fixed: added missing columns to schema.sql
+
+## 1.0.1
+
+* added cars from red pack
+* added windows 64 bit build
+
+## 1.0.0
+
+* initial release
diff --git a/release/v1.1.0/LICENSE b/release/v1.1.0/LICENSE
new file mode 100644
index 0000000..ae1a182
--- /dev/null
+++ b/release/v1.1.0/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Marvin Blum
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/release/v1.1.0/README.md b/release/v1.1.0/README.md
new file mode 100644
index 0000000..3ef512b
--- /dev/null
+++ b/release/v1.1.0/README.md
@@ -0,0 +1,166 @@
+![AC](aclogo.png)
+
+# Assetto Corsa server web interface
+
+This tool provides monitoring and management for your Assetto Corsa server instances. You can create multiple configuration profiles, start/stop server instances and watch the status of them.
+
+**Screenshots at the bottom of this page!**
+
+## Install
+
+Note that the scripts within the main directory are not used to start or install the server. They're for development only and not shipped with the release. Download releases from the [GitHub release page](https://github.com/DeKugelschieber/acweb/releases) instead of the release/ directory. If you find any issues installing the server or bugs, please open an issue in the issue section on GitHub.
+These instructions do not provide information on how to install the Assetto Corsa server itself. On Linux, you basically install steam, login to your account and download **the Windows version** of the game, which also includes the Linux server.
+
+### Install using Docker
+
+The easiest way to install acweb is to use [Docker](https://hub.docker.com/r/kugel/acweb/):
+
+1. install Docker on your (Linux) server
+2. pull the latest release:
+
+```
+docker pull kugel/acweb
+```
+
+3. install MySQL on your server or use a docker image
+4. create the database schema (db/schema.sql + all migration scripts in appropriate order) and create the first user:
+
+```
+INSERT INTO `user` (`id`, `login`, `email`, `password`, `admin`, `moderator`) VALUES (NULL, 'username', 'user@email.com', 'SHA256_HASH', '1', '0');
+```
+
+Note that the user password must be a SHA256 hash. You can find tools online to create one from a clear password.
+
+5. start the Docker container (adjust the parameters to your needs):
+
+```
+# expose the same port you start the server on: -p PORT:${ACWEB_HOST}
+sudo docker run -d -p 80:8080 --name acweb \
+ -e ACWEB_DB_USER=root \
+ -e ACWEB_DB_PASSWORD=password \
+ -e ACWEB_DB_HOST="tcp(127.0.0.1:3306)" \
+ -e ACWEB_DB=acweb \
+ -v /ac/install/path:/ac \
+ -v /log/dir/path:/logs \
+ kugel/acweb
+
+# make sure its running
+sudo docker ps acweb
+```
+
+This will use a MySQL database installed on your host machine. To use a MySQL database running in a container, please rever to the official [MySQL image](https://hub.docker.com/_/mysql/). You have to use Dockers --link option to access it, if you don't expose the MySQL port.
+To start the server, you can also use a [docker-compose file](https://docs.docker.com/compose/). I recommend to enable SSL using [letsencrypt](https://letsencrypt.org/) and a reverse proxy.
+To run server instances, you need to mount the Assetto Corsa installation directory (containing the binary) to /ac. In the UI set the execution path (Settings -> AC server folder) to /ac. To save the instance logs outside the Docker container, you can mount /instance_logs.
+
+### Manual installation
+
+This instruction supposes you to use Linux. On Windows you basically need to perform the same steps. You need a MySQL database and rights to upload and execute applications. I recommend to create a user for your web interface installation.
+
+1. download the latest release of acweb
+2. upload it to your server and unzip it
+3. create the database schema (db/schema.sql + all migration scripts in appropriate order) and create the first user:
+
+```
+INSERT INTO `user` (`id`, `login`, `email`, `password`, `admin`, `moderator`) VALUES (NULL, 'username', 'user@email.com', 'SHA256_HASH', '1', '0');
+```
+
+Note that the user password must be a SHA256 hash. You can find tools online to create one from a clear password.
+
+4. set the environment variables to configure your server:
+
+```
+# acweb host, to make it accessible from the outside use 0.0.0.0:PORT
+export ACWEB_HOST=localhost:8080
+# optional log file location (will be created if it doesn't exist)
+export ACWEB_LOGDIR=
+# optional log level (debug, info or empty for warnings and higher)
+export ACWEB_LOGLEVEL=info
+# log directory for server instances, must be set
+export ACWEB_INSTANCE_LOGDIR=instance_logs
+# config file directory for tracks.json and cars.json
+export ACWEB_CONFIG_DIR=
+# path to TLS private key file
+export ACWEB_TLS_PRIVATE_KEY=
+# path to TLS cert file
+export ACWEB_TLS_CERT=
+# database user
+export ACWEB_DB_USER=root
+# database password
+export ACWEB_DB_PASSWORD=
+# database host (most likely tcp(localhost:3306))
+export ACWEB_DB_HOST=
+# database name:
+export ACWEB_DB=acweb
+```
+
+5. start it ./acweb
+6. you can now visit your web interface
+
+## Updating
+
+1. download the latest release
+2. upload it to your server and unzip it
+3. update your MySQL database (migration scripts can be found in db/mig_FROMVERSION_TOVERSION.sql)
+4. start it
+
+For Docker pull the latest release, execute the migration script(s) and start it.
+
+## Adding tracks and cars
+
+To add tracks and cars, from a mod for instance, you must add them to the cars.json and tracks.json configuration files to make them appear in the web interface:
+
+```
+[
+ // a track
+ {
+ "name": "NAME",
+ "config": "CONFIG_TRACK",
+ "description": "Name",
+ "max_slots": NUMBER_OF_SLOTS
+ },
+ // ...
+```
+
+```
+[
+ // a car
+ {
+ "name": "CAR_NAME",
+ "description": "Car Name",
+ "paintings": [
+ "SKIN_0",
+ "SKIN_1",
+ // ...
+ ]
+ },
+ // ...
+```
+
+The files can be found within the config directory. To modify them using Docker, mount a volume to /config and copy the original files into it, then modify them.
+
+## Contribute
+
+To contribute please open issues and pull requests. The frontend is build using VueJs, [minvue](https://github.com/DeKugelschieber/vuejs-minify) and sass. The backend is build on Go (golang) and MySQL. For details please view the provided scripts within the main directory.
+
+### Contributors (alphabetical)
+
+macedot, vinyii
+
+## Links
+
+* [Docker Hub](https://hub.docker.com/r/kugel/acweb/)
+* [Assetto Corsa Forums](http://www.assettocorsa.net/forum/index.php?threads/ac-server-web-interface.44582)
+* [Spieleprogrammierer.de](https://www.spieleprogrammierer.de/12-projektvorstellungen-und-stellenangebote/26396-tool-assetto-corsa-server-web-interface/?highlight=)
+
+## License
+
+MIT
+
+## Screenshots
+
+![Screenshot 1](screenshots/screen1.png)
+![Screenshot 2](screenshots/screen2.png)
+![Screenshot 3](screenshots/screen3.png)
+![Screenshot 4](screenshots/screen4.png)
+![Screenshot 5](screenshots/screen5.png)
+![Screenshot 6](screenshots/screen6.png)
diff --git a/release/v1.1.0/acweb b/release/v1.1.0/acweb
new file mode 100755
index 0000000..13193d8
Binary files /dev/null and b/release/v1.1.0/acweb differ
diff --git a/release/v1.1.0/config/cars.json b/release/v1.1.0/config/cars.json
new file mode 100755
index 0000000..6eb9e12
--- /dev/null
+++ b/release/v1.1.0/config/cars.json
@@ -0,0 +1,2753 @@
+[
+ {
+ "name": "abarth500",
+ "description": "Abarth 500 EsseEsse",
+ "paintings": [
+ "0_white_scorpion",
+ "black_red",
+ "grey_white",
+ "light_blue",
+ "light_blue_scorpion",
+ "pearl",
+ "pearl_scorpion",
+ "red_scorpion",
+ "red_white",
+ "white"
+ ]
+ },
+ {
+ "name": "abarth500_s1",
+ "description": "Abarth 500 EsseEsse Step1",
+ "paintings": [
+ "black_neon",
+ "dark_blue_blue",
+ "dark_green_yellow",
+ "light_blue_orange",
+ "maroon_white",
+ "orange_grey",
+ "red_yellow",
+ "silver_red",
+ "white_grey",
+ "yellow_orange"
+ ]
+ },
+ {
+ "name": "alfa_romeo_giulietta_qv",
+ "description": "Giulietta QV",
+ "paintings": [
+ "0_rosso_alfa",
+ "Argento_Alfa",
+ "Bianco_Ghiaccio",
+ "Blu_Anodizzato",
+ "Bronzo",
+ "Grigio_Antracite",
+ "Grigio_Magnesio",
+ "Nero",
+ "Nero_Etna",
+ "Perla_Moonlight",
+ "Rosso_Competizione"
+ ]
+ },
+ {
+ "name": "alfa_romeo_giulietta_qv_le",
+ "description": "Giulietta QV Launch Edition 2014",
+ "paintings": [
+ "0_rosso_alfa",
+ "Argento_Alfa",
+ "Bianco_Ghiaccio",
+ "Blu_Anodizzato",
+ "Bronzo",
+ "Grigio_Antracite",
+ "Grigio_Magnesio",
+ "Nero",
+ "Nero_Etna",
+ "Perla_Moonlight",
+ "Rosso_Competizione"
+ ]
+ },
+ {
+ "name": "bmw_1m",
+ "description": "BMW 1M",
+ "paintings": [
+ "0_orange",
+ "black_sapphire",
+ "crimson_red",
+ "deep_sea_blue",
+ "glacier_silver",
+ "grey",
+ "liquid_blue",
+ "midnight_blue",
+ "mineral_grey",
+ "red",
+ "sparkling_bronze",
+ "valencia_orange",
+ "white",
+ "zaphir"
+ ]
+ },
+ {
+ "name": "bmw_1m_s3",
+ "description": "BMW 1M Stage 3",
+ "paintings": [
+ "ArisTek_5",
+ "BMW_Bank_22",
+ "BMW_Motorsport_black_88",
+ "BMW_Motorsport_white_99",
+ "BMW_motorsport_07",
+ "Green_Motorsport_45",
+ "Inferno_64",
+ "Just_Mareo_14",
+ "Kunos_Racing_2",
+ "Midnight_Boss",
+ "Street_Racer",
+ "Taurus_3D_17",
+ "Yashugan_DGFX_Art_4",
+ "black_sapphire_02",
+ "black_sapphire_03",
+ "bmw_20",
+ "crimson_red_04",
+ "deep_sea_blue_08",
+ "dgfx_11",
+ "glacier_silver_09",
+ "grey_05",
+ "liquid_blue_10",
+ "midnight_blue_12",
+ "mineral_grey_13",
+ "red_01",
+ "sparkling_bronze_17",
+ "staiger_15",
+ "valencia_orange_18",
+ "white_14",
+ "zaphir_19"
+ ]
+ },
+ {
+ "name": "bmw_m3_e30",
+ "description": "BMW M3 E30",
+ "paintings": [
+ "0_jet_black",
+ "Brilliant_red",
+ "Cinnabar_red",
+ "Henna_Red",
+ "Macau_Blue_Metallic",
+ "Misano_red",
+ "Nogaro_Silver_metallic",
+ "Salmon_Silver_metallic",
+ "Sterling_Silver_metallic",
+ "alpine_white",
+ "diamond_black_metallic"
+ ]
+ },
+ {
+ "name": "bmw_m3_e30_drift",
+ "description": "BMW M3 E30 Drift",
+ "paintings": [
+ "DGFX_Vinyl",
+ "Falken",
+ "JTC_Drift",
+ "Nitto_Red",
+ "Nitto_White"
+ ]
+ },
+ {
+ "name": "bmw_m3_e30_dtm",
+ "description": "BMW M3 E30 Gr.A 92",
+ "paintings": [
+ "0_fina_7",
+ "LUK",
+ "black",
+ "bmw"
+ ]
+ },
+ {
+ "name": "bmw_m3_e30_gra",
+ "description": "BMW M3 E30 Group A",
+ "paintings": [
+ "0_Sterling_Silver_metallic",
+ "Brilliant_red",
+ "Cinnabar_red",
+ "Henna_Red",
+ "Jet_Black",
+ "Macau_Blue_Metallic",
+ "Misano_red",
+ "Nogaro_Silver_metallic",
+ "Salmon_Silver_metallic",
+ "alpine_white",
+ "diamond_black_metallic"
+ ]
+ },
+ {
+ "name": "bmw_m3_e30_s1",
+ "description": "BMW M3 E30 Step1",
+ "paintings": [
+ "2_Tone_White_Red",
+ "Burnt_Orange",
+ "Diamond_Black_metallic",
+ "Germany",
+ "Nogaro_Silver_metallic",
+ "Sterling_Silver_metallic",
+ "Street_2",
+ "Street_Racer",
+ "alpine_white"
+ ]
+ },
+ {
+ "name": "bmw_m3_e92",
+ "description": "BMW M3 E92",
+ "paintings": [
+ "0_monte_carlo_blue",
+ "Atlantis_metallic",
+ "Azurite_Black",
+ "Barbera_Red",
+ "Black_Sapphire_metallic",
+ "Brilliant_White",
+ "Dakar_Yellow",
+ "Frozen_Black",
+ "Hellrot",
+ "Laguna_Seca_Blue",
+ "Marrakesh_Brown",
+ "Midnight_Blue",
+ "Moonstone",
+ "Orange",
+ "Phoenix_Yellow",
+ "Power_Green",
+ "Red",
+ "Santorini_Blue",
+ "Titanium_Silver"
+ ]
+ },
+ {
+ "name": "bmw_m3_e92_drift",
+ "description": "BMW M3 E92 drift",
+ "paintings": [
+ "BMW_Academy",
+ "Falken",
+ "GSR",
+ "Hankook",
+ "Koni_7",
+ "Monster_Falken",
+ "Rockstar",
+ "drivemotive"
+ ]
+ },
+ {
+ "name": "bmw_m3_e92_s1",
+ "description": "BMW M3 E92 Step1",
+ "paintings": [
+ "0_monte_carlo_blue",
+ "Atlantis_metallic",
+ "Barbera_Red",
+ "Black_Sapphire_metallic",
+ "Dakar_Yellow",
+ "Frozen_Black",
+ "Hellrot",
+ "Moonstone",
+ "Nvidia",
+ "Orange",
+ "Phoenix_Yellow",
+ "Power_Green",
+ "Red",
+ "Titanium_Silver",
+ "basic",
+ "drivemotive"
+ ]
+ },
+ {
+ "name": "bmw_m3_gt2",
+ "description": "BMW M3 GT2",
+ "paintings": [
+ "0_BMW_Motorsport",
+ "ADVAN",
+ "DSD",
+ "Digigrafet",
+ "Endless",
+ "Falken",
+ "Ozoshi",
+ "kunos_racing",
+ "kunos_racing_80",
+ "kunos_racing_81"
+ ]
+ },
+ {
+ "name": "bmw_z4",
+ "description": "BMW Z4 E89",
+ "paintings": [
+ "0_space_grey_metal",
+ "alpine_white",
+ "atacama_yellow",
+ "black_sapphire_metal",
+ "crimson_red",
+ "deep_sea_blue_metal",
+ "jet_black",
+ "melbourne_red_metal",
+ "mineral_white_metal",
+ "orion_silver_metal",
+ "titamium_silver_metal"
+ ]
+ },
+ {
+ "name": "bmw_z4_drift",
+ "description": "BMW Z4 E89 Drift",
+ "paintings": [
+ "Falken",
+ "drift_418",
+ "drift_419",
+ "ksart_17",
+ "ksart_18"
+ ]
+ },
+ {
+ "name": "bmw_z4_gt3",
+ "description": "BMW Z4 GT3",
+ "paintings": [
+ "0_bmw_motorsport_2013_black",
+ "TCR_2014_097",
+ "TCR_2014_903",
+ "Vita4one",
+ "assetto_z",
+ "bmw_motorsport_2012",
+ "bmw_motorsport_2013_white",
+ "fanatec",
+ "marc_vds_2013",
+ "scuderia_ecosse",
+ "walkenhorst_motorsport",
+ "xdrive_20_z"
+ ]
+ },
+ {
+ "name": "bmw_z4_s1",
+ "description": "BMW Z4 E89 Step1",
+ "paintings": [
+ "0_red",
+ "black",
+ "black_matte",
+ "blue",
+ "ksart_black",
+ "ksart_orange",
+ "ksart_white",
+ "white"
+ ]
+ },
+ {
+ "name": "ferrari_312t",
+ "description": "Ferrari 312T",
+ "paintings": [
+ "00_racing_12",
+ "01_ita_11",
+ "02_ita_1",
+ "03_racing_2",
+ "04_racing_4",
+ "05_racing_5",
+ "06_racing_6",
+ "07_racing_3"
+ ]
+ },
+ {
+ "name": "ferrari_458",
+ "description": "Ferrari 458 Italia",
+ "paintings": [
+ "00_rosso_scuderia",
+ "01_rosso_scuderia_dark_top",
+ "02_giallo_modena",
+ "03_blupozzi",
+ "04_grigio_scuro",
+ "05_giallo_modena_dark_top",
+ "06_avorio",
+ "07_rosso_corsa",
+ "08_rosso_mugello",
+ "09_bianco_avus"
+ ]
+ },
+ {
+ "name": "ferrari_458_gt2",
+ "description": "Ferrari 458 GT2",
+ "paintings": [
+ "00_red",
+ "2011_Team_Sofrev_ASP_20",
+ "2014_Team_Sofrev_ASP_GTE_58",
+ "AF_Corse_WEC_2014_71",
+ "af_corse_51",
+ "black_38",
+ "black_matte",
+ "kessel1_52",
+ "kunos_14",
+ "rosso_corsa",
+ "white",
+ "yellow"
+ ]
+ },
+ {
+ "name": "ferrari_458_s3",
+ "description": "Ferrari 458 Italia Stage 3",
+ "paintings": [
+ "00_rosso_scuderia",
+ "01_rosso_scuderia_dark_top",
+ "02_giallo_modena",
+ "03_blupozzi",
+ "04_grigio_scuro",
+ "05_giallo_modena_dark_top",
+ "06_avorio",
+ "07_rosso_corsa",
+ "08_rosso_mugello",
+ "09_bianco_avus"
+ ]
+ },
+ {
+ "name": "ferrari_599xxevo",
+ "description": "Ferrari 599XX EVO",
+ "paintings": [
+ "1",
+ "2",
+ "24",
+ "25",
+ "27",
+ "4",
+ "40",
+ "97"
+ ]
+ },
+ {
+ "name": "ferrari_f40",
+ "description": "Ferrari F40",
+ "paintings": [
+ "01_red"
+ ]
+ },
+ {
+ "name": "ferrari_f40_s3",
+ "description": "Ferrari F40 Stage 3",
+ "paintings": [
+ "01_yellow",
+ "02_black",
+ "03_red",
+ "04_blue",
+ "05_grey",
+ "06_white"
+ ]
+ },
+ {
+ "name": "ferrari_laferrari",
+ "description": "Ferrari LaFerrari",
+ "paintings": [
+ "00_rosso_scuderia",
+ "01_giallo_modena",
+ "02_rosso_corsa_r",
+ "04_grigio_scuro",
+ "05_blupozzi_r",
+ "06_bianco_avus",
+ "07_avorio_r",
+ "08_rosso_mugello",
+ "09_rosso_scuderia_r",
+ "10_giallo_modena_r",
+ "11_rosso_corsa",
+ "12_grigio_scuro_r",
+ "13_blupozzi",
+ "14_bianco_avus_r",
+ "15_avorio",
+ "16_rosso_mugello_r"
+ ]
+ },
+ {
+ "name": "ks_abarth500_assetto_corse",
+ "description": "Abarth 500 Assetto Corse",
+ "paintings": [
+ "0_official",
+ "black_neon",
+ "dark_blue",
+ "dark_green_yellow",
+ "light_blue_orange",
+ "maroon_white",
+ "orange_grey",
+ "racing_500",
+ "racing_501",
+ "racing_502",
+ "red_yellow",
+ "silver_red",
+ "white_grey",
+ "yellow_orange",
+ "ze_507",
+ "ze_508",
+ "ze_509"
+ ]
+ },
+ {
+ "name": "ks_abarth_595ss",
+ "description": "Abarth 595 SS",
+ "paintings": [
+ "1_official",
+ "2_official",
+ "avorio_antico",
+ "azzurro_acquamarina",
+ "beige_sabbia",
+ "bianco",
+ "blu_oriente",
+ "blue_medio",
+ "blue_scuro",
+ "grigio_garda",
+ "grigio_medio",
+ "rosso_corallo",
+ "rosso_corallo_scuro",
+ "rosso_medio"
+ ]
+ },
+ {
+ "name": "ks_abarth_595ss_s1",
+ "description": "Abarth 595 SS Step 1",
+ "paintings": [
+ "3_official",
+ "black",
+ "blue",
+ "campione",
+ "checkered",
+ "orange",
+ "red",
+ "yellow"
+ ]
+ },
+ {
+ "name": "ks_abarth_595ss_s2",
+ "description": "Abarth 595 SS Step 2",
+ "paintings": [
+ "4_official",
+ "black",
+ "blue",
+ "orange",
+ "red",
+ "yellow"
+ ]
+ },
+ {
+ "name": "ks_alfa_mito_qv",
+ "description": "Alfa Romeo Mito QV",
+ "paintings": [
+ "0_rosso_alfa",
+ "Biancospino",
+ "Blu_Tornado",
+ "Grigio_Grafite",
+ "Grigio_Techno",
+ "Nero",
+ "Nero_Etna",
+ "Rosso"
+ ]
+ },
+ {
+ "name": "ks_alfa_romeo_155_v6",
+ "description": "Alfa Romeo 155 TI V6",
+ "paintings": [
+ "0_racing_8",
+ "basic",
+ "racing_18",
+ "racing_19",
+ "racing_21",
+ "racing_5",
+ "racing_6",
+ "racing_7",
+ "racing_9",
+ "racing_91"
+ ]
+ },
+ {
+ "name": "ks_alfa_romeo_4c",
+ "description": "Alfa Romeo 4C",
+ "paintings": [
+ "0_rosso_alfa",
+ "bianco",
+ "bianco_black_rims",
+ "bianco_madreperla",
+ "bianco_madreperla_black_rims",
+ "grigio_basalto",
+ "grigio_basalto_black_rims",
+ "nero",
+ "nero_black_rims",
+ "orange_satin",
+ "orange_satin_black_rims",
+ "red",
+ "red_black_rims",
+ "red_black_rims_pastel",
+ "red_pastel",
+ "rosso_alfa_black_rims",
+ "rosso_alfa_black_rims_pastel",
+ "rosso_alfa_pastel"
+ ]
+ },
+ {
+ "name": "ks_alfa_romeo_gta",
+ "description": "Alfa Romeo GTA",
+ "paintings": [
+ "0_rosso_alfa",
+ "101_williams",
+ "10_marte",
+ "12_martocci",
+ "159_lugo",
+ "22_lavezzi",
+ "262_carrera",
+ "2_porzio",
+ "3_lemont",
+ "41_barthez",
+ "42_cardinali",
+ "46_jackermeier",
+ "4_marquez",
+ "55_coneja",
+ "61_perez",
+ "71_yoshida",
+ "72_johnson",
+ "84_lasarthe",
+ "91_raucci",
+ "96_colado",
+ "99_willis",
+ "black",
+ "cerulean",
+ "corn_yellow",
+ "dark_brown",
+ "dark_cerulean",
+ "dark_tangerine",
+ "denim",
+ "dim_gray",
+ "dodger_blue",
+ "fractal",
+ "golden_rod",
+ "monza_red",
+ "real_red",
+ "sangria_red"
+ ]
+ },
+ {
+ "name": "ks_audi_a1s1",
+ "description": "Audi S1",
+ "paintings": [
+ "00_sepang_blue_pearl_effect_br",
+ "01_vegas_yellow_br",
+ "02_misano_red_pearl_br",
+ "03_floret_silver_metallic_gr",
+ "03_scuba_blue_metallic_br",
+ "04_floret_silver_metallic_br",
+ "05_daytona_grey_pearl_br",
+ "06_glacier_white_metallic_br",
+ "07_nano_grey_metallic_gr",
+ "09_misano_red_pearl_gr",
+ "10_mythos_black_metallic_br",
+ "11_mythos_black_metallic_gr",
+ "12_nano_grey_metallic_br",
+ "13_glacier_white_metallic_gr",
+ "14_daytona_grey_pearl_gr",
+ "15_scuba_blue_metallic_gr",
+ "16_sepang_blue_pearl_effect_gr",
+ "17_vegas_yellow_gr",
+ "18_brilliant_black_br"
+ ]
+ },
+ {
+ "name": "ks_audi_r8_lms",
+ "description": "Audi R8 LMS Ultra",
+ "paintings": [
+ "2014_Hankook_C_Abt_09",
+ "2014_Hankook_C_Abt_10",
+ "2015_C_Abt_Racing_1",
+ "2015_C_Abt_Racing_2",
+ "2015_C_Abt_Racing_3",
+ "2015_WRT_1",
+ "2015_WRT_2",
+ "2015_WRT_3",
+ "audi_sport",
+ "factory_grey",
+ "factory_matte",
+ "factory_white"
+ ]
+ },
+ {
+ "name": "ks_audi_r8_plus",
+ "description": "Audi R8 V10 Plus",
+ "paintings": [
+ "00_brilliant_red_t",
+ "01_sepang_blue_matte_t",
+ "03_daytona_gray_pearl",
+ "04_estoril_blue_crystal",
+ "05_ibis_white_t",
+ "06_ice_silver_metallic",
+ "07_panther_black_crystal_t",
+ "08_phantom_black_pearl",
+ "09_samoa_orange_metallic_t",
+ "10_sepang_blue_pearl",
+ "11_suzuka_gray_metallic_t",
+ "12_teak_brown_metallic",
+ "Brilliant_Red",
+ "Ibis_White",
+ "Panther_Black_Crystal",
+ "Samoa_Orange_Metallic",
+ "Sepang_Blue_Matte",
+ "Suzuka_Gray_Metallic",
+ "daytona_gray_pearl_t",
+ "estoril_blue_crystal_t",
+ "ice_silver_metallic_t",
+ "phantom_black_pearl_t",
+ "sepang_blue_pearl_t",
+ "teak_brown_metallic_t"
+ ]
+ },
+ {
+ "name": "ks_audi_sport_quattro",
+ "description": "Audi Sport quattro",
+ "paintings": [
+ "00_tornado_red_rings",
+ "01_alpine_white",
+ "02_black",
+ "03_copenhagen_blue_rings",
+ "04_malachite_green",
+ "05_tornado_red",
+ "06_alpine_white_rings",
+ "07_copenhagen_blue",
+ "08_malachite_green_rings"
+ ]
+ },
+ {
+ "name": "ks_audi_sport_quattro_rally",
+ "description": "Audi Sport quattro S1 E2",
+ "paintings": [
+ "00_racing_2",
+ "01_roc_4",
+ "02_sanremo_5",
+ "03_racing_1",
+ "04_montecarlo_6"
+ ]
+ },
+ {
+ "name": "ks_audi_sport_quattro_s1",
+ "description": "Audi Sport quattro Step1",
+ "paintings": [
+ "00_copenhagen_blue_rings",
+ "01_alpine_white",
+ "02_black",
+ "03_tornado_red_rings",
+ "04_malachite_green",
+ "05_tornado_red",
+ "06_alpine_white_rings",
+ "07_copenhagen_blue",
+ "08_malachite_green_rings"
+ ]
+ },
+ {
+ "name": "ks_bmw_m235i_racing",
+ "description": "BMW M235i Racing",
+ "paintings": [
+ "00_racing_1",
+ "00_racing_171",
+ "racing_1",
+ "racing_2",
+ "racing_233",
+ "racing_235",
+ "racing_310",
+ "racing_44",
+ "racing_669",
+ "racing_71",
+ "racing_903",
+ "racing_909"
+ ]
+ },
+ {
+ "name": "ks_bmw_m4",
+ "description": "BMW M4",
+ "paintings": [
+ "0_austin_yellow_metallic",
+ "alpinweiss_iii_pastel",
+ "azuritschwarz_metallic",
+ "champagne_metallic",
+ "m_black_stripe",
+ "m_white_stripe",
+ "m_white_stripe_2",
+ "mineral_grau_metallic",
+ "mineral_white_metallic",
+ "sakhir_orange",
+ "saphirschwarz_metallic",
+ "silverstone_ii_metallic",
+ "smocked_topaz",
+ "tananit_blue_metallic",
+ "yas_marina_blue_metallic"
+ ]
+ },
+ {
+ "name": "ks_bmw_m4_akrapovic",
+ "description": "BMW M4 Akrapovic",
+ "paintings": [
+ "0_akrapovic",
+ "AH_Exclusive",
+ "Blackbox",
+ "akrapovic_m",
+ "alpinweiss_iii_pastel",
+ "austin_yellow_metallic",
+ "azuritschwarz_metallic",
+ "champagne_metallic",
+ "mineral_grau_metallic",
+ "mineral_white_metallic",
+ "sakhir_orange",
+ "saphirschwarz_metallic",
+ "silverstone_ii_metallic",
+ "smocked_topaz",
+ "tananit_blue_metallic",
+ "yas_marina_blue_metallic"
+ ]
+ },
+ {
+ "name": "ks_corvette_c7_stingray",
+ "description": "Chevrolet Corvette C7 Stingray",
+ "paintings": [
+ "00_velocity_yellow",
+ "01_torch_red",
+ "02_black_s",
+ "03_laguna_blue_sw",
+ "04_blade_silver_met_s",
+ "05_cyber_grey_s",
+ "06_lime_rock_green",
+ "07_night_race_blue_met_s",
+ "08_arctic_white_sr",
+ "Arctic_White_S",
+ "Arctic_White_SB",
+ "Black",
+ "Black_SG",
+ "Blade_Silver_Met",
+ "Crystal_Red",
+ "Cyber_Grey",
+ "Laguna_Blue",
+ "Laguna_Blue_SB",
+ "Lime_Rock_Green_S",
+ "Night_Race_Blue_Met",
+ "Torch_Red_SB",
+ "Torch_Red_SW",
+ "Velocity_Yellow_SB",
+ "Velocity_Yellow_SG",
+ "x_pacecar"
+ ]
+ },
+ {
+ "name": "ks_corvette_c7r",
+ "description": "Chevrolet Corvette C7R",
+ "paintings": [
+ "0_racing_3",
+ "101",
+ "12",
+ "15",
+ "22",
+ "23",
+ "25",
+ "26",
+ "4",
+ "40",
+ "41",
+ "42",
+ "46",
+ "55",
+ "63",
+ "64",
+ "72",
+ "racing_00"
+ ]
+ },
+ {
+ "name": "ks_ferrari_488_gt3",
+ "description": "Ferrari 488 GT3",
+ "paintings": [
+ "00_rosso_scuderia",
+ "01_racing_483",
+ "02_racing_487",
+ "03_racing_480",
+ "04_racing_500",
+ "05_racing_502",
+ "06_racing_489",
+ "07_racing_501",
+ "08_racing_490",
+ "09_racing_491",
+ "10_racing_492",
+ "11_racing_493",
+ "12_racing_494",
+ "13_racing_495",
+ "14_racing_496",
+ "15_racing_497",
+ "16_racing_498",
+ "17_racing_499",
+ "18_racing_503",
+ "19_racing_504",
+ "20_racing_505"
+ ]
+ },
+ {
+ "name": "ks_ferrari_488_gtb",
+ "description": "Ferrari 488 GTB",
+ "paintings": [
+ "00_rosso_scuderia",
+ "01_rosso_corsa_b",
+ "02_rosso_mugello",
+ "03_nero_pastello",
+ "04_giallo_modena_b",
+ "05_avorio",
+ "06_bianco_avus_b",
+ "07_blu_abu_dhabi",
+ "08_grigio_ferro_b",
+ "avorio_b",
+ "bianco_avus",
+ "blu_abu_dhabi_b",
+ "giallo_modena",
+ "grigio_ferro",
+ "rosso_corsa",
+ "rosso_mugello_b",
+ "rosso_scuderia_b"
+ ]
+ },
+ {
+ "name": "ks_ferrari_f138",
+ "description": "Ferrari F138",
+ "paintings": [
+ "00_official",
+ "01_ferrari_3",
+ "02_ferrari_4"
+ ]
+ },
+ {
+ "name": "ks_ferrari_fxx_k",
+ "description": "Ferrari FXX K",
+ "paintings": [
+ "01_rosso_ferrari_10",
+ "02_giallo_ferrari_15",
+ "02_red_yellow_13",
+ "03_black_yellow_44",
+ "04_blu_white_27",
+ "05_rosso_ferrari_69",
+ "06_red_silver_52",
+ "07_white_red_47"
+ ]
+ },
+ {
+ "name": "ks_ferrari_sf15t",
+ "description": "Ferrari SF15-T",
+ "paintings": [
+ "00_default",
+ "01_ferrari_5",
+ "02_ferrari_7"
+ ]
+ },
+ {
+ "name": "ks_ford_escort_mk1",
+ "description": "Ford Escort RS1600",
+ "paintings": [
+ "blue_white",
+ "classic_1",
+ "classic_112",
+ "classic_2",
+ "classic_34",
+ "classic_85",
+ "classic_zakspeed_25",
+ "grey_black",
+ "light_blue",
+ "lime_black",
+ "mexico_beige",
+ "mexico_black",
+ "mexico_copper",
+ "mexico_green",
+ "mexico_silver",
+ "orange_black",
+ "red_white",
+ "white_blue",
+ "yellow_black"
+ ]
+ },
+ {
+ "name": "ks_ford_gt40",
+ "description": "Ford GT40",
+ "paintings": [
+ "0_blue_stripes",
+ "15",
+ "19",
+ "29",
+ "beige",
+ "green",
+ "grey",
+ "orange",
+ "racing_6",
+ "racing_7",
+ "racing_9",
+ "racing_dark",
+ "racing_mcqueen",
+ "red",
+ "scuderia",
+ "white",
+ "yellow_stripes"
+ ]
+ },
+ {
+ "name": "ks_ford_mustang_2015",
+ "description": "Ford Mustang 2015",
+ "paintings": [
+ "00_deep_impact_blue_metallic_s",
+ "01_black",
+ "02_triple_yellow_tricoat_s2",
+ "03_deep_impact_blue_metallic",
+ "04_ingot_silver_metallic",
+ "05_competition_orange_s",
+ "06_oxford_white",
+ "07_race_red_s",
+ "08_guard_metallic",
+ "09_ruby_red_metallic_s",
+ "10_triple_yellow_tricoat",
+ "11_race_red",
+ "12_magnetic_metallic",
+ "13_black_s",
+ "14_competition_orange",
+ "15_oxford_white_s",
+ "16_ingot_silver_metallic_s",
+ "17_ruby_red_metallic",
+ "18_guard_metallic_s2",
+ "19_magnetic_metallic_s2"
+ ]
+ },
+ {
+ "name": "ks_glickenhaus_scg003",
+ "description": "SCG 003C",
+ "paintings": [
+ "0_mimetic",
+ "macchina1",
+ "macchina2"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_aventador_sv",
+ "description": "Lamborghini Aventador SV",
+ "paintings": [
+ "00_rosso_bia_glittered",
+ "01_giallo_evros_solid",
+ "02_arancio_argos_pearl",
+ "03_azzurro_thetys_metal",
+ "04_verde_ithaca_pearl",
+ "05_nero_pegaso_metal",
+ "06_verde_ermes_metal",
+ "07_oro_elios_metal",
+ "08_rosso_mars_metallic",
+ "09_grigio_thalasso_metal",
+ "10_giallo_horus_matt",
+ "11_blue_cepheus_pearl",
+ "12_grigio_telesto_pearl",
+ "13_arancio_atlas_pearl",
+ "14_blu_fontus_metal",
+ "15_grigio_estoque_metal",
+ "16_marrone_apus_matt",
+ "17_nero_nemesis_matt",
+ "18_bianco_isis",
+ "19_grigio_titans_matt",
+ "20_grigio_lynx_metal",
+ "21_new_giallo_orion_pearl",
+ "22_giallo_tenerife_pearl",
+ "23_blu_sideris_glittered",
+ "24_blu_nethus_metal",
+ "25_blu_caelum_metal",
+ "26_bianco_canopus_matt",
+ "27_blu_glauco_solid",
+ "28_balloon_white_pearl",
+ "29_blu_hera_metal",
+ "30_grigio_antares_metal",
+ "31_nero_aldebaran_solid",
+ "32_rosso_efesto_metal",
+ "33_verde_scandal_solid"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_countach",
+ "description": "Lamborghini Countach",
+ "paintings": [
+ "0_oro_sahara_metal",
+ "WalterWolf_black",
+ "WalterWolf_blue",
+ "WalterWolf_green",
+ "WalterWolf_red",
+ "argento_luna_metal",
+ "bianco_polo_park",
+ "blu_acapulco_metal",
+ "blu_tahiti_metal",
+ "canna_fucile_metal",
+ "nero_tenebre",
+ "nero_tenebre_gold",
+ "rosso_siviglia",
+ "rosso_siviglia_gold"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_countach_s1",
+ "description": "Lamborghini Countach S1",
+ "paintings": [
+ "0_oro_sahara_metal",
+ "WalterWolf_black",
+ "WalterWolf_blue",
+ "WalterWolf_green",
+ "WalterWolf_red",
+ "argento_luna_metal",
+ "bianco_polo_park",
+ "blu_acapulco_metal",
+ "blu_tahiti_metal",
+ "canna_fucile_metal",
+ "nero_tenebre",
+ "nero_tenebre_gold",
+ "rosso_siviglia",
+ "rosso_siviglia_gold"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_gallardo_sl",
+ "description": "Lamborghini Gallardo SL",
+ "paintings": [
+ "0_verde_ithaca_pearl",
+ "arancio_borealis_pearl",
+ "bianco_canopus",
+ "bianco_monocerus",
+ "blu_ely",
+ "edizione_technica",
+ "giallo_horus_matt",
+ "giallo_midas_pearl",
+ "grigio_telesto",
+ "nero_nemesis_matt",
+ "nero_noctis",
+ "rosso_mars",
+ "striped_grey",
+ "striped_orange",
+ "striped_yellow",
+ "tricolor_black",
+ "tricolor_white"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_gallardo_sl_s3",
+ "description": "Lamborghini Gallardo SL Step3",
+ "paintings": [
+ "striped_black_orange",
+ "striped_grey",
+ "striped_orange",
+ "striped_orange_black",
+ "striped_yellow",
+ "tricolor_black",
+ "tricolor_white"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_huracan_gt3",
+ "description": "Lamborghini Huracan GT3",
+ "paintings": [
+ "0_Racing_green",
+ "Racing_Black",
+ "Racing_Black_matte",
+ "Racing_BlizzardBlue",
+ "Racing_Cinnabar",
+ "Racing_Grey",
+ "Racing_Lime",
+ "Racing_Orange",
+ "Racing_Orange_matte",
+ "Racing_Red",
+ "Racing_Violet",
+ "Racing_White",
+ "Racing_Yellow",
+ "Racing_apricot",
+ "Racing_blue",
+ "Racing_copper",
+ "Racing_darkgreen",
+ "Racing_darkred",
+ "Racing_grey_matte"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_huracan_st",
+ "description": "Lamborghini Huracan ST",
+ "paintings": [
+ "0_Racing_63",
+ "Racing_18",
+ "Racing_23",
+ "Racing_25",
+ "Racing_26",
+ "Racing_28",
+ "Racing_29",
+ "Racing_35",
+ "Racing_36",
+ "Racing_37",
+ "Racing_38",
+ "Racing_39",
+ "Racing_52",
+ "Racing_53",
+ "Racing_55",
+ "Racing_56",
+ "Racing_68",
+ "Racing_69",
+ "Racing_76",
+ "Racing_79",
+ "Racing_82",
+ "Racing_99"
+ ]
+ },
+ {
+ "name": "ks_lamborghini_miura_sv",
+ "description": "Lamborghini Miura P400 SV",
+ "paintings": [
+ "Arancio_Gold",
+ "Arancio_Silver",
+ "Argento",
+ "Azzuro_Cielo",
+ "Bianco",
+ "Bleu_Medio",
+ "Bleu_Notte",
+ "Bleu_Tahiti",
+ "Champagne",
+ "Giallo_Miura",
+ "Nero_Cangiante_Gold",
+ "Nero_Cangiante_Silver",
+ "Rosso_Corsa_Gold",
+ "Rosso_Corsa_Silver",
+ "Rosso_Rubino_Metalizzato",
+ "Verde_Inglese",
+ "Verde_Miura",
+ "Verde_Rio_Metalizzato_Gold",
+ "Verde_Rio_Metalizzato_Silver"
+ ]
+ },
+ {
+ "name": "ks_lotus_25",
+ "description": "Lotus Type 25",
+ "paintings": [
+ "racing_01",
+ "racing_02",
+ "racing_03",
+ "racing_04",
+ "racing_05",
+ "racing_06",
+ "racing_07",
+ "racing_08",
+ "racing_09",
+ "racing_10",
+ "racing_11",
+ "racing_12",
+ "racing_13",
+ "racing_14",
+ "racing_15",
+ "racing_16",
+ "racing_17",
+ "racing_18",
+ "racing_19",
+ "racing_20",
+ "racing_21"
+ ]
+ },
+ {
+ "name": "ks_lotus_72d",
+ "description": "Lotus 72D",
+ "paintings": [
+ "classic_lotus_5",
+ "gold_2",
+ "lotus_10",
+ "lotus_11",
+ "lotus_12",
+ "lotus_13",
+ "lotus_14",
+ "lotus_15",
+ "lotus_16",
+ "lotus_3",
+ "lotus_4",
+ "lotus_5",
+ "lotus_6",
+ "lotus_7",
+ "lotus_8",
+ "lotus_9"
+ ]
+ },
+ {
+ "name": "ks_maserati_250f_12cyl",
+ "description": "Maserati 250F 12 cylinder",
+ "paintings": [
+ "00_racing_06",
+ "01_racing_02",
+ "02_racing_12",
+ "03_racing_14",
+ "04_racing_15",
+ "05_racing_18",
+ "06_racing_22",
+ "07_racing_24",
+ "08_racing_26",
+ "09_racing_282",
+ "10_racing_283",
+ "11_racing_29",
+ "12_racing_30",
+ "13_racing_33",
+ "14_racing_52",
+ "15_racing_53",
+ "16_racing_54"
+ ]
+ },
+ {
+ "name": "ks_maserati_250f_6cyl",
+ "description": "Maserati 250F 6 cylinder",
+ "paintings": [
+ "00_racing_01",
+ "01_racing_03",
+ "02_racing_05",
+ "03_racing_06",
+ "04_racing_13",
+ "05_racing_16",
+ "06_racing_20",
+ "07_racing_21",
+ "08_racing_24",
+ "09_racing_25",
+ "10_racing_27",
+ "11_racing_28",
+ "12_racing_56"
+ ]
+ },
+ {
+ "name": "ks_maserati_gt_mc_gt4",
+ "description": "Maserati GranTurismo MC GT4",
+ "paintings": [
+ "00_official",
+ "01_racing_12",
+ "02_racing_14",
+ "03_racing_17",
+ "04_racing_34",
+ "05_racing_56",
+ "06_racing_58",
+ "07_racing_67",
+ "08_racing_82",
+ "09_racing_89",
+ "10_racing_40",
+ "11_racing_41",
+ "12_racing_44",
+ "13_racing_65",
+ "14_racing_190",
+ "15_red"
+ ]
+ },
+ {
+ "name": "ks_maserati_levante",
+ "description": "Maserati Levante S",
+ "paintings": [
+ "00_nero_ribelle",
+ "01_champagne",
+ "02_blu_emozione",
+ "03_grigio",
+ "04_rosso_rubino",
+ "05_grigio_metallo",
+ "06_rame",
+ "07_grigio_maratea",
+ "08_blu_passione",
+ "09_bianco",
+ "10_bianco_alpi",
+ "11_nero",
+ "12_verde_ossido"
+ ]
+ },
+ {
+ "name": "ks_mazda_787b",
+ "description": "Mazda 787B",
+ "paintings": [
+ "00_renown_55",
+ "01_renown_lm_55",
+ "02_mazda_18",
+ "03_mazda_56",
+ "04_mazda_201"
+ ]
+ },
+ {
+ "name": "ks_mazda_miata",
+ "description": "Mazda Miata NA",
+ "paintings": [
+ "00_classic_red",
+ "01_mariner_blue",
+ "02_crystal_white",
+ "03_silver_stone_metallic_red",
+ "04_brilliant_black",
+ "05_sunburst_yellow",
+ "06_white_tan",
+ "07_montego_blue_mica",
+ "08_merlot_mica_tan",
+ "09_marina_green_mica",
+ "10_twilight_blue",
+ "11_british_racing_green_lim",
+ "12_black_lim",
+ "13_black_red_lim",
+ "14_montego_blue_lim",
+ "15_laguna_blue_lim",
+ "16_merlot_lim",
+ "17_starlight_blue_lim",
+ "18_marina_green_lim",
+ "19_twilight_blue_lim"
+ ]
+ },
+ {
+ "name": "ks_mazda_mx5_cup",
+ "description": "Mazda MX5 Cup",
+ "paintings": [
+ "00_official",
+ "01_cup_07",
+ "02_cup_23",
+ "03_cup_24",
+ "04_cup_29",
+ "05_cup_36",
+ "06_cup_55",
+ "07_cup_56",
+ "08_cup_57",
+ "09_cup_58",
+ "10_cup_60",
+ "11_cup_61",
+ "12_cup_62",
+ "13_cup_70",
+ "14_cup_87",
+ "15_speedsource_71",
+ "17_arisoil_72"
+ ]
+ },
+ {
+ "name": "ks_mazda_mx5_nd",
+ "description": "Mazda MX5 ND",
+ "paintings": [
+ "00_soul_red_metallic",
+ "01_jet_black_mica",
+ "02_artic_white",
+ "03_ceramic_metallic",
+ "04_blue_reflex_mica",
+ "05_meteor_grey_mica",
+ "06_crystal_white_pearlescent"
+ ]
+ },
+ {
+ "name": "ks_mazda_rx7_spirit_r",
+ "description": "Mazda RX-7 Spirit R",
+ "paintings": [
+ "00_blaze_red_b",
+ "01_pure_white",
+ "02_titanium_grey_b",
+ "03_competition_yellow",
+ "04_blue_mica_b",
+ "05_brilliant_black",
+ "06_blaze_red",
+ "07_pure_white_b",
+ "08_titanium_grey",
+ "09_competition_yellow_b",
+ "10_blue_mica"
+ ]
+ },
+ {
+ "name": "ks_mazda_rx7_tuned",
+ "description": "Mazda RX-7 Tuned",
+ "paintings": [
+ "00_orange_s2",
+ "01_blaze_red_s1",
+ "02_blue_mica_s2",
+ "03_competition_yellow_s1",
+ "04_brilliant_black_s2",
+ "05_titanium_grey_s1",
+ "06_white_stripe_s2",
+ "07_kunos_63",
+ "08_kunos_66",
+ "09_kunos_64",
+ "10_kunos_65",
+ "11_orange_s1",
+ "12_blaze_red_s2",
+ "13_blue_mica_s1",
+ "14_competition_yellow_s2",
+ "15_brilliant_black_s1",
+ "16_titanium_grey_s2",
+ "17_white_stripe_s1",
+ "18_mspeed"
+ ]
+ },
+ {
+ "name": "ks_mclaren_650_gt3",
+ "description": "McLaren 650S GT3",
+ "paintings": [
+ "00_racing_59",
+ "racing_2",
+ "racing_3",
+ "racing_57",
+ "racing_58",
+ "racing_60",
+ "racing_61",
+ "racing_62",
+ "racing_63",
+ "racing_64",
+ "racing_65",
+ "w_great_britain"
+ ]
+ },
+ {
+ "name": "ks_mclaren_f1_gtr",
+ "description": "McLaren F1 GTR",
+ "paintings": [
+ "0_orange",
+ "Fina_39",
+ "Fina_42",
+ "Gulf_24",
+ "Gulf_33",
+ "dark_grey",
+ "default",
+ "grey",
+ "red"
+ ]
+ },
+ {
+ "name": "ks_mclaren_p1",
+ "description": "McLaren P1",
+ "paintings": [
+ "0_mclaren_orange",
+ "azure_blue",
+ "carbon_black",
+ "mercury_red",
+ "pearl_white",
+ "silver",
+ "volcano_orange",
+ "volcano_red",
+ "volcano_yellow",
+ "yellow"
+ ]
+ },
+ {
+ "name": "ks_mercedes_190_evo2",
+ "description": "Mercedes-Benz 190E EVO II",
+ "paintings": [
+ "0_Sonax_3",
+ "Argento_Iridio_65",
+ "Blue_71",
+ "Grigio_Alanite_designo_68",
+ "Mystic_White_designo_55",
+ "Nero_Ossidiana_72",
+ "Rosso_Opale_67",
+ "Silver_Blue_13",
+ "Yellow_Blue_12",
+ "alpine_white_64",
+ "black_66"
+ ]
+ },
+ {
+ "name": "ks_mercedes_amg_gt3",
+ "description": "Mercedes-Benz AMG GT3",
+ "paintings": [
+ "0_0fficial",
+ "racing_69",
+ "racing_70",
+ "racing_71",
+ "racing_72",
+ "racing_73",
+ "racing_74",
+ "racing_75",
+ "racing_76"
+ ]
+ },
+ {
+ "name": "ks_mercedes_c9",
+ "description": "Mercedes-Benz C9 1989 LM",
+ "paintings": [
+ "00_sauber_63",
+ "01_sauber_61",
+ "02_michelin_63",
+ "03_aeg_61",
+ "04_aeg_olympia_62",
+ "05_team_redline_blue",
+ "06_team_redline_classic",
+ "07_team_redline_navy",
+ "08_team_redline_red",
+ "09_team_redline_white"
+ ]
+ },
+ {
+ "name": "ks_nissan_370z",
+ "description": "Nissan 370z Nismo",
+ "paintings": [
+ "00_pearl_white_met",
+ "01_magnetic_black_met",
+ "02_solid_red_solid",
+ "03_brillant_silver_met"
+ ]
+ },
+ {
+ "name": "ks_nissan_gtr",
+ "description": "Nissan GT-R NISMO",
+ "paintings": [
+ "0_pearl_white",
+ "jet_black",
+ "solid_red",
+ "super_silver"
+ ]
+ },
+ {
+ "name": "ks_nissan_gtr_gt3",
+ "description": "Nissan GT-R GT3",
+ "paintings": [
+ "0_Nissan_12",
+ "2t_94",
+ "2t_95",
+ "2t_96",
+ "2t_97",
+ "JRM_22",
+ "JRM_23",
+ "JRM_230",
+ "Nissan_98",
+ "ac_15",
+ "ac_36",
+ "ac_67",
+ "gt3_91",
+ "gt3_92",
+ "gt3_93",
+ "kunosart_112",
+ "kunosart_121",
+ "nismo_88",
+ "nismo_89",
+ "nismo_90"
+ ]
+ },
+ {
+ "name": "ks_nissan_skyline_r34",
+ "description": "Nissan Skyline GTR R34 V-Spec",
+ "paintings": [
+ "00_bayside_blue",
+ "01_active_red",
+ "02_athlete_silver",
+ "03_black_pearl",
+ "04_lightning_yellow",
+ "05_pearl_white",
+ "06_sonic_silver",
+ "07_midnight_purple_ii",
+ "08_millennium_jade",
+ "09_silica_breath"
+ ]
+ },
+ {
+ "name": "ks_porsche_718_boxster_s",
+ "description": "Porsche 718 Boxster S",
+ "paintings": [
+ "00_gt_silver_metallic",
+ "01_miami_blue",
+ "02_carmine_red",
+ "03_black",
+ "04_white",
+ "05_racing_yellow",
+ "06_guards_red",
+ "07_carrara_white_metallic",
+ "08_jet_black_metallic",
+ "09_graphite_blue_metallic",
+ "10_rhodium_silver_metallic",
+ "11_night_blue_metallic",
+ "12_agate_grey_metallic",
+ "13_lava_orange",
+ "14_sapphire_blue_metallic",
+ "15_mahogany_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_718_boxster_s_pdk",
+ "description": "Porsche 718 Boxster S PDK",
+ "paintings": [
+ "00_carmine_red",
+ "01_lava_orange",
+ "02_miami_blue",
+ "03_black",
+ "04_white",
+ "05_racing_yellow",
+ "06_guards_red",
+ "07_carrara_white_metallic",
+ "08_jet_black_metallic",
+ "09_graphite_blue_metallic",
+ "10_rhodium_silver_metallic",
+ "11_night_blue_metallic",
+ "12_agate_grey_metallic",
+ "13_gt_silver_metallic",
+ "14_sapphire_blue_metallic",
+ "15_mahogany_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_718_cayman_s",
+ "description": "Porsche 718 Cayman S",
+ "paintings": [
+ "00_graphite_blue_metallic",
+ "01_carmine_red",
+ "02_lava_orange",
+ "03_black",
+ "04_white",
+ "05_racing_yellow",
+ "06_guards_red",
+ "07_carrara_white_metallic",
+ "08_jet_black_metallic",
+ "09_miami_blue",
+ "10_rhodium_silver_metallic",
+ "11_night_blue_metallic",
+ "12_agate_grey_metallic",
+ "13_gt_silver_metallic",
+ "14_sapphire_blue_metallic",
+ "15_mahogany_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_718_spyder_rs",
+ "description": "Porsche 718 RS 60 Spyder",
+ "paintings": [
+ "00_racing_42",
+ "01_racing_34",
+ "02_racing_50",
+ "03_racing_136",
+ "04_racing_silver"
+ ]
+ },
+ {
+ "name": "ks_porsche_908_lh",
+ "description": "Porsche 908 LH",
+ "paintings": [
+ "00_racing_64",
+ "01_racing_25",
+ "02_racing_60",
+ "03_racing_33",
+ "04_racing_10",
+ "05_racing_5"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_carrera_rsr",
+ "description": "Porsche 911 Carrera RSR 3.0",
+ "paintings": [
+ "00_imsa_74",
+ "01_racing_red",
+ "02_kremer",
+ "03_kunosracing_17",
+ "04_kunosracing_52",
+ "05_kunosracing_56",
+ "06_carrera_white",
+ "07_carrera_blue",
+ "08_carrera_green",
+ "09_carrera_black",
+ "10_carrera_grey",
+ "11_carrera_lime",
+ "12_carrera_red",
+ "13_carrera_76",
+ "14_carrera_brown",
+ "15_carrera_purple",
+ "16_carrera_cyan",
+ "17_carrera_burgundy",
+ "18_kunosracing_57",
+ "19_kunosracing_58",
+ "20_kunosracing_59",
+ "21_kunosracing_75"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_gt1",
+ "description": "Porsche 911 GT1-98",
+ "paintings": [
+ "00_racing_26",
+ "01_racing_25",
+ "02_racing_5",
+ "03_racing_6"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_gt3_cup_2017",
+ "description": "Porsche 911 GT3 Cup 2017",
+ "paintings": [
+ "00_cup",
+ "01_racing_912",
+ "02_racing_917",
+ "03_racing_919",
+ "04_racing_915",
+ "05_racing_913",
+ "06_racing_922",
+ "07_racing_914",
+ "08_racing_920",
+ "09_racing_921",
+ "10_racing_918",
+ "11_racing_923",
+ "12_racing_924",
+ "13_racing_925",
+ "14_racing_926",
+ "15_racing_927",
+ "16_racing_928",
+ "17_racing_929",
+ "18_racing_930",
+ "19_racing_916",
+ "20_racing_931"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_gt3_r_2016",
+ "description": "Porsche 911 GT3 R 2016",
+ "paintings": [
+ "00_gt3",
+ "01_racing_912",
+ "02_racing_911",
+ "03_racing_910"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_gt3_rs",
+ "description": "Porsche 911 GT3 RS",
+ "paintings": [
+ "00_lava_orange",
+ "01_ultraviolet",
+ "02_gt_silver_metallic",
+ "03_white"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_r",
+ "description": "Porsche 911 R",
+ "paintings": [
+ "00_white_red",
+ "01_silver_green",
+ "02_white",
+ "03_gt_silver_metallic",
+ "04_silver_red",
+ "05_white_green"
+ ]
+ },
+ {
+ "name": "ks_porsche_911_rsr_2017",
+ "description": "Porsche 911 RSR 2017",
+ "paintings": [
+ "00_rsr",
+ "01_racing_911",
+ "02_racing_912"
+ ]
+ },
+ {
+ "name": "ks_porsche_917_30",
+ "description": "Porsche 917/30 Spyder",
+ "paintings": [
+ "00_chassis_002_racing",
+ "01_chassis_003_racing",
+ "02_chassis_006_racing",
+ "03_chassis_004_private",
+ "04_chassis_005_private"
+ ]
+ },
+ {
+ "name": "ks_porsche_917_k",
+ "description": "Porsche 917 K",
+ "paintings": [
+ "00_racing_21",
+ "01_racing_20",
+ "02_racing_1",
+ "03_racing_2",
+ "04_racing_3",
+ "05_racing_23",
+ "06_racing_32",
+ "07_racing_16"
+ ]
+ },
+ {
+ "name": "ks_porsche_918_spyder",
+ "description": "Porsche 918 Spyder",
+ "paintings": [
+ "00_salzburg_racing_03",
+ "01_salzburg_racing_25",
+ "02_rhodium_silver_metallic",
+ "03_liquid_metal_silver",
+ "04_guards_red",
+ "05_black_matte",
+ "06_basalt_black_metallic",
+ "07_black",
+ "08_dark_blue_metallic",
+ "09_gt_silver_metallic",
+ "10_liquid_metal_chrome_blue",
+ "11_meteor_grey_metallic",
+ "12_racing_yellow",
+ "13_sapphire_blue_metallic",
+ "14_white",
+ "15_salzburg_racing_28",
+ "16_salzburg_racing_04",
+ "17_salzburg_racing_05",
+ "18_salzburg_racing_01"
+ ]
+ },
+ {
+ "name": "ks_porsche_919_hybrid_2015",
+ "description": "Porsche 919 Hybrid 2015",
+ "paintings": [
+ "00_lms_19",
+ "01_lms_17",
+ "02_lms_18"
+ ]
+ },
+ {
+ "name": "ks_porsche_919_hybrid_2016",
+ "description": "Porsche 919 Hybrid 2016",
+ "paintings": [
+ "00_lms_02",
+ "01_lms_01"
+ ]
+ },
+ {
+ "name": "ks_porsche_935_78_moby_dick",
+ "description": "Porsche 935/78 'Moby Dick'",
+ "paintings": [
+ "00_racing_01",
+ "01_racing_43",
+ "02_racing_27",
+ "03_racing_30",
+ "04_racing_70",
+ "05_racing_66",
+ "06_racing_79"
+ ]
+ },
+ {
+ "name": "ks_porsche_962c_longtail",
+ "description": "Porsche 962 C Long Tail",
+ "paintings": [
+ "00_racing_17_87",
+ "01_racing_18_87",
+ "02_racing_1_87",
+ "03_racing_17_88",
+ "04_racing_19_88",
+ "05_racing_10",
+ "06_racing_11",
+ "07_racing_12",
+ "08_racing_4",
+ "09_racing_77"
+ ]
+ },
+ {
+ "name": "ks_porsche_962c_shorttail",
+ "description": "Porsche 962 C Short Tail",
+ "paintings": [
+ "00_racing_01",
+ "01_racing_02",
+ "02_racing_17",
+ "03_racing_7",
+ "04_racing_99",
+ "05_racing_78",
+ "06_racing_18"
+ ]
+ },
+ {
+ "name": "ks_porsche_991_carrera_s",
+ "description": "Porsche 911 Carrera S",
+ "paintings": [
+ "00_guards_red",
+ "01_black",
+ "02_white",
+ "03_agate_grey_metallic",
+ "04_racing_yellow",
+ "05_carmine_red",
+ "06_lava_orange",
+ "07_miami_blue",
+ "08_carrara_white_metallic",
+ "09_jet_black_metallic",
+ "10_graphite_blue_metallic",
+ "11_rhodium_silver_metallic",
+ "12_sapphire_blue_metallic",
+ "13_night_blue_metallic",
+ "14_gt_silver_metallic",
+ "15_mahogany_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_991_turbo_s",
+ "description": "Porsche 911 Turbo S",
+ "paintings": [
+ "00_miami_blue",
+ "01_black",
+ "02_white",
+ "03_agate_grey_metallic",
+ "04_racing_yellow",
+ "05_carmine_red",
+ "06_lava_orange",
+ "07_guards_red",
+ "08_carrara_white_metallic",
+ "09_jet_black_metallic",
+ "10_graphite_blue_metallic",
+ "11_rhodium_silver_metallic",
+ "12_sapphire_blue_metallic",
+ "13_night_blue_metallic",
+ "14_gt_silver_metallic",
+ "15_mahogany_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_cayenne",
+ "description": "Porsche Cayenne Turbo S",
+ "paintings": [
+ "00_black",
+ "01_meteor_grey_metallic",
+ "02_white",
+ "03_carmine_red",
+ "04_purpurite_metallic",
+ "05_carrara_white_metallic",
+ "06_jet_black_metallic",
+ "07_moonlight_blue_metallic",
+ "08_rhodium_silver_metallic",
+ "09_sapphire_blue_metallic",
+ "10_palladium_metallic",
+ "11_mahogany_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_cayman_gt4_clubsport",
+ "description": "Porsche Cayman GT4 Clubsport",
+ "paintings": [
+ "00_clubsport",
+ "02_cup_01",
+ "03_cup_02",
+ "04_cup_03",
+ "05_cup_05",
+ "06_cup_06",
+ "07_cup_07",
+ "08_cup_08",
+ "09_cup_09",
+ "10_cup_10",
+ "11_cup_11",
+ "12_cup_12",
+ "13_cup_13",
+ "14_cup_26",
+ "15_cup_33",
+ "16_cup_46",
+ "17_cup_76",
+ "18_cup_62",
+ "19_cup_63",
+ "20_cup_64"
+ ]
+ },
+ {
+ "name": "ks_porsche_cayman_gt4_std",
+ "description": "Porsche Cayman GT4",
+ "paintings": [
+ "00_racing_yellow",
+ "01_agate_grey_metallic",
+ "02_black",
+ "03_carmine_red",
+ "04_carrara_white_metallic",
+ "05_gt_silver_metallic",
+ "06_guards_red",
+ "07_jet_black_metallic",
+ "08_rhodium_silver_metallic",
+ "09_sapphire_blue_metallic",
+ "10_white",
+ "11_dark_blue_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_macan",
+ "description": "Porsche Macan Turbo",
+ "paintings": [
+ "00_agate_grey_metallic",
+ "01_black",
+ "02_white",
+ "03_carmine_red",
+ "05_carrara_white_metallic",
+ "06_jet_black_metallic",
+ "07_volcano_grey_metallic",
+ "08_rhodium_silver_metallic",
+ "09_sapphire_blue_metallic",
+ "10_night_blue_metallic",
+ "11_mahogany_metallic",
+ "12_meteor_grey_metallic"
+ ]
+ },
+ {
+ "name": "ks_porsche_panamera",
+ "description": "Porsche Panamera Turbo",
+ "paintings": [
+ "00_sapphire_blue_metallic",
+ "01_black",
+ "02_white",
+ "03_carmine_red",
+ "04_gt_silver_metallic",
+ "05_carrara_white_metallic",
+ "06_jet_black_metallic",
+ "07_volcano_grey_metallic",
+ "08_rhodium_silver_metallic",
+ "09_agate_grey_metallic",
+ "10_night_blue_metallic",
+ "11_mahogany_metallic",
+ "12_palladium_metallic",
+ "13_amethyst_metallic",
+ "14_chalk"
+ ]
+ },
+ {
+ "name": "ks_praga_r1",
+ "description": "Praga R1",
+ "paintings": [
+ "00_praga_cars_racing_blue",
+ "01_praga_cars_racing_9",
+ "02_gryphon_racing_69",
+ "04_monticello_motor_club_36",
+ "05_robert_haub_69",
+ "06_power_sport_racing_56",
+ "07_gryphon_racing_69",
+ "08_blueberry_racing_771",
+ "09_racing_praga_27",
+ "10_Gryphon_racing_13",
+ "11_blueberry_racing_770",
+ "12_endurance_2015_01"
+ ]
+ },
+ {
+ "name": "ks_ruf_rt12r",
+ "description": "RUF RT12 R",
+ "paintings": [
+ "0_official",
+ "Green",
+ "black",
+ "black_matte_silver",
+ "blue",
+ "kunos_fanatec",
+ "light_blue",
+ "light_green",
+ "lime",
+ "orange",
+ "purple",
+ "red",
+ "silver",
+ "silver_matte",
+ "silver_matte_gr",
+ "white",
+ "yellow"
+ ]
+ },
+ {
+ "name": "ks_ruf_rt12r_awd",
+ "description": "RUF RT12 R AWD",
+ "paintings": [
+ "0_official",
+ "Green",
+ "black",
+ "black_matte_silver",
+ "blue",
+ "kunos",
+ "light_blue",
+ "light_green",
+ "lime",
+ "orange",
+ "purple",
+ "red",
+ "silver",
+ "silver_matte",
+ "silver_matte_gr",
+ "white",
+ "yellow"
+ ]
+ },
+ {
+ "name": "ks_toyota_ae86",
+ "description": "Toyota AE86",
+ "paintings": [
+ "00_white",
+ "01_black",
+ "02_blue_met",
+ "03_silver_gray",
+ "04_red",
+ "05_white_carbon",
+ "06_dark_orange_met",
+ "07_wine_met",
+ "08_black_met",
+ "09_light_topaz_met",
+ "10_lt_bluemd_blue",
+ "11_shell_met",
+ "12_medium_blue_met",
+ "14_silver_black",
+ "15_white_bhood",
+ "16_yellow"
+ ]
+ },
+ {
+ "name": "ks_toyota_ae86_drift",
+ "description": "Toyota AE86 Drift",
+ "paintings": [
+ "00_ksdrift7",
+ "01_ksdrift3",
+ "02_ksdrift8",
+ "03_ksdrift5",
+ "04_ksdrift4",
+ "05_ksdrift2",
+ "06_ksdrift6",
+ "07_ksdrift1"
+ ]
+ },
+ {
+ "name": "ks_toyota_ae86_tuned",
+ "description": "Toyota AE86 Tuned",
+ "paintings": [
+ "01_spooler_16",
+ "02_spooler_17",
+ "03_toyo_84",
+ "04_trd_86",
+ "05_white_carbon"
+ ]
+ },
+ {
+ "name": "ks_toyota_gt86",
+ "description": "Toyota GT86",
+ "paintings": [
+ "0_fusion_orange",
+ "crystal_black",
+ "crystal_white_pearl",
+ "dark_grey",
+ "galaxy_blue",
+ "gravity_blue",
+ "ice_silver",
+ "ignition_red",
+ "lightning_red",
+ "rsrnurburg",
+ "velocity_orange",
+ "vivid_yellow"
+ ]
+ },
+ {
+ "name": "ks_toyota_supra_mkiv",
+ "description": "Toyota Supra MKIV",
+ "paintings": [
+ "00_super_red",
+ "01_dark_green_pearl_met",
+ "02_super_white",
+ "03_silver_met",
+ "04_black",
+ "05_blue_pearl_met"
+ ]
+ },
+ {
+ "name": "ks_toyota_supra_mkiv_drift",
+ "description": "Toyota Supra MKIV Drift",
+ "paintings": [
+ "00_orange",
+ "01_black",
+ "02_blue",
+ "03_red",
+ "04_silver",
+ "05_white",
+ "06_yellow",
+ "07_ksart",
+ "08_classic_yellow"
+ ]
+ },
+ {
+ "name": "ks_toyota_supra_mkiv_tuned",
+ "description": "Toyota Supra MKIV Time Attack",
+ "paintings": [
+ "00_kunos",
+ "01_art",
+ "03_tims",
+ "04_toyo_stripe",
+ "05_red_carbon",
+ "06_black_carbon",
+ "07_purple_carbon",
+ "08_white_carbon",
+ "09_lime_carbon",
+ "10_silver_stripe",
+ "11_black_stripe",
+ "12_blue_stripe",
+ "13_white_stripe"
+ ]
+ },
+ {
+ "name": "ktm_xbow_r",
+ "description": "KTM X-Bow R",
+ "paintings": [
+ "00_orange_14",
+ "01_blue_01",
+ "02_isotope_green_10",
+ "03_dark_grey_06",
+ "04_yellow_07",
+ "05_light_blue_04",
+ "06_red_18",
+ "07_dark_grey_09",
+ "08_orange_19",
+ "09_red_15",
+ "10_blue_02",
+ "11_carbon_03",
+ "12_cyan_05",
+ "13_light_grey_08",
+ "14_isotope_green_11",
+ "15_lemon_12",
+ "16_light_grey_13",
+ "17_green_20"
+ ]
+ },
+ {
+ "name": "lotus_2_eleven",
+ "description": "Lotus 2-Eleven",
+ "paintings": [
+ "2_eleven",
+ "kunos_racing_40",
+ "kunos_racing_41",
+ "red"
+ ]
+ },
+ {
+ "name": "lotus_2_eleven_gt4",
+ "description": "Lotus 2-Eleven GT4",
+ "paintings": [
+ "2ELEVEN_13",
+ "2ELEVEN_14",
+ "2ELEVEN_15",
+ "2ELEVEN_16",
+ "Atech_Green_07",
+ "Atech_Orange_08",
+ "Cloud9_19",
+ "Cloud9_20",
+ "DGFX_Blue_06",
+ "DGFX_Red_05",
+ "Kunos_Racing_11",
+ "Kunos_Racing_12",
+ "Lotus_Black_03",
+ "Lotus_Green_01",
+ "Lotus_White_04",
+ "Lotus_Yellow_02",
+ "Mareo_Wins_09",
+ "Mareo_Wins_10",
+ "Taurus_17",
+ "Taurus_18"
+ ]
+ },
+ {
+ "name": "lotus_49",
+ "description": "Lotus Type 49",
+ "paintings": [
+ "00_default",
+ "1967_02",
+ "1967_03",
+ "1967_05",
+ "1967_06",
+ "1967_12",
+ "1967_14",
+ "1967_15",
+ "1967_16",
+ "1967_18",
+ "1967_20",
+ "1967_29",
+ "1967_32",
+ "1967_34",
+ "1967__07",
+ "1967__17",
+ "racing_22",
+ "racing_5"
+ ]
+ },
+ {
+ "name": "lotus_98t",
+ "description": "Lotus 98T",
+ "paintings": [
+ "0_delonghi_11",
+ "DeLonghi_12",
+ "Mullberry_17",
+ "Mullberry_18",
+ "brokmans_13",
+ "brokmans_14",
+ "craft_03",
+ "craft_04",
+ "dline_01",
+ "dline_02",
+ "dome_15",
+ "dome_16",
+ "eastern_07",
+ "eastern_08",
+ "epoxo_09",
+ "epoxo_10",
+ "race_trim_19",
+ "race_trim_20",
+ "wilson_05",
+ "wilson_06"
+ ]
+ },
+ {
+ "name": "lotus_elise_sc",
+ "description": "Lotus Elise SC",
+ "paintings": [
+ "0_racing_green",
+ "black_metallic",
+ "blue_metallic",
+ "grey_metallic",
+ "orange_metallic",
+ "signature_grey",
+ "silver_metallic",
+ "solid_red",
+ "solid_yellow",
+ "white_metallic"
+ ]
+ },
+ {
+ "name": "lotus_elise_sc_s1",
+ "description": "Lotus Elise SC Step1",
+ "paintings": [
+ "0_Motorsport_Green",
+ "Aquamarine_Blue",
+ "Autumn_Bronze",
+ "Chrome_Orange",
+ "Ice_White",
+ "Laser_Blue",
+ "Quartz_Silver",
+ "Sienna_Brown",
+ "Starlight_Black",
+ "Velvet_Red"
+ ]
+ },
+ {
+ "name": "lotus_elise_sc_s2",
+ "description": "Lotus Elise SC Step2",
+ "paintings": [
+ "0_Racing_Green_Stripe",
+ "Amethyst_Grey",
+ "Ardent_Red",
+ "Canyon_Red",
+ "Frost_Blue",
+ "Isotope_Green",
+ "Liquid_Blue",
+ "Persian_Blue",
+ "Solar_Yellow",
+ "Storm_Titanium"
+ ]
+ },
+ {
+ "name": "lotus_evora_gtc",
+ "description": "Lotus Evora GTC",
+ "paintings": [
+ "Burnt_Orange",
+ "Carbon_Grey",
+ "Motorsport_Green",
+ "Motorsport_Green_Cosworth",
+ "Phantom_Black",
+ "Quartz_Silver",
+ "Solar_Yellow",
+ "battery_tender",
+ "bull_run",
+ "racing_green",
+ "red"
+ ]
+ },
+ {
+ "name": "lotus_evora_gte",
+ "description": "Lotus Evora GTE",
+ "paintings": [
+ "0_yellow",
+ "black_red",
+ "grey",
+ "kunos_racing_72",
+ "red",
+ "red_stripes",
+ "white_black"
+ ]
+ },
+ {
+ "name": "lotus_evora_gte_carbon",
+ "description": "Lotus Evora GTE Carbon",
+ "paintings": [
+ "carbon"
+ ]
+ },
+ {
+ "name": "lotus_evora_gx",
+ "description": "Lotus Evora GX",
+ "paintings": [
+ "Burnt_Orange",
+ "Carbon_Grey",
+ "Motorsport_Green",
+ "Phantom_Black",
+ "Quartz_Silver",
+ "Solar_Yellow",
+ "battery_tender",
+ "default",
+ "racing_green",
+ "red"
+ ]
+ },
+ {
+ "name": "lotus_evora_s",
+ "description": "Lotus Evora S",
+ "paintings": [
+ "0_Racing_Green",
+ "Aquamarine_Blue",
+ "Aspen_White",
+ "Canyon_Red",
+ "Chrome_Orange",
+ "Nightfall_Blue",
+ "Quartz_Silver",
+ "Solar_Yellow"
+ ]
+ },
+ {
+ "name": "lotus_evora_s_s2",
+ "description": "Lotus Evora S Stage 2",
+ "paintings": [
+ "0_Motorsport_Green",
+ "Amethyst_Grey",
+ "Ardent_Red",
+ "Autumn_Bronze",
+ "Carbon_Grey",
+ "Phantom_Black",
+ "Sienna_Brown"
+ ]
+ },
+ {
+ "name": "lotus_exige_240",
+ "description": "Lotus Exige 240R",
+ "paintings": [
+ "orange",
+ "red"
+ ]
+ },
+ {
+ "name": "lotus_exige_240_s3",
+ "description": "Lotus Exige 240R Stage3",
+ "paintings": [
+ "0_motorsport_green_stripe",
+ "black",
+ "blue_dsd",
+ "light_blue_orange",
+ "orange_aris",
+ "red_dgfx",
+ "tcr_2014"
+ ]
+ },
+ {
+ "name": "lotus_exige_s",
+ "description": "Lotus Exige S",
+ "paintings": [
+ "0_racing_green",
+ "Amethyst_Grey",
+ "Aquamarine_Blue",
+ "Ardent_Red",
+ "Artic_Silver",
+ "Aspen_White",
+ "Autumn_Bronze",
+ "Burnt_Orange",
+ "Canyon_Red",
+ "Carbon_Grey",
+ "Chrome_Orange",
+ "Frost_Blue",
+ "Graphite_Grey",
+ "Ice_White",
+ "Isotope_Green",
+ "Laser_Blue",
+ "Liquid_Blue",
+ "Motorsport_Green",
+ "Nightfall_Blue",
+ "Persian_Blue",
+ "Phantom_Black",
+ "Quartz_Silver",
+ "Sienna_Brown",
+ "Solar_Yellow",
+ "Starlight_Black",
+ "Storm_Titanium",
+ "Velvet_Red"
+ ]
+ },
+ {
+ "name": "lotus_exige_s_roadster",
+ "description": "Lotus Exige S roadster",
+ "paintings": [
+ "0_racing_green",
+ "Amethyst_Grey",
+ "Ardent_Red",
+ "Artic_Silver",
+ "Aspen_White",
+ "Autumn_Bronze",
+ "Burnt_Orange",
+ "Canyon_Red",
+ "Motorsport_Green",
+ "Nightfall_Blue",
+ "Phantom_Black",
+ "Solar_Yellow"
+ ]
+ },
+ {
+ "name": "lotus_exige_scura",
+ "description": "Lotus Exige Scura",
+ "paintings": [
+ "scura"
+ ]
+ },
+ {
+ "name": "lotus_exige_v6_cup",
+ "description": "Lotus Exige V6 CUP",
+ "paintings": [
+ "0_solar_yellow",
+ "Ardent_Red",
+ "Chrome_Orange",
+ "Grey",
+ "Nightfall_Blue",
+ "Quartz_Silver",
+ "Starlight_Black",
+ "racing_green"
+ ]
+ },
+ {
+ "name": "lotus_exos_125",
+ "description": "Lotus Exos 125",
+ "paintings": [
+ "0_Lotus",
+ "Premiere",
+ "carbon"
+ ]
+ },
+ {
+ "name": "lotus_exos_125_s1",
+ "description": "Lotus Exos 125 Stage 1",
+ "paintings": [
+ "00_racing_green",
+ "01_lotus_legends",
+ "02_racing_23",
+ "03_racing_24",
+ "04_racing_25",
+ "05_racing_68",
+ "06_racing_22",
+ "07_kunos_racing",
+ "08_kunos_black",
+ "09_kunos_green",
+ "10_kunos_red",
+ "11_black_red",
+ "12_german_grey"
+ ]
+ },
+ {
+ "name": "mclaren_mp412c",
+ "description": "McLaren MP4-12C",
+ "paintings": [
+ "0_mclaren_orange",
+ "azure_blue",
+ "carbon_black",
+ "mercury_red",
+ "orange_rsr",
+ "pearl_white",
+ "silver",
+ "silver_rsr",
+ "volcano_orange",
+ "volcano_red",
+ "volcano_yellow"
+ ]
+ },
+ {
+ "name": "mclaren_mp412c_gt3",
+ "description": "McLaren MP4-12C GT3",
+ "paintings": [
+ "0_2013-Official_McLaren",
+ "2012-Gemballa_Racing",
+ "2012-United_Autosports",
+ "2012-g_racing",
+ "2013-ART_GrandPrix",
+ "2013-Hexis_Racing"
+ ]
+ },
+ {
+ "name": "mercedes_sls",
+ "description": "Mercedes SLS AMG",
+ "paintings": [
+ "Argento_Iridio",
+ "Grigio_Alanite_designo",
+ "Mystic_White_designo",
+ "Nero_Ossidiana",
+ "Rosso_Opale"
+ ]
+ },
+ {
+ "name": "mercedes_sls_gt3",
+ "description": "Mercedes SLS AMG GT3",
+ "paintings": [
+ "0_AMG",
+ "ALL_INKL_37",
+ "ALL_INKL_38",
+ "Black_Falcon_Dubai_24H_1",
+ "Black_Falcon_Dubai_24H_2",
+ "Black_Falcon_Porta_9",
+ "Black_Falcon_SB_Mobel_Boss_10",
+ "Kunos_zp_115",
+ "Kunos_zp_116",
+ "Kunos_zp_117",
+ "TCR_2014_05",
+ "TCR_2014_65",
+ "kunos_zp_121"
+ ]
+ },
+ {
+ "name": "p4-5_2011",
+ "description": "P4/5 Competizione 2011",
+ "paintings": [
+ "2011"
+ ]
+ },
+ {
+ "name": "pagani_huayra",
+ "description": "Pagani Huayra",
+ "paintings": [
+ "2013_car_of_the_year",
+ "black",
+ "cadet_grey",
+ "casper",
+ "cerulean",
+ "dark_grey",
+ "dark_sienna",
+ "firebrick",
+ "graphite",
+ "ice",
+ "light_grey",
+ "light_sapphire",
+ "mountbatten_violet",
+ "night_black",
+ "ochre",
+ "orange",
+ "peru",
+ "red",
+ "rust",
+ "scarlet",
+ "silver",
+ "slate_blue",
+ "slate_violet",
+ "titanium",
+ "white",
+ "yellow"
+ ]
+ },
+ {
+ "name": "pagani_zonda_r",
+ "description": "Pagani Zonda R",
+ "paintings": [
+ "00_default",
+ "01_world_record",
+ "02_kunos_racing"
+ ]
+ },
+ {
+ "name": "ruf_yellowbird",
+ "description": "RUF CTR Yellowbird",
+ "paintings": [
+ "00_yellowbird_black",
+ "01_yellowbird_silver",
+ "02_yellowbird_silverblack",
+ "03_black",
+ "04_green",
+ "05_blue",
+ "06_red_blackrims",
+ "07_blue_blackrims",
+ "08_green_blackrims",
+ "09_red",
+ "10_black_blackrims"
+ ]
+ },
+ {
+ "name": "shelby_cobra_427sc",
+ "description": "Shelby Cobra 427 S/C",
+ "paintings": [
+ "50th_anniversary",
+ "black_15",
+ "black_34",
+ "blue_44",
+ "blue_95",
+ "brick_red_90",
+ "dark_blue_52",
+ "dark_blue_96",
+ "dark_red_98",
+ "light_blue_67",
+ "light_blue_69",
+ "red_27",
+ "red_71",
+ "silver_6",
+ "silver_8",
+ "white_11",
+ "white_23",
+ "white_60",
+ "yellow_13",
+ "yellow_33"
+ ]
+ },
+ {
+ "name": "tatuusfa1",
+ "description": "Tatuus FA01",
+ "paintings": [
+ "scheme_0",
+ "scheme_1",
+ "scheme_2",
+ "scheme_3",
+ "scheme_4"
+ ]
+ }
+]
diff --git a/release/v1.1.0/config/tracks.json b/release/v1.1.0/config/tracks.json
new file mode 100755
index 0000000..e226bee
--- /dev/null
+++ b/release/v1.1.0/config/tracks.json
@@ -0,0 +1,266 @@
+[
+ {
+ "name": "drift",
+ "config": "",
+ "description": "Drift",
+ "max_slots": 18
+ },
+ {
+ "name": "imola",
+ "config": "",
+ "description": "Imola",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_barcelona",
+ "config": "layout_gp",
+ "description": "Ks_barcelona - Layout_gp",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_barcelona",
+ "config": "layout_moto",
+ "description": "Ks_barcelona - Layout_moto",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_black_cat_county",
+ "config": "layout_int",
+ "description": "Ks_black_cat_county - Layout_int",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_black_cat_county",
+ "config": "layout_long",
+ "description": "Ks_black_cat_county - Layout_long",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_black_cat_county",
+ "config": "layout_short",
+ "description": "Ks_black_cat_county - Layout_short",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_brands_hatch",
+ "config": "gp",
+ "description": "Ks_brands_hatch - Gp",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_brands_hatch",
+ "config": "indy",
+ "description": "Ks_brands_hatch - Indy",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_drag",
+ "config": "drag1000",
+ "description": "Ks_drag - Drag1000",
+ "max_slots": 2
+ },
+ {
+ "name": "ks_drag",
+ "config": "drag200",
+ "description": "Ks_drag - Drag200",
+ "max_slots": 2
+ },
+ {
+ "name": "ks_drag",
+ "config": "drag2000",
+ "description": "Ks_drag - Drag2000",
+ "max_slots": 2
+ },
+ {
+ "name": "ks_drag",
+ "config": "drag400",
+ "description": "Ks_drag - Drag400",
+ "max_slots": 2
+ },
+ {
+ "name": "ks_drag",
+ "config": "drag500",
+ "description": "Ks_drag - Drag500",
+ "max_slots": 2
+ },
+ {
+ "name": "ks_highlands",
+ "config": "layout_drift",
+ "description": "Ks_highlands - Layout_drift",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_highlands",
+ "config": "layout_int",
+ "description": "Ks_highlands - Layout_int",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_highlands",
+ "config": "layout_long",
+ "description": "Ks_highlands - Layout_long",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_highlands",
+ "config": "layout_short",
+ "description": "Ks_highlands - Layout_short",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_monza66",
+ "config": "full",
+ "description": "Ks_monza66 - Full",
+ "max_slots": 25
+ },
+ {
+ "name": "ks_monza66",
+ "config": "junior",
+ "description": "Ks_monza66 - Junior",
+ "max_slots": 25
+ },
+ {
+ "name": "ks_monza66",
+ "config": "road",
+ "description": "Ks_monza66 - Road",
+ "max_slots": 25
+ },
+ {
+ "name": "ks_nordschleife",
+ "config": "endurance",
+ "description": "Ks_nordschleife - Endurance",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_nordschleife",
+ "config": "endurance_cup",
+ "description": "Ks_nordschleife - Endurance_cup",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_nordschleife",
+ "config": "nordschleife",
+ "description": "Ks_nordschleife - Nordschleife",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_nordschleife",
+ "config": "touristenfahrten",
+ "description": "Ks_nordschleife - Touristenfahrten",
+ "max_slots": 32
+ },
+ {
+ "name": "ks_nurburgring",
+ "config": "layout_gp_a",
+ "description": "Ks_nurburgring - Layout_gp_a",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_nurburgring",
+ "config": "layout_gp_b",
+ "description": "Ks_nurburgring - Layout_gp_b",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_nurburgring",
+ "config": "layout_sprint_a",
+ "description": "Ks_nurburgring - Layout_sprint_a",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_nurburgring",
+ "config": "layout_sprint_b",
+ "description": "Ks_nurburgring - Layout_sprint_b",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_red_bull_ring",
+ "config": "layout_gp",
+ "description": "Ks_red_bull_ring - Layout_gp",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_red_bull_ring",
+ "config": "layout_national",
+ "description": "Ks_red_bull_ring - Layout_national",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_silverstone",
+ "config": "gp",
+ "description": "Ks_silverstone - Gp",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_silverstone",
+ "config": "international",
+ "description": "Ks_silverstone - International",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_silverstone",
+ "config": "national",
+ "description": "Ks_silverstone - National",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_silverstone1967",
+ "config": "",
+ "description": "Ks_silverstone1967",
+ "max_slots": 20
+ },
+ {
+ "name": "ks_vallelunga",
+ "config": "classic_circuit",
+ "description": "Ks_vallelunga - Classic_circuit",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_vallelunga",
+ "config": "club_circuit",
+ "description": "Ks_vallelunga - Club_circuit",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_vallelunga",
+ "config": "extended_circuit",
+ "description": "Ks_vallelunga - Extended_circuit",
+ "max_slots": 24
+ },
+ {
+ "name": "ks_zandvoort",
+ "config": "",
+ "description": "Ks_zandvoort",
+ "max_slots": 18
+ },
+ {
+ "name": "magione",
+ "config": "",
+ "description": "Magione",
+ "max_slots": 18
+ },
+ {
+ "name": "monza",
+ "config": "",
+ "description": "Monza",
+ "max_slots": 26
+ },
+ {
+ "name": "mugello",
+ "config": "",
+ "description": "Mugello",
+ "max_slots": 24
+ },
+ {
+ "name": "spa",
+ "config": "",
+ "description": "Spa",
+ "max_slots": 24
+ },
+ {
+ "name": "trento-bondone",
+ "config": "",
+ "description": "Trento-bondone",
+ "max_slots": 4
+ }
+]
diff --git a/release/v1.1.0/db/mig_1.0.3_1.1.0.sql b/release/v1.1.0/db/mig_1.0.3_1.1.0.sql
new file mode 100644
index 0000000..2c6340b
--- /dev/null
+++ b/release/v1.1.0/db/mig_1.0.3_1.1.0.sql
@@ -0,0 +1,19 @@
+ALTER TABLE `cars`
+ADD COLUMN `fixed_setup` varchar(100) NOT NULL AFTER `position`;
+
+ALTER TABLE `configurations`
+ADD COLUMN `legal_tyres` varchar(100) NOT NULL AFTER `track_config`,
+ADD COLUMN `udp_plugin_local_port` int(10) NOT NULL AFTER `legal_tyres`,
+ADD COLUMN `udp_plugin_address` varchar(100) NOT NULL AFTER `udp_plugin_local_port`,
+ADD COLUMN `race_pit_window_start` int(100) NOT NULL AFTER `udp_plugin_address`,
+ADD COLUMN `race_pit_window_end` int(100) NOT NULL AFTER `race_pit_window_start`,
+ADD COLUMN `reversed_grid_race_positions` int(100) NOT NULL AFTER `race_pit_window_end`;
+
+ALTER TABLE `weather`
+ADD COLUMN `wind_base_speed_min` int(10) NOT NULL AFTER `road_variation`,
+ADD COLUMN `wind_base_speed_max` int(10) NOT NULL AFTER `wind_base_speed_min`,
+ADD COLUMN `wind_base_direction` int(10) NOT NULL AFTER `wind_base_speed_max`,
+ADD COLUMN `wind_variation_direction` int(10) NOT NULL AFTER `wind_base_direction`,
+DROP COLUMN `realistic_road_temp`;
+
+ALTER TABLE `configurations` DROP COLUMN `time`;
diff --git a/release/v1.1.0/db/schema.sql b/release/v1.1.0/db/schema.sql
new file mode 100644
index 0000000..e67d073
--- /dev/null
+++ b/release/v1.1.0/db/schema.sql
@@ -0,0 +1,140 @@
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+SET time_zone = "+00:00";
+
+CREATE TABLE `cars` (
+ `id` int(10) UNSIGNED NOT NULL,
+ `configuration` int(10) UNSIGNED NOT NULL,
+ `car` varchar(100) NOT NULL,
+ `painting` varchar(100) NOT NULL,
+ `spectator` tinyint(1) NOT NULL,
+ `driver` varchar(40) NOT NULL,
+ `team` varchar(40) NOT NULL,
+ `guid` varchar(100) NOT NULL,
+ `position` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE `configurations` (
+ `id` int(10) UNSIGNED NOT NULL,
+ `name` varchar(200) NOT NULL,
+ `pwd` varchar(40) NOT NULL,
+ `admin_pwd` varchar(40) NOT NULL,
+ `pickup_mode` tinyint(1) NOT NULL,
+ `lock_entry_list` tinyint(1) NOT NULL,
+ `race_overtime` int(11) NOT NULL,
+ `max_slots` int(11) NOT NULL,
+ `welcome` varchar(200) NOT NULL,
+ `description` text NOT NULL,
+ `udp` int(11) NOT NULL,
+ `tcp` int(11) NOT NULL,
+ `http` int(11) NOT NULL,
+ `packets_hz` int(11) NOT NULL,
+ `loop_mode` tinyint(1) NOT NULL,
+ `show_in_lobby` tinyint(1) NOT NULL,
+ `threads` int(11) NOT NULL,
+ `abs` varchar(40) NOT NULL,
+ `tc` varchar(40) NOT NULL,
+ `stability_aid` tinyint(1) NOT NULL,
+ `auto_clutch` tinyint(1) NOT NULL,
+ `tyre_blankets` tinyint(1) NOT NULL,
+ `force_virtual_mirror` tinyint(1) NOT NULL,
+ `fuel_rate` int(11) NOT NULL,
+ `damage_rate` int(11) NOT NULL,
+ `tires_wear_rate` int(11) NOT NULL,
+ `allowed_tires_out` int(11) NOT NULL,
+ `max_ballast` int(11) NOT NULL,
+ `disable_gas_cut_penality` tinyint(1) NOT NULL,
+ `result_screen_time` int(11) NOT NULL,
+ `dynamic_track` tinyint(1) NOT NULL,
+ `track_condition` varchar(40) NOT NULL,
+ `start_value` int(11) NOT NULL,
+ `randomness` int(11) NOT NULL,
+ `transferred_grip` int(11) NOT NULL,
+ `laps_to_improve_grip` int(11) NOT NULL,
+ `kick_vote_quorum` int(11) NOT NULL,
+ `session_vote_quorum` int(11) NOT NULL,
+ `vote_duration` int(11) NOT NULL,
+ `blacklist` varchar(40) NOT NULL,
+ `max_collisions_km` int(11) NOT NULL,
+ `booking` tinyint(1) NOT NULL,
+ `booking_time` int(11) NOT NULL,
+ `practice` tinyint(1) NOT NULL,
+ `practice_time` int(11) NOT NULL,
+ `can_join_practice` tinyint(1) NOT NULL,
+ `qualify` tinyint(1) NOT NULL,
+ `qualify_time` int(11) NOT NULL,
+ `can_join_qualify` tinyint(1) NOT NULL,
+ `race` tinyint(1) NOT NULL,
+ `race_laps` int(11) NOT NULL,
+ `race_time` int(11) NOT NULL,
+ `race_wait_time` int(11) NOT NULL,
+ `race_extra_lap` tinyint(1) NOT NULL,
+ `join_type` varchar(40) NOT NULL,
+ `time` varchar(20) NOT NULL,
+ `sun_angle` int(11) NOT NULL,
+ `track` varchar(100) NOT NULL,
+ `track_config` varchar(100) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE `settings` (
+ `id` int(10) UNSIGNED NOT NULL,
+ `folder` text NOT NULL,
+ `executable` text NOT NULL,
+ `args` varchar(500) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE `user` (
+ `id` int(10) UNSIGNED NOT NULL,
+ `login` varchar(40) NOT NULL,
+ `email` varchar(200) NOT NULL,
+ `password` varchar(64) NOT NULL,
+ `admin` tinyint(1) NOT NULL,
+ `moderator` tinyint(1) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE `weather` (
+ `id` int(10) UNSIGNED NOT NULL,
+ `configuration` int(10) UNSIGNED NOT NULL,
+ `weather` varchar(40) NOT NULL,
+ `base_ambient_temp` int(11) NOT NULL,
+ `realistic_road_temp` int(11) NOT NULL,
+ `base_road_temp` int(11) NOT NULL,
+ `ambient_variation` int(11) NOT NULL,
+ `road_variation` int(11) NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+
+ALTER TABLE `cars`
+ ADD PRIMARY KEY (`id`),
+ ADD KEY `cars_config_fk` (`configuration`);
+
+ALTER TABLE `configurations`
+ ADD PRIMARY KEY (`id`);
+
+ALTER TABLE `settings`
+ ADD PRIMARY KEY (`id`);
+
+ALTER TABLE `user`
+ ADD PRIMARY KEY (`id`);
+
+ALTER TABLE `weather`
+ ADD PRIMARY KEY (`id`),
+ ADD KEY `weather_config_fk` (`configuration`);
+
+
+ALTER TABLE `cars`
+ MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=42;
+ALTER TABLE `configurations`
+ MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
+ALTER TABLE `settings`
+ MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
+ALTER TABLE `user`
+ MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
+ALTER TABLE `weather`
+ MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
+
+ALTER TABLE `cars`
+ ADD CONSTRAINT `cars_config_fk` FOREIGN KEY (`configuration`) REFERENCES `configurations` (`id`);
+
+ALTER TABLE `weather`
+ ADD CONSTRAINT `weather_config_fk` FOREIGN KEY (`configuration`) REFERENCES `configurations` (`id`);
+
diff --git a/release/v1.1.0/public/app.js b/release/v1.1.0/public/app.js
new file mode 100644
index 0000000..765a7f4
--- /dev/null
+++ b/release/v1.1.0/public/app.js
@@ -0,0 +1,2079 @@
+var VERSION = '1.1.0';
+var _MS_PER_DAY = 1000 * 60 * 60 * 24;
+
+// Returns date in format dd.mm.yyyy hh:mi:ss.
+Date.prototype.formatDE = function(withTime){
+ var day = _addLeadingZero(this.getDate());
+ var month = _addLeadingZero(this.getMonth()+1);
+ var year = this.getFullYear();
+ var hours = _addLeadingZero(this.getHours());
+ var minutes = _addLeadingZero(this.getMinutes());
+ var seconds = _addLeadingZero(this.getSeconds());
+
+ return [day, month, year].join('.')+' '+[hours, minutes, seconds].join(':');
+};
+
+// Returns date in format dd.mm.yyyy.
+Date.prototype.formatDDMMYYYY = function(){
+ var day = _addLeadingZero(this.getDate());
+ var month = _addLeadingZero(this.getMonth()+1);
+ var year = this.getFullYear();
+
+ return [day, month, year].join('.');
+};
+
+// Returns date in format yyyy-mm-dd.
+Date.prototype.formatYYYYMMDD = function(){
+ var day = _addLeadingZero(this.getDate());
+ var month = _addLeadingZero(this.getMonth()+1);
+ var year = this.getFullYear();
+
+ return [year, month, day].join('-');
+};
+
+// Returns date in format hh:mi.
+Date.prototype.formatHHMI = function(){
+ var hours = _addLeadingZero(this.getHours());
+ var minutes = _addLeadingZero(this.getMinutes());
+
+ return [hours, minutes].join(':');
+};
+
+// Parses time only from given ISO string.
+Date.parseTime = function(time){
+ var date = new Date(0);
+ var hours = parseInt(time.substring(11, 13));
+ var minutes = parseInt(time.substring(14, 16));
+
+ date.setHours(hours);
+ date.setMinutes(minutes);
+
+ return date;
+};
+
+function _addLeadingZero(time){
+ if(time < 10){
+ return '0'+time
+ }
+
+ return time
+}
+// Extracts hours and minutes in 24h format from string in format hh:mi
+// and returns them as object. Throws an error if time is invalid.
+function parseTime(time){
+ var split = time.split(':');
+ var hours = parseInt(split[0]);
+ var minutes = parseInt(split[1]);
+
+ if(hours < 0 || hours > 23 || minutes < 0 || minutes > 59){
+ throw 'Hours and minutes must be within range 00-23 and 00-59';
+ }
+
+ return {hours: hours, minutes: minutes};
+}
+
+// Returns hours, minutes for given date in format hh:mi.
+function getTimeHHMI(date){
+ var minutes = date/1000/60;
+ var hours = Math.floor(minutes/60);
+ minutes -= hours*60;
+ hours = _addLeadingZero(hours);
+ minutes = _addLeadingZero(minutes);
+
+ return [hours, minutes].join(':');
+}
+var SessionService = {
+ data: {
+ userId: 0
+ },
+ init: function(data){
+ if(!data){
+ return;
+ }
+
+ this.data.userId = data.user_id;
+ },
+ login: function(router, data){
+ this.init(data.data);
+ router.push('/instance');
+ },
+ logout: function(router){
+ this.data.userId = 0;
+
+ Vue.http.put('/api/logout')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ }
+
+ router.push('/');
+ });
+ }
+};
+Vue.component('msg', {
+ props: ['type', 'msg'],
+ template: '
\
+ {{msg}}\
+
'
+});
+Vue.component('hmenu', {
+ template: '',
+ data: function(){
+ return {
+ version: VERSION
+ }
+ },
+ methods: {
+ performLogout: function(){
+ SessionService.logout(this.$router);
+ }
+ }
+});
+Vue.component('About', {
+ template: '\
+
\
+\
+
\
+
About \
+ \
+
\
+
\
+ Assetto Corsa server web interface
\
+ Version {{version}}
\
+ © 2017 Marvin Blum
\
+
\
+
View on GitHub \
+
\
+
\
+
\
+
',
+ data: function(){
+ return {
+ version: VERSION
+ }
+ }
+});
+Vue.component('Configuration', {
+ template: '\
+
\
+\
+
\
+
Configurations \
+ \
+
\
+
\
+
Create/Edit Configuration \
+\
+
\
+
\
+
\
+
\
+\
+
\
+
\
+
\
+\
+
\
+
\
+
Remove Configuration \
+\
+
\
+\
+
Do you really want to remove this configuration? This won\'t stop any instances currently running.
\
+\
+
Yes, remove configuration \
+
Cancel \
+
\
+
\
+\
+
\
+
\
+
\
+
\
+\
+
Add Configuration \
+\
+
\
+ \
+ \
+ ID \
+ Name \
+ Info \
+ \
+ \
+ \
+ \
+ \
+ {{config.id}} \
+ {{config.name}} \
+ {{config.track}} \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+
\
+
\
+
\
+
\
+
',
+ data: function(){
+ return {
+ configs: [],
+ tracks: [],
+ cars: [],
+ activePaintings: [],
+ selectedTrack: 0,
+ selectedCar: 0,
+ selectedPainting: 0,
+ spectator: false,
+ driver: '',
+ team: '',
+ guid: '',
+ fixed_setup: '',
+ // ---
+ selectedCars: [],
+ weather: [],
+ // ---
+ _id: 0,
+ name: 'Servername',
+ pwd: '',
+ admin_pwd: '',
+ pickup_mode: true,
+ lock_entry_list: false,
+ race_overtime: 60,
+ max_slots: 0,
+ result_screen_time: 60,
+ welcome: '',
+ description: '',
+ udp: 9600,
+ tcp: 9600,
+ http: 8081,
+ packets_hz: 18,
+ loop_mode: true,
+ show_in_lobby: true,
+ threads: 2,
+ abs: 1,
+ tc: 1,
+ stability_aid: false,
+ auto_clutch: false,
+ tyre_blankets: true,
+ force_virtual_mirror: true,
+ fuel_rate: 100,
+ damage_rate: 50,
+ tires_wear_rate: 100,
+ allowed_tires_out: 2,
+ max_ballast: 150,
+ disable_gas_cut_penality: false,
+ dynamic_track: true,
+ condition: 'CUSTOM',
+ start_value: 100,
+ randomness: 0,
+ transferred_grip: 100,
+ laps_to_improve_grip: 1,
+ kick_vote_quorum: 70,
+ session_vote_quorum: 70,
+ vote_duration: 15,
+ blacklist: 0,
+ max_collisions_km: 5,
+ booking: false,
+ booking_time: 0,
+ practice: true,
+ practice_time: 15,
+ can_join_practice: true,
+ qualify: true,
+ qualify_time: 15,
+ can_join_qualify: true,
+ race: true,
+ race_laps: 10,
+ race_time: 0,
+ race_wait_time: 60,
+ race_extra_lap: false,
+ join_type: 1,
+ time: '14:00',
+ sun_angle: 16,
+ track: '',
+ legal_tyres: '',
+ udp_plugin_local_port: 0,
+ udp_plugin_address: '',
+ race_pit_window_start: 0,
+ race_pit_window_end: 0,
+ reversed_grid_race_positions: 0,
+ // ---
+ err: 0,
+ addEditConfig: false,
+ removeConfig: false,
+ saved: false,
+ removed: false
+ }
+ },
+ mounted: function(){
+ this._load();
+ },
+ watch: {
+ condition: function (value) {
+ this.populateDynamicTrackWithPreset(value);
+ },
+ time: function (value) {
+ this.calculateSunAngleByTime(value);
+ }
+ },
+ methods: {
+ _load: function(){
+ this.$http.get('/api/configuration')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.configs = resp.data;
+ });
+
+ this.$http.get('/api/tracks')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.tracks = resp.data;
+ });
+
+ this.$http.get('/api/cars')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.cars = resp.data;
+
+ if(this.cars.length){
+ this.activePaintings = this.cars[0].paintings;
+ }
+ });
+ },
+ _reset: function(){
+ this.spectator = false;
+ this.driver = '';
+ this.team = '';
+ this.guid = '';
+ this.fixed_setup = '';
+
+ this.selectedCars = [];
+ this.weather = [];
+
+ this._id = 0;
+ this.name = 'Servername';
+ this.pwd = '';
+ this.admin_pwd = '';
+ this.pickup_mode = true;
+ this.lock_entry_list = false;
+ this.race_overtime = 60;
+ this.max_slots = 0;
+ this.result_screen_time = 60;
+ this.welcome = '';
+ this.description = '';
+ this.udp = 9600;
+ this.tcp = 9600;
+ this.http = 8081;
+ this.packets_hz = 18;
+ this.loop_mode = true;
+ this.show_in_lobby = true;
+ this.threads = 2;
+ this.abs = 1;
+ this.tc = 1;
+ this.stability_aid = false;
+ this.auto_clutch = false;
+ this.tyre_blankets = true;
+ this.force_virtual_mirror = true;
+ this.fuel_rate = 100;
+ this.damage_rate = 50;
+ this.tires_wear_rate = 100;
+ this.allowed_tires_out = 2;
+ this.max_ballast = 150;
+ this.disable_gas_cut_penality = false;
+ this.dynamic_track = true;
+ this.condition = 'CUSTOM';
+ this.start_value = 100;
+ this.randomness = 0;
+ this.transferred_grip = 100;
+ this.laps_to_improve_grip = 1;
+ this.kick_vote_quorum = 70;
+ this.session_vote_quorum = 70;
+ this.vote_duration = 15;
+ this.blacklist = 0;
+ this.max_collisions_km = 5;
+ this.booking = false;
+ this.booking_time = 0;
+ this.practice = true;
+ this.practice_time = 15;
+ this.can_join_practice = true;
+ this.qualify = true;
+ this.qualify_time = 15;
+ this.can_join_qualify = true;
+ this.race = true;
+ this.race_laps = 10;
+ this.race_time = 0;
+ this.race_wait_time = 60;
+ this.race_extra_lap = false;
+ this.join_type = 1;
+ this.time = '14:00';
+ this.sun_angle = 16;
+ this.track = '';
+ this.legal_tyres = '';
+ this.udp_plugin_local_port = 0;
+ this.udp_plugin_address = '';
+ this.race_pit_window_start = 0;
+ this.race_pit_window_end = 0;
+ this.reversed_grid_race_positions = 0;
+
+ this.err = 0;
+ this.addEditConfig = false;
+ this.removeConfig = false;
+ this.saved = false;
+ this.removed = false;
+ },
+ _openConfig: function(id, copy){
+ this.$http.get('/api/configuration', {params: {id: id}})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ // config
+ this.name = resp.data.name;
+ this.pwd = resp.data.pwd;
+ this.admin_pwd = resp.data.admin_pwd;
+ this.pickup_mode = resp.data.pickup_mode;
+ this.lock_entry_list = resp.data.lock_entry_list;
+ this.race_overtime = resp.data.race_overtime;
+ this.max_slots = resp.data.max_slots;
+ this.welcome = resp.data.welcome;
+ this.description = resp.data.description;
+ this.udp = resp.data.udp;
+ this.tcp = resp.data.tcp;
+ this.http = resp.data.http;
+ this.packets_hz = resp.data.packets_hz;
+ this.loop_mode = resp.data.loop_mode;
+ this.show_in_lobby = resp.data.show_in_lobby;
+ this.threads = resp.data.threads;
+ this.abs = resp.data.abs;
+ this.tc = resp.data.tc;
+ this.stability_aid = resp.data.stability_aid;
+ this.auto_clutch = resp.data.auto_clutch;
+ this.tyre_blankets = resp.data.tyre_blankets;
+ this.force_virtual_mirror = resp.data.force_virtual_mirror;
+ this.fuel_rate = resp.data.fuel_rate;
+ this.damage_rate = resp.data.damage_rate;
+ this.tires_wear_rate = resp.data.tires_wear_rate;
+ this.allowed_tires_out = resp.data.allowed_tires_out;
+ this.max_ballast = resp.data.max_ballast;
+ this.disable_gas_cut_penality = resp.data.disable_gas_cut_penality;
+ this.result_screen_time = resp.data.result_screen_time;
+ this.dynamic_track = resp.data.dynamic_track;
+ this.condition = resp.data.condition;
+ this.start_value = resp.data.start_value;
+ this.randomness = resp.data.randomness;
+ this.transferred_grip = resp.data.transferred_grip;
+ this.laps_to_improve_grip = resp.data.laps_to_improve_grip;
+ this.kick_vote_quorum = resp.data.kick_vote_quorum;
+ this.session_vote_quorum = resp.data.session_vote_quorum;
+ this.vote_duration = resp.data.vote_duration;
+ this.blacklist = resp.data.blacklist;
+ this.max_collisions_km = resp.data.max_collisions_km;
+ this.booking = resp.data.booking;
+ this.booking_time = resp.data.booking_time;
+ this.practice = resp.data.practice;
+ this.practice_time = resp.data.practice_time;
+ this.can_join_practice = resp.data.can_join_practice;
+ this.qualify = resp.data.qualify;
+ this.qualify_time = resp.data.qualify_time;
+ this.can_join_qualify = resp.data.can_join_qualify;
+ this.race = resp.data.race;
+ this.race_laps = resp.data.race_laps;
+ this.race_time = resp.data.race_time;
+ this.race_wait_time = resp.data.race_wait_time;
+ this.race_extra_lap = resp.data.race_extra_lap;
+ this.join_type = resp.data.join_type;
+ this.sun_angle = resp.data.sun_angle;
+ this.time = this.calculateTimeBySunAngle(this.sun_angle);
+ this.legal_tyres = resp.data.legal_tyres;
+ this.udp_plugin_local_port = resp.data.udp_plugin_local_port;
+ this.udp_plugin_address = resp.data.udp_plugin_address;
+ this.race_pit_window_start = resp.data.race_pit_window_start;
+ this.race_pit_window_end = resp.data.race_pit_window_end;
+ this.reversed_grid_race_positions = resp.data.reversed_grid_race_positions;
+
+ if(copy){
+ this.name += ' (copy)';
+ }
+
+ // track
+ for(var i = 0; i < this.tracks.length; i++){
+ if(this.tracks[i].name == resp.data.track && this.tracks[i].config == resp.data.track_config){
+ this.selectTrack(i);
+ break;
+ }
+ }
+
+ // weather
+ this.weather = resp.data.weather;
+
+ if(copy){
+ for(var i = 0; i < this.weather.length; i++){
+ this.weather[i].id = 0;
+ }
+ }
+
+ // cars
+ this.selectedCars = resp.data.cars;
+
+ if(copy){
+ for(var i = 0; i < this.selectedCars.length; i++){
+ this.selectedCars[i].id = 0;
+ }
+ }
+
+ this.addEditConfig = true;
+ });
+ },
+ openAddEditConfig: function(id){
+ this._reset();
+
+ if(id){
+ this._id = id;
+ this._openConfig(id, false);
+ }
+ else{
+ this.addEditConfig = true;
+ }
+ },
+ openRemoveConfig: function(id){
+ this._reset();
+
+ if(!id){
+ return;
+ }
+
+ this._id = id;
+ this.removeConfig = true;
+ },
+ copyConfig: function(id){
+ this._openConfig(id, true);
+ },
+ performAddEditConfig: function(){
+ for(var i = 0; i < this.weather.length; i++){
+ this.weather[i].base_ambient_temp = parseInt(this.weather[i].base_ambient_temp);
+ this.weather[i].base_road_temp = parseInt(this.weather[i].base_road_temp);
+ this.weather[i].ambient_variation = parseInt(this.weather[i].ambient_variation);
+ this.weather[i].road_variation = parseInt(this.weather[i].road_variation);
+ this.weather[i].wind_base_speed_min = parseInt(this.weather[i].wind_base_speed_min);
+ this.weather[i].wind_base_speed_max = parseInt(this.weather[i].wind_base_speed_max);
+ this.weather[i].wind_base_direction = parseInt(this.weather[i].wind_base_direction);
+ this.weather[i].wind_variation_direction = parseInt(this.weather[i].wind_variation_direction);
+ }
+
+ for(var i = 0; i < this.selectedCars.length; i++){
+ this.selectedCars[i].position = i;
+ }
+
+ var data = {
+ id: this._id,
+ name: this.name,
+ pwd: this.pwd,
+ admin_pwd: this.admin_pwd,
+ pickup_mode: this.pickup_mode,
+ lock_entry_list: this.lock_entry_list,
+ race_overtime: parseInt(this.race_overtime),
+ max_slots: parseInt(this.max_slots),
+ welcome: this.welcome,
+ description: this.description,
+ udp: parseInt(this.udp),
+ tcp: parseInt(this.tcp),
+ http: parseInt(this.http),
+ packets_hz: parseInt(this.packets_hz),
+ loop_mode: this.loop_mode,
+ show_in_lobby: this.show_in_lobby,
+ threads: parseInt(this.threads),
+ abs: parseInt(this.abs),
+ tc: parseInt(this.tc),
+ stability_aid: this.stability_aid,
+ auto_clutch: this.auto_clutch,
+ tyre_blankets: this.tyre_blankets,
+ force_virtual_mirror: this.force_virtual_mirror,
+ fuel_rate: parseInt(this.fuel_rate),
+ damage_rate: parseInt(this.damage_rate),
+ tires_wear_rate: parseInt(this.tires_wear_rate),
+ allowed_tires_out: parseInt(this.allowed_tires_out),
+ max_ballast: parseInt(this.max_ballast),
+ disable_gas_cut_penality: this.disable_gas_cut_penality,
+ result_screen_time: parseInt(this.result_screen_time),
+ dynamic_track: this.dynamic_track,
+ condition: this.condition,
+ start_value: parseInt(this.start_value),
+ randomness: parseInt(this.randomness),
+ transferred_grip: parseInt(this.transferred_grip),
+ laps_to_improve_grip: parseInt(this.laps_to_improve_grip),
+ kick_vote_quorum: parseInt(this.kick_vote_quorum),
+ session_vote_quorum: parseInt(this.session_vote_quorum),
+ vote_duration: parseInt(this.vote_duration),
+ blacklist: parseInt(this.blacklist),
+ max_collisions_km: parseInt(this.max_collisions_km),
+ booking: this.booking,
+ booking_time: parseInt(this.booking_time),
+ practice: this.practice,
+ practice_time: parseInt(this.practice_time),
+ can_join_practice: this.can_join_practice,
+ qualify: this.qualify,
+ qualify_time: parseInt(this.qualify_time),
+ can_join_qualify: this.can_join_qualify,
+ race: this.race,
+ race_laps: parseInt(this.race_laps),
+ race_time: parseInt(this.race_time),
+ race_wait_time: parseInt(this.race_wait_time),
+ race_extra_lap: this.race_extra_lap,
+ join_type: parseInt(this.join_type),
+ sun_angle: parseInt(this.sun_angle),
+ time: this.calculateTimeBySunAngle(parseInt(this.sun_angle)),
+ weather: this.weather,
+ track: this.track.name,
+ track_config: this.track.config,
+ legal_tyres: this.legal_tyres,
+ udp_plugin_local_port: parseInt(this.udp_plugin_local_port),
+ udp_plugin_address: this.udp_plugin_address,
+ race_pit_window_start: parseInt(this.race_pit_window_start),
+ race_pit_window_end: parseInt(this.race_pit_window_end),
+ reversed_grid_race_positions: parseInt(this.reversed_grid_race_positions),
+ cars: this.selectedCars
+ };
+
+ this.$http.post('/api/configuration', data)
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this._reset();
+ this._load();
+ this.saved = true;
+ });
+ },
+ performRemoveConfig: function(){
+ this.$http.delete('/api/configuration', {params: {id: this._id}})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this._reset();
+ this._load();
+ this.removed = true;
+ });
+ },
+ addWeather: function(){
+ this.weather.push({
+ weather: 'Clear',
+ base_ambient_temp: 20,
+ base_road_temp: 18,
+ ambient_variation: 1,
+ road_variation: 1,
+ wind_base_speed_min: 0,
+ wind_base_speed_max: 0,
+ wind_base_direction: 0,
+ wind_variation_direction: 0
+ });
+ },
+ removeWeather: function(i){
+ this.weather.splice(i, 1);
+ },
+ selectTrack: function(i){
+ this.selectedTrack = i;
+ this.track = this.tracks[i];
+ },
+ selectCar: function(i){
+ this.selectedCar = i;
+ this.selectedPainting = 0;
+ this.activePaintings = this.cars[i].paintings;
+ },
+ selectPainting: function(i){
+ this.selectedPainting = i;
+ },
+ addCar: function(){
+ var car = this.cars[this.selectedCar];
+ this.selectedCars.push({
+ car: car.name,
+ painting: car.paintings[this.selectedPainting],
+ spectator: this.spectator,
+ driver: this.driver,
+ team: this.team,
+ guid: this.guid,
+ position: this.selectedCars.length,
+ fixed_setup: this.fixed_setup
+ });
+
+ // only reset driver and GUID in case user wants to add multiple similar slots
+ this.driver = '';
+ this.guid = '';
+ },
+ carUp: function(i){
+ if(i == 0){
+ return;
+ }
+
+ var car = this.selectedCars[i-1];
+ Vue.set(this.selectedCars, i-1, this.selectedCars[i]);
+ Vue.set(this.selectedCars, i, car);
+ },
+ carDown: function(i){
+ if(i == this.selectedCars.length-1){
+ return;
+ }
+
+ var car = this.selectedCars[i+1];
+ Vue.set(this.selectedCars, i+1, this.selectedCars[i]);
+ Vue.set(this.selectedCars, i, car);
+ },
+ removeCar: function(i){
+ this.selectedCars.splice(i, 1);
+ },
+ populateDynamicTrackWithPreset: function(preset) {
+ switch(preset) {
+ case 'DUSTY':
+ this.start_value = 86;
+ this.randomness = 1;
+ this.transferred_grip = 50;
+ this.laps_to_improve_grip = 30;
+ break;
+ case 'OLD':
+ this.start_value = 89;
+ this.randomness = 3;
+ this.transferred_grip = 80;
+ this.laps_to_improve_grip = 50;
+ break;
+ case 'SLOW':
+ this.start_value = 96;
+ this.randomness = 1;
+ this.transferred_grip = 80;
+ this.laps_to_improve_grip = 300;
+ break;
+ case 'GREEN':
+ this.start_value = 95;
+ this.randomness = 2;
+ this.transferred_grip = 90;
+ this.laps_to_improve_grip = 132;
+ break;
+ case 'FAST':
+ this.start_value = 98;
+ this.randomness = 2;
+ this.transferred_grip = 80;
+ this.laps_to_improve_grip = 700;
+ break;
+ case 'OPTIMUM':
+ this.start_value = 100;
+ this.randomness = 0;
+ this.transferred_grip = 100;
+ this.laps_to_improve_grip = 1;
+ break;
+ }
+ },
+ generateCfgDownloadUrl: function (id) {
+ return '/api/configuration?id=' + id + '&dl=1';
+ },
+ calculateSunAngleByTime: function(time) {
+ var totalHours = parseInt(time.replace(':', ''), 10);
+
+ if (isNaN(totalHours) || totalHours < 800 || totalHours > 1800) {
+ // Invalid date, default to 0 (13:00)
+ this.sun_angle = 0;
+ return;
+ }
+
+ var timeParts = time.split(':');
+ var hours = parseInt(timeParts[0], 10);
+ var minutes = parseInt(timeParts[1], 10);
+
+ // Calculate the time in minutes and subtract 13 hours
+ // The sun angle can range from -80 to 80 in the time frame 08:00h - 18:00h
+ // e.g. 08:00 = 480min. - 780min. = -300 / 30 = -10 * 8 = -80
+ // e.g. 13:00 = 780min. - 780min. = 0 / 30 = 0 * 8 = 0
+ // e.g. 16:30 = 990min. - 780min. = 210 / 30 = 7 * 8 = 56
+ var totalMinutes = (hours * 60 + minutes) - 780;
+
+ this.sun_angle = Math.floor(totalMinutes / 30) * 8;
+ },
+ calculateTimeBySunAngle: function(sun_angle) {
+ var totalHours = ((sun_angle / 8) * 30 + 780) / 60;
+ var hrs = totalHours.toString();
+
+ return Math.floor(totalHours).toString() + ':' + (hrs[hrs.length - 1] === '5' ? '30' : '00');
+ }
+ }
+});
+Vue.component('Instance', {
+ template: '\
+
\
+\
+
\
+
Status \
+\
+
\
+
\
+
Start New Instance \
+\
+
\
+
\
+\
+
\
+ \
+ \
+
\
+
\
+\
+
\
+
\
+
Stop Instance \
+\
+
\
+\
+
Do you really want to stop this server instance?
\
+\
+
Yes, stop instance \
+
Cancel \
+
\
+
\
+\
+
\
+
\
+
Log Output \
+\
+ \
+\
+ Close \
+ \
+
\
+\
+
\
+
\
+
Active Server Instances \
+\
+
\
+
\
+\
+
Start New Instance \
+\
+
\
+ \
+ \
+ PID \
+ Instance \
+ Configuration \
+ \
+ \
+ \
+ \
+ \
+ {{instance.pid}} \
+ {{instance.name}} \
+ \
+ {{instance.configuration.name}} \
+ {{instance.configuration.track}} \
+ TCP: {{instance.configuration.tcp}} UPD: {{instance.configuration.udp}}\
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+
\
+
\
+
\
+\
+
\
+
\
+
Log Files \
+\
+
\
+ \
+ \
+ Filename \
+ Date \
+ Size \
+ \
+ \
+ \
+ \
+ \
+ {{log.file}} \
+ {{log.date}} \
+ {{log.size}} \
+ \
+ \
+ \
+ \
+ \
+
\
+
\
+
\
+
\
+
',
+ data: function(){
+ return {
+ _pid: 0,
+ instances: [],
+ configs: [],
+ logs: [],
+ err: 0,
+ name: '',
+ config: 0,
+ log: '',
+ showLog: false,
+ started: false,
+ stopped: false,
+ startInstance: false,
+ stopInstance: false
+ }
+ },
+ mounted: function(){
+ this._load();
+ },
+ methods: {
+ _load: function(){
+ this.$http.get('/api/configuration')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.configs = resp.data;
+ this._loadInstances();
+ });
+
+ this.$http.get('/api/instance/log')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.logs = resp.data;
+
+ // reverse
+ for(var i = this.logs.length-1; i >= 0; i--){
+ this.logs[i].date = new Date(this.logs[i].date).formatDE();
+
+ if(this.logs[i].size > 1024*1024){
+ this.logs[i].size = Math.round(this.logs[i].size/1024/1024*100)/100+' MB';
+ }
+ else if(this.logs[i].size > 1024){
+ this.logs[i].size = Math.round(this.logs[i].size/1024*100)/100+' KB';
+ }
+ else{
+ this.logs[i].size = Math.round(this.logs[i].size*100)/100+' Byte';
+ }
+ }
+ });
+ },
+ _loadInstances: function(){
+ this.$http.get('/api/instance')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.instances = resp.data;
+
+ for(var i = 0; i < this.instances.length; i++){
+ this.instances[i].configuration = this._getConfigName(this.instances[i].configuration);
+ }
+ });
+ },
+ _getConfigName: function(id){
+ for(i in this.configs){
+ if(id == this.configs[i].id){
+ return this.configs[i];
+ }
+ }
+
+ return null;
+ },
+ _reset: function(){
+ this.err = 0;
+ this.name = '';
+ this.config = 0;
+ this.log = '';
+ this.showLog = false;
+ this.started = false;
+ this.stopped = false;
+ this.startInstance = false;
+ this.stopInstance = false;
+ },
+ performStart: function(){
+ this.$http.post('/api/instance', {name: this.name, config: this.config})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this._reset();
+ this._load();
+ this.started = true;
+ });
+ },
+ showStopInstance: function(pid){
+ this._reset();
+
+ if(!pid){
+ return;
+ }
+
+ this._pid = pid;
+ this.stopInstance = true;
+ },
+ performStop: function(){
+ this.$http.delete('/api/instance', {params: {pid: this._pid}})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this._reset();
+ this._load();
+ this.stopped = true;
+ });
+ },
+ openLog: function(file){
+ this._reset();
+
+ this.$http.get('/api/instance/log', {params: {file: file}})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ var log = resp.data.substr(1, resp.data.length-2).split('\\n');
+ this.log = log.join('\n');
+ this.showLog = true;
+ });
+ },
+ generateInstanceDownloadUrl: function (id) {
+ return '/api/configuration?id=' + id + '&dl=2';
+ }
+ }
+});
+Vue.component('Login', {
+ template: '\
+
\
+
\
+
\
+\
+
\
+
\
+
Login \
+\
+
\
+\
+
\
+ \
+ \
+
\
+
\
+\
+
\
+
\
+ Version {{version}} | © 2017 Marvin Blum |
GitHub \
+
\
+
\
+
',
+ data: function(){
+ return {
+ version: VERSION,
+ err: 0,
+ login: '',
+ pwd: ''
+ }
+ },
+ methods: {
+ performLogin: function(){
+ this.$http.post('/api/login', {login: this.login, pwd: this.pwd})
+ .then(function(resp){
+ if(resp.data.code){
+ this.err = resp.data.code;
+ return;
+ }
+
+ SessionService.login(this.$router, resp.data);
+ });
+ }
+ }
+});
+Vue.component('Settings', {
+ template: '\
+
\
+\
+
\
+
Settings \
+ \
+
\
+
\
+
Server Settings \
+\
+
\
+
\
+
\
+\
+
\
+ \
+ \
+
\
+
\
+\
+
\
+
\
+ The AC server folder must be the full path to your AC server installation folder, containing the acServer executable. Example: /home/acuser/steam/steamapps/common/Assetto Corsa Dedicated Server \
+ Executable is the executable file to start a server instance. Example: acServer \
+ Arguments are the arguments passed to the executable to start a server instance, separated by spaces. Example: linux \
+\
+ Make sure the web interface has the permissions to read, write and execute within the server folder. If you cannot start instances, please test your settings on your server.\
+
\
+
\
+
\
+
',
+ data: function(){
+ return {
+ err: 0,
+ folder: '',
+ executable: '',
+ args: '',
+ saved: false
+ }
+ },
+ mounted: function(){
+ this._load();
+ },
+ methods: {
+ _load: function(){
+ this.$http.get('/api/settings')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.folder = resp.data.folder;
+ this.executable = resp.data.executable;
+ this.args = resp.data.args;
+ });
+ },
+ performSave: function(){
+ this.saved = false;
+
+ this.$http.post('/api/settings', {folder: this.folder,
+ executable: this.executable,
+ args: this.args})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this.saved = true;
+ });
+ }
+ }
+});
+Vue.component('User', {
+ template: '\
+
\
+\
+
\
+
User \
+\
+
\
+
\
+
Create/Edit User \
+\
+
\
+
\
+
\
+
\
+
\
+\
+
\
+ \
+ \
+
\
+
\
+\
+
\
+
\
+
Remove User \
+\
+
\
+\
+
Do you really want to remove this user?
\
+\
+
Yes, remove user \
+
Cancel \
+
\
+
\
+\
+
\
+
\
+
\
+
\
+\
+
Add User \
+\
+
\
+ \
+ \
+ ID \
+ Login \
+ E-Mail \
+ Role \
+ \
+ \
+ \
+ \
+ \
+ {{u.id}} \
+ {{u.login}} \
+ {{u.email}} \
+ \
+ Administrator \
+ Moderator \
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+
\
+
\
+
\
+\
+
\
+
\
+ Administrators have full access and can change all settings (including changing user passwords). \
+ Moderators can start/stop server instances and create, change and remove configurations. \
+ Other users have read access, except for user E-Mail addresses.\
+
\
+
\
+
\
+
',
+ data: function(){
+ return {
+ user: [],
+ _id: 0,
+ login: '',
+ email: '',
+ pwd1: '',
+ pwd2: '',
+ admin: false,
+ moderator: false,
+ err: 0,
+ addEditUser: false,
+ removeUser: false,
+ userSaved: false,
+ userRemoved: false
+ }
+ },
+ mounted: function(){
+ this._load();
+ },
+ methods: {
+ _load: function(){
+ this.$http.get('/api/user')
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.user = resp.data;
+ });
+ },
+ _reset: function(){
+ this._id = 0;
+ this.login = '';
+ this.email = '';
+ this.pwd1 = '';
+ this.pwd2 = '';
+ this.admin = false;
+ this.moderator = false;
+ this.err = 0;
+ this.addEditUser = false;
+ this.removeUser = false;
+ this.userSaved = false;
+ this.userRemoved = false;
+ },
+ openAddEditUser: function(id){
+ this._reset();
+
+ if(id){
+ this._id = id;
+
+ this.$http.get('/api/user', {params: {id: id}})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ return;
+ }
+
+ this.login = resp.data.login;
+ this.email = resp.data.email;
+ this.admin = resp.data.admin;
+ this.moderator = resp.data.moderator;
+ this.addEditUser = true;
+ });
+ }
+ else{
+ this.addEditUser = true;
+ }
+ },
+ openRemoveUser: function(id){
+ this._reset();
+
+ if(!id){
+ return;
+ }
+
+ this._id = id;
+ this.removeUser = true;
+ },
+ performAddEditUser: function(){
+ this.$http.post('/api/user', {id: this._id,
+ login: this.login,
+ email: this.email,
+ pwd1: this.pwd1,
+ pwd2: this.pwd2,
+ admin: this.admin,
+ moderator: this.moderator})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this._reset();
+ this._load();
+ this.userSaved = true;
+ });
+ },
+ performRemoveUser: function(){
+ this.$http.delete('/api/user', {params: {id: this._id}})
+ .then(function(resp){
+ if(resp.data.code){
+ console.log(resp.data.code+': '+resp.data.msg);
+ this.err = resp.data.code;
+ return;
+ }
+
+ this._reset();
+ this._load();
+ this.userRemoved = true;
+ });
+ }
+ }
+});
+Vue.use(VueRouter);
+Vue.use(VueResource);
+
+var router = new VueRouter({
+ routes: [
+ {
+ path: '/',
+ component: Vue.component('Login')
+ },
+ {
+ path: '/instance',
+ component: Vue.component('Instance')
+ },
+ {
+ path: '/configuration',
+ component: Vue.component('Configuration')
+ },
+ {
+ path: '/settings',
+ component: Vue.component('Settings')
+ },
+ {
+ path: '/user',
+ component: Vue.component('User')
+ },
+ {
+ path: '/about',
+ component: Vue.component('About')
+ },
+ {
+ path: '*',
+ component: Vue.component('Dashboard')
+ }
+ ]
+});
+
+// Simple login check with redirection when not logged in.
+router.beforeEach(function(to, from, next){
+ Vue.http.get('/api/session')
+ .then(function(resp){
+ // if not logged in and not on login page, redirect to login
+ if(resp.data.code && to.path != '/'){
+ next('/');
+ return;
+ }
+
+ // if login or password page, but logged in, redirect to start page
+ if(!resp.data.code && to.path == '/'){
+ next('/instance');
+ return;
+ }
+
+ SessionService.init(resp.data.data);
+ next();
+ });
+});
+
+window.onload = function(){
+ new Vue({el: '#app', router: router});
+};
diff --git a/release/v1.1.0/public/css/main.css b/release/v1.1.0/public/css/main.css
new file mode 100644
index 0000000..be3a7a8
--- /dev/null
+++ b/release/v1.1.0/public/css/main.css
@@ -0,0 +1,2653 @@
+@charset "UTF-8";
+@font-face {
+ font-family: "Roboto";
+ font-style: normal;
+ font-weight: 400;
+ src: url("../fonts/Roboto-Regular.ttf"); }
+
+@font-face {
+ font-family: "Roboto";
+ font-style: italic;
+ font-weight: 400;
+ src: url("../fonts/Roboto-Italic.ttf"); }
+
+@font-face {
+ font-family: "Roboto";
+ font-style: normal;
+ font-weight: 300;
+ src: url("../fonts/Roboto-Thin.ttf"); }
+
+@font-face {
+ font-family: "Roboto";
+ font-style: italic;
+ font-weight: 300;
+ src: url("../fonts/Roboto-ThinItalic.ttf"); }
+
+@font-face {
+ font-family: "Roboto";
+ font-style: normal;
+ font-weight: 700;
+ src: url("../fonts/Roboto-Bold.ttf"); }
+
+@font-face {
+ font-family: "Roboto";
+ font-style: italic;
+ font-weight: 700;
+ src: url("../fonts/Roboto-BoldItalic.ttf"); }
+
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url("../fonts/fontawesome-webfont.eot?v=4.7.0");
+ src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");
+ font-weight: normal;
+ font-style: normal; }
+
+.fa {
+ display: inline-block;
+ font: normal normal normal 14px/1 FontAwesome;
+ font-size: inherit;
+ text-rendering: auto;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+/* makes the font 33% larger relative to the icon container */
+.fa-lg {
+ font-size: 1.33333em;
+ line-height: 0.75em;
+ vertical-align: -15%; }
+
+.fa-2x {
+ font-size: 2em; }
+
+.fa-3x {
+ font-size: 3em; }
+
+.fa-4x {
+ font-size: 4em; }
+
+.fa-5x {
+ font-size: 5em; }
+
+.fa-fw {
+ width: 1.28571em;
+ text-align: center; }
+
+.fa-ul {
+ padding-left: 0;
+ margin-left: 2.14286em;
+ list-style-type: none; }
+ .fa-ul > li {
+ position: relative; }
+
+.fa-li {
+ position: absolute;
+ left: -2.14286em;
+ width: 2.14286em;
+ top: 0.14286em;
+ text-align: center; }
+ .fa-li.fa-lg {
+ left: -1.85714em; }
+
+.fa-border {
+ padding: .2em .25em .15em;
+ border: solid 0.08em #eee;
+ border-radius: .1em; }
+
+.fa-pull-left {
+ float: left; }
+
+.fa-pull-right {
+ float: right; }
+
+.fa.fa-pull-left {
+ margin-right: .3em; }
+
+.fa.fa-pull-right {
+ margin-left: .3em; }
+
+/* Deprecated as of 4.4.0 */
+.pull-right {
+ float: right; }
+
+.pull-left {
+ float: left; }
+
+.fa.pull-left {
+ margin-right: .3em; }
+
+.fa.pull-right {
+ margin-left: .3em; }
+
+.fa-spin {
+ -webkit-animation: fa-spin 2s infinite linear;
+ animation: fa-spin 2s infinite linear; }
+
+.fa-pulse {
+ -webkit-animation: fa-spin 1s infinite steps(8);
+ animation: fa-spin 1s infinite steps(8); }
+
+@-webkit-keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg); } }
+
+@keyframes fa-spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg); }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg); } }
+
+.fa-rotate-90 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
+ -webkit-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg); }
+
+.fa-rotate-180 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
+ -webkit-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ transform: rotate(180deg); }
+
+.fa-rotate-270 {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
+ -webkit-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ transform: rotate(270deg); }
+
+.fa-flip-horizontal {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
+ -webkit-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ transform: scale(-1, 1); }
+
+.fa-flip-vertical {
+ -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
+ -webkit-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ transform: scale(1, -1); }
+
+:root .fa-rotate-90,
+:root .fa-rotate-180,
+:root .fa-rotate-270,
+:root .fa-flip-horizontal,
+:root .fa-flip-vertical {
+ filter: none; }
+
+.fa-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: middle; }
+
+.fa-stack-1x, .fa-stack-2x {
+ position: absolute;
+ left: 0;
+ width: 100%;
+ text-align: center; }
+
+.fa-stack-1x {
+ line-height: inherit; }
+
+.fa-stack-2x {
+ font-size: 2em; }
+
+.fa-inverse {
+ color: #fff; }
+
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.fa-glass:before {
+ content: ""; }
+
+.fa-music:before {
+ content: ""; }
+
+.fa-search:before {
+ content: ""; }
+
+.fa-envelope-o:before {
+ content: ""; }
+
+.fa-heart:before {
+ content: ""; }
+
+.fa-star:before {
+ content: ""; }
+
+.fa-star-o:before {
+ content: ""; }
+
+.fa-user:before {
+ content: ""; }
+
+.fa-film:before {
+ content: ""; }
+
+.fa-th-large:before {
+ content: ""; }
+
+.fa-th:before {
+ content: ""; }
+
+.fa-th-list:before {
+ content: ""; }
+
+.fa-check:before {
+ content: ""; }
+
+.fa-remove:before,
+.fa-close:before,
+.fa-times:before {
+ content: ""; }
+
+.fa-search-plus:before {
+ content: ""; }
+
+.fa-search-minus:before {
+ content: ""; }
+
+.fa-power-off:before {
+ content: ""; }
+
+.fa-signal:before {
+ content: ""; }
+
+.fa-gear:before,
+.fa-cog:before {
+ content: ""; }
+
+.fa-trash-o:before {
+ content: ""; }
+
+.fa-home:before {
+ content: ""; }
+
+.fa-file-o:before {
+ content: ""; }
+
+.fa-clock-o:before {
+ content: ""; }
+
+.fa-road:before {
+ content: ""; }
+
+.fa-download:before {
+ content: ""; }
+
+.fa-arrow-circle-o-down:before {
+ content: ""; }
+
+.fa-arrow-circle-o-up:before {
+ content: ""; }
+
+.fa-inbox:before {
+ content: ""; }
+
+.fa-play-circle-o:before {
+ content: ""; }
+
+.fa-rotate-right:before,
+.fa-repeat:before {
+ content: ""; }
+
+.fa-refresh:before {
+ content: ""; }
+
+.fa-list-alt:before {
+ content: ""; }
+
+.fa-lock:before {
+ content: ""; }
+
+.fa-flag:before {
+ content: ""; }
+
+.fa-headphones:before {
+ content: ""; }
+
+.fa-volume-off:before {
+ content: ""; }
+
+.fa-volume-down:before {
+ content: ""; }
+
+.fa-volume-up:before {
+ content: ""; }
+
+.fa-qrcode:before {
+ content: ""; }
+
+.fa-barcode:before {
+ content: ""; }
+
+.fa-tag:before {
+ content: ""; }
+
+.fa-tags:before {
+ content: ""; }
+
+.fa-book:before {
+ content: ""; }
+
+.fa-bookmark:before {
+ content: ""; }
+
+.fa-print:before {
+ content: ""; }
+
+.fa-camera:before {
+ content: ""; }
+
+.fa-font:before {
+ content: ""; }
+
+.fa-bold:before {
+ content: ""; }
+
+.fa-italic:before {
+ content: ""; }
+
+.fa-text-height:before {
+ content: ""; }
+
+.fa-text-width:before {
+ content: ""; }
+
+.fa-align-left:before {
+ content: ""; }
+
+.fa-align-center:before {
+ content: ""; }
+
+.fa-align-right:before {
+ content: ""; }
+
+.fa-align-justify:before {
+ content: ""; }
+
+.fa-list:before {
+ content: ""; }
+
+.fa-dedent:before,
+.fa-outdent:before {
+ content: ""; }
+
+.fa-indent:before {
+ content: ""; }
+
+.fa-video-camera:before {
+ content: ""; }
+
+.fa-photo:before,
+.fa-image:before,
+.fa-picture-o:before {
+ content: ""; }
+
+.fa-pencil:before {
+ content: ""; }
+
+.fa-map-marker:before {
+ content: ""; }
+
+.fa-adjust:before {
+ content: ""; }
+
+.fa-tint:before {
+ content: ""; }
+
+.fa-edit:before,
+.fa-pencil-square-o:before {
+ content: ""; }
+
+.fa-share-square-o:before {
+ content: ""; }
+
+.fa-check-square-o:before {
+ content: ""; }
+
+.fa-arrows:before {
+ content: ""; }
+
+.fa-step-backward:before {
+ content: ""; }
+
+.fa-fast-backward:before {
+ content: ""; }
+
+.fa-backward:before {
+ content: ""; }
+
+.fa-play:before {
+ content: ""; }
+
+.fa-pause:before {
+ content: ""; }
+
+.fa-stop:before {
+ content: ""; }
+
+.fa-forward:before {
+ content: ""; }
+
+.fa-fast-forward:before {
+ content: ""; }
+
+.fa-step-forward:before {
+ content: ""; }
+
+.fa-eject:before {
+ content: ""; }
+
+.fa-chevron-left:before {
+ content: ""; }
+
+.fa-chevron-right:before {
+ content: ""; }
+
+.fa-plus-circle:before {
+ content: ""; }
+
+.fa-minus-circle:before {
+ content: ""; }
+
+.fa-times-circle:before {
+ content: ""; }
+
+.fa-check-circle:before {
+ content: ""; }
+
+.fa-question-circle:before {
+ content: ""; }
+
+.fa-info-circle:before {
+ content: ""; }
+
+.fa-crosshairs:before {
+ content: ""; }
+
+.fa-times-circle-o:before {
+ content: ""; }
+
+.fa-check-circle-o:before {
+ content: ""; }
+
+.fa-ban:before {
+ content: ""; }
+
+.fa-arrow-left:before {
+ content: ""; }
+
+.fa-arrow-right:before {
+ content: ""; }
+
+.fa-arrow-up:before {
+ content: ""; }
+
+.fa-arrow-down:before {
+ content: ""; }
+
+.fa-mail-forward:before,
+.fa-share:before {
+ content: ""; }
+
+.fa-expand:before {
+ content: ""; }
+
+.fa-compress:before {
+ content: ""; }
+
+.fa-plus:before {
+ content: ""; }
+
+.fa-minus:before {
+ content: ""; }
+
+.fa-asterisk:before {
+ content: ""; }
+
+.fa-exclamation-circle:before {
+ content: ""; }
+
+.fa-gift:before {
+ content: ""; }
+
+.fa-leaf:before {
+ content: ""; }
+
+.fa-fire:before {
+ content: ""; }
+
+.fa-eye:before {
+ content: ""; }
+
+.fa-eye-slash:before {
+ content: ""; }
+
+.fa-warning:before,
+.fa-exclamation-triangle:before {
+ content: ""; }
+
+.fa-plane:before {
+ content: ""; }
+
+.fa-calendar:before {
+ content: ""; }
+
+.fa-random:before {
+ content: ""; }
+
+.fa-comment:before {
+ content: ""; }
+
+.fa-magnet:before {
+ content: ""; }
+
+.fa-chevron-up:before {
+ content: ""; }
+
+.fa-chevron-down:before {
+ content: ""; }
+
+.fa-retweet:before {
+ content: ""; }
+
+.fa-shopping-cart:before {
+ content: ""; }
+
+.fa-folder:before {
+ content: ""; }
+
+.fa-folder-open:before {
+ content: ""; }
+
+.fa-arrows-v:before {
+ content: ""; }
+
+.fa-arrows-h:before {
+ content: ""; }
+
+.fa-bar-chart-o:before,
+.fa-bar-chart:before {
+ content: ""; }
+
+.fa-twitter-square:before {
+ content: ""; }
+
+.fa-facebook-square:before {
+ content: ""; }
+
+.fa-camera-retro:before {
+ content: ""; }
+
+.fa-key:before {
+ content: ""; }
+
+.fa-gears:before,
+.fa-cogs:before {
+ content: ""; }
+
+.fa-comments:before {
+ content: ""; }
+
+.fa-thumbs-o-up:before {
+ content: ""; }
+
+.fa-thumbs-o-down:before {
+ content: ""; }
+
+.fa-star-half:before {
+ content: ""; }
+
+.fa-heart-o:before {
+ content: ""; }
+
+.fa-sign-out:before {
+ content: ""; }
+
+.fa-linkedin-square:before {
+ content: ""; }
+
+.fa-thumb-tack:before {
+ content: ""; }
+
+.fa-external-link:before {
+ content: ""; }
+
+.fa-sign-in:before {
+ content: ""; }
+
+.fa-trophy:before {
+ content: ""; }
+
+.fa-github-square:before {
+ content: ""; }
+
+.fa-upload:before {
+ content: ""; }
+
+.fa-lemon-o:before {
+ content: ""; }
+
+.fa-phone:before {
+ content: ""; }
+
+.fa-square-o:before {
+ content: ""; }
+
+.fa-bookmark-o:before {
+ content: ""; }
+
+.fa-phone-square:before {
+ content: ""; }
+
+.fa-twitter:before {
+ content: ""; }
+
+.fa-facebook-f:before,
+.fa-facebook:before {
+ content: ""; }
+
+.fa-github:before {
+ content: ""; }
+
+.fa-unlock:before {
+ content: ""; }
+
+.fa-credit-card:before {
+ content: ""; }
+
+.fa-feed:before,
+.fa-rss:before {
+ content: ""; }
+
+.fa-hdd-o:before {
+ content: ""; }
+
+.fa-bullhorn:before {
+ content: ""; }
+
+.fa-bell:before {
+ content: ""; }
+
+.fa-certificate:before {
+ content: ""; }
+
+.fa-hand-o-right:before {
+ content: ""; }
+
+.fa-hand-o-left:before {
+ content: ""; }
+
+.fa-hand-o-up:before {
+ content: ""; }
+
+.fa-hand-o-down:before {
+ content: ""; }
+
+.fa-arrow-circle-left:before {
+ content: ""; }
+
+.fa-arrow-circle-right:before {
+ content: ""; }
+
+.fa-arrow-circle-up:before {
+ content: ""; }
+
+.fa-arrow-circle-down:before {
+ content: ""; }
+
+.fa-globe:before {
+ content: ""; }
+
+.fa-wrench:before {
+ content: ""; }
+
+.fa-tasks:before {
+ content: ""; }
+
+.fa-filter:before {
+ content: ""; }
+
+.fa-briefcase:before {
+ content: ""; }
+
+.fa-arrows-alt:before {
+ content: ""; }
+
+.fa-group:before,
+.fa-users:before {
+ content: ""; }
+
+.fa-chain:before,
+.fa-link:before {
+ content: ""; }
+
+.fa-cloud:before {
+ content: ""; }
+
+.fa-flask:before {
+ content: ""; }
+
+.fa-cut:before,
+.fa-scissors:before {
+ content: ""; }
+
+.fa-copy:before,
+.fa-files-o:before {
+ content: ""; }
+
+.fa-paperclip:before {
+ content: ""; }
+
+.fa-save:before,
+.fa-floppy-o:before {
+ content: ""; }
+
+.fa-square:before {
+ content: ""; }
+
+.fa-navicon:before,
+.fa-reorder:before,
+.fa-bars:before {
+ content: ""; }
+
+.fa-list-ul:before {
+ content: ""; }
+
+.fa-list-ol:before {
+ content: ""; }
+
+.fa-strikethrough:before {
+ content: ""; }
+
+.fa-underline:before {
+ content: ""; }
+
+.fa-table:before {
+ content: ""; }
+
+.fa-magic:before {
+ content: ""; }
+
+.fa-truck:before {
+ content: ""; }
+
+.fa-pinterest:before {
+ content: ""; }
+
+.fa-pinterest-square:before {
+ content: ""; }
+
+.fa-google-plus-square:before {
+ content: ""; }
+
+.fa-google-plus:before {
+ content: ""; }
+
+.fa-money:before {
+ content: ""; }
+
+.fa-caret-down:before {
+ content: ""; }
+
+.fa-caret-up:before {
+ content: ""; }
+
+.fa-caret-left:before {
+ content: ""; }
+
+.fa-caret-right:before {
+ content: ""; }
+
+.fa-columns:before {
+ content: ""; }
+
+.fa-unsorted:before,
+.fa-sort:before {
+ content: ""; }
+
+.fa-sort-down:before,
+.fa-sort-desc:before {
+ content: ""; }
+
+.fa-sort-up:before,
+.fa-sort-asc:before {
+ content: ""; }
+
+.fa-envelope:before {
+ content: ""; }
+
+.fa-linkedin:before {
+ content: ""; }
+
+.fa-rotate-left:before,
+.fa-undo:before {
+ content: ""; }
+
+.fa-legal:before,
+.fa-gavel:before {
+ content: ""; }
+
+.fa-dashboard:before,
+.fa-tachometer:before {
+ content: ""; }
+
+.fa-comment-o:before {
+ content: ""; }
+
+.fa-comments-o:before {
+ content: ""; }
+
+.fa-flash:before,
+.fa-bolt:before {
+ content: ""; }
+
+.fa-sitemap:before {
+ content: ""; }
+
+.fa-umbrella:before {
+ content: ""; }
+
+.fa-paste:before,
+.fa-clipboard:before {
+ content: ""; }
+
+.fa-lightbulb-o:before {
+ content: ""; }
+
+.fa-exchange:before {
+ content: ""; }
+
+.fa-cloud-download:before {
+ content: ""; }
+
+.fa-cloud-upload:before {
+ content: ""; }
+
+.fa-user-md:before {
+ content: ""; }
+
+.fa-stethoscope:before {
+ content: ""; }
+
+.fa-suitcase:before {
+ content: ""; }
+
+.fa-bell-o:before {
+ content: ""; }
+
+.fa-coffee:before {
+ content: ""; }
+
+.fa-cutlery:before {
+ content: ""; }
+
+.fa-file-text-o:before {
+ content: ""; }
+
+.fa-building-o:before {
+ content: ""; }
+
+.fa-hospital-o:before {
+ content: ""; }
+
+.fa-ambulance:before {
+ content: ""; }
+
+.fa-medkit:before {
+ content: ""; }
+
+.fa-fighter-jet:before {
+ content: ""; }
+
+.fa-beer:before {
+ content: ""; }
+
+.fa-h-square:before {
+ content: ""; }
+
+.fa-plus-square:before {
+ content: ""; }
+
+.fa-angle-double-left:before {
+ content: ""; }
+
+.fa-angle-double-right:before {
+ content: ""; }
+
+.fa-angle-double-up:before {
+ content: ""; }
+
+.fa-angle-double-down:before {
+ content: ""; }
+
+.fa-angle-left:before {
+ content: ""; }
+
+.fa-angle-right:before {
+ content: ""; }
+
+.fa-angle-up:before {
+ content: ""; }
+
+.fa-angle-down:before {
+ content: ""; }
+
+.fa-desktop:before {
+ content: ""; }
+
+.fa-laptop:before {
+ content: ""; }
+
+.fa-tablet:before {
+ content: ""; }
+
+.fa-mobile-phone:before,
+.fa-mobile:before {
+ content: ""; }
+
+.fa-circle-o:before {
+ content: ""; }
+
+.fa-quote-left:before {
+ content: ""; }
+
+.fa-quote-right:before {
+ content: ""; }
+
+.fa-spinner:before {
+ content: ""; }
+
+.fa-circle:before {
+ content: ""; }
+
+.fa-mail-reply:before,
+.fa-reply:before {
+ content: ""; }
+
+.fa-github-alt:before {
+ content: ""; }
+
+.fa-folder-o:before {
+ content: ""; }
+
+.fa-folder-open-o:before {
+ content: ""; }
+
+.fa-smile-o:before {
+ content: ""; }
+
+.fa-frown-o:before {
+ content: ""; }
+
+.fa-meh-o:before {
+ content: ""; }
+
+.fa-gamepad:before {
+ content: ""; }
+
+.fa-keyboard-o:before {
+ content: ""; }
+
+.fa-flag-o:before {
+ content: ""; }
+
+.fa-flag-checkered:before {
+ content: ""; }
+
+.fa-terminal:before {
+ content: ""; }
+
+.fa-code:before {
+ content: ""; }
+
+.fa-mail-reply-all:before,
+.fa-reply-all:before {
+ content: ""; }
+
+.fa-star-half-empty:before,
+.fa-star-half-full:before,
+.fa-star-half-o:before {
+ content: ""; }
+
+.fa-location-arrow:before {
+ content: ""; }
+
+.fa-crop:before {
+ content: ""; }
+
+.fa-code-fork:before {
+ content: ""; }
+
+.fa-unlink:before,
+.fa-chain-broken:before {
+ content: ""; }
+
+.fa-question:before {
+ content: ""; }
+
+.fa-info:before {
+ content: ""; }
+
+.fa-exclamation:before {
+ content: ""; }
+
+.fa-superscript:before {
+ content: ""; }
+
+.fa-subscript:before {
+ content: ""; }
+
+.fa-eraser:before {
+ content: ""; }
+
+.fa-puzzle-piece:before {
+ content: ""; }
+
+.fa-microphone:before {
+ content: ""; }
+
+.fa-microphone-slash:before {
+ content: ""; }
+
+.fa-shield:before {
+ content: ""; }
+
+.fa-calendar-o:before {
+ content: ""; }
+
+.fa-fire-extinguisher:before {
+ content: ""; }
+
+.fa-rocket:before {
+ content: ""; }
+
+.fa-maxcdn:before {
+ content: ""; }
+
+.fa-chevron-circle-left:before {
+ content: ""; }
+
+.fa-chevron-circle-right:before {
+ content: ""; }
+
+.fa-chevron-circle-up:before {
+ content: ""; }
+
+.fa-chevron-circle-down:before {
+ content: ""; }
+
+.fa-html5:before {
+ content: ""; }
+
+.fa-css3:before {
+ content: ""; }
+
+.fa-anchor:before {
+ content: ""; }
+
+.fa-unlock-alt:before {
+ content: ""; }
+
+.fa-bullseye:before {
+ content: ""; }
+
+.fa-ellipsis-h:before {
+ content: ""; }
+
+.fa-ellipsis-v:before {
+ content: ""; }
+
+.fa-rss-square:before {
+ content: ""; }
+
+.fa-play-circle:before {
+ content: ""; }
+
+.fa-ticket:before {
+ content: ""; }
+
+.fa-minus-square:before {
+ content: ""; }
+
+.fa-minus-square-o:before {
+ content: ""; }
+
+.fa-level-up:before {
+ content: ""; }
+
+.fa-level-down:before {
+ content: ""; }
+
+.fa-check-square:before {
+ content: ""; }
+
+.fa-pencil-square:before {
+ content: ""; }
+
+.fa-external-link-square:before {
+ content: ""; }
+
+.fa-share-square:before {
+ content: ""; }
+
+.fa-compass:before {
+ content: ""; }
+
+.fa-toggle-down:before,
+.fa-caret-square-o-down:before {
+ content: ""; }
+
+.fa-toggle-up:before,
+.fa-caret-square-o-up:before {
+ content: ""; }
+
+.fa-toggle-right:before,
+.fa-caret-square-o-right:before {
+ content: ""; }
+
+.fa-euro:before,
+.fa-eur:before {
+ content: ""; }
+
+.fa-gbp:before {
+ content: ""; }
+
+.fa-dollar:before,
+.fa-usd:before {
+ content: ""; }
+
+.fa-rupee:before,
+.fa-inr:before {
+ content: ""; }
+
+.fa-cny:before,
+.fa-rmb:before,
+.fa-yen:before,
+.fa-jpy:before {
+ content: ""; }
+
+.fa-ruble:before,
+.fa-rouble:before,
+.fa-rub:before {
+ content: ""; }
+
+.fa-won:before,
+.fa-krw:before {
+ content: ""; }
+
+.fa-bitcoin:before,
+.fa-btc:before {
+ content: ""; }
+
+.fa-file:before {
+ content: ""; }
+
+.fa-file-text:before {
+ content: ""; }
+
+.fa-sort-alpha-asc:before {
+ content: ""; }
+
+.fa-sort-alpha-desc:before {
+ content: ""; }
+
+.fa-sort-amount-asc:before {
+ content: ""; }
+
+.fa-sort-amount-desc:before {
+ content: ""; }
+
+.fa-sort-numeric-asc:before {
+ content: ""; }
+
+.fa-sort-numeric-desc:before {
+ content: ""; }
+
+.fa-thumbs-up:before {
+ content: ""; }
+
+.fa-thumbs-down:before {
+ content: ""; }
+
+.fa-youtube-square:before {
+ content: ""; }
+
+.fa-youtube:before {
+ content: ""; }
+
+.fa-xing:before {
+ content: ""; }
+
+.fa-xing-square:before {
+ content: ""; }
+
+.fa-youtube-play:before {
+ content: ""; }
+
+.fa-dropbox:before {
+ content: ""; }
+
+.fa-stack-overflow:before {
+ content: ""; }
+
+.fa-instagram:before {
+ content: ""; }
+
+.fa-flickr:before {
+ content: ""; }
+
+.fa-adn:before {
+ content: ""; }
+
+.fa-bitbucket:before {
+ content: ""; }
+
+.fa-bitbucket-square:before {
+ content: ""; }
+
+.fa-tumblr:before {
+ content: ""; }
+
+.fa-tumblr-square:before {
+ content: ""; }
+
+.fa-long-arrow-down:before {
+ content: ""; }
+
+.fa-long-arrow-up:before {
+ content: ""; }
+
+.fa-long-arrow-left:before {
+ content: ""; }
+
+.fa-long-arrow-right:before {
+ content: ""; }
+
+.fa-apple:before {
+ content: ""; }
+
+.fa-windows:before {
+ content: ""; }
+
+.fa-android:before {
+ content: ""; }
+
+.fa-linux:before {
+ content: ""; }
+
+.fa-dribbble:before {
+ content: ""; }
+
+.fa-skype:before {
+ content: ""; }
+
+.fa-foursquare:before {
+ content: ""; }
+
+.fa-trello:before {
+ content: ""; }
+
+.fa-female:before {
+ content: ""; }
+
+.fa-male:before {
+ content: ""; }
+
+.fa-gittip:before,
+.fa-gratipay:before {
+ content: ""; }
+
+.fa-sun-o:before {
+ content: ""; }
+
+.fa-moon-o:before {
+ content: ""; }
+
+.fa-archive:before {
+ content: ""; }
+
+.fa-bug:before {
+ content: ""; }
+
+.fa-vk:before {
+ content: ""; }
+
+.fa-weibo:before {
+ content: ""; }
+
+.fa-renren:before {
+ content: ""; }
+
+.fa-pagelines:before {
+ content: ""; }
+
+.fa-stack-exchange:before {
+ content: ""; }
+
+.fa-arrow-circle-o-right:before {
+ content: ""; }
+
+.fa-arrow-circle-o-left:before {
+ content: ""; }
+
+.fa-toggle-left:before,
+.fa-caret-square-o-left:before {
+ content: ""; }
+
+.fa-dot-circle-o:before {
+ content: ""; }
+
+.fa-wheelchair:before {
+ content: ""; }
+
+.fa-vimeo-square:before {
+ content: ""; }
+
+.fa-turkish-lira:before,
+.fa-try:before {
+ content: ""; }
+
+.fa-plus-square-o:before {
+ content: ""; }
+
+.fa-space-shuttle:before {
+ content: ""; }
+
+.fa-slack:before {
+ content: ""; }
+
+.fa-envelope-square:before {
+ content: ""; }
+
+.fa-wordpress:before {
+ content: ""; }
+
+.fa-openid:before {
+ content: ""; }
+
+.fa-institution:before,
+.fa-bank:before,
+.fa-university:before {
+ content: ""; }
+
+.fa-mortar-board:before,
+.fa-graduation-cap:before {
+ content: ""; }
+
+.fa-yahoo:before {
+ content: ""; }
+
+.fa-google:before {
+ content: ""; }
+
+.fa-reddit:before {
+ content: ""; }
+
+.fa-reddit-square:before {
+ content: ""; }
+
+.fa-stumbleupon-circle:before {
+ content: ""; }
+
+.fa-stumbleupon:before {
+ content: ""; }
+
+.fa-delicious:before {
+ content: ""; }
+
+.fa-digg:before {
+ content: ""; }
+
+.fa-pied-piper-pp:before {
+ content: ""; }
+
+.fa-pied-piper-alt:before {
+ content: ""; }
+
+.fa-drupal:before {
+ content: ""; }
+
+.fa-joomla:before {
+ content: ""; }
+
+.fa-language:before {
+ content: ""; }
+
+.fa-fax:before {
+ content: ""; }
+
+.fa-building:before {
+ content: ""; }
+
+.fa-child:before {
+ content: ""; }
+
+.fa-paw:before {
+ content: ""; }
+
+.fa-spoon:before {
+ content: ""; }
+
+.fa-cube:before {
+ content: ""; }
+
+.fa-cubes:before {
+ content: ""; }
+
+.fa-behance:before {
+ content: ""; }
+
+.fa-behance-square:before {
+ content: ""; }
+
+.fa-steam:before {
+ content: ""; }
+
+.fa-steam-square:before {
+ content: ""; }
+
+.fa-recycle:before {
+ content: ""; }
+
+.fa-automobile:before,
+.fa-car:before {
+ content: ""; }
+
+.fa-cab:before,
+.fa-taxi:before {
+ content: ""; }
+
+.fa-tree:before {
+ content: ""; }
+
+.fa-spotify:before {
+ content: ""; }
+
+.fa-deviantart:before {
+ content: ""; }
+
+.fa-soundcloud:before {
+ content: ""; }
+
+.fa-database:before {
+ content: ""; }
+
+.fa-file-pdf-o:before {
+ content: ""; }
+
+.fa-file-word-o:before {
+ content: ""; }
+
+.fa-file-excel-o:before {
+ content: ""; }
+
+.fa-file-powerpoint-o:before {
+ content: ""; }
+
+.fa-file-photo-o:before,
+.fa-file-picture-o:before,
+.fa-file-image-o:before {
+ content: ""; }
+
+.fa-file-zip-o:before,
+.fa-file-archive-o:before {
+ content: ""; }
+
+.fa-file-sound-o:before,
+.fa-file-audio-o:before {
+ content: ""; }
+
+.fa-file-movie-o:before,
+.fa-file-video-o:before {
+ content: ""; }
+
+.fa-file-code-o:before {
+ content: ""; }
+
+.fa-vine:before {
+ content: ""; }
+
+.fa-codepen:before {
+ content: ""; }
+
+.fa-jsfiddle:before {
+ content: ""; }
+
+.fa-life-bouy:before,
+.fa-life-buoy:before,
+.fa-life-saver:before,
+.fa-support:before,
+.fa-life-ring:before {
+ content: ""; }
+
+.fa-circle-o-notch:before {
+ content: ""; }
+
+.fa-ra:before,
+.fa-resistance:before,
+.fa-rebel:before {
+ content: ""; }
+
+.fa-ge:before,
+.fa-empire:before {
+ content: ""; }
+
+.fa-git-square:before {
+ content: ""; }
+
+.fa-git:before {
+ content: ""; }
+
+.fa-y-combinator-square:before,
+.fa-yc-square:before,
+.fa-hacker-news:before {
+ content: ""; }
+
+.fa-tencent-weibo:before {
+ content: ""; }
+
+.fa-qq:before {
+ content: ""; }
+
+.fa-wechat:before,
+.fa-weixin:before {
+ content: ""; }
+
+.fa-send:before,
+.fa-paper-plane:before {
+ content: ""; }
+
+.fa-send-o:before,
+.fa-paper-plane-o:before {
+ content: ""; }
+
+.fa-history:before {
+ content: ""; }
+
+.fa-circle-thin:before {
+ content: ""; }
+
+.fa-header:before {
+ content: ""; }
+
+.fa-paragraph:before {
+ content: ""; }
+
+.fa-sliders:before {
+ content: ""; }
+
+.fa-share-alt:before {
+ content: ""; }
+
+.fa-share-alt-square:before {
+ content: ""; }
+
+.fa-bomb:before {
+ content: ""; }
+
+.fa-soccer-ball-o:before,
+.fa-futbol-o:before {
+ content: ""; }
+
+.fa-tty:before {
+ content: ""; }
+
+.fa-binoculars:before {
+ content: ""; }
+
+.fa-plug:before {
+ content: ""; }
+
+.fa-slideshare:before {
+ content: ""; }
+
+.fa-twitch:before {
+ content: ""; }
+
+.fa-yelp:before {
+ content: ""; }
+
+.fa-newspaper-o:before {
+ content: ""; }
+
+.fa-wifi:before {
+ content: ""; }
+
+.fa-calculator:before {
+ content: ""; }
+
+.fa-paypal:before {
+ content: ""; }
+
+.fa-google-wallet:before {
+ content: ""; }
+
+.fa-cc-visa:before {
+ content: ""; }
+
+.fa-cc-mastercard:before {
+ content: ""; }
+
+.fa-cc-discover:before {
+ content: ""; }
+
+.fa-cc-amex:before {
+ content: ""; }
+
+.fa-cc-paypal:before {
+ content: ""; }
+
+.fa-cc-stripe:before {
+ content: ""; }
+
+.fa-bell-slash:before {
+ content: ""; }
+
+.fa-bell-slash-o:before {
+ content: ""; }
+
+.fa-trash:before {
+ content: ""; }
+
+.fa-copyright:before {
+ content: ""; }
+
+.fa-at:before {
+ content: ""; }
+
+.fa-eyedropper:before {
+ content: ""; }
+
+.fa-paint-brush:before {
+ content: ""; }
+
+.fa-birthday-cake:before {
+ content: ""; }
+
+.fa-area-chart:before {
+ content: ""; }
+
+.fa-pie-chart:before {
+ content: ""; }
+
+.fa-line-chart:before {
+ content: ""; }
+
+.fa-lastfm:before {
+ content: ""; }
+
+.fa-lastfm-square:before {
+ content: ""; }
+
+.fa-toggle-off:before {
+ content: ""; }
+
+.fa-toggle-on:before {
+ content: ""; }
+
+.fa-bicycle:before {
+ content: ""; }
+
+.fa-bus:before {
+ content: ""; }
+
+.fa-ioxhost:before {
+ content: ""; }
+
+.fa-angellist:before {
+ content: ""; }
+
+.fa-cc:before {
+ content: ""; }
+
+.fa-shekel:before,
+.fa-sheqel:before,
+.fa-ils:before {
+ content: ""; }
+
+.fa-meanpath:before {
+ content: ""; }
+
+.fa-buysellads:before {
+ content: ""; }
+
+.fa-connectdevelop:before {
+ content: ""; }
+
+.fa-dashcube:before {
+ content: ""; }
+
+.fa-forumbee:before {
+ content: ""; }
+
+.fa-leanpub:before {
+ content: ""; }
+
+.fa-sellsy:before {
+ content: ""; }
+
+.fa-shirtsinbulk:before {
+ content: ""; }
+
+.fa-simplybuilt:before {
+ content: ""; }
+
+.fa-skyatlas:before {
+ content: ""; }
+
+.fa-cart-plus:before {
+ content: ""; }
+
+.fa-cart-arrow-down:before {
+ content: ""; }
+
+.fa-diamond:before {
+ content: ""; }
+
+.fa-ship:before {
+ content: ""; }
+
+.fa-user-secret:before {
+ content: ""; }
+
+.fa-motorcycle:before {
+ content: ""; }
+
+.fa-street-view:before {
+ content: ""; }
+
+.fa-heartbeat:before {
+ content: ""; }
+
+.fa-venus:before {
+ content: ""; }
+
+.fa-mars:before {
+ content: ""; }
+
+.fa-mercury:before {
+ content: ""; }
+
+.fa-intersex:before,
+.fa-transgender:before {
+ content: ""; }
+
+.fa-transgender-alt:before {
+ content: ""; }
+
+.fa-venus-double:before {
+ content: ""; }
+
+.fa-mars-double:before {
+ content: ""; }
+
+.fa-venus-mars:before {
+ content: ""; }
+
+.fa-mars-stroke:before {
+ content: ""; }
+
+.fa-mars-stroke-v:before {
+ content: ""; }
+
+.fa-mars-stroke-h:before {
+ content: ""; }
+
+.fa-neuter:before {
+ content: ""; }
+
+.fa-genderless:before {
+ content: ""; }
+
+.fa-facebook-official:before {
+ content: ""; }
+
+.fa-pinterest-p:before {
+ content: ""; }
+
+.fa-whatsapp:before {
+ content: ""; }
+
+.fa-server:before {
+ content: ""; }
+
+.fa-user-plus:before {
+ content: ""; }
+
+.fa-user-times:before {
+ content: ""; }
+
+.fa-hotel:before,
+.fa-bed:before {
+ content: ""; }
+
+.fa-viacoin:before {
+ content: ""; }
+
+.fa-train:before {
+ content: ""; }
+
+.fa-subway:before {
+ content: ""; }
+
+.fa-medium:before {
+ content: ""; }
+
+.fa-yc:before,
+.fa-y-combinator:before {
+ content: ""; }
+
+.fa-optin-monster:before {
+ content: ""; }
+
+.fa-opencart:before {
+ content: ""; }
+
+.fa-expeditedssl:before {
+ content: ""; }
+
+.fa-battery-4:before,
+.fa-battery:before,
+.fa-battery-full:before {
+ content: ""; }
+
+.fa-battery-3:before,
+.fa-battery-three-quarters:before {
+ content: ""; }
+
+.fa-battery-2:before,
+.fa-battery-half:before {
+ content: ""; }
+
+.fa-battery-1:before,
+.fa-battery-quarter:before {
+ content: ""; }
+
+.fa-battery-0:before,
+.fa-battery-empty:before {
+ content: ""; }
+
+.fa-mouse-pointer:before {
+ content: ""; }
+
+.fa-i-cursor:before {
+ content: ""; }
+
+.fa-object-group:before {
+ content: ""; }
+
+.fa-object-ungroup:before {
+ content: ""; }
+
+.fa-sticky-note:before {
+ content: ""; }
+
+.fa-sticky-note-o:before {
+ content: ""; }
+
+.fa-cc-jcb:before {
+ content: ""; }
+
+.fa-cc-diners-club:before {
+ content: ""; }
+
+.fa-clone:before {
+ content: ""; }
+
+.fa-balance-scale:before {
+ content: ""; }
+
+.fa-hourglass-o:before {
+ content: ""; }
+
+.fa-hourglass-1:before,
+.fa-hourglass-start:before {
+ content: ""; }
+
+.fa-hourglass-2:before,
+.fa-hourglass-half:before {
+ content: ""; }
+
+.fa-hourglass-3:before,
+.fa-hourglass-end:before {
+ content: ""; }
+
+.fa-hourglass:before {
+ content: ""; }
+
+.fa-hand-grab-o:before,
+.fa-hand-rock-o:before {
+ content: ""; }
+
+.fa-hand-stop-o:before,
+.fa-hand-paper-o:before {
+ content: ""; }
+
+.fa-hand-scissors-o:before {
+ content: ""; }
+
+.fa-hand-lizard-o:before {
+ content: ""; }
+
+.fa-hand-spock-o:before {
+ content: ""; }
+
+.fa-hand-pointer-o:before {
+ content: ""; }
+
+.fa-hand-peace-o:before {
+ content: ""; }
+
+.fa-trademark:before {
+ content: ""; }
+
+.fa-registered:before {
+ content: ""; }
+
+.fa-creative-commons:before {
+ content: ""; }
+
+.fa-gg:before {
+ content: ""; }
+
+.fa-gg-circle:before {
+ content: ""; }
+
+.fa-tripadvisor:before {
+ content: ""; }
+
+.fa-odnoklassniki:before {
+ content: ""; }
+
+.fa-odnoklassniki-square:before {
+ content: ""; }
+
+.fa-get-pocket:before {
+ content: ""; }
+
+.fa-wikipedia-w:before {
+ content: ""; }
+
+.fa-safari:before {
+ content: ""; }
+
+.fa-chrome:before {
+ content: ""; }
+
+.fa-firefox:before {
+ content: ""; }
+
+.fa-opera:before {
+ content: ""; }
+
+.fa-internet-explorer:before {
+ content: ""; }
+
+.fa-tv:before,
+.fa-television:before {
+ content: ""; }
+
+.fa-contao:before {
+ content: ""; }
+
+.fa-500px:before {
+ content: ""; }
+
+.fa-amazon:before {
+ content: ""; }
+
+.fa-calendar-plus-o:before {
+ content: ""; }
+
+.fa-calendar-minus-o:before {
+ content: ""; }
+
+.fa-calendar-times-o:before {
+ content: ""; }
+
+.fa-calendar-check-o:before {
+ content: ""; }
+
+.fa-industry:before {
+ content: ""; }
+
+.fa-map-pin:before {
+ content: ""; }
+
+.fa-map-signs:before {
+ content: ""; }
+
+.fa-map-o:before {
+ content: ""; }
+
+.fa-map:before {
+ content: ""; }
+
+.fa-commenting:before {
+ content: ""; }
+
+.fa-commenting-o:before {
+ content: ""; }
+
+.fa-houzz:before {
+ content: ""; }
+
+.fa-vimeo:before {
+ content: ""; }
+
+.fa-black-tie:before {
+ content: ""; }
+
+.fa-fonticons:before {
+ content: ""; }
+
+.fa-reddit-alien:before {
+ content: ""; }
+
+.fa-edge:before {
+ content: ""; }
+
+.fa-credit-card-alt:before {
+ content: ""; }
+
+.fa-codiepie:before {
+ content: ""; }
+
+.fa-modx:before {
+ content: ""; }
+
+.fa-fort-awesome:before {
+ content: ""; }
+
+.fa-usb:before {
+ content: ""; }
+
+.fa-product-hunt:before {
+ content: ""; }
+
+.fa-mixcloud:before {
+ content: ""; }
+
+.fa-scribd:before {
+ content: ""; }
+
+.fa-pause-circle:before {
+ content: ""; }
+
+.fa-pause-circle-o:before {
+ content: ""; }
+
+.fa-stop-circle:before {
+ content: ""; }
+
+.fa-stop-circle-o:before {
+ content: ""; }
+
+.fa-shopping-bag:before {
+ content: ""; }
+
+.fa-shopping-basket:before {
+ content: ""; }
+
+.fa-hashtag:before {
+ content: ""; }
+
+.fa-bluetooth:before {
+ content: ""; }
+
+.fa-bluetooth-b:before {
+ content: ""; }
+
+.fa-percent:before {
+ content: ""; }
+
+.fa-gitlab:before {
+ content: ""; }
+
+.fa-wpbeginner:before {
+ content: ""; }
+
+.fa-wpforms:before {
+ content: ""; }
+
+.fa-envira:before {
+ content: ""; }
+
+.fa-universal-access:before {
+ content: ""; }
+
+.fa-wheelchair-alt:before {
+ content: ""; }
+
+.fa-question-circle-o:before {
+ content: ""; }
+
+.fa-blind:before {
+ content: ""; }
+
+.fa-audio-description:before {
+ content: ""; }
+
+.fa-volume-control-phone:before {
+ content: ""; }
+
+.fa-braille:before {
+ content: ""; }
+
+.fa-assistive-listening-systems:before {
+ content: ""; }
+
+.fa-asl-interpreting:before,
+.fa-american-sign-language-interpreting:before {
+ content: ""; }
+
+.fa-deafness:before,
+.fa-hard-of-hearing:before,
+.fa-deaf:before {
+ content: ""; }
+
+.fa-glide:before {
+ content: ""; }
+
+.fa-glide-g:before {
+ content: ""; }
+
+.fa-signing:before,
+.fa-sign-language:before {
+ content: ""; }
+
+.fa-low-vision:before {
+ content: ""; }
+
+.fa-viadeo:before {
+ content: ""; }
+
+.fa-viadeo-square:before {
+ content: ""; }
+
+.fa-snapchat:before {
+ content: ""; }
+
+.fa-snapchat-ghost:before {
+ content: ""; }
+
+.fa-snapchat-square:before {
+ content: ""; }
+
+.fa-pied-piper:before {
+ content: ""; }
+
+.fa-first-order:before {
+ content: ""; }
+
+.fa-yoast:before {
+ content: ""; }
+
+.fa-themeisle:before {
+ content: ""; }
+
+.fa-google-plus-circle:before,
+.fa-google-plus-official:before {
+ content: ""; }
+
+.fa-fa:before,
+.fa-font-awesome:before {
+ content: ""; }
+
+.fa-handshake-o:before {
+ content: ""; }
+
+.fa-envelope-open:before {
+ content: ""; }
+
+.fa-envelope-open-o:before {
+ content: ""; }
+
+.fa-linode:before {
+ content: ""; }
+
+.fa-address-book:before {
+ content: ""; }
+
+.fa-address-book-o:before {
+ content: ""; }
+
+.fa-vcard:before,
+.fa-address-card:before {
+ content: ""; }
+
+.fa-vcard-o:before,
+.fa-address-card-o:before {
+ content: ""; }
+
+.fa-user-circle:before {
+ content: ""; }
+
+.fa-user-circle-o:before {
+ content: ""; }
+
+.fa-user-o:before {
+ content: ""; }
+
+.fa-id-badge:before {
+ content: ""; }
+
+.fa-drivers-license:before,
+.fa-id-card:before {
+ content: ""; }
+
+.fa-drivers-license-o:before,
+.fa-id-card-o:before {
+ content: ""; }
+
+.fa-quora:before {
+ content: ""; }
+
+.fa-free-code-camp:before {
+ content: ""; }
+
+.fa-telegram:before {
+ content: ""; }
+
+.fa-thermometer-4:before,
+.fa-thermometer:before,
+.fa-thermometer-full:before {
+ content: ""; }
+
+.fa-thermometer-3:before,
+.fa-thermometer-three-quarters:before {
+ content: ""; }
+
+.fa-thermometer-2:before,
+.fa-thermometer-half:before {
+ content: ""; }
+
+.fa-thermometer-1:before,
+.fa-thermometer-quarter:before {
+ content: ""; }
+
+.fa-thermometer-0:before,
+.fa-thermometer-empty:before {
+ content: ""; }
+
+.fa-shower:before {
+ content: ""; }
+
+.fa-bathtub:before,
+.fa-s15:before,
+.fa-bath:before {
+ content: ""; }
+
+.fa-podcast:before {
+ content: ""; }
+
+.fa-window-maximize:before {
+ content: ""; }
+
+.fa-window-minimize:before {
+ content: ""; }
+
+.fa-window-restore:before {
+ content: ""; }
+
+.fa-times-rectangle:before,
+.fa-window-close:before {
+ content: ""; }
+
+.fa-times-rectangle-o:before,
+.fa-window-close-o:before {
+ content: ""; }
+
+.fa-bandcamp:before {
+ content: ""; }
+
+.fa-grav:before {
+ content: ""; }
+
+.fa-etsy:before {
+ content: ""; }
+
+.fa-imdb:before {
+ content: ""; }
+
+.fa-ravelry:before {
+ content: ""; }
+
+.fa-eercast:before {
+ content: ""; }
+
+.fa-microchip:before {
+ content: ""; }
+
+.fa-snowflake-o:before {
+ content: ""; }
+
+.fa-superpowers:before {
+ content: ""; }
+
+.fa-wpexplorer:before {
+ content: ""; }
+
+.fa-meetup:before {
+ content: ""; }
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0; }
+
+.sr-only-focusable:active, .sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto; }
+
+.shadow-l1, .box, .menu, input[type~="submit"], button, a.button {
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); }
+
+.shadow-l2 {
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); }
+
+.shadow-l3 {
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); }
+
+.shadow-l4 {
+ box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); }
+
+.shadow-l5 {
+ box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22); }
+
+@keyframes shadow1to3 {
+ from {
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); }
+ to {
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); } }
+
+@keyframes shadow1to2 {
+ from {
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); }
+ to {
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23); } }
+
+.font, html, body, input, select, textarea, button, a.button {
+ font-family: "Roboto";
+ font-size: 16px;
+ color: #333; }
+
+html, body {
+ padding: 0;
+ margin: 0;
+ line-height: 1.5;
+ background: #FAFAFA; }
+
+.wrapper {
+ padding: 20px; }
+
+.box {
+ background: #fff;
+ margin: 0 0 20px 0; }
+
+.msg, .success, .warn, .error {
+ padding: 20px;
+ margin: 20px 0 20px 0;
+ background: #fff;
+ border-style: solid;
+ border-width: 1px 1px 1px 5px; }
+ .msg .close, .success .close, .warn .close, .error .close {
+ float: right;
+ margin: 0 0 -10px 0; }
+ .msg .close:hover, .success .close:hover, .warn .close:hover, .error .close:hover {
+ cursor: pointer; }
+
+.success {
+ border-color: #4CAF50; }
+
+.warn {
+ border-color: #FFEB3B; }
+
+.error {
+ border-color: #F44336; }
+
+.login {
+ max-width: 400px;
+ margin: 100px auto 20px auto; }
+ .login .center {
+ text-align: center; }
+ .login .version {
+ font-size: 12px;
+ text-align: center; }
+
+.menu {
+ position: fixed;
+ width: 100%;
+ top: 0;
+ height: 40px;
+ background: #212121;
+ padding: 0 20px 0 20px; }
+ .menu .wrapper {
+ padding: 0 20px 0 20px; }
+ .menu .logo {
+ float: left;
+ width: 40px;
+ height: 40px;
+ margin: 0 20px 0 0;
+ background: url("../img/aclogo_small.png"); }
+ .menu a {
+ display: block;
+ float: left;
+ padding: 8px 15px 8px 15px;
+ color: #fff;
+ font-weight: bold; }
+ .menu a:hover {
+ background: #EEEEEE;
+ color: #333; }
+ .menu .right {
+ float: right; }
+
+.main {
+ padding: 20px;
+ margin: 40px 0 0 0; }
+
+img.track {
+ float: left;
+ margin: 0 20px 0 0; }
+
+.select {
+ height: 400px;
+ overflow-y: scroll;
+ border: 1px solid #EEEEEE;
+ margin: 5px; }
+ .select .option {
+ padding: 5px; }
+ .select .option:hover {
+ cursor: pointer;
+ background: #EEEEEE;
+ color: #333; }
+ .select .selected {
+ background: #ea141e;
+ color: #fff; }
+
+.fa:hover {
+ cursor: pointer; }
+
+h1, h2, h3, h4 {
+ display: block;
+ margin: 10px 0 10px 0;
+ padding: 0;
+ font-weight: bold; }
+
+h1 {
+ font-size: 30px;
+ margin-left: 20px; }
+
+h2 {
+ font-size: 26px;
+ margin-bottom: 15px; }
+
+h3 {
+ font-size: 24px;
+ margin-bottom: 10px; }
+
+h4 {
+ font-size: 22px;
+ margin-bottom: 10px; }
+
+hr {
+ width: 100%;
+ height: 1px;
+ background: #EEEEEE;
+ margin: 20px 0 20px 0;
+ border-width: 0; }
+
+a {
+ color: #ea141e;
+ text-decoration: none; }
+
+a:hover {
+ color: #333; }
+
+p {
+ margin: 10px 0 10px 0;
+ padding: 0; }
+
+table {
+ margin: 10px 0 10px 0;
+ width: 100%;
+ display: border-box; }
+ table tr {
+ padding: 0;
+ margin: 0; }
+ table tr td {
+ padding: 5px;
+ margin: 0; }
+ table tr td.w5 {
+ width: 5%; }
+ table tr td.w10 {
+ width: 10%; }
+ table tr td.w15 {
+ width: 15%; }
+ table tr td.w20 {
+ width: 20%; }
+ table tr td.w25 {
+ width: 25%; }
+ table tr td.w30 {
+ width: 30%; }
+ table tr td.w33 {
+ width: 33.33%; }
+ table tr td.w35 {
+ width: 35%; }
+ table tr td.w40 {
+ width: 40%; }
+ table tr td.w50 {
+ width: 50%; }
+ table tr td.w55 {
+ width: 55%; }
+ table thead tr {
+ background: #212121;
+ color: #fff; }
+ table tbody td {
+ border-style: solid;
+ border-color: #ea141e;
+ border-width: 0 0 1px 0; }
+
+table.small {
+ width: auto;
+ font-size: 16px; }
+
+td.top {
+ vertical-align: top;
+ padding-top: 12px; }
+
+img {
+ max-width: 100%;
+ margin: 10px 0 10px 0; }
+
+input, select, textarea, button, a.button {
+ display: inline-block;
+ padding: 5px;
+ margin: 5px 0 5px 0;
+ border: 1px solid #9E9E9E;
+ border-width: 0 0 1px 0;
+ border-radius: 1px;
+ background: #fff; }
+ input .fa, select .fa, textarea .fa, button .fa, a.button .fa {
+ margin: 0 5px 0 0; }
+
+input:focus, select:focus, textarea:focus {
+ border-color: #9E9E9E; }
+
+input[readonly] {
+ color: #ccc;
+ border-color: #ccc; }
+
+.full-width, textarea {
+ box-sizing: border-box;
+ width: 100%; }
+
+input.w5 {
+ width: 5%; }
+
+input.w10 {
+ width: 10%; }
+
+input.w20 {
+ width: 20%; }
+
+input.w30 {
+ width: 30%; }
+
+input.w50 {
+ width: 50%; }
+
+input.w70 {
+ width: 70%; }
+
+textarea {
+ min-height: 100px;
+ border-width: 1px; }
+
+input[type~="submit"], button, a.button {
+ background: #ea141e;
+ border-width: 0;
+ color: #fff;
+ padding: 5px 15px 5px 15px; }
+
+input[type~="submit"]:hover, button:hover, a.button:hover {
+ cursor: pointer;
+ animation-name: shadow1to3;
+ animation-duration: 0.3s;
+ animation-fill-mode: forwards; }
+
+input[type~="checkbox"] {
+ width: auto; }
+
+input.no-margin, button.no-margin {
+ margin: 0; }
+
+a.button .fa {
+ margin: 0 5px 0 0; }
+
+a.icon-link {
+ color: #333; }
diff --git a/release/v1.1.0/public/fonts/FontAwesome.otf b/release/v1.1.0/public/fonts/FontAwesome.otf
new file mode 100644
index 0000000..401ec0f
Binary files /dev/null and b/release/v1.1.0/public/fonts/FontAwesome.otf differ
diff --git a/release/v1.1.0/public/fonts/Roboto-Bold.ttf b/release/v1.1.0/public/fonts/Roboto-Bold.ttf
new file mode 100644
index 0000000..68822ca
Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Bold.ttf differ
diff --git a/release/v1.1.0/public/fonts/Roboto-BoldItalic.ttf b/release/v1.1.0/public/fonts/Roboto-BoldItalic.ttf
new file mode 100644
index 0000000..aebf8eb
Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-BoldItalic.ttf differ
diff --git a/release/v1.1.0/public/fonts/Roboto-Italic.ttf b/release/v1.1.0/public/fonts/Roboto-Italic.ttf
new file mode 100644
index 0000000..2041cbc
Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Italic.ttf differ
diff --git a/release/v1.1.0/public/fonts/Roboto-Regular.ttf b/release/v1.1.0/public/fonts/Roboto-Regular.ttf
new file mode 100644
index 0000000..0e58508
Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Regular.ttf differ
diff --git a/release/v1.1.0/public/fonts/Roboto-Thin.ttf b/release/v1.1.0/public/fonts/Roboto-Thin.ttf
new file mode 100644
index 0000000..8779333
Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-Thin.ttf differ
diff --git a/release/v1.1.0/public/fonts/Roboto-ThinItalic.ttf b/release/v1.1.0/public/fonts/Roboto-ThinItalic.ttf
new file mode 100644
index 0000000..b79cb26
Binary files /dev/null and b/release/v1.1.0/public/fonts/Roboto-ThinItalic.ttf differ
diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.eot b/release/v1.1.0/public/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.eot differ
diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.svg b/release/v1.1.0/public/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/release/v1.1.0/public/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
+
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.ttf b/release/v1.1.0/public/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.ttf differ
diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.woff b/release/v1.1.0/public/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..400014a
Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.woff differ
diff --git a/release/v1.1.0/public/fonts/fontawesome-webfont.woff2 b/release/v1.1.0/public/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/release/v1.1.0/public/fonts/fontawesome-webfont.woff2 differ
diff --git a/release/v1.1.0/public/img/aclogo.png b/release/v1.1.0/public/img/aclogo.png
new file mode 100644
index 0000000..f45e84c
Binary files /dev/null and b/release/v1.1.0/public/img/aclogo.png differ
diff --git a/release/v1.1.0/public/img/aclogo_small.png b/release/v1.1.0/public/img/aclogo_small.png
new file mode 100644
index 0000000..165135b
Binary files /dev/null and b/release/v1.1.0/public/img/aclogo_small.png differ
diff --git a/release/v1.1.0/public/index.html b/release/v1.1.0/public/index.html
new file mode 100644
index 0000000..b8b8873
--- /dev/null
+++ b/release/v1.1.0/public/index.html
@@ -0,0 +1,23 @@
+
+
+
+ Assetto Corsa Web
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/release/v1.1.0/public/js/vue-resource.min.js b/release/v1.1.0/public/js/vue-resource.min.js
new file mode 100644
index 0000000..2883ea9
--- /dev/null
+++ b/release/v1.1.0/public/js/vue-resource.min.js
@@ -0,0 +1,7 @@
+/*!
+ * vue-resource v1.2.1
+ * https://github.com/pagekit/vue-resource
+ * Released under the MIT License.
+ */
+
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueResource=e()}(this,function(){"use strict";function t(t){this.state=J,this.value=void 0,this.deferred=[];var e=this;try{t(function(t){e.resolve(t)},function(t){e.reject(t)})}catch(t){e.reject(t)}}function e(t,e){t instanceof Promise?this.promise=t:this.promise=new Promise(t.bind(e)),this.context=e}function n(t){"undefined"!=typeof console&&Q&&console.warn("[VueResource warn]: "+t)}function o(t){"undefined"!=typeof console&&console.error(t)}function r(t,e){return G(t,e)}function i(t){return t?t.replace(/^\s*|\s*$/g,""):""}function u(t){return t?t.toLowerCase():""}function s(t){return t?t.toUpperCase():""}function a(t){return"string"==typeof t}function c(t){return"function"==typeof t}function f(t){return null!==t&&"object"==typeof t}function h(t){return f(t)&&Object.getPrototypeOf(t)==Object.prototype}function p(t){return"undefined"!=typeof Blob&&t instanceof Blob}function d(t){return"undefined"!=typeof FormData&&t instanceof FormData}function l(t,n,o){var r=e.resolve(t);return arguments.length<2?r:r.then(n,o)}function m(t,e,n){return n=n||{},c(n)&&(n=n.call(e)),v(t.bind({$vm:e,$options:n}),t,{$options:n})}function y(t,e){var n,o;if(tt(t))for(n=0;n=200&&r<300,this.status=r||0,this.statusText=i||"",this.headers=new bt(o),this.body=t,a(t)?this.bodyText=t:p(t)&&(this.bodyBlob=t,B(t)&&(this.bodyText=H(t)))};gt.prototype.blob=function(){return l(this.bodyBlob)},gt.prototype.text=function(){return l(this.bodyText)},gt.prototype.json=function(){return l(this.text(),function(t){return JSON.parse(t)})};var wt=function(t){this.body=null,this.params={},et(this,t,{method:s(t.method||"GET")}),this.headers instanceof bt||(this.headers=new bt(this.headers))};wt.prototype.getUrl=function(){return $(this)},wt.prototype.getBody=function(){return this.body},wt.prototype.respondWith=function(t,e){return new gt(t,et(e||{},{url:this.getUrl()}))};var Tt={Accept:"application/json, text/plain, */*"},xt={"Content-Type":"application/json;charset=utf-8"};return L.options={},L.headers={put:xt,post:xt,patch:xt,delete:xt,common:Tt,custom:{}},L.interceptors=[ht,pt,at,ft,dt,st],["get","delete","head","jsonp"].forEach(function(t){L[t]=function(e,n){return this(et(n||{},{url:e,method:t}))}}),["post","put","patch"].forEach(function(t){L[t]=function(e,n,o){return this(et(o||{},{url:e,method:t,body:n}))}}),q.actions={get:{method:"GET"},save:{method:"POST"},query:{method:"GET"},update:{method:"PUT"},remove:{method:"DELETE"},delete:{method:"DELETE"}},"undefined"!=typeof window&&window.Vue&&window.Vue.use(N),N});
\ No newline at end of file
diff --git a/release/v1.1.0/public/js/vue-router.min.js b/release/v1.1.0/public/js/vue-router.min.js
new file mode 100644
index 0000000..ac5900f
--- /dev/null
+++ b/release/v1.1.0/public/js/vue-router.min.js
@@ -0,0 +1,6 @@
+/**
+ * vue-router v2.2.1
+ * (c) 2017 Evan You
+ * @license MIT
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueRouter=e()}(this,function(){"use strict";function t(t,e){t||"undefined"!=typeof console&&console.warn("[vue-router] "+e)}function e(e,n){switch(typeof n){case"undefined":return;case"object":return n;case"function":return n(e);case"boolean":return n?e.params:void 0;default:t(!1,'props in "'+e.path+'" is a '+typeof n+", expecting an object, function or boolean.")}}function n(t,e){if(void 0===e&&(e={}),t){var n;try{n=r(t)}catch(t){n={}}for(var o in e)n[o]=e[o];return n}return e}function r(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach(function(t){var n=t.replace(/\+/g," ").split("="),r=_t(n.shift()),o=n.length>0?_t(n.join("=")):null;void 0===e[r]?e[r]=o:Array.isArray(e[r])?e[r].push(o):e[r]=[e[r],o]}),e):e}function o(t){var e=t?Object.keys(t).map(function(e){var n=t[e];if(void 0===n)return"";if(null===n)return Ct(e);if(Array.isArray(n)){var r=[];return n.slice().forEach(function(t){void 0!==t&&(null===t?r.push(Ct(e)):r.push(Ct(e)+"="+Ct(t)))}),r.join("&")}return Ct(e)+"="+Ct(n)}).filter(function(t){return t.length>0}).join("&"):null;return e?"?"+e:""}function i(t,e,n){var r={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:e.query||{},params:e.params||{},fullPath:u(e),matched:t?a(t):[]};return n&&(r.redirectedFrom=u(n)),Object.freeze(r)}function a(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function u(t){var e=t.path,n=t.query;void 0===n&&(n={});var r=t.hash;return void 0===r&&(r=""),(e||"/")+o(n)+r}function c(t,e){return e===$t?t===e:!!e&&(t.path&&e.path?t.path.replace(Tt,"")===e.path.replace(Tt,"")&&t.hash===e.hash&&s(t.query,e.query):!(!t.name||!e.name)&&(t.name===e.name&&t.hash===e.hash&&s(t.query,e.query)&&s(t.params,e.params)))}function s(t,e){void 0===t&&(t={}),void 0===e&&(e={});var n=Object.keys(t),r=Object.keys(e);return n.length===r.length&&n.every(function(n){return String(t[n])===String(e[n])})}function p(t,e){return 0===t.path.replace(Tt,"/").indexOf(e.path.replace(Tt,"/"))&&(!e.hash||t.hash===e.hash)&&f(t.query,e.query)}function f(t,e){for(var n in e)if(!(n in t))return!1;return!0}function h(t){if(!(t.metaKey||t.ctrlKey||t.shiftKey||t.defaultPrevented||void 0!==t.button&&0!==t.button)){if(t.target&&t.target.getAttribute){var e=t.target.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function l(t){if(t)for(var e,n=0;n=0&&(e=t.slice(r),t=t.slice(0,r));var o=t.indexOf("?");return o>=0&&(n=t.slice(o+1),t=t.slice(0,o)),{path:t,query:n,hash:e}}function m(t){return t.replace(/\/\//g,"/")}function g(t,e,n){var r=e||Object.create(null),o=n||Object.create(null);return t.forEach(function(t){w(r,o,t)}),{pathMap:r,nameMap:o}}function w(t,e,n,r,o){var i=n.path,a=n.name,u={path:b(i,r),components:n.components||{default:n.component},instances:{},name:a,parent:r,matchAs:o,redirect:n.redirect,beforeEnter:n.beforeEnter,meta:n.meta||{},props:null==n.props?{}:n.components?n.props:{default:n.props}};if(n.children&&n.children.forEach(function(n){var r=o?m(o+"/"+n.path):void 0;w(t,e,n,u,r)}),void 0!==n.alias)if(Array.isArray(n.alias))n.alias.forEach(function(o){var i={path:o,children:n.children};w(t,e,i,r,u.path)});else{var c={path:n.alias,children:n.children};w(t,e,c,r,u.path)}t[u.path]||(t[u.path]=u),a&&(e[a]||(e[a]=u))}function b(t,e){return t=t.replace(/\/$/,""),"/"===t[0]?t:null==e?t:m(e.path+"/"+t)}function x(t,e){for(var n,r=[],o=0,i=0,a="",u=e&&e.delimiter||"/";null!=(n=Ft.exec(t));){var c=n[0],s=n[1],p=n.index;if(a+=t.slice(i,p),i=p+c.length,s)a+=s[1];else{var f=t[i],h=n[2],l=n[3],d=n[4],y=n[5],v=n[6],m=n[7];a&&(r.push(a),a="");var g=null!=h&&null!=f&&f!==h,w="+"===v||"*"===v,b="?"===v||"*"===v,x=n[2]||u,k=d||y;r.push({name:l||o++,prefix:h||"",delimiter:x,optional:b,repeat:w,partial:g,asterisk:!!m,pattern:k?A(k):m?".*":"[^"+j(x)+"]+?"})}}return i-1&&(r.params[c]=e.params[c]);if(i)return r.path=U(i.path,r.params,'named route "'+o+'"'),u(i,r,n)}else if(r.path){r.params={};for(var f in s)if(B(f,r.params,r.path))return u(s[f],r,n)}return u(null,r)}function o(e,n){var o=e.redirect,a="function"==typeof o?o(i(e,n)):o;if("string"==typeof a&&(a={path:a}),!a||"object"!=typeof a)return u(null,n);var c=a,s=c.name,f=c.path,h=n.query,l=n.hash,d=n.params;if(h=c.hasOwnProperty("query")?c.query:h,l=c.hasOwnProperty("hash")?c.hash:l,d=c.hasOwnProperty("params")?c.params:d,s){p[s];return r({_normalized:!0,name:s,query:h,hash:l,params:d},void 0,n)}if(f){var y=H(f,e),v=U(y,d,'redirect route with path "'+y+'"');return r({_normalized:!0,path:v,query:h,hash:l},void 0,n)}return t(!1,"invalid redirect option: "+JSON.stringify(a)),u(null,n)}function a(t,e,n){var o=U(n,e.params,'aliased route with path "'+n+'"'),i=r({_normalized:!0,path:o});if(i){var a=i.matched,c=a[a.length-1];return e.params=i.params,u(c,e)}return u(null,e)}function u(t,e,n){return t&&t.redirect?o(t,n||e):t&&t.matchAs?a(t,e,t.matchAs):i(t,e,n)}var c=g(e),s=c.pathMap,p=c.nameMap;return{match:r,addRoutes:n}}function B(t,e,n){var r=P(t),o=r.regexp,i=r.keys,a=n.match(o);if(!a)return!1;if(!e)return!0;for(var u=1,c=a.length;u=t.length?n():t[o]?e(t[o],function(){r(o+1)}):r(o+1)};r(0)}function nt(t){if(!t)if(Pt){var e=document.querySelector("base");t=e?e.getAttribute("href"):"/"}else t="/";return"/"!==t.charAt(0)&&(t="/"+t),t.replace(/\/$/,"")}function rt(t,e){var n,r=Math.max(t.length,e.length);for(n=0;n=0?e:0)+"#"+t)}function kt(t,e,n){var r="hash"===n?"#"+e:e;return t?m(t+"/"+r):r}var Ot,Rt={name:"router-view",functional:!0,props:{name:{type:String,default:"default"}},render:function(t,n){var r=n.props,o=n.children,i=n.parent,a=n.data;a.routerView=!0;for(var u=r.name,c=i.$route,s=i._routerViewCache||(i._routerViewCache={}),p=0,f=!1;i;)i.$vnode&&i.$vnode.data.routerView&&p++,i._inactive&&(f=!0),i=i.$parent;if(a.routerViewDepth=p,f)return t(s[u],a,o);var h=c.matched[p];if(!h)return s[u]=null,t();var l=s[u]=h.components[u],d=a.hook||(a.hook={});return d.init=function(t){h.instances[u]=t.child},d.prepatch=function(t,e){h.instances[u]=e.child},d.destroy=function(t){h.instances[u]===t.child&&(h.instances[u]=void 0)},a.props=e(c,h.props&&h.props[u]),t(l,a,o)}},Et=/[!'()*]/g,jt=function(t){return"%"+t.charCodeAt(0).toString(16)},At=/%2C/g,Ct=function(t){return encodeURIComponent(t).replace(Et,jt).replace(At,",")},_t=decodeURIComponent,Tt=/\/?$/,$t=i(null,{path:"/"}),St=[String,Object],qt=[String,Array],Lt={name:"router-link",props:{to:{type:St,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,event:{type:qt,default:"click"}},render:function(t){var e=this,n=this.$router,r=this.$route,o=n.resolve(this.to,r,this.append),a=o.location,u=o.route,s=o.href,f={},d=this.activeClass||n.options.linkActiveClass||"router-link-active",y=a.path?i(null,a):u;f[d]=this.exact?c(r,y):p(r,y);var v=function(t){h(t)&&(e.replace?n.replace(a):n.push(a))},m={click:h};Array.isArray(this.event)?this.event.forEach(function(t){m[t]=v}):m[this.event]=v;var g={class:f};if("a"===this.tag)g.on=m,g.attrs={href:s};else{var w=l(this.$slots.default);if(w){w.isStatic=!1;var b=Ot.util.extend,x=w.data=b({},w.data);x.on=m;var k=w.data.attrs=b({},w.data.attrs);k.href=s}else g.on=m}return t(this.tag,g,this.$slots.default)}},Pt="undefined"!=typeof window,Ut=Array.isArray||function(t){return"[object Array]"==Object.prototype.toString.call(t)},zt=Ut,Mt=L,Vt=x,Bt=k,Ht=E,It=q,Ft=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");Mt.parse=Vt,Mt.compile=Bt,Mt.tokensToFunction=Ht,Mt.tokensToRegExp=It;var Dt=Object.create(null),Jt=Object.create(null),Kt=Object.create(null),Nt=Pt&&function(){var t=window.navigator.userAgent;return(t.indexOf("Android 2.")===-1&&t.indexOf("Android 4.0")===-1||t.indexOf("Mobile Safari")===-1||t.indexOf("Chrome")!==-1||t.indexOf("Windows Phone")!==-1)&&(window.history&&"pushState"in window.history)}(),Xt=Pt&&window.performance&&window.performance.now?window.performance:Date,Yt=W(),Wt=function(t,e){this.router=t,this.base=nt(e),this.current=$t,this.pending=null,this.ready=!1,this.readyCbs=[]};Wt.prototype.listen=function(t){this.cb=t},Wt.prototype.onReady=function(t){this.ready?t():this.readyCbs.push(t)},Wt.prototype.transitionTo=function(t,e,n){var r=this,o=this.router.match(t,this.current);this.confirmTransition(o,function(){r.updateRoute(o),e&&e(o),r.ensureURL(),r.ready||(r.ready=!0,r.readyCbs.forEach(function(t){t(o)}))},n)},Wt.prototype.confirmTransition=function(t,e,n){var r=this,o=this.current,i=function(){n&&n()};if(c(t,o)&&t.matched.length===o.matched.length)return this.ensureURL(),i();var a=rt(this.current.matched,t.matched),u=a.updated,s=a.deactivated,p=a.activated,f=[].concat(at(s),this.router.beforeHooks,ut(u),p.map(function(t){return t.beforeEnter}),ht(p));this.pending=t;var h=function(e,n){return r.pending!==t?i():void e(t,o,function(t){t===!1?(r.ensureURL(!0),i()):"string"==typeof t||"object"==typeof t?("object"==typeof t&&t.replace?r.replace(t):r.push(t),i()):n(t)})};et(f,h,function(){var n=[],o=function(){return r.current===t},a=st(p,n,o);et(a,h,function(){return r.pending!==t?i():(r.pending=null,e(t),void(r.router.app&&r.router.app.$nextTick(function(){n.forEach(function(t){return t()})})))})})},Wt.prototype.updateRoute=function(t){var e=this.current;this.current=t,this.cb&&this.cb(t),this.router.afterHooks.forEach(function(n){n&&n(t,e)})};var Gt=function(t){function e(e,n){var r=this;t.call(this,e,n);var o=e.options.scrollBehavior;o&&I(),window.addEventListener("popstate",function(t){r.transitionTo(vt(r.base),function(t){o&&F(e,t,r.current,!0)})})}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){Z(m(r.base+t.fullPath)),F(r.router,t,r.current,!1),e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){tt(m(r.base+t.fullPath)),F(r.router,t,r.current,!1),e&&e(t)},n)},e.prototype.ensureURL=function(t){if(vt(this.base)!==this.current.fullPath){var e=m(this.base+this.current.fullPath);t?Z(e):tt(e)}},e.prototype.getCurrentLocation=function(){return vt(this.base)},e}(Wt),Qt=function(t){function e(e,n,r){t.call(this,e,n),r&&mt(this.base)||gt()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;window.addEventListener("hashchange",function(){gt()&&t.transitionTo(wt(),function(t){xt(t.fullPath)})})},e.prototype.push=function(t,e,n){this.transitionTo(t,function(t){bt(t.fullPath),e&&e(t)},n)},e.prototype.replace=function(t,e,n){this.transitionTo(t,function(t){xt(t.fullPath),e&&e(t)},n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;wt()!==e&&(t?bt(e):xt(e))},e.prototype.getCurrentLocation=function(){return wt()},e}(Wt),Zt=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index+1).concat(t),r.index++,e&&e(t)},n)},e.prototype.replace=function(t,e,n){var r=this;this.transitionTo(t,function(t){r.stack=r.stack.slice(0,r.index).concat(t),e&&e(t)},n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,function(){e.index=n,e.updateRoute(r)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Wt),te=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.afterHooks=[],this.matcher=V(t.routes||[]);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Nt,this.fallback&&(e="hash"),Pt||(e="abstract"),this.mode=e,e){case"history":this.history=new Gt(this,t.base);break;case"hash":this.history=new Qt(this,t.base,this.fallback);break;case"abstract":this.history=new Zt(this,t.base)}},ee={currentRoute:{}};return te.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},ee.currentRoute.get=function(){return this.history&&this.history.current},te.prototype.init=function(t){var e=this;if(this.apps.push(t),!this.app){this.app=t;var n=this.history;if(n instanceof Gt)n.transitionTo(n.getCurrentLocation());else if(n instanceof Qt){var r=function(){n.setupListeners()};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},te.prototype.beforeEach=function(t){this.beforeHooks.push(t)},te.prototype.afterEach=function(t){this.afterHooks.push(t)},te.prototype.onReady=function(t){this.history.onReady(t)},te.prototype.push=function(t,e,n){this.history.push(t,e,n)},te.prototype.replace=function(t,e,n){this.history.replace(t,e,n)},te.prototype.go=function(t){this.history.go(t)},te.prototype.back=function(){this.go(-1)},te.prototype.forward=function(){this.go(1)},te.prototype.getMatchedComponents=function(t){var e=t?this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},te.prototype.resolve=function(t,e,n){var r=z(t,e||this.history.current,n),o=this.match(r,e),i=o.redirectedFrom||o.fullPath,a=this.history.base,u=kt(a,i,this.mode);return{location:r,route:o,href:u,normalizedTo:r,resolved:o}},te.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==$t&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(te.prototype,ee),te.install=d,te.version="2.2.1",Pt&&window.Vue&&window.Vue.use(te),te});
\ No newline at end of file
diff --git a/release/v1.1.0/public/js/vue.min.js b/release/v1.1.0/public/js/vue.min.js
new file mode 100644
index 0000000..d079a74
--- /dev/null
+++ b/release/v1.1.0/public/js/vue.min.js
@@ -0,0 +1,8 @@
+/*!
+ * Vue.js v2.2.6
+ * (c) 2014-2017 Evan You
+ * Released under the MIT License.
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Vue=t()}(this,function(){"use strict";function e(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function t(e){var t=parseFloat(e);return isNaN(t)?e:t}function n(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}function i(e,t){return $i.call(e,t)}function o(e){return"string"==typeof e||"number"==typeof e}function a(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}function s(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function c(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function u(e,t){for(var n in t)e[n]=t[n];return e}function l(e){return null!==e&&"object"==typeof e}function f(e){return ki.call(e)===Ai}function p(e){for(var t={},n=0;n=0&&co[n].id>e.id;)n--;co.splice(Math.max(n,po)+1,0,e)}else co.push(e);lo||(lo=!0,zi(de))}}function he(e){mo.clear(),me(e,mo)}function me(e,t){var n,r,i=Array.isArray(e);if((i||l(e))&&Object.isExtensible(e)){if(e.__ob__){var o=e.__ob__.dep.id;if(t.has(o))return;t.add(o)}if(i)for(n=e.length;n--;)me(e[n],t);else for(r=Object.keys(e),n=r.length;n--;)me(e[r[n]],t)}}function ge(e,t,n){go.get=function(){return this[t][n]},go.set=function(e){this[t][n]=e},Object.defineProperty(e,n,go)}function ye(e){e._watchers=[];var t=e.$options;t.props&&_e(e,t.props),t.methods&&ke(e,t.methods),t.data?be(e):k(e._data={},!0),t.computed&&we(e,t.computed),t.watch&&Ae(e,t.watch)}function _e(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[],o=!e.$parent;Qi.shouldConvert=o;for(var a in t)!function(o){i.push(o);var a=P(o,t,n,e);A(r,o,a),o in e||ge(e,"_props",o)}(a);Qi.shouldConvert=!0}function be(e){var t=e.$options.data;t=e._data="function"==typeof t?$e(t,e):t||{},f(t)||(t={});for(var n=Object.keys(t),r=e.$options.props,o=n.length;o--;)r&&i(r,n[o])||g(n[o])||ge(e,"_data",n[o]);k(t,!0)}function $e(e,t){try{return e.call(t)}catch(e){return U(e,t,"data()"),{}}}function we(e,t){var n=e._computedWatchers=Object.create(null);for(var r in t){var i=t[r],o="function"==typeof i?i:i.get;n[r]=new ho(e,o,d,yo),r in e||xe(e,r,i)}}function xe(e,t,n){"function"==typeof n?(go.get=Ce(t),go.set=d):(go.get=n.get?n.cache!==!1?Ce(t):n.get:d,go.set=n.set?n.set:d),Object.defineProperty(e,t,go)}function Ce(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),qi.target&&t.depend(),t.value}}function ke(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?d:s(t[n],e)}function Ae(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:e instanceof RegExp&&e.test(t)}function ft(e,t){for(var n in e){var r=e[n];if(r){var i=ut(r.componentOptions);i&&!t(i)&&(pt(r),e[n]=null)}}}function pt(e){e&&(e.componentInstance._inactive||fe(e.componentInstance,"deactivated"),e.componentInstance.$destroy())}function dt(e){for(var t=e.data,n=e,r=e;r.componentInstance;)r=r.componentInstance._vnode,r.data&&(t=vt(r.data,t));for(;n=n.parent;)n.data&&(t=vt(t,n.data));return ht(t)}function vt(e,t){return{staticClass:mt(e.staticClass,t.staticClass),class:e.class?[e.class,t.class]:t.class}}function ht(e){var t=e.class,n=e.staticClass;return n||t?mt(n,gt(t)):""}function mt(e,t){return e?t?e+" "+t:e:t||""}function gt(e){var t="";if(!e)return t;if("string"==typeof e)return e;if(Array.isArray(e)){for(var n,r=0,i=e.length;r-1?Zo[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Zo[e]=/HTMLUnknownElement/.test(t.toString())}function bt(e){if("string"==typeof e){var t=document.querySelector(e);return t?t:document.createElement("div")}return e}function $t(e,t){var n=document.createElement(e);return"select"!==e?n:(t.data&&t.data.attrs&&void 0!==t.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)}function wt(e,t){return document.createElementNS(zo[e],t)}function xt(e){return document.createTextNode(e)}function Ct(e){return document.createComment(e)}function kt(e,t,n){e.insertBefore(t,n)}function At(e,t){e.removeChild(t)}function Ot(e,t){e.appendChild(t)}function Tt(e){return e.parentNode}function St(e){return e.nextSibling}function Et(e){return e.tagName}function jt(e,t){e.textContent=t}function Nt(e,t,n){e.setAttribute(t,n)}function It(e,t){var n=e.data.ref;if(n){var i=e.context,o=e.componentInstance||e.elm,a=i.$refs;t?Array.isArray(a[n])?r(a[n],o):a[n]===o&&(a[n]=void 0):e.data.refInFor?Array.isArray(a[n])&&a[n].indexOf(o)<0?a[n].push(o):a[n]=[o]:a[n]=o}}function Lt(e){return void 0===e||null===e}function Dt(e){return void 0!==e&&null!==e}function Mt(e){return e===!0}function Pt(e,t){return e.key===t.key&&e.tag===t.tag&&e.isComment===t.isComment&&Dt(e.data)===Dt(t.data)&&Rt(e,t)}function Rt(e,t){if("input"!==e.tag)return!0;var n;return(Dt(n=e.data)&&Dt(n=n.attrs)&&n.type)===(Dt(n=t.data)&&Dt(n=n.attrs)&&n.type)}function Ft(e,t,n){var r,i,o={};for(r=t;r<=n;++r)i=e[r].key,Dt(i)&&(o[i]=r);return o}function Ht(e,t){(e.data.directives||t.data.directives)&&Ut(e,t)}function Ut(e,t){var n,r,i,o=e===Qo,a=t===Qo,s=Bt(e.data.directives,e.context),c=Bt(t.data.directives,t.context),u=[],l=[];for(n in c)r=s[n],i=c[n],r?(i.oldValue=r.value,zt(i,"update",t,e),i.def&&i.def.componentUpdated&&l.push(i)):(zt(i,"bind",t,e),i.def&&i.def.inserted&&u.push(i));if(u.length){var f=function(){for(var n=0;n=0&&" "===(m=e.charAt(h));h--);m&&oa.test(m)||(l=!0)}}else void 0===o?(v=i+1,o=e.slice(0,i).trim()):t();if(void 0===o?o=e.slice(0,i).trim():0!==v&&t(),a)for(i=0;i=Oo}function ln(e){return 34===e||39===e}function fn(e){var t=1;for(jo=Eo;!un();)if(e=cn(),ln(e))pn(e);else if(91===e&&t++,93===e&&t--,0===t){No=Eo;break}}function pn(e){for(var t=e;!un()&&(e=cn())!==t;);}function dn(e,t,n){Io=n;var r=t.value,i=t.modifiers,o=e.tag,a=e.attrsMap.type;if("select"===o)mn(e,r,i);else if("input"===o&&"checkbox"===a)vn(e,r,i);else if("input"===o&&"radio"===a)hn(e,r,i);else if("input"===o||"textarea"===o)gn(e,r,i);else if(!Si.isReservedTag(o))return on(e,r,i),!1;return!0}function vn(e,t,n){var r=n&&n.number,i=nn(e,"value")||"null",o=nn(e,"true-value")||"true",a=nn(e,"false-value")||"false";Qt(e,"checked","Array.isArray("+t+")?_i("+t+","+i+")>-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),tn(e,sa,"var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$c){$$i<0&&("+t+"=$$a.concat($$v))}else{$$i>-1&&("+t+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+t+"=$$c}",null,!0)}function hn(e,t,n){var r=n&&n.number,i=nn(e,"value")||"null";i=r?"_n("+i+")":i,Qt(e,"checked","_q("+t+","+i+")"),tn(e,sa,an(t,i),null,!0)}function mn(e,t,n){var r=n&&n.number,i='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(r?"_n(val)":"val")+"})",o="var $$selectedVal = "+i+";";o=o+" "+an(t,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),tn(e,"change",o,null,!0)}function gn(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?aa:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=an(t,l);c&&(f="if($event.target.composing)return;"+f),Qt(e,"value","("+t+")"),tn(e,u,f,null,!0),(s||a||"number"===r)&&tn(e,"blur","$forceUpdate()")}function yn(e){var t;e[aa]&&(t=Di?"change":"input",e[t]=[].concat(e[aa],e[t]||[]),delete e[aa]),e[sa]&&(t=Hi?"click":"change",e[t]=[].concat(e[sa],e[t]||[]),delete e[sa])}function _n(e,t,n,r){if(n){var i=t,o=Lo;t=function(n){null!==(1===arguments.length?i(n):i.apply(null,arguments))&&bn(e,t,r,o)}}Lo.addEventListener(e,t,r)}function bn(e,t,n,r){(r||Lo).removeEventListener(e,t,n)}function $n(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};Lo=t.elm,yn(n),K(n,r,_n,bn,t.context)}}function wn(e,t){if(e.data.domProps||t.data.domProps){var n,r,i=t.elm,o=e.data.domProps||{},a=t.data.domProps||{};a.__ob__&&(a=t.data.domProps=u({},a));for(n in o)null==a[n]&&(i[n]="");for(n in a)if(r=a[n],"textContent"!==n&&"innerHTML"!==n||(t.children&&(t.children.length=0),r!==o[n]))if("value"===n){i._value=r;var s=null==r?"":String(r);xn(i,t,s)&&(i.value=s)}else i[n]=r}}function xn(e,t,n){return!e.composing&&("option"===t.tag||Cn(e,n)||kn(e,n))}function Cn(e,t){return document.activeElement!==e&&e.value!==t}function kn(e,n){var r=e.value,i=e._vModifiers;return i&&i.number||"number"===e.type?t(r)!==t(n):i&&i.trim?r.trim()!==n.trim():r!==n}function An(e){var t=On(e.style);return e.staticStyle?u(e.staticStyle,t):t}function On(e){return Array.isArray(e)?p(e):"string"==typeof e?la(e):e}function Tn(e,t){var n,r={};if(t)for(var i=e;i.componentInstance;)i=i.componentInstance._vnode,i.data&&(n=An(i.data))&&u(r,n);(n=An(e.data))&&u(r,n);for(var o=e;o=o.parent;)o.data&&(n=An(o.data))&&u(r,n);return r}function Sn(e,t){var n=t.data,r=e.data;if(n.staticStyle||n.style||r.staticStyle||r.style){var i,o,a=t.elm,s=e.data.staticStyle,c=e.data.style||{},l=s||c,f=On(t.data.style)||{};t.data.style=f.__ob__?u({},f):f;var p=Tn(t,!0);for(o in l)null==p[o]&&da(a,o,"");for(o in p)(i=p[o])!==l[o]&&da(a,o,null==i?"":i)}}function En(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function jn(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(/\s+/).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t);else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");e.setAttribute("class",n.trim())}}function Nn(e){if(e){if("object"==typeof e){var t={};return e.css!==!1&&u(t,ga(e.name||"v")),u(t,e),t}return"string"==typeof e?ga(e):void 0}}function In(e){ka(function(){ka(e)})}function Ln(e,t){(e._transitionClasses||(e._transitionClasses=[])).push(t),En(e,t)}function Dn(e,t){e._transitionClasses&&r(e._transitionClasses,t),jn(e,t)}function Mn(e,t,n){var r=Pn(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===_a?wa:Ca,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=_a,l=a,f=o.length):t===ba?u>0&&(n=ba,l=u,f=c.length):(l=Math.max(a,u),n=l>0?a>u?_a:ba:null,f=n?n===_a?o.length:c.length:0),{type:n,timeout:l,propCount:f,hasTransform:n===_a&&Aa.test(r[$a+"Property"])}}function Rn(e,t){for(;e.length1}function zn(e,t){t.data.show||Hn(t)}function Jn(e,t,n){var r=t.value,i=e.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=e.options.length;s-1,a.selected!==o&&(a.selected=o);else if(v(qn(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function Kn(e,t){for(var n=0,r=t.length;n=0&&a[i].lowerCasedTag!==s;i--);else i=0;if(i>=0){for(var c=a.length-1;c>=i;c--)t.end&&t.end(a[c].tag,n,r);a.length=i,o=i&&a[i-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,r):"p"===s&&(t.start&&t.start(e,[],!1,n,r),t.end&&t.end(e,n,r))}for(var i,o,a=[],s=t.expectHTML,c=t.isUnaryTag||Oi,u=t.canBeLeftOpenTag||Oi,l=0;e;){if(i=e,o&&ys(o)){var f=o.toLowerCase(),p=_s[f]||(_s[f]=new RegExp("([\\s\\S]*?)("+f+"[^>]*>)","i")),d=0,v=e.replace(p,function(e,n,r){return d=r.length,ys(f)||"noscript"===f||(n=n.replace(//g,"$1").replace(//g,"$1")),t.chars&&t.chars(n),""});l+=e.length-v.length,e=v,r(f,l-d,l)}else{var h=e.indexOf("<");if(0===h){if(Ya.test(e)){var m=e.indexOf("-->");if(m>=0){n(m+3);continue}}if(Qa.test(e)){var g=e.indexOf("]>");if(g>=0){n(g+2);continue}}var y=e.match(Ga);if(y){n(y[0].length);continue}var _=e.match(Za);if(_){var b=l;n(_[0].length),r(_[1],b,l);continue}var $=function(){var t=e.match(qa);if(t){var r={tagName:t[1],attrs:[],start:l};n(t[0].length);for(var i,o;!(i=e.match(Wa))&&(o=e.match(Ja));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=l,r}}();if($){!function(e){var n=e.tagName,i=e.unarySlash;s&&("p"===o&&Va(n)&&r(o),u(n)&&o===n&&r(n));for(var l=c(n)||"html"===n&&"head"===o||!!i,f=e.attrs.length,p=new Array(f),d=0;d=0){for(x=e.slice(h);!(Za.test(x)||qa.test(x)||Ya.test(x)||Qa.test(x)||(C=x.indexOf("<",1))<0);)h+=C,x=e.slice(h);w=e.substring(0,h),n(h)}h<0&&(w=e,e=""),t.chars&&w&&t.chars(w)}if(e===i){t.chars&&t.chars(e);break}}r()}function ur(e,t){var n=t?Cs(t):xs;if(n.test(e)){for(var r,i,o=[],a=n.lastIndex=0;r=n.exec(e);){i=r.index,i>a&&o.push(JSON.stringify(e.slice(a,i)));var s=Wt(r[1].trim());o.push("_s("+s+")"),a=i+r[0].length}return a0,Pi=Li&&Li.indexOf("edge/")>0,Ri=Li&&Li.indexOf("android")>0,Fi=Li&&/iphone|ipad|ipod|ios/.test(Li),Hi=Li&&/chrome\/\d+/.test(Li)&&!Pi,Ui=function(){return void 0===yi&&(yi=!Ii&&"undefined"!=typeof global&&"server"===global.process.env.VUE_ENV),yi},Bi=Ii&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,Vi="undefined"!=typeof Symbol&&b(Symbol)&&"undefined"!=typeof Reflect&&b(Reflect.ownKeys),zi=function(){function e(){r=!1;var e=n.slice(0);n.length=0;for(var t=0;t1?c(n):n;for(var r=c(arguments,1),i=0,o=n.length;i1&&(t[n[0].trim()]=n[1].trim())}}),t}),fa=/^--/,pa=/\s*!important$/,da=function(e,t,n){fa.test(t)?e.style.setProperty(t,n):pa.test(n)?e.style.setProperty(t,n.replace(pa,""),"important"):e.style[ha(t)]=n},va=["Webkit","Moz","ms"],ha=a(function(e){if(Do=Do||document.createElement("div"),"filter"!==(e=wi(e))&&e in Do.style)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=0;np?(u=Lt(n[m+1])?null:n[m+1].elm,h(e,u,n,f,m,r)):f>m&&g(e,t,l,p)}function b(e,t,n,r){if(e!==t){if(Mt(t.isStatic)&&Mt(e.isStatic)&&t.key===e.key&&(Mt(t.isCloned)||Mt(t.isOnce)))return t.elm=e.elm,void(t.componentInstance=e.componentInstance);var i,o=t.data;Dt(o)&&Dt(i=o.hook)&&Dt(i=i.prepatch)&&i(e,t);var a=t.elm=e.elm,s=e.children,c=t.children;if(Dt(o)&&p(t)){for(i=0;i',n.innerHTML.indexOf(t)>0}("\n","
"),Ua=n("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),Ba=n("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),Va=n("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),za=[/"([^"]*)"+/.source,/'([^']*)'+/.source,/([^\s"'=<>`]+)/.source],Ja=new RegExp("^\\s*"+/([^\s"'<>\/=]+)/.source+"(?:\\s*("+/(?:=)/.source+")\\s*(?:"+za.join("|")+"))?"),Ka="[a-zA-Z_][\\w\\-\\.]*",qa=new RegExp("^<((?:"+Ka+"\\:)?"+Ka+")"),Wa=/^\s*(\/?)>/,Za=new RegExp("^<\\/((?:"+Ka+"\\:)?"+Ka+")[^>]*>"),Ga=/^]+>/i,Ya=/^