diff --git a/.gitignore b/.gitignore
index 71e39b9..099d08e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,3 +62,6 @@ typings/
*.lock
/services/node/package-lock.json
+/DMT/.idea/
+.idea/
+.scannerwork/
\ No newline at end of file
diff --git a/DMT/.gitignore b/DMT/.gitignore
index 2b11622..1ed5686 100644
--- a/DMT/.gitignore
+++ b/DMT/.gitignore
@@ -9,3 +9,5 @@ npm-debug.*
web-build/
web-report/
/*.lock
+
+.idea/
diff --git a/DMT/.idea/DMT.iml b/DMT/.idea/DMT.iml
deleted file mode 100644
index 24643cc..0000000
--- a/DMT/.idea/DMT.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DMT/.idea/encodings.xml b/DMT/.idea/encodings.xml
deleted file mode 100644
index 15a15b2..0000000
--- a/DMT/.idea/encodings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/DMT/.idea/misc.xml b/DMT/.idea/misc.xml
deleted file mode 100644
index 24eb271..0000000
--- a/DMT/.idea/misc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DMT/.idea/modules.xml b/DMT/.idea/modules.xml
deleted file mode 100644
index a796769..0000000
--- a/DMT/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DMT/.idea/vcs.xml b/DMT/.idea/vcs.xml
deleted file mode 100644
index 6c0b863..0000000
--- a/DMT/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/DMT/App.js b/DMT/App.js
index 4b06ae7..708d9af 100644
--- a/DMT/App.js
+++ b/DMT/App.js
@@ -7,9 +7,14 @@ import RevenueLicense from './components/RevenueLicense'
import MyVehicles from './components/MyVehicles'
import Logout from './components/actions/Logout'
import Reload from './components/commons/Reload'
-import {ScrollView} from 'react-native';
+import {ScrollView, View} from 'react-native';
import {Image} from "react-native-elements";
import {createAppContainer, createDrawerNavigator, createSwitchNavigator, DrawerItems} from 'react-navigation'
+import configs from "./config.json"
+import FineManagement from "./components/FineManagement";
+
+import SignInScreen from "./components/SignInScreen";
+import PaymentGateway from "./components/PaymentGateway";
export default class App extends React.Component {
@@ -23,10 +28,12 @@ export default class App extends React.Component {
const customDrawerContent = (props) => (
-
+
+
+
)
@@ -44,6 +51,11 @@ const DrawerNavigator = createDrawerNavigator({
headerVisible: false,
},
initialRouteName: 'Home',
+ contentOptions: {
+ activeLabelStyle: {
+ color: configs.theme
+ }
+ },
contentComponent: customDrawerContent,
}
);
@@ -54,6 +66,7 @@ const DrawerNavigatorLoginUsers = createDrawerNavigator({
VehicleDetails: {screen: VehicleDetails},
RevenueLicense: {screen: RevenueLicense},
MyVehicles: {screen: MyVehicles},
+ FineManagement: {screen: FineManagement},
Logout: {screen: Logout}
},
{
@@ -62,12 +75,19 @@ const DrawerNavigatorLoginUsers = createDrawerNavigator({
headerVisible: false,
},
initialRouteName: 'Home',
+ contentOptions: {
+ activeLabelStyle: {
+ color: configs.theme
+ }
+ },
contentComponent: customDrawerContent,
}
);
const SwitchNavigator = createSwitchNavigator({
Reload: {screen: Reload},
+ SignIn: SignInScreen,
+ PaymentGateway: PaymentGateway,
App: DrawerNavigator,
UserApp: DrawerNavigatorLoginUsers
},
diff --git a/DMT/app.json b/DMT/app.json
index 431ad3e..c48e4c6 100644
--- a/DMT/app.json
+++ b/DMT/app.json
@@ -1,7 +1,7 @@
{
"expo": {
"name": "DMT",
- "slug": "first-rn-app",
+ "slug": "dmt",
"privacy": "public",
"sdkVersion": "33.0.0",
"platforms": [
@@ -27,7 +27,12 @@
"supportsTablet": true
},
"android": {
- "package": "com.tmg"
+ "package": "com.tmg",
+ "permissions": [
+ "CAMERA",
+ "READ_EXTERNAL_STORAGE",
+ "WRITE_EXTERNAL_STORAGE"
+ ]
}
}
}
\ No newline at end of file
diff --git a/DMT/assets/OngoingNumberIcons/bigTruckIcon.png b/DMT/assets/OngoingNumberIcons/bigTruckIcon.png
new file mode 100644
index 0000000..9fb5887
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/bigTruckIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/buldozerIcon.png b/DMT/assets/OngoingNumberIcons/buldozerIcon.png
new file mode 100644
index 0000000..47f83d5
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/buldozerIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/busIcon.png b/DMT/assets/OngoingNumberIcons/busIcon.png
new file mode 100644
index 0000000..1394f35
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/busIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/carIcon.png b/DMT/assets/OngoingNumberIcons/carIcon.png
new file mode 100644
index 0000000..d0a4211
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/carIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/cementIcon.png b/DMT/assets/OngoingNumberIcons/cementIcon.png
new file mode 100644
index 0000000..09022ba
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/cementIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/commercialIcon.png b/DMT/assets/OngoingNumberIcons/commercialIcon.png
new file mode 100644
index 0000000..106d774
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/commercialIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/excavatorIcon.png b/DMT/assets/OngoingNumberIcons/excavatorIcon.png
new file mode 100644
index 0000000..2a04efa
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/excavatorIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/forkLiftIcon.png b/DMT/assets/OngoingNumberIcons/forkLiftIcon.png
new file mode 100644
index 0000000..808c521
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/forkLiftIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/lorryIcon.png b/DMT/assets/OngoingNumberIcons/lorryIcon.png
new file mode 100644
index 0000000..e2228a4
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/lorryIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/panzerIcon.png b/DMT/assets/OngoingNumberIcons/panzerIcon.png
new file mode 100644
index 0000000..d089583
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/panzerIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/primeMoverIcon.png b/DMT/assets/OngoingNumberIcons/primeMoverIcon.png
new file mode 100644
index 0000000..664375d
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/primeMoverIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/singleCabIcon.png b/DMT/assets/OngoingNumberIcons/singleCabIcon.png
new file mode 100644
index 0000000..5d6782c
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/singleCabIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/tractorTrailerIcon.png b/DMT/assets/OngoingNumberIcons/tractorTrailerIcon.png
new file mode 100644
index 0000000..3292b0a
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/tractorTrailerIcon.png differ
diff --git a/DMT/assets/OngoingNumberIcons/trailerIcon.png b/DMT/assets/OngoingNumberIcons/trailerIcon.png
new file mode 100644
index 0000000..d9cba27
Binary files /dev/null and b/DMT/assets/OngoingNumberIcons/trailerIcon.png differ
diff --git a/DMT/assets/drawer_image - Copy.png b/DMT/assets/drawer_image - Copy.png
index 5d1bc29..98955d9 100644
Binary files a/DMT/assets/drawer_image - Copy.png and b/DMT/assets/drawer_image - Copy.png differ
diff --git a/DMT/assets/drawer_image.png b/DMT/assets/drawer_image.png
index 379a56c..0f954a0 100644
Binary files a/DMT/assets/drawer_image.png and b/DMT/assets/drawer_image.png differ
diff --git a/DMT/assets/home_logo.png b/DMT/assets/home_logo.png
new file mode 100644
index 0000000..aa475a5
Binary files /dev/null and b/DMT/assets/home_logo.png differ
diff --git a/DMT/assets/icon - Copy.png b/DMT/assets/icon - Copy.png
deleted file mode 100644
index d28cd2f..0000000
Binary files a/DMT/assets/icon - Copy.png and /dev/null differ
diff --git a/DMT/assets/icon-copy.png b/DMT/assets/icon-copy.png
new file mode 100644
index 0000000..a5b387e
Binary files /dev/null and b/DMT/assets/icon-copy.png differ
diff --git a/DMT/assets/icon.png b/DMT/assets/icon.png
index af9247c..d28cd2f 100644
Binary files a/DMT/assets/icon.png and b/DMT/assets/icon.png differ
diff --git a/DMT/assets/icons/email.png b/DMT/assets/icons/email.png
new file mode 100644
index 0000000..c056545
Binary files /dev/null and b/DMT/assets/icons/email.png differ
diff --git a/DMT/assets/icons/fine_management.png b/DMT/assets/icons/fine_management.png
new file mode 100644
index 0000000..7a1330c
Binary files /dev/null and b/DMT/assets/icons/fine_management.png differ
diff --git a/DMT/assets/icons/firstName.png b/DMT/assets/icons/firstName.png
new file mode 100644
index 0000000..f57bf14
Binary files /dev/null and b/DMT/assets/icons/firstName.png differ
diff --git a/DMT/assets/icons/home.png b/DMT/assets/icons/home.png
index 9563284..353d732 100644
Binary files a/DMT/assets/icons/home.png and b/DMT/assets/icons/home.png differ
diff --git a/DMT/assets/icons/left_arrow.png b/DMT/assets/icons/left_arrow.png
new file mode 100644
index 0000000..dd52599
Binary files /dev/null and b/DMT/assets/icons/left_arrow.png differ
diff --git a/DMT/assets/icons/logged_user.png b/DMT/assets/icons/logged_user.png
index ae07978..4c94fa5 100644
Binary files a/DMT/assets/icons/logged_user.png and b/DMT/assets/icons/logged_user.png differ
diff --git a/DMT/assets/icons/login.png b/DMT/assets/icons/login.png
index ee5c5db..304eadc 100644
Binary files a/DMT/assets/icons/login.png and b/DMT/assets/icons/login.png differ
diff --git a/DMT/assets/icons/login_black.png b/DMT/assets/icons/login_black.png
index d7a743e..1a13a4e 100644
Binary files a/DMT/assets/icons/login_black.png and b/DMT/assets/icons/login_black.png differ
diff --git a/DMT/assets/icons/login_logo.png b/DMT/assets/icons/login_logo.png
new file mode 100644
index 0000000..a8b4c02
Binary files /dev/null and b/DMT/assets/icons/login_logo.png differ
diff --git a/DMT/assets/icons/logout.png b/DMT/assets/icons/logout.png
index e727fa8..96bb074 100644
Binary files a/DMT/assets/icons/logout.png and b/DMT/assets/icons/logout.png differ
diff --git a/DMT/assets/icons/my_vehicle.png b/DMT/assets/icons/my_vehicle.png
index d320d33..ac22581 100644
Binary files a/DMT/assets/icons/my_vehicle.png and b/DMT/assets/icons/my_vehicle.png differ
diff --git a/DMT/assets/icons/ongoing_numbers.png b/DMT/assets/icons/ongoing_numbers.png
index 9c750af..75d82eb 100644
Binary files a/DMT/assets/icons/ongoing_numbers.png and b/DMT/assets/icons/ongoing_numbers.png differ
diff --git a/DMT/assets/icons/password.png b/DMT/assets/icons/password.png
new file mode 100644
index 0000000..07fa8dc
Binary files /dev/null and b/DMT/assets/icons/password.png differ
diff --git a/DMT/assets/icons/revenue_license.png b/DMT/assets/icons/revenue_license.png
index aecb0c8..8fd1116 100644
Binary files a/DMT/assets/icons/revenue_license.png and b/DMT/assets/icons/revenue_license.png differ
diff --git a/DMT/assets/icons/user_reg.png b/DMT/assets/icons/user_reg.png
new file mode 100644
index 0000000..60d61f6
Binary files /dev/null and b/DMT/assets/icons/user_reg.png differ
diff --git a/DMT/assets/icons/user_reg2.png b/DMT/assets/icons/user_reg2.png
new file mode 100644
index 0000000..14a2458
Binary files /dev/null and b/DMT/assets/icons/user_reg2.png differ
diff --git a/DMT/assets/icons/user_reg3.png b/DMT/assets/icons/user_reg3.png
new file mode 100644
index 0000000..753ffb6
Binary files /dev/null and b/DMT/assets/icons/user_reg3.png differ
diff --git a/DMT/assets/icons/username.png b/DMT/assets/icons/username.png
new file mode 100644
index 0000000..01f7a89
Binary files /dev/null and b/DMT/assets/icons/username.png differ
diff --git a/DMT/assets/icons/vehicle_info.png b/DMT/assets/icons/vehicle_info.png
index 72461ba..0e5a3dd 100644
Binary files a/DMT/assets/icons/vehicle_info.png and b/DMT/assets/icons/vehicle_info.png differ
diff --git a/DMT/assets/ongoing_numbers.jpg b/DMT/assets/ongoing_numbers.jpg
index 8e99bb2..b821bdd 100644
Binary files a/DMT/assets/ongoing_numbers.jpg and b/DMT/assets/ongoing_numbers.jpg differ
diff --git a/DMT/assets/vehicle_details.jpg b/DMT/assets/vehicle_details.jpg
index bb87834..f619bda 100644
Binary files a/DMT/assets/vehicle_details.jpg and b/DMT/assets/vehicle_details.jpg differ
diff --git a/DMT/components/FineManagement.js b/DMT/components/FineManagement.js
new file mode 100644
index 0000000..57a7a06
--- /dev/null
+++ b/DMT/components/FineManagement.js
@@ -0,0 +1,175 @@
+import React from "react"
+import {AsyncStorage, Image, ScrollView, Text, View, StyleSheet} from "react-native";
+import AppHeader from "./commons/AppHeader";
+import {Button, Card, Icon, Avatar} from "react-native-elements";
+import configs from "../config";
+
+
+export default class HomeScreen extends React.Component {
+ static navigationOptions = {
+ title: "Fine Management",
+ drawerIcon: (
+
+ )
+ };
+
+ state = {
+ fineDetails: [],
+ name: "Ranmal Dewage",
+ licenseDetails: "B54356789",
+ loading: false
+ }
+
+ componentDidMount() {
+ const PUSH_ENDPOINT = configs.dmtUrl + "/fines/"
+ fetch(PUSH_ENDPOINT).then(res => res.json()).then(res => {
+ this.setState({
+ fineDetails: res
+ })
+ });
+ }
+
+ render() {
+ const {navigate} = this.props.navigation;
+ return (
+ <>
+
+
+
+
+
+ Name : {this.state.name}
+ License No : {this.state.licenseDetails}
+
+
+ {this.state.fineDetails.length != 0 && this.state.fineDetails.map((fine) => {
+ const ref = "REF : " + fine.ref
+ return
+
+ Vehicle Number
+ : {fine.vehicleNumber}
+
+
+ Fined Date
+ : {fine.finedDate}
+
+
+ Fined Place
+ : {fine.finedPlace}
+
+
+ Fine Due Date
+ : {fine.fineDueDate}
+
+
+ Reason
+ : {fine.reason}
+
+
+ Amount
+ : Rs.{fine.amount}
+
+
+ Status
+ : {fine.status}
+
+
+ {fine.status === "NOT PAID" && }
+ buttonStyle={{
+ backgroundColor: '#15B867',
+ borderRadius: 15,
+ marginLeft: 0,
+ marginRight: 0,
+ marginBottom: 0,
+ borderWidth: 0
+ }}
+ onPress={() => navigate('PaymentGateway', {
+ name: this.state.name,
+ licenseNumber: this.state.licenseDetails,
+ ref: fine.ref,
+ vno: fine.vehicleNumber,
+ amount: fine.amount
+ })}
+ title=' PAY NOW'/>}
+
+
+
+ })}
+
+
+
+
+
+ >
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ profileText1: {
+ margin: 8,
+ fontSize: 20,
+ textAlign: "left"
+ },
+ profileText2: {
+ margin: 8,
+ fontSize: 20,
+ textAlign: "left",
+ color: "rgb(0,102,102)"
+ }
+});
\ No newline at end of file
diff --git a/DMT/components/HomeScreen.js b/DMT/components/HomeScreen.js
index 1ebfb06..e9b288d 100644
--- a/DMT/components/HomeScreen.js
+++ b/DMT/components/HomeScreen.js
@@ -1,9 +1,10 @@
-import React from 'react';
-import {AsyncStorage, Image, ScrollView, Text} from 'react-native';
-import {Button, Card, Icon} from "react-native-elements";
+import React from 'react'
+import {AsyncStorage, Image, ScrollView, Text, View} from 'react-native'
+import {Button, Card, Icon} from "react-native-elements"
import Footer from './commons/Footer'
import RevenueLicense from './RevenueLicense'
-import AppHeader from "./commons/AppHeader";
+import AppHeader from "./commons/AppHeader"
+import configs from "../config.json"
export default class HomeScreen extends React.Component {
static navigationOptions = {
@@ -27,6 +28,12 @@ export default class HomeScreen extends React.Component {
<>
+ {/**/}
+ {/**/}
+ {/**/}
navigate('OngoingNumbers')}
title='Ongoing Numbers'
@@ -37,13 +44,17 @@ export default class HomeScreen extends React.Component {
service.
}
+ icon={}
buttonStyle={{
borderRadius: 0,
marginLeft: 0,
marginRight: 0,
marginBottom: 0,
- borderWidth: 1
+ borderWidth: 1,
+ borderColor: configs.theme
+ }}
+ titleStyle={{
+ color: configs.theme
}}
type="outline"
onPress={() => navigate('OngoingNumbers')}
@@ -57,13 +68,17 @@ export default class HomeScreen extends React.Component {
You can get the details of a registered vehicle through this service.
}
+ icon={}
buttonStyle={{
borderRadius: 0,
marginLeft: 0,
marginRight: 0,
marginBottom: 0,
- borderWidth: 1
+ borderWidth: 1,
+ borderColor: configs.theme
+ }}
+ titleStyle={{
+ color: configs.theme
}}
type="outline"
onPress={() => navigate('VehicleDetails')}
@@ -80,13 +95,17 @@ export default class HomeScreen extends React.Component {
Land vehicles, Three wheelers, Motor car A-Z online using this service.
}
+ icon={}
buttonStyle={{
borderRadius: 0,
marginLeft: 0,
marginRight: 0,
marginBottom: 0,
- borderWidth: 1
+ borderWidth: 1,
+ borderColor: configs.theme
+ }}
+ titleStyle={{
+ color: configs.theme
}}
type="outline"
onPress={() => navigate('RevenueLicense')}
diff --git a/DMT/components/LoginScreen.js b/DMT/components/LoginScreen.js
index b0f9db0..8a4a8ea 100644
--- a/DMT/components/LoginScreen.js
+++ b/DMT/components/LoginScreen.js
@@ -1,7 +1,15 @@
import React from 'react';
-import {AsyncStorage, Image, Text, ToastAndroid} from 'react-native';
-import {Button} from "react-native-elements";
+import {Image, StyleSheet, View, AsyncStorage, ScrollView, ToastAndroid, KeyboardAvoidingView, Text} from 'react-native';
+import MaterialButtonPrimary1 from "./login_symbols/MaterialButtonPrimary1";
+import MaterialButtonViolet from "./login_symbols/MaterialButtonViolet";
+import MaterialCheckboxWithLabel1 from "./login_symbols/MaterialCheckboxWithLabel1";
+import MaterialButtonWithVioletText1 from "./login_symbols/MaterialButtonWithVioletText1";
+import LoginTextBox from "./login_symbols/LoginTextBox";
+import LoginHeader from "./login_symbols/LoginHeader";
import {registerForPushNotificationsAsync} from "./functions/DmtNotification";
+import {loginUser} from "./functions/Services";
+import configs from "../config";
+import {SocialIcon} from "react-native-elements";
export default class LoginScreen extends React.Component {
static navigationOptions = {
@@ -11,61 +19,208 @@ export default class LoginScreen extends React.Component {
)
};
- componentDidMount() {
- this.setUser()
+ state = {
+ email: '',
+ password: '',
+ remember: false
}
- setUser = async () => {
- const user = {
- id: 1,
- fname: "Tenusha",
- lname: "Guruge",
- email: "tenusha@gmail.com"
+ handleChange = (name, value) => {
+ this.setState({[name]: value})
+ }
+
+ handleSubmit = async () => {
+ // TODO
+ if (this.state.email && this.state.password) {
+ const userObj = {
+ email: this.state.email,
+ password: this.state.password
+ };
+
+ await loginUser(userObj).then(async data => {
+ if (data) {
+ let user = data;
+ await AsyncStorage.setItem("dmt_user", JSON.stringify(user))
+
+ // enable notification
+ registerForPushNotificationsAsync().catch(err => {
+ ToastAndroid.showWithGravityAndOffset(
+ 'notification server error!',
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ })
+ this.props.navigation.navigate("UserApp")
+ } else {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Invalid email or password !',
+ ToastAndroid.LONG,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ }
+ }).catch(err => {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Invalid email or password !',
+ ToastAndroid.LONG,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ });
+
+ } else {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Please fill required fields!',
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
}
+ }
+
+ handleSignUp = async () => {
+ this.props.navigation.navigate("SignIn")
+ }
- AsyncStorage.setItem("dmt_user", JSON.stringify(user))
- console.log("set User")
+ handleToggle = () => {
+ this.setState({remember: !this.state.remember})
}
render() {
const {navigate} = this.props.navigation;
return (
- <>
- Login
-
+ >
);
}
+
+ getBarColor = fines => {
+ if (fines === 0) {
+ return "green"
+ } else if (fines <= 2) {
+ return "orange"
+ } else {
+ return "red"
+ }
+ }
}
const styles = StyleSheet.create({
@@ -197,5 +306,10 @@ const styles = StyleSheet.create({
padding: 10,
width: "100%",
height: 100,
+ },
+ materialButtonPrimary: {
+ width: 150,
+ height: 36,
+ margin: 10
}
});
\ No newline at end of file
diff --git a/DMT/components/OngoingNumbers.js b/DMT/components/OngoingNumbers.js
index e23d914..082f94e 100644
--- a/DMT/components/OngoingNumbers.js
+++ b/DMT/components/OngoingNumbers.js
@@ -1,6 +1,36 @@
import React from 'react';
-import {Image, Text} from 'react-native';
+import {Image, Text, FlatList, Dimensions, View, StyleSheet} from 'react-native';
import AppHeader from "./commons/AppHeader";
+import configs from "../config";
+
+const data = [
+ {key: 'CAR', img: require('../assets/OngoingNumberIcons/carIcon.png'), licNo: 'LW-2006'},
+ {key: 'LORRY TRAILER BOWSER', img: require('../assets/OngoingNumberIcons/bigTruckIcon.png'), licNo: 'CBI-2956'},
+ {key: 'LAND VEHICLE (SMALL)', img: require('../assets/OngoingNumberIcons/buldozerIcon.png'), licNo: 'LW-2006'},
+ {key: 'DUAL PURPOSE (COMMERCIAL)', img: require('../assets/OngoingNumberIcons/busIcon.png'), licNo: 'ND-9377'},
+ {key: 'NON AGRICULTURAL LAND', img: require('../assets/OngoingNumberIcons/cementIcon.png'), licNo: 'LW-2006'},
+ {key: 'COMMERCIAL', img: require('../assets/OngoingNumberIcons/commercialIcon.png'), licNo: 'PJ-8138'},
+ {key: 'LAND VEHICLE', img: require('../assets/OngoingNumberIcons/excavatorIcon.png'), licNo: 'LV-0345'},
+ {key: 'FORK LIFT', img: require('../assets/OngoingNumberIcons/forkLiftIcon.png'), licNo: 'PZ-0541'},
+ {key: 'MOTOR LORRY (COMMERCIAL)', img: require('../assets/OngoingNumberIcons/lorryIcon.png'), licNo: 'RG-1187'},
+ {key: 'SPECIAL PURPOSE', img: require('../assets/OngoingNumberIcons/panzerIcon.png'), licNo: 'LZ-0219'},
+ {key: 'PRIME MOVER', img: require('../assets/OngoingNumberIcons/primeMoverIcon.png'), licNo: 'LO-2345'},
+ {key: 'SINGLE CAB', img: require('../assets/OngoingNumberIcons/singleCabIcon.png'), licNo: 'DAH-1876'},
+ {key: 'TRACTOR TRAILER BOWSER', img: require('../assets/OngoingNumberIcons/tractorTrailerIcon.png'), licNo: 'ZB-0886'},
+ {key: 'OTHER', img: require('../assets/OngoingNumberIcons/trailerIcon.png'), licNo: 'RY-5467'}
+
+];
+
+const formatData = (data, numOfColumns) => {
+ const numberOfFullRows = Math.floor(data.length / numOfColumns);
+
+ let numOfElementsInLastRow = data.length - (numberOfFullRows * numOfColumns);
+ while (numOfElementsInLastRow !== numOfColumns && numOfElementsInLastRow !== 0) {
+ data.push({key: `blank-${numOfElementsInLastRow}`, empty: true});
+ numOfElementsInLastRow = numOfElementsInLastRow + 1;
+ }
+ return data;
+};
export default class OngoingNumbers extends React.Component {
static navigationOptions = {
@@ -10,13 +40,71 @@ export default class OngoingNumbers extends React.Component {
)
};
+ renderItem = ({item, index}) => {
+ if (item.empty === true) {
+ return
+ }
+ return (
+
+
+ {item.key}
+ {/*The next ongoing number is:*/}
+ {item.licNo}
+
+ )
+ };
+
render() {
const {navigate} = this.props.navigation;
return (
<>
-
- Ongoing Numbers
+
+
>
);
}
-}
\ No newline at end of file
+}
+
+const styles = StyleSheet.create({
+ container: {
+ flex: 1,
+ marginVertical: 0,
+ },
+ item: {
+ backgroundColor: '#fff',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flex: 1,
+ margin: 2,
+ borderWidth: 1,
+ borderColor: configs.theme,
+ height: Dimensions.get('window').width / 2,
+ },
+ itemImage: {
+ width: Dimensions.get('window').width / 2 - 60,
+ height: Dimensions.get('window').width / 2 - 150,
+ marginBottom: 10,
+ resizeMode: 'contain'
+ },
+ itemInvisible: {
+ backgroundColor: 'transparent'
+ },
+ itemText: {
+ color: '#000',
+ fontWeight: 'bold',
+ fontSize: 16,
+ textAlign: 'center',
+ marginBottom: 10
+ },
+ itemLicenceNo: {
+ color: configs.theme,
+ fontWeight: 'bold',
+ fontSize: 20
+ }
+});
\ No newline at end of file
diff --git a/DMT/components/PaymentGateway.js b/DMT/components/PaymentGateway.js
new file mode 100644
index 0000000..8006dbb
--- /dev/null
+++ b/DMT/components/PaymentGateway.js
@@ -0,0 +1,199 @@
+import React from 'react';
+import {ScrollView, View, Text, StyleSheet, ToastAndroid, KeyboardAvoidingView, Dimensions} from 'react-native';
+import {Header, Icon, Button, Card} from "react-native-elements"
+import CustomTextField from "./commons/CustomTextField";
+import {formatCardNumber, formatExpiryDate} from "./functions/UitilityFunctions"
+import configs from "../config";
+
+
+export default class PaymentGateway extends React.Component {
+ static navigationOptions = {
+ title: 'PaymentGateway'
+ };
+
+ state = {
+ cardNo: '',
+ cvvNo: '',
+ expDate: '',
+ textColor: '#2089dc'
+ };
+
+ handleChange = (name, value) => {
+
+ if (name === 'expDate') {
+ if (value.length <= 2) {
+ value = value.replace(/\D/g, '');
+ } else if (value.length > 3) {
+ let temp = value.substring(3).replace(/\D/g, '');
+ value = value.substring(0, 3) + temp;
+ }
+ } else {
+ value = value.replace(/\D/g, '');
+ }
+
+ if (name === 'cardNo') {
+ if (value.length <= 16) {
+ let tempValue = formatCardNumber(value);
+ this.setState({[name]: tempValue})
+ }
+ } else if (name === 'expDate') {
+ if (value.length <= 5) {
+ let tempValue = formatExpiryDate(value);
+ this.setState({[name]: tempValue});
+ }
+ } else if (name === 'cvvNo') {
+ if (value.length <= 3) {
+ this.setState({[name]: value});
+ }
+ } else {
+ this.setState({[name]: value})
+ }
+ };
+
+ handleSubmit = () => {
+ if (this.state.cardNo === '' || this.state.expDate === '' || this.state.cvvNo === '') {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Please fill all the respective fields!',
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ } else {
+ this.props.navigation.navigate("Home")
+ }
+ };
+
+
+ render() {
+ const {navigation} = this.props;
+ const {navigate} = this.props.navigation;
+ const name = navigation.getParam("name", "No Name");
+ const licenseNumber = navigation.getParam("licenseNumber", "No licenseNumber");
+ const ref = navigation.getParam("ref", "No Reference");
+ const vno = navigation.getParam("vno", "No Vehicle Number");
+ const amount = navigation.getParam("amount", "No Amount");
+
+ return (
+
+
+ this.props.navigation.navigate("FineManagement")}
+ />}
+ centerComponent={{
+ text: 'PAYMENT', style: {color: 'black', fontWeight: "bold"}
+ }}
+ />
+
+
+
+ Name
+ : {name}
+
+
+ License Number
+ : {licenseNumber}
+
+
+ Reference ID
+ : {ref}
+
+
+ Vehicle Number
+ : {vno}
+
+
+ Amount
+ : {amount}
+
+
+ this.handleChange('cardNo', value)}/>
+
+
+
+ this.handleChange('expDate', value)}
+ />
+
+
+
+
+
+ this.handleChange('cvvNo', value)}/>
+
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ materialMessageTextbox: {
+ padding: 10,
+ width: "100%",
+ height: 100,
+ },
+ materialButtonPrimary: {
+ width: 150,
+ height: 36,
+ margin: 10
+ }
+});
+
diff --git a/DMT/components/RevenueLicense.js b/DMT/components/RevenueLicense.js
index b0b4eff..67f41e9 100644
--- a/DMT/components/RevenueLicense.js
+++ b/DMT/components/RevenueLicense.js
@@ -63,7 +63,7 @@ export default class RevenueLicense extends React.Component {
render() {
const {navigate} = this.props.navigation;
const data = this.state.License_Expiry_Date ?
- <>
+
- License Issued Date : {this.state.License_Issued_Date}
- Vehicle Reg No : {this.state.Vehicle_Reg_No}
- License Expiry Date : {this.state.License_Expiry_Date}
- License No : {this.state.License_No}
+
+ Vehicle Reg No
+ : {this.state.Vehicle_Reg_No}
+
+
+
+ License No
+ : {this.state.License_No}
+
+
+
+ License Issued Date
+ : {this.state.License_Issued_Date}
+
+
+
+ License Expiry Date
+ : {this.state.License_Expiry_Date}
+
- > : null
+ : null
return (
diff --git a/DMT/components/SignInScreen.js b/DMT/components/SignInScreen.js
new file mode 100644
index 0000000..e3fb122
--- /dev/null
+++ b/DMT/components/SignInScreen.js
@@ -0,0 +1,267 @@
+import React from 'react';
+import {
+ Image,
+ KeyboardAvoidingView,
+ ScrollView,
+ StyleSheet,
+ ToastAndroid,
+ TouchableHighlight,
+ View
+} from 'react-native';
+import MaterialButtonPrimary1 from "./login_symbols/MaterialButtonPrimary1";
+import MaterialButtonViolet from "./login_symbols/MaterialButtonViolet";
+import LoginTextBox from "./login_symbols/LoginTextBox";
+import LoginHeader from "./login_symbols/LoginHeader";
+import {Avatar} from "react-native-elements";
+import {registerUser} from "./functions/Services";
+import * as ImagePicker from 'expo-image-picker';
+
+export default class LoginScreen extends React.Component {
+ static navigationOptions = {
+ title: 'SignIn'
+ };
+
+ state = {
+ email: '',
+ password: '',
+ rpassword: '',
+ license: '',
+ firstName: '',
+ lastName: '',
+ image: null,
+ }
+
+ componentDidMount() {
+ // this.getPermissionAsync().catch(err => console.log(err));
+ }
+
+ handleChange = (name, value) => {
+ this.setState({[name]: value})
+ }
+
+ handleSubmit = async () => {
+ const data = this.state
+ if (data.license && data.email && data.password && data.rpassword && data.firstName && data.lastName) {
+ if (data.password === data.rpassword) {
+ const profilePic = new FormData()
+ profilePic.append('photo', {uri: this.state.image, name: this.state.image});
+ const userObj = {
+ firstName: data.firstName,
+ lastName: data.lastName,
+ password: data.password,
+ email: data.email,
+ license: data.license
+ };
+ await registerUser(userObj).then(async res => {
+ if (res && res.responseCode === '01') {
+ ToastAndroid.showWithGravityAndOffset(
+ res.reason,
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ } else if (res) {
+ this.props.navigation.navigate("Login")
+ ToastAndroid.showWithGravityAndOffset(
+ 'Registration successful! please login...',
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ } else {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Unable to register new user. please try again !',
+ ToastAndroid.LONG,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ }
+ }).catch(err => {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Unable to register new user. please try again !',
+ ToastAndroid.LONG,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ });
+ } else {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Password and confirm password does not match!',
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ }
+ } else {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Please fill required fields!',
+ ToastAndroid.SHORT,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ }
+ }
+
+ handleLogin = async () => {
+ this.props.navigation.navigate("Login")
+ }
+
+ handleToggle = () => {
+ this.setState({remember: !this.state.remember})
+ }
+
+ // getPermissionAsync = async () => {
+ // if (Constants.platform.ios) {
+ // const {status} = await Permissions.askAsync(Permissions.CAMERA_ROLL);
+ // if (status !== 'granted') {
+ // alert('Sorry, we need camera roll permissions to make this work!');
+ // }
+ // }
+ // }
+
+ _pickImage = async () => {
+ let result = await ImagePicker.launchImageLibraryAsync({
+ mediaTypes: ImagePicker.MediaTypeOptions.All,
+ allowsEditing: true,
+ aspect: [4, 3],
+ });
+
+ console.log(result);
+
+ if (!result.cancelled) {
+ this.setState({image: result.uri});
+ }
+ };
+
+ render() {
+ const {navigate} = this.props.navigation;
+ const avatar = this.state.image ? :
+ return (
+
+
+
+
+ {/**/}
+ {/**/}
+
+ {/**/}
+ {avatar}
+
+
+
+ this.handleChange('firstName', value)}/>
+
+
+
+ this.handleChange('lastName', value)}/>
+
+
+
+ this.handleChange('license', value)}/>
+
+
+
+ this.handleChange('email', value)}/>
+
+
+
+ this.handleChange('password', value)}/>
+
+
+
+ this.handleChange('rpassword', value)}/>
+
+
+
+
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ flex: 1,
+ backgroundColor: "rgb(255,255,255)"
+ },
+ materialFixedLabelTextbox: {
+ margin: 10,
+ height: 50,
+ width: "80%"
+ },
+ materialButtonPrimary1: {
+ height: 40,
+ opacity: 1,
+ marginLeft: 15,
+ marginRight: 15,
+ marginBottom: 10
+ },
+ materialButtonViolet: {
+ height: 40,
+ marginLeft: 15,
+ marginRight: 15
+ },
+ materialCheckboxWithLabel1: {
+ margin: 20,
+ height: 40,
+ },
+ materialButtonWithVioletText1: {
+ marginTop: 20,
+ height: 36,
+ },
+ profileImgContainer: {
+ height: 130,
+ width: 130,
+ borderRadius: 40,
+ },
+ profileImg: {
+ height: 130,
+ width: 130,
+ borderRadius: 40,
+ }
+});
\ No newline at end of file
diff --git a/DMT/components/VehicleDetails.js b/DMT/components/VehicleDetails.js
index 5081542..c2772dd 100644
--- a/DMT/components/VehicleDetails.js
+++ b/DMT/components/VehicleDetails.js
@@ -1,6 +1,9 @@
import React from 'react';
-import {Image, Text} from 'react-native';
+import {Image, ScrollView, StyleSheet, Text, ToastAndroid, View} from 'react-native';
import AppHeader from "./commons/AppHeader";
+import CustomTextField from "./commons/CustomTextField";
+import {Button, Card} from "react-native-elements";
+import configs from "../config";
export default class VehicleDetails extends React.Component {
static navigationOptions = {
@@ -9,14 +12,178 @@ export default class VehicleDetails extends React.Component {
)
};
+ state = {
+ display: false,
+ vehicleNo: '',
+ vehicleDetails: []
+
+ }
+
+ getVehicle = () => {
+ const PUSH_ENDPOINT = configs.dmtUrl + "/slvehicles/" + this.state.vehicleNo
+ fetch(PUSH_ENDPOINT).then(res => res.json()).then(res => {
+ this.setState({
+ vehicleDetails: res
+ })
+ if (res.length == 0) {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Not a Valid Vehicle Number',
+ ToastAndroid.LONG,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ )
+ }
+ });
+
+ }
+
+ handleChange = (name, value) => {
+ this.setState({[name]: value})
+ }
+
+ handleDisplay = () => {
+ this.setState({display: !this.state.display})
+ }
+
+ handleSubmit = async () => {
+ if (this.state.vehicleNo === '') {
+ ToastAndroid.showWithGravityAndOffset(
+ 'Enter Valid Vehicle Number',
+ ToastAndroid.LONG,
+ ToastAndroid.BOTTOM,
+ 25,
+ 100,
+ );
+ } else {
+ await this.getVehicle()
+ }
+ }
render() {
const {navigate} = this.props.navigation;
return (
<>
- Vehicle Details
+
+ this.handleChange('vehicleNo', value)}
+ />
+
+
+
+
+
+ {this.state.vehicleDetails.length != 0 && this.state.vehicleDetails.map((vehicle) => {
+ return
+
+ Vehicle Number
+ : {vehicle.vehicleNumber}
+
+
+ Vehicle Owner
+ : {vehicle.vehicleOwner}
+
+
+ Engine Number
+ : {vehicle.engineNumber}
+
+
+ Class
+ : {vehicle.class}
+
+
+ Manufacturer
+ : {vehicle.manufacturer}
+
+
+ Model
+ : {vehicle.model}
+
+
+ Year
+ : {vehicle.year}
+
+
+ })}
+
+
+
+
+
>
);
}
-}
\ No newline at end of file
+}
+
+
+const styles = StyleSheet.create({
+ materialMessageTextbox: {
+ padding: 10,
+ width: "100%",
+ height: 100,
+ }
+});
\ No newline at end of file
diff --git a/DMT/components/commons/AppHeader.js b/DMT/components/commons/AppHeader.js
index ad05583..b89acc8 100644
--- a/DMT/components/commons/AppHeader.js
+++ b/DMT/components/commons/AppHeader.js
@@ -1,6 +1,7 @@
-import React from 'react';
-import {Button, Header, Icon} from "react-native-elements";
-import {AsyncStorage, Image} from "react-native";
+import React from 'react'
+import {Button, Header, Icon, Avatar} from "react-native-elements"
+import {AsyncStorage, Image} from "react-native"
+import configs from "../../config.json"
export default class AppHeader extends React.Component {
@@ -16,13 +17,32 @@ export default class AppHeader extends React.Component {
}
render() {
+ //
const userIcon = this.state.user ?
- :
+ :
- const navigateTo = this.state.user ? "Home" : "Login"
+ const navigateTo = this.state.user ? "MyVehicles" : "Login"
+ const centerComponent = this.props.title === 'DMT' ? }
+ buttonStyle={{
+ borderRadius: 0,
+ marginLeft: 0,
+ marginRight: 0,
+ marginBottom: 0
+ }}/> : {text: this.props.title, style: {color: '#fff', fontSize: 20}}
return (
}
buttonStyle={{
borderRadius: 0,
@@ -32,9 +52,11 @@ export default class AppHeader extends React.Component {
}}
onPress={() => this.props.navigation.openDrawer()}/>}
- centerComponent={{text: this.props.title, style: {color: '#fff', fontSize: 20}}}
+ // centerComponent={{text: this.props.title, style: {color: '#fff', fontSize: 20}}}
+ centerComponent={centerComponent}
rightComponent={ {
+ this.setState({
+ borderColor: '#FEBE12'
+ })
+ };
+
+ onBlur = () => {
+ this.setState({
+ borderColor: '#E4E4E4'
+ })
+ };
+
+ render() {
+ const {
+ placeholder,
+ value,
+ onChangeText,
+ maxLength,
+ secureTextEntry,
+ returnKeyType,
+ onSubmitEditing
+ } = this.props;
+
+ return (
+
+ )
+ }
+}
+
+Input.propTypes = {
+ value : PropTypes.string,
+ placeholder : PropTypes.string,
+ onChangeText : PropTypes.func,
+ maxLength : PropTypes.number,
+ secureTextEntry : PropTypes.boolean
+};
+
+const styles = {
+ input: {
+ padding: 10,
+ height: 36,
+ flex: 1,
+ flexDirection: 'row',
+ fontSize: 14,
+ borderWidth: 1,
+ borderRadius: 4,
+ color: '#000',
+ paddingLeft: 15,
+ paddingRight: 15
+ }
+};
+
+export { Input }
\ No newline at end of file
diff --git a/DMT/components/commons/LoadingScreen.js b/DMT/components/commons/LoadingScreen.js
index 679bb1b..cfc4f3c 100644
--- a/DMT/components/commons/LoadingScreen.js
+++ b/DMT/components/commons/LoadingScreen.js
@@ -1,6 +1,5 @@
-import React from 'react';
-import {Modal, StyleSheet, View} from 'react-native';
-import {Image} from "react-native-elements";
+import React from 'react'
+import {Modal, StyleSheet, View, Image} from 'react-native'
export default class LoadingScreen extends React.Component {
diff --git a/DMT/components/commons/Section.js b/DMT/components/commons/Section.js
new file mode 100644
index 0000000..ed7f5c7
--- /dev/null
+++ b/DMT/components/commons/Section.js
@@ -0,0 +1,23 @@
+import React from 'react'
+import { View } from 'react-native'
+
+const Section = (props) => {
+ const { container } = styles;
+ return (
+
+ {props.children}
+
+ )
+}
+
+const styles = {
+ container: {
+ alignSelf: 'stretch',
+ flexDirection: 'row',
+ justifyContent: 'flex-start',
+ position: 'relative',
+ marginBottom: 10,
+ }
+};
+
+export { Section }
\ No newline at end of file
diff --git a/DMT/components/functions/Services.js b/DMT/components/functions/Services.js
index 159db4e..91567cc 100644
--- a/DMT/components/functions/Services.js
+++ b/DMT/components/functions/Services.js
@@ -8,6 +8,10 @@ export function getRevenueLicenseDetails(vehicle) {
return callGet(config.dmtUrl + '/revenueLicense/' + vehicle);
}
+export function getUserVehicleDetails(vehicle) {
+ return callGet(config.dmtUrl + '/users/' + vehicle);
+}
+
export function getUserVehicles(uid) {
return callGet(config.dmtUrl + '/users/' + uid + "/vehicles");
}
@@ -20,6 +24,14 @@ export function addUserVehicle(uid,body) {
return callPost(config.dmtUrl + '/users/' + uid + "/vehicles/", body);
}
+export function loginUser(body) {
+ return callPost(config.user_backend + '/users/login', body);
+}
+
+export function registerUser(body) {
+ return callPost(config.user_backend + '/users', body);
+}
+
const callGet = (url) => {
return fetch(url, {
method: 'GET',
diff --git a/DMT/components/functions/UitilityFunctions.js b/DMT/components/functions/UitilityFunctions.js
new file mode 100644
index 0000000..de4dcc8
--- /dev/null
+++ b/DMT/components/functions/UitilityFunctions.js
@@ -0,0 +1,10 @@
+export const formatCardNumber = (value) => {
+ return value.replace(/\s?/g, '').replace(/(\d{4})/g, '$1 ').trim()
+};
+
+export const formatExpiryDate = (currValue) => {
+ if (currValue.length === 2) {
+ return currValue += '/'
+ }
+ return currValue
+};
diff --git a/DMT/components/login_symbols/LoginHeader.js b/DMT/components/login_symbols/LoginHeader.js
new file mode 100644
index 0000000..45298b7
--- /dev/null
+++ b/DMT/components/login_symbols/LoginHeader.js
@@ -0,0 +1,32 @@
+import React from 'react'
+import {Header, Icon} from "react-native-elements"
+
+export default class AppHeader extends React.Component {
+
+ render() {
+ return (
+ }
+ // buttonStyle={{
+ // borderRadius: 0,
+ // marginLeft: 0,
+ // marginRight: 0,
+ // marginBottom: 0
+ // }}
+ // onPress={() => this.props.navigation.navigate("Home")}/>}
+ leftComponent={ this.props.navigation.navigate("Home")}
+ />}
+ />
+ );
+ }
+}
+
diff --git a/DMT/components/login_symbols/LoginTextBox.js b/DMT/components/login_symbols/LoginTextBox.js
new file mode 100644
index 0000000..2aee2de
--- /dev/null
+++ b/DMT/components/login_symbols/LoginTextBox.js
@@ -0,0 +1,78 @@
+import React from 'react';
+import {StyleSheet, Text, TextInput, View} from 'react-native';
+
+export default class CustomTextField extends React.Component {
+
+ render() {
+ return (
+
+
+
+ {this.props.error ? (
+
+ Error message
+
+ ) : null}
+ {this.props.success ? (
+
+ Success message
+
+ ) : null}
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ backgroundColor: "transparent"
+ },
+ inputStyle: {
+ width: "100%",
+ color: "#000",
+ paddingTop: 8,
+ paddingBottom: 8,
+ borderColor: "#D9D5DC",
+ borderBottomWidth: 1,
+ fontSize: 16,
+ },
+ helper1: {
+ paddingTop: 8,
+ fontSize: 12,
+ textAlign: "left"
+ },
+ helper2: {
+ paddingTop: 8,
+ fontSize: 12,
+ textAlign: "left"
+ }
+});
diff --git a/DMT/components/login_symbols/MaterialButtonPrimary1.js b/DMT/components/login_symbols/MaterialButtonPrimary1.js
new file mode 100644
index 0000000..f720762
--- /dev/null
+++ b/DMT/components/login_symbols/MaterialButtonPrimary1.js
@@ -0,0 +1,41 @@
+import React, {Component} from "react";
+import {StyleSheet, TouchableOpacity, Text} from "react-native";
+import configs from "../../config";
+
+export default class MaterialButtonPrimary1 extends Component {
+ render() {
+ return (
+
+ {this.props.title}
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ backgroundColor: configs.theme,
+ flexDirection: "row",
+ alignItems: "center",
+ justifyContent: "center",
+ paddingRight: 16,
+ paddingLeft: 16,
+ elevation: 2,
+ minWidth: 88,
+ borderRadius: 100,
+ borderColor: "#000000",
+ borderWidth: 0,
+ shadowOffset: {
+ height: 1,
+ width: 0
+ },
+ shadowColor: "#000",
+ shadowOpacity: 0.35,
+ shadowRadius: 5
+ },
+ caption: {
+ color: "#fff",
+ fontSize: 14,
+ fontWeight: "200"
+ }
+});
diff --git a/DMT/components/login_symbols/MaterialButtonViolet.js b/DMT/components/login_symbols/MaterialButtonViolet.js
new file mode 100644
index 0000000..4a644fc
--- /dev/null
+++ b/DMT/components/login_symbols/MaterialButtonViolet.js
@@ -0,0 +1,41 @@
+import React, {Component} from "react";
+import {StyleSheet, TouchableOpacity, Text} from "react-native";
+import configs from "../../config";
+
+export default class MaterialButtonViolet extends Component {
+ render() {
+ return (
+
+ {this.props.title}
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ backgroundColor: "#ffffff00",
+ flexDirection: "row",
+ alignItems: "center",
+ justifyContent: "center",
+ paddingRight: 16,
+ paddingLeft: 16,
+ elevation: 2,
+ minWidth: 88,
+ borderRadius: 100,
+ borderColor: "#000000",
+ borderWidth: 0,
+ shadowOffset: {
+ height: 1,
+ width: 0
+ },
+ shadowColor: "#000",
+ shadowOpacity: 0.35,
+ shadowRadius: 5
+ },
+ caption: {
+ color: configs.theme,
+ fontSize: 14,
+ fontWeight: "200"
+ }
+});
diff --git a/DMT/components/login_symbols/MaterialButtonWithVioletText1.js b/DMT/components/login_symbols/MaterialButtonWithVioletText1.js
new file mode 100644
index 0000000..784bbfc
--- /dev/null
+++ b/DMT/components/login_symbols/MaterialButtonWithVioletText1.js
@@ -0,0 +1,31 @@
+import React, {Component} from "react";
+import {StyleSheet, TouchableOpacity, Text} from "react-native";
+import configs from "../../config";
+
+export default class MaterialButtonWithVioletText1 extends Component {
+ render() {
+ return (
+
+ Forgot Your Password
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ flex: 1,
+ backgroundColor: "transparent",
+ flexDirection: "row",
+ alignItems: "center",
+ justifyContent: "center",
+ paddingRight: 16,
+ paddingLeft: 16,
+ minWidth: 88
+ },
+ caption: {
+ color: configs.theme,
+ fontSize: 14,
+ fontWeight: "200"
+ }
+});
diff --git a/DMT/components/login_symbols/MaterialCheckboxWithLabel1.js b/DMT/components/login_symbols/MaterialCheckboxWithLabel1.js
new file mode 100644
index 0000000..ce1d353
--- /dev/null
+++ b/DMT/components/login_symbols/MaterialCheckboxWithLabel1.js
@@ -0,0 +1,41 @@
+import React, {Component} from "react";
+import {StyleSheet, TouchableOpacity, Text} from "react-native";
+import Icon from "@builderx/icons";
+import configs from "../../config";
+
+export default class MaterialCheckboxWithLabel1 extends Component {
+ render() {
+ return (
+
+
+ {this.props.label || "Label"}
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ backgroundColor: "transparent",
+ flexDirection: "row",
+ },
+ checkIcon: {
+ color: configs.theme,
+ fontSize: 28,
+ lineHeight: 28,
+ alignSelf: "center",
+
+ },
+ checkLabel: {
+ color: "rgba(0,0,0,0.87)",
+ marginLeft: 2,
+ marginTop: 10,
+ fontSize: 16
+ }
+});
diff --git a/DMT/components/login_symbols/MaterialFixedLabelTextbox.js b/DMT/components/login_symbols/MaterialFixedLabelTextbox.js
new file mode 100644
index 0000000..cbc529e
--- /dev/null
+++ b/DMT/components/login_symbols/MaterialFixedLabelTextbox.js
@@ -0,0 +1,44 @@
+import React, {Component} from "react";
+import {StyleSheet, View, Text, TextInput} from "react-native";
+
+export default class MaterialFixedLabelTextbox extends Component {
+ render() {
+ return (
+
+ FixedLabel
+
+
+ );
+ }
+}
+
+const styles = StyleSheet.create({
+ root: {
+ flex: 1,
+ backgroundColor: "transparent",
+ flexDirection: "row",
+ paddingLeft: 16,
+ borderColor: "#D9D5DC",
+ borderBottomWidth: 1
+ },
+ label: {
+ color: "#000",
+ alignSelf: "flex-start",
+ opacity: 0.5,
+ paddingTop: 16,
+ paddingBottom: 8,
+ fontSize: 16,
+ lineHeight: 16
+ },
+ inputStyle: {
+ flex: 1,
+ color: "#000",
+ alignSelf: "stretch",
+ paddingTop: 14,
+ paddingRight: 5,
+ paddingBottom: 8,
+ paddingLeft: 30,
+ fontSize: 16,
+ lineHeight: 16
+ }
+});
diff --git a/DMT/config.json b/DMT/config.json
index d6f77e9..48fe60e 100644
--- a/DMT/config.json
+++ b/DMT/config.json
@@ -1,3 +1,6 @@
{
- "dmtUrl": "http://192.168.8.101:3001"
+ "dmtUrl": "http://192.168.43.102:3001",
+ "user_backend": "http://192.168.43.102:8080",
+ "theme": "#8B0000",
+ "buttonCol": "rgb(92, 166, 220)"
}
\ No newline at end of file
diff --git a/DMT/package.json b/DMT/package.json
index 2702ec7..1873671 100644
--- a/DMT/package.json
+++ b/DMT/package.json
@@ -8,13 +8,15 @@
"eject": "expo eject"
},
"dependencies": {
+ "@builderx/icons": "^0.1.10",
"@react-native-community/async-storage": "^1.5.1",
"expo": "^33.0.0",
+ "expo-image-picker": "^6.0.0",
"expo-permissions": "^5.0.1",
"react": "16.8.3",
"react-dom": "^16.8.6",
"react-native": "https://github.com/expo/react-native/archive/sdk-33.0.0.tar.gz",
- "react-native-elements": "^1.1.0",
+ "react-native-elements": "^1.2.0",
"react-native-gesture-handler": "^1.3.0",
"react-native-off-canvas-menu": "^0.1.32",
"react-native-vector-icons": "^6.6.0",
diff --git a/README.md b/README.md
index 5b5c25b..1e0cf56 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,91 @@
-# Department of Motor Traffic
-Department of Motor Traffic (DMT) - Mobile App
+# Department of Motor Traffic (DMT) - Mobile App
+
+## Introduction
+
+The original DMT app has three main features, which are view ongoing vehicle numbers, vehicle details and revenue license status. This app is an improved version of the previous app with user experience and performance improvements. Also there are new features such as vehicle management, where users can register and track their own vehicles as well as recieve notifications on revenue license stataus. This app has the ability to pay fines of the user online.
+
+The app is developed using React Native, NodeJs, Java Spring Boot and MongoDB.
+
+
+
+Figure_1: home screen
+
+
+## Features of the application
+
+### 1) Sign up
+
+If user is a new to DMT, he/she can regiter to the app or simply login to the system using username and password. Also, users can use their social accounts to login to the app.
+
+
+
+Figure_2: login and registration
+
+
+### 2) Revenue License Status
+
+Once user enter the valid vehicle number, it displays the license details of the entered vehicle.
+
+
+
+Figure_3: revenue license status
+
+
+### 3) My vehicles
+
+User can add new vehicle to his/her account by providing the “Vehicle Number”. Then users can track their vehicles. A colour schema is used to track fines (per week) for that vehicle (eg: green - no fines, orange - less than 3, red - more than 3)
+
+
+
+Figure_4: my vehicle management
+
+
+### 4) Vehicle Details
+
+Once user enters the valid vehicle number, it displays the vehicle details of the entered vehicle.
+
+
+
+Figure_5: home screen
+
+
+### 5) Fine Management
+
+User can Pay the Fines Online by clicking the “PAY” button for the Fines with “NOT PAID” Status. Allow user to pay fines using credit/debit card.
+
+
+
+Figure_5: home screen
+
+
+### 6) Ongoing Numbers
+
+Users can view the current onging number of the each vehicle category.
+
+
+
+Figure_5: home screen
+
+
+## Limitations
+
+• Still there is no back end support for social login.
+
+• Dummy payment gateway is used.
+
+• Real DMT api is not used to get relevant information.
+
+
+## Future Improvements
+
+• Add the ability to track your vehicle using GPS from your phone.
+
+• Overcome and fix the current limitations.
+
+• Add the ability for police to view fine history of a vehicle when the vehicle number is entered.
+
+## Copyright
+
+(C) 2019 Tenusha Guruge
+
+[tenusha.wordpress.com](https://tenusha.wordpress.com)
diff --git a/services/node/.expo/packager-info.json b/services/node/.expo/packager-info.json
new file mode 100644
index 0000000..0c248ba
--- /dev/null
+++ b/services/node/.expo/packager-info.json
@@ -0,0 +1,3 @@
+{
+ "devToolsPort": 19002
+}
\ No newline at end of file
diff --git a/services/node/.expo/settings.json b/services/node/.expo/settings.json
new file mode 100644
index 0000000..8e4fcd2
--- /dev/null
+++ b/services/node/.expo/settings.json
@@ -0,0 +1,7 @@
+{
+ "hostType": "lan",
+ "lanType": "ip",
+ "dev": true,
+ "minify": false,
+ "urlRandomness": null
+}
\ No newline at end of file
diff --git a/services/node/app.js b/services/node/app.js
index 975c1a3..8ee0129 100644
--- a/services/node/app.js
+++ b/services/node/app.js
@@ -1,8 +1,22 @@
'use strict'
const express = require('express')
const app = express()
+const mongoose = require("mongoose")
const revenue_license = require('./routers/revenue_license')
const user_vehicles = require('./routers/user_vehicles')
+const slvehicle_details = require('./routers/slvehicle_details')
+const fine_details = require('./routers/fine_details')
+
+
+mongoose.connect("mongodb://localhost:27017/dmt", { useNewUrlParser: true })
+const db = mongoose.connection
+db.on("error", (err) => {
+ console.log("Error : " + err)
+})
+
+db.once("open", () => {
+ console.log("Connected to MongoDB")
+})
app.use(express.json());
app.use(function (req, res, next) {
@@ -14,6 +28,8 @@ app.use(function (req, res, next) {
app.use("/revenueLicense",revenue_license)
app.use("/users",user_vehicles)
+app.use("/slvehicles",slvehicle_details)
+app.use("/fines",fine_details)
app.listen(3001, err => {
if (err) {
diff --git a/services/node/model/cars.json b/services/node/model/cars.json
new file mode 100644
index 0000000..c41b894
--- /dev/null
+++ b/services/node/model/cars.json
@@ -0,0 +1,19827 @@
+[
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "ILX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "MDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "MDX Sport Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "NSX",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "RDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "RLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "RLX Sport Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Acura",
+ "model": "TLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Alfa Romeo",
+ "model": "4C Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Alfa Romeo",
+ "model": "Giulia",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Alfa Romeo",
+ "model": "Stelvio",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A3",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A4 allroad",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A5",
+ "body_styles": [
+ "Coupe",
+ "Convertible",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "A8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "e-tron",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "Q5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "Q7",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "Q8",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "RS 5",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "S3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "S5",
+ "body_styles": [
+ "Convertible",
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Audi",
+ "model": "SQ5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "2 Series",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "3 Series",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "4 Series",
+ "body_styles": [
+ "Convertible",
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "5 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "7 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "i3",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "i8",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "M2",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "M5",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "M6",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X1",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X2",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X6",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X6 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "BMW",
+ "model": "X7",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "Cascada",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "Enclave",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "Encore",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "Envision",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "LaCrosse",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "Regal Sportback",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Buick",
+ "model": "Regal TourX",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "ATS",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "CT6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "CT6-V",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "CTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "CTS-V",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "Escalade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "Escalade ESV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "XT4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "XT5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Cadillac",
+ "model": "XTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Blazer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Bolt EV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Camaro",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Colorado Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Colorado Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Corvette",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Cruze",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Equinox",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Express 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Express 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Express 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Express 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Impala",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Malibu",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 LD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Sonic",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Spark",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Suburban",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Tahoe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Traverse",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Trax",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chevrolet",
+ "model": "Volt",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chrysler",
+ "model": 300,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Chrysler",
+ "model": "Pacifica",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Dodge",
+ "model": "Challenger",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Dodge",
+ "model": "Charger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Dodge",
+ "model": "Durango",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Dodge",
+ "model": "Grand Caravan Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Dodge",
+ "model": "Journey",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "FIAT",
+ "model": "124 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "FIAT",
+ "model": "500 Abarth",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "FIAT",
+ "model": "500L",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "EcoSport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Edge",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Escape",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Expedition",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Expedition MAX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Explorer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "F150 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "F150 Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "F150 SuperCrew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "F250 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "F350 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Fiesta",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Flex",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Fusion",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Fusion Energi",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Mustang",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Ranger SuperCab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Ranger SuperCrew",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Taurus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Transit 250 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Transit 350 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Transit Connect Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ford",
+ "model": "Transit Connect Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Genesis",
+ "model": "G70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Genesis",
+ "model": "G80",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Genesis",
+ "model": "G90",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Acadia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Canyon Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Canyon Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Sierra 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Sierra 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Sierra 1500 Limited Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Sierra 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Terrain",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Yukon",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "GMC",
+ "model": "Yukon XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Accord",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Accord Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Civic",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Civic Type R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Clarity Electric",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Clarity Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "CR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Fit",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "HR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Insight",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Odyssey",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Passport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Pilot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Honda",
+ "model": "Ridgeline",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Accent",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Elantra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Elantra GT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Ioniq Electric",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Ioniq Hybrid",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Ioniq Plug-in Hybrid",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Kona",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Kona Electric",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "NEXO",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Santa Fe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Santa Fe XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Sonata",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Sonata Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Sonata Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Tucson",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Hyundai",
+ "model": "Veloster",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "Q50",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "Q60",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "Q70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "QX30",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "QX50",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "QX60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "INFINITI",
+ "model": "QX80",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jaguar",
+ "model": "E-PACE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jaguar",
+ "model": "F-PACE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jaguar",
+ "model": "F-TYPE",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jaguar",
+ "model": "I-PACE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jaguar",
+ "model": "XE",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jeep",
+ "model": "Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jeep",
+ "model": "Compass",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jeep",
+ "model": "Grand Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jeep",
+ "model": "Renegade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jeep",
+ "model": "Wrangler",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Jeep",
+ "model": "Wrangler Unlimited",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Cadenza",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Forte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "K900",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Niro",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Niro Plug-in Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Optima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Optima Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Rio",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Sedona",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Sorento",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Soul",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Soul EV",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Sportage",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Kia",
+ "model": "Stinger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Land Rover",
+ "model": "Discovery",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Land Rover",
+ "model": "Discovery Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Land Rover",
+ "model": "Range Rover",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Land Rover",
+ "model": "Range Rover Evoque",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Land Rover",
+ "model": "Range Rover Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Land Rover",
+ "model": "Range Rover Velar",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "ES",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "GS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "GX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "IS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "LC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "LS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "LX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "NX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "RC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "RX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lexus",
+ "model": "UX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lincoln",
+ "model": "Continental",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lincoln",
+ "model": "MKC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lincoln",
+ "model": "MKZ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lincoln",
+ "model": "Nautilus",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lincoln",
+ "model": "Navigator",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Lincoln",
+ "model": "Navigator L",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Maserati",
+ "model": "Ghibli",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Maserati",
+ "model": "Levante",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "CX-3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "CX-5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "CX-9",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "MAZDA3",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "MAZDA6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "MX-5 Miata",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MAZDA",
+ "model": "MX-5 Miata RF",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "A-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "C-Class",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "CLS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "E-Class",
+ "body_styles": [
+ "Convertible",
+ "Coupe",
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "GLC Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "GLS",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG C-Class",
+ "body_styles": [
+ "Sedan",
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG E-Class",
+ "body_styles": [
+ "Coupe",
+ "Convertible",
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLS",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG S-Class",
+ "body_styles": [
+ "Sedan",
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "S-Class",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mercedes-Benz",
+ "model": "SLC",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MINI",
+ "model": "Convertible",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MINI",
+ "model": "Countryman",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MINI",
+ "model": "Hardtop 2 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "MINI",
+ "model": "Hardtop 4 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mitsubishi",
+ "model": "Eclipse Cross",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mitsubishi",
+ "model": "Mirage",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mitsubishi",
+ "model": "Mirage G4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mitsubishi",
+ "model": "Outlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mitsubishi",
+ "model": "Outlander PHEV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Mitsubishi",
+ "model": "Outlander Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "370Z",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Altima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Armada",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Frontier Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Frontier King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "GT-R",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Kicks",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "LEAF",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Maxima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Murano",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "NV1500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "NV200",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "NV2500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "NV3500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "NV3500 HD Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Pathfinder",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Rogue",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Rogue Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Sentra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Titan Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Titan King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "TITAN Single Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "TITAN XD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "TITAN XD King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "TITAN XD Single Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Versa",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Nissan",
+ "model": "Versa Note",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Porsche",
+ "model": "718 Boxster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Porsche",
+ "model": "718 Cayman",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Porsche",
+ "model": 911,
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Porsche",
+ "model": "Cayenne",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Porsche",
+ "model": "Macan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Porsche",
+ "model": "Panamera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ram",
+ "model": "1500 Classic Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ram",
+ "model": "1500 Classic Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ram",
+ "model": "1500 Classic Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ram",
+ "model": "1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ram",
+ "model": "1500 Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Ram",
+ "model": "ProMaster City",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "Ascent",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "BRZ",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "Crosstrek",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "Forester",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "Impreza",
+ "body_styles": [
+ "Wagon",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "Legacy",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "Outback",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Subaru",
+ "model": "WRX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Tesla",
+ "model": "Model 3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Tesla",
+ "model": "Model S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Tesla",
+ "model": "Model X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "4Runner",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": 86,
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Avalon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Avalon Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Camry",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Camry Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "C-HR",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Corolla",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Corolla Hatchback",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Highlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Highlander Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Land Cruiser",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Mirai",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Prius",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Prius c",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Prius Prime",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "RAV4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "RAV4 Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Sequoia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Sienna",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Tacoma Access Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Tacoma Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Tundra CrewMax",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Tundra Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Toyota",
+ "model": "Yaris",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Arteon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Atlas",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Beetle",
+ "body_styles": [
+ "Convertible",
+ "Coupe",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "e-Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Golf Alltrack",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Golf GTI",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Golf R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Golf SportWagen",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Jetta",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Passat",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volkswagen",
+ "model": "Tiguan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volvo",
+ "model": "S60",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volvo",
+ "model": "S90",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volvo",
+ "model": "V90",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volvo",
+ "model": "XC40",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volvo",
+ "model": "XC60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2019,
+ "make": "Volvo",
+ "model": "XC90",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "ILX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "MDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "MDX Sport Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "NSX",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "RDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "RLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "RLX Sport Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Acura",
+ "model": "TLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Alfa Romeo",
+ "model": "4C",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Alfa Romeo",
+ "model": "4C Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Alfa Romeo",
+ "model": "Giulia",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Alfa Romeo",
+ "model": "Stelvio",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Aston Martin",
+ "model": "DB11",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Aston Martin",
+ "model": "Vanquish S",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A3",
+ "body_styles": [
+ "Convertible",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A3 Sportback e-tron",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A4 allroad",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A5",
+ "body_styles": [
+ "Convertible",
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "A8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "Q3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "Q5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "Q7",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "R8",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "RS 3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "RS 5",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "RS 7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "S3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "S4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "S5",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "S6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "S7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "S8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "SQ5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Audi",
+ "model": "TT",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Bentley",
+ "model": "Bentayga",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Bentley",
+ "model": "Continental",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Bentley",
+ "model": "Flying Spur",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Bentley",
+ "model": "Mulsanne",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "2 Series",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "3 Series",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "4 Series",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "5 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "6 Series",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "7 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "i3",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "M2",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "M3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "M4",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "M5",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "M6",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X1",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X2",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X5 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X6",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "BMW",
+ "model": "X6 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "Cascada",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "Enclave",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "Encore",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "Envision",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "LaCrosse",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "Regal Sportback",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Buick",
+ "model": "Regal TourX",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "ATS",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "ATS-V",
+ "body_styles": [
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "CT6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "CTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "CTS-V",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "Escalade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "Escalade ESV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "XT5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Cadillac",
+ "model": "XTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Bolt EV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Camaro",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "City Express",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Colorado Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Colorado Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Corvette",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Cruze",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Equinox",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Express 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Express 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Express 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Express 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Impala",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Malibu",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Sonic",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Spark",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Suburban",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Suburban 3500HD",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Tahoe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Traverse",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Trax",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chevrolet",
+ "model": "Volt",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chrysler",
+ "model": 300,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chrysler",
+ "model": "Pacifica",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Chrysler",
+ "model": "Pacifica Hybrid",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Dodge",
+ "model": "Challenger",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Dodge",
+ "model": "Charger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Dodge",
+ "model": "Durango",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Dodge",
+ "model": "Grand Caravan Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Dodge",
+ "model": "Journey",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ferrari",
+ "model": "488 GTB",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ferrari",
+ "model": "488 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ferrari",
+ "model": "812 Superfast",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ferrari",
+ "model": "GTC4Lusso",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ferrari",
+ "model": "Portofino",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "124 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": 500,
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "500 Abarth",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "500c",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "500c Abarth",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "500e",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "500L",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "FIAT",
+ "model": "500X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "C-MAX Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "EcoSport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Edge",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Escape",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Expedition",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Expedition MAX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Explorer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F150 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F150 Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F150 SuperCrew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F250 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F250 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F250 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F350 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F350 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F350 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "F450 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Fiesta",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Flex",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Focus",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Fusion",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Fusion Energi",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Mustang",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Taurus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit 150 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit 150 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit 250 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit 350 HD Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit 350 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit 350 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit Connect Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ford",
+ "model": "Transit Connect Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Freightliner",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Freightliner",
+ "model": "Sprinter 3500XD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Freightliner",
+ "model": "Sprinter WORKER Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Genesis",
+ "model": "G80",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Genesis",
+ "model": "G90",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Acadia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Canyon Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Canyon Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Savana 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Savana 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Savana 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Savana 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Terrain",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Yukon",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "GMC",
+ "model": "Yukon XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Accord",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Accord Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Civic",
+ "body_styles": [
+ "Coupe",
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Civic Type R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Clarity Electric",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Clarity Fuel Cell",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Clarity Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "CR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Fit",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "HR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Odyssey",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Pilot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Honda",
+ "model": "Ridgeline",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Accent",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Elantra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Elantra GT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Ioniq Electric",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Ioniq Hybrid",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Ioniq Plug-in Hybrid",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Kona",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Santa Fe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Santa Fe Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Sonata",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Sonata Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Sonata Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Hyundai",
+ "model": "Tucson",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "INFINITI",
+ "model": "Q50",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "INFINITI",
+ "model": "Q60",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "INFINITI",
+ "model": "Q70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "INFINITI",
+ "model": "QX30",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "INFINITI",
+ "model": "QX60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "INFINITI",
+ "model": "QX80",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jaguar",
+ "model": "E-PACE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jaguar",
+ "model": "F-PACE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jaguar",
+ "model": "F-TYPE",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jaguar",
+ "model": "XE",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jaguar",
+ "model": "XF",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jaguar",
+ "model": "XJ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jeep",
+ "model": "Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jeep",
+ "model": "Compass",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jeep",
+ "model": "Grand Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jeep",
+ "model": "Renegade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jeep",
+ "model": "Wrangler",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Jeep",
+ "model": "Wrangler Unlimited",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Cadenza",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Forte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Forte5",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Niro",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Niro Plug-in Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Optima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Optima Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Optima Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Rio",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Sedona",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Sorento",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Soul",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Soul EV",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Sportage",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Kia",
+ "model": "Stinger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lamborghini",
+ "model": "Aventador",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lamborghini",
+ "model": "Huracan",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Land Rover",
+ "model": "Discovery",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Land Rover",
+ "model": "Discovery Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Land Rover",
+ "model": "Range Rover",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Land Rover",
+ "model": "Range Rover Evoque",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Land Rover",
+ "model": "Range Rover Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Land Rover",
+ "model": "Range Rover Velar",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "ES",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "GS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "GX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "IS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "LC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "LS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "LX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "NX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "RC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lexus",
+ "model": "RX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "Continental",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "MKC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "MKT",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "MKX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "MKZ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "Navigator",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lincoln",
+ "model": "Navigator L",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Lotus",
+ "model": "Evora 400",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Maserati",
+ "model": "Ghibli",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Maserati",
+ "model": "GranTurismo",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Maserati",
+ "model": "Levante",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Maserati",
+ "model": "Quattroporte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "CX-3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "CX-5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "CX-9",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "MAZDA3",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "MAZDA6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "MX-5 Miata",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MAZDA",
+ "model": "MX-5 Miata RF",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "McLaren",
+ "model": "570GT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "McLaren",
+ "model": "570S",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "McLaren",
+ "model": "720S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "C-Class",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "CLS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "E-Class",
+ "body_styles": [
+ "Convertible",
+ "Coupe",
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "GLC Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "GLS",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG C-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG E-Class",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLC Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLS",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG S-Class",
+ "body_styles": [
+ "Convertible",
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SLC",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-Maybach S-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Metris Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Metris Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Metris WORKER Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Metris WORKER Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "S-Class",
+ "body_styles": [
+ "Sedan",
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "SLC",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 XD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter WORKER Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MINI",
+ "model": "Clubman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MINI",
+ "model": "Convertible",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MINI",
+ "model": "Countryman",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MINI",
+ "model": "Hardtop 2 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "MINI",
+ "model": "Hardtop 4 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mitsubishi",
+ "model": "Eclipse Cross",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mitsubishi",
+ "model": "Mirage",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mitsubishi",
+ "model": "Mirage G4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mitsubishi",
+ "model": "Outlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mitsubishi",
+ "model": "Outlander PHEV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Mitsubishi",
+ "model": "Outlander Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "370Z",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Altima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Armada",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Frontier Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Frontier King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "GT-R",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Kicks",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "LEAF",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Maxima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Murano",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "NV1500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "NV200",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "NV2500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "NV3500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "NV3500 HD Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Pathfinder",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Rogue",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Rogue Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Sentra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Titan Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Titan King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "TITAN Single Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "TITAN XD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "TITAN XD King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "TITAN XD Single Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Versa",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Nissan",
+ "model": "Versa Note",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Porsche",
+ "model": "718 Boxster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Porsche",
+ "model": "718 Cayman",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Porsche",
+ "model": 911,
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Porsche",
+ "model": "Cayenne",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Porsche",
+ "model": "Macan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Porsche",
+ "model": "Panamera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "1500 Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "2500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "2500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "2500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "3500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "3500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "3500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "ProMaster Cargo Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "ProMaster City",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Ram",
+ "model": "ProMaster Window Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Rolls-Royce",
+ "model": "Dawn",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Rolls-Royce",
+ "model": "Ghost",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Rolls-Royce",
+ "model": "Phantom",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Rolls-Royce",
+ "model": "Wraith",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "smart",
+ "model": "fortwo electric drive",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "smart",
+ "model": "fortwo electric drive cabrio",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "BRZ",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "Crosstrek",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "Forester",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "Impreza",
+ "body_styles": [
+ "Wagon",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "Legacy",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "Outback",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Subaru",
+ "model": "WRX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Tesla",
+ "model": "Model 3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Tesla",
+ "model": "Model S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Tesla",
+ "model": "Model X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "4Runner",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": 86,
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Avalon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Avalon Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Camry",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Camry Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "C-HR",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Corolla",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Corolla iM",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Highlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Highlander Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Land Cruiser",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Mirai",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Prius",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Prius c",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Prius Prime",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "RAV4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "RAV4 Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Sequoia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Sienna",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Tacoma Access Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Tacoma Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Tundra CrewMax",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Tundra Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Yaris",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Toyota",
+ "model": "Yaris iA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Atlas",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Beetle",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "e-Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Golf Alltrack",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Golf GTI",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Golf R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Golf SportWagen",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Jetta",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Passat",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Tiguan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volkswagen",
+ "model": "Tiguan Limited",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volvo",
+ "model": "S60",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volvo",
+ "model": "S90",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volvo",
+ "model": "V60",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volvo",
+ "model": "V90",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volvo",
+ "model": "XC60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2018,
+ "make": "Volvo",
+ "model": "XC90",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "ILX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "MDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "MDX Sport Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "NSX",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "RDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "RLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "RLX Sport Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Acura",
+ "model": "TLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Alfa Romeo",
+ "model": "4C",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Alfa Romeo",
+ "model": "Giulia",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Aston Martin",
+ "model": "DB11",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Aston Martin",
+ "model": "Rapide S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Aston Martin",
+ "model": "Vanquish",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Aston Martin",
+ "model": "Vantage",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A3",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A3 Sportback e-tron",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A4 allroad",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A5 Sport",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "A8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "Q3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "Q5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "Q7",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "R8",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "RS 3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "RS 7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "S3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "S5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "S6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "S7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "S8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "SQ5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Audi",
+ "model": "TT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Bentley",
+ "model": "Bentayga",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Bentley",
+ "model": "Continental",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Bentley",
+ "model": "Flying Spur",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Bentley",
+ "model": "Mulsanne",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "2 Series",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "3 Series",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "4 Series",
+ "body_styles": [
+ "Sedan",
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "5 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "6 Series",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "7 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "i3",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "i8",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "M2",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "M3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "M4",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "M6",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X1",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X5 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X6",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "BMW",
+ "model": "X6 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "Cascada",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "Enclave",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "Encore",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "Envision",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "LaCrosse",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "Regal",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Buick",
+ "model": "Verano",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "ATS",
+ "body_styles": [
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "ATS-V",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "CT6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "CTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "CTS-V",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "Escalade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "Escalade ESV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "XT5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Cadillac",
+ "model": "XTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Bolt EV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Camaro",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "City Express",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Colorado Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Colorado Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Corvette",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Cruze",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Equinox",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Express 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Express 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Express 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Express 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Impala",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Malibu",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Sonic",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Spark",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "SS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Suburban",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Suburban 3500HD",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Tahoe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Traverse",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Trax",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chevrolet",
+ "model": "Volt",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chrysler",
+ "model": 200,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chrysler",
+ "model": 300,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chrysler",
+ "model": "Pacifica",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Chrysler",
+ "model": "Pacifica Hybrid",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Dodge",
+ "model": "Challenger",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Dodge",
+ "model": "Charger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Dodge",
+ "model": "Durango",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Dodge",
+ "model": "Grand Caravan Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Dodge",
+ "model": "Journey",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Dodge",
+ "model": "Viper",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ferrari",
+ "model": "488 GTB",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ferrari",
+ "model": "488 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ferrari",
+ "model": "California",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ferrari",
+ "model": "F12berlinetta",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ferrari",
+ "model": "GTC4Lusso",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "124 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": 500,
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "500 Abarth",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "500c",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "500c Abarth",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "500e",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "500L",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "FIAT",
+ "model": "500X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "C-MAX Energi",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "C-MAX Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Edge",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Escape",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Expedition",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Expedition EL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Explorer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F150 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F150 Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F150 SuperCrew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F250 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F250 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F250 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F350 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F350 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F350 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "F450 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Fiesta",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Flex",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Focus",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Fusion",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Fusion Energi",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Mustang",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Taurus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit 150 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit 150 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit 250 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit 350 HD Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit 350 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit 350 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit Connect Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ford",
+ "model": "Transit Connect Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter 3500XD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter WORKER Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Freightliner",
+ "model": "Sprinter WORKER Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Genesis",
+ "model": "G80",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Genesis",
+ "model": "G90",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Acadia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Acadia Limited",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Canyon Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Canyon Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Savana 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Savana 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Savana 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Savana 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Terrain",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Yukon",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "GMC",
+ "model": "Yukon XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Accord",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Accord Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Civic",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Civic Type R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "CR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Fit",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "HR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Odyssey",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Pilot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Honda",
+ "model": "Ridgeline",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Accent",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Azera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Elantra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Elantra GT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Ioniq Electric",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Ioniq Hybrid",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Santa Fe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Santa Fe Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Sonata",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Sonata Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Sonata Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Tucson",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Tucson Fuel Cell",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Hyundai",
+ "model": "Veloster",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "Q50",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "Q60",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "Q70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "QX30",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "QX50",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "QX60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "QX70",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "INFINITI",
+ "model": "QX80",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jaguar",
+ "model": "F-PACE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jaguar",
+ "model": "F-TYPE",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jaguar",
+ "model": "XE",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jaguar",
+ "model": "XF",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jaguar",
+ "model": "XJ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Compass",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Grand Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Patriot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Renegade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Wrangler",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Jeep",
+ "model": "Wrangler Unlimited",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Cadenza",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Forte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Forte5",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "K900",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Niro",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Optima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Optima Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Optima Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Rio",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Sedona",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Sorento",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Soul",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Soul EV",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Kia",
+ "model": "Sportage",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lamborghini",
+ "model": "Aventador",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lamborghini",
+ "model": "Huracan",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Land Rover",
+ "model": "Discovery",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Land Rover",
+ "model": "Discovery Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Land Rover",
+ "model": "Range Rover",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Land Rover",
+ "model": "Range Rover Evoque",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Land Rover",
+ "model": "Range Rover Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "CT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "ES",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "GS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "GX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "IS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "LS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "LX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "NX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "RC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lexus",
+ "model": "RX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "Continental",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "MKC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "MKT",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "MKX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "MKZ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "Navigator",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lincoln",
+ "model": "Navigator L",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Lotus",
+ "model": "Evora 400",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Maserati",
+ "model": "Ghibli",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Maserati",
+ "model": "GranTurismo",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Maserati",
+ "model": "Levante",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Maserati",
+ "model": "Quattroporte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "CX-3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "CX-5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "CX-9",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "MAZDA3",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "MAZDA6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "MX-5 Miata",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MAZDA",
+ "model": "MX-5 Miata RF",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "McLaren",
+ "model": "570GT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "McLaren",
+ "model": "570S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "B-Class",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "C-Class",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "CLS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "E-Class",
+ "body_styles": [
+ "Convertible",
+ "Sedan",
+ "Coupe",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "GLC Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "GLS",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG C-Class",
+ "body_styles": [
+ "Convertible",
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG E-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLC Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLS",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG S-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SLC",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-Maybach S-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Metris Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Metris Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Metris WORKER Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Metris WORKER Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "S-Class",
+ "body_styles": [
+ "Sedan",
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "SLC",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 XD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter WORKER Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter WORKER Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MINI",
+ "model": "Clubman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MINI",
+ "model": "Convertible",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MINI",
+ "model": "Countryman",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MINI",
+ "model": "Hardtop 2 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "MINI",
+ "model": "Hardtop 4 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mitsubishi",
+ "model": "i-MiEV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mitsubishi",
+ "model": "Lancer",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mitsubishi",
+ "model": "Mirage",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mitsubishi",
+ "model": "Mirage G4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mitsubishi",
+ "model": "Outlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Mitsubishi",
+ "model": "Outlander Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "370Z",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Altima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Armada",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Frontier Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Frontier King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "GT-R",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "JUKE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "LEAF",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Maxima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Murano",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "NV1500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "NV200",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "NV2500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "NV3500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "NV3500 HD Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Pathfinder",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Quest",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Rogue",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Rogue Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Sentra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Titan Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Titan King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "TITAN Single Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "TITAN XD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "TITAN XD King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "TITAN XD Single Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Versa",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Nissan",
+ "model": "Versa Note",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Porsche",
+ "model": "718 Boxster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Porsche",
+ "model": "718 Cayman",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Porsche",
+ "model": 911,
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Porsche",
+ "model": "Cayenne",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Porsche",
+ "model": "Macan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Porsche",
+ "model": "Panamera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "1500 Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "2500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "2500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "2500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "3500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "3500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "3500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "ProMaster Cargo Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "ProMaster City",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Ram",
+ "model": "ProMaster Window Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Rolls-Royce",
+ "model": "Dawn",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Rolls-Royce",
+ "model": "Ghost",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Rolls-Royce",
+ "model": "Wraith",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "smart",
+ "model": "fortwo",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "smart",
+ "model": "fortwo cabrio",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "smart",
+ "model": "fortwo electric drive",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "smart",
+ "model": "fortwo electric drive cabrio",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "BRZ",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "Crosstrek",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "Forester",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "Impreza",
+ "body_styles": [
+ "Wagon",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "Legacy",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "Outback",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Subaru",
+ "model": "WRX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Tesla",
+ "model": "Model S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Tesla",
+ "model": "Model X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "4Runner",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": 86,
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Avalon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Avalon Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Camry",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Camry Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Corolla",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Corolla iM",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Highlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Highlander Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Land Cruiser",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Mirai",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Prius",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Prius c",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Prius Prime",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Prius v",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "RAV4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "RAV4 Hybrid",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Sequoia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Sienna",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Tacoma Access Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Tacoma Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Tundra CrewMax",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Tundra Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Tundra Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Yaris",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Toyota",
+ "model": "Yaris iA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Beetle",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "CC",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "e-Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Golf Alltrack",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Golf GTI",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Golf R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Golf SportWagen",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Jetta",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Passat",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Tiguan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Tiguan Limited",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volkswagen",
+ "model": "Touareg",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volvo",
+ "model": "S60",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volvo",
+ "model": "S90",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volvo",
+ "model": "V60",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volvo",
+ "model": "V90",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volvo",
+ "model": "XC60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2017,
+ "make": "Volvo",
+ "model": "XC90",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "ILX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "MDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "RDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "RLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "RLX Sport Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "TLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Alfa Romeo",
+ "model": "4C",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Alfa Romeo",
+ "model": "4C Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "DB9 GT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "Rapide S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "Vanquish",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "Vantage",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A3",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A3 Sportback e-tron",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "allroad",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "Q3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "Q5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "RS 7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "SQ5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "TT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Bentley",
+ "model": "Continental",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Bentley",
+ "model": "Flying Spur",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Bentley",
+ "model": "Mulsanne",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "2 Series",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "3 Series",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "4 Series",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "5 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "6 Series",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "7 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "i3",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "i8",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M2",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M4",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M5",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M6",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X1",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X5 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X6",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X6 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "Z4",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Cascada",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Enclave",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Encore",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Envision",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "LaCrosse",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Regal",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Verano",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "ATS",
+ "body_styles": [
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "ATS-V",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "CT6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "CTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "CTS-V",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "ELR",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "Escalade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "Escalade ESV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "SRX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "XTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Camaro",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "City Express",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Colorado Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Colorado Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Corvette",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Cruze",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Cruze Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Equinox",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Impala",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Impala Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Malibu",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Malibu Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Sonic",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Spark",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Spark EV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "SS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Suburban",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Suburban 3500HD",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Tahoe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Traverse",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Trax",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Volt",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chrysler",
+ "model": 200,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chrysler",
+ "model": 300,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chrysler",
+ "model": "Town & Country",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Challenger",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Charger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Dart",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Durango",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Grand Caravan Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Journey",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Viper",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "488 GTB",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "488 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "California",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "F12berlinetta",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "FF",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": 500,
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500 Abarth",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500c",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500e",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500L",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "C-MAX Energi",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "C-MAX Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Edge",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Escape",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Expedition",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Expedition EL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Explorer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F150 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F150 Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F150 SuperCrew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F250 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F250 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F250 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F350 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F350 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F350 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F450 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Fiesta",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Flex",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Focus",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Fusion",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Fusion Energi",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Mustang",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Taurus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 150 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 150 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 250 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 350 HD Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 350 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 350 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit Connect Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit Connect Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Acadia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Canyon Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Canyon Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Terrain",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Yukon",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Yukon XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Accord",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Civic",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "CR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "CR-Z",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Fit",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "HR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Odyssey",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Pilot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Accent",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Azera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Elantra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Elantra GT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Equus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Genesis",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Genesis Coupe",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Santa Fe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Santa Fe Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Sonata",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Sonata Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Sonata Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Tucson",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Tucson Fuel Cell",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Veloster",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "Q50",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "Q70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX50",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX70",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX80",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jaguar",
+ "model": "F-TYPE",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jaguar",
+ "model": "XF",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jaguar",
+ "model": "XJ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Compass",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Grand Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Patriot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Renegade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Wrangler",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Cadenza",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Forte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Forte Koup",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Forte5",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "K900",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Optima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Optima Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Rio",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Sedona",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Sorento",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Soul",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Soul EV",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Sportage",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lamborghini",
+ "model": "Aventador",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lamborghini",
+ "model": "Huracan",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Discovery Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "LR4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Range Rover",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Range Rover Evoque",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Range Rover Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "CT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "ES",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "GS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "GX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "IS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "LS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "LX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "NX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "RC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "RX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKT",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKZ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "Navigator",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "Navigator L",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Maserati",
+ "model": "Ghibli",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Maserati",
+ "model": "GranTurismo",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Maserati",
+ "model": "Quattroporte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "CX-3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "CX-5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "CX-9",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "MAZDA3",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "MAZDA6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "MX-5 Miata",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "McLaren",
+ "model": "570S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "McLaren",
+ "model": "650S",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "McLaren",
+ "model": "675LT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "B-Class",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "C-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "CLS-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "E-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe",
+ "Wagon",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GL-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLE Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SLK",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-Maybach S 600",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Metris Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Metris Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "S-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "SLK",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Clubman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Convertible",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Countryman",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Hardtop 2 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Hardtop 4 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Paceman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "i-MiEV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "Lancer",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "Outlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "Outlander Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "370Z",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Altima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Frontier Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Frontier King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "GT-R",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "JUKE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "LEAF",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Maxima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Murano",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV1500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV200",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV200 Taxi",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV2500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV3500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV3500 HD Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Pathfinder",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Quest",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Rogue",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Sentra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "TITAN XD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Versa",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Versa Note",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": 911,
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Boxster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Cayenne",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Cayman",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Macan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Panamera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "1500 Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "2500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "2500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "2500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "3500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "3500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "3500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "ProMaster Cargo Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "ProMaster City",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "ProMaster Window Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Dawn",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Ghost",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Phantom",
+ "body_styles": [
+ "Sedan",
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Wraith",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "FR-S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "iA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "iM",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "tC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "smart",
+ "model": "fortwo",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "smart",
+ "model": "fortwo electric drive",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "BRZ",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Crosstrek",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Forester",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Impreza",
+ "body_styles": [
+ "Wagon",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Legacy",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Outback",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "WRX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Tesla",
+ "model": "Model S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Tesla",
+ "model": "Model X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "4Runner",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Avalon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Camry",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Corolla",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Highlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Land Cruiser",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Mirai",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Prius",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Prius c",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Prius v",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "RAV4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Sequoia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Sienna",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tacoma Access Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tacoma Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tundra CrewMax",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tundra Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tundra Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Yaris",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Beetle",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "CC",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "e-Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Eos",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf GTI",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf SportWagen",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Jetta",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Passat",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Tiguan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Touareg",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "S60",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "S80",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "V60",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "XC60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "XC70",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "XC90",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "ILX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "MDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "RDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "RLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "RLX Sport Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Acura",
+ "model": "TLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Alfa Romeo",
+ "model": "4C",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Alfa Romeo",
+ "model": "4C Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "DB9 GT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "Rapide S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "Vanquish",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Aston Martin",
+ "model": "Vantage",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A3",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A3 Sportback e-tron",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "A8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "allroad",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "Q3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "Q5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "RS 7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "S8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "SQ5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Audi",
+ "model": "TT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Bentley",
+ "model": "Continental",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Bentley",
+ "model": "Flying Spur",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Bentley",
+ "model": "Mulsanne",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "2 Series",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "3 Series",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "4 Series",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "5 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "6 Series",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "7 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "i3",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "i8",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M2",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M4",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M5",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "M6",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X1",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X5 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X6",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "X6 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "BMW",
+ "model": "Z4",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Cascada",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Enclave",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Encore",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Envision",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "LaCrosse",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Regal",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Buick",
+ "model": "Verano",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "ATS",
+ "body_styles": [
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "ATS-V",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "CT6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "CTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "CTS-V",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "ELR",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "Escalade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "Escalade ESV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "SRX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Cadillac",
+ "model": "XTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Camaro",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "City Express",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Colorado Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Colorado Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Corvette",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Cruze",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Cruze Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Equinox",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Express 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Impala",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Impala Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Malibu",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Malibu Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Sonic",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Spark",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Spark EV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "SS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Suburban",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Suburban 3500HD",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Tahoe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Traverse",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Trax",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chevrolet",
+ "model": "Volt",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chrysler",
+ "model": 200,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chrysler",
+ "model": 300,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Chrysler",
+ "model": "Town & Country",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Challenger",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Charger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Dart",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Durango",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Grand Caravan Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Journey",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Dodge",
+ "model": "Viper",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "488 GTB",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "488 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "California",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "F12berlinetta",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ferrari",
+ "model": "FF",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": 500,
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500 Abarth",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500c",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500e",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500L",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "FIAT",
+ "model": "500X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "C-MAX Energi",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "C-MAX Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Edge",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Escape",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Expedition",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Expedition EL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Explorer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F150 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F150 Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F150 SuperCrew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F250 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F250 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F250 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F350 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F350 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F350 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "F450 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Fiesta",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Flex",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Focus",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Fusion",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Fusion Energi",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Mustang",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Taurus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 150 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 150 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 250 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 350 HD Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 350 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit 350 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit Connect Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ford",
+ "model": "Transit Connect Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Freightliner",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Acadia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Canyon Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Canyon Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Savana 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Terrain",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Yukon",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "GMC",
+ "model": "Yukon XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Accord",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Civic",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "CR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "CR-Z",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Fit",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "HR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Odyssey",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Honda",
+ "model": "Pilot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Accent",
+ "body_styles": [
+ "Hatchback",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Azera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Elantra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Elantra GT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Equus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Genesis",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Genesis Coupe",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Santa Fe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Santa Fe Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Sonata",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Sonata Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Sonata Plug-in Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Tucson",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Tucson Fuel Cell",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Hyundai",
+ "model": "Veloster",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "Q50",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "Q70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX50",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX70",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "INFINITI",
+ "model": "QX80",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jaguar",
+ "model": "F-TYPE",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jaguar",
+ "model": "XF",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jaguar",
+ "model": "XJ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Compass",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Grand Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Patriot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Renegade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Jeep",
+ "model": "Wrangler",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Cadenza",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Forte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Forte Koup",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Forte5",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "K900",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Optima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Optima Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Rio",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Sedona",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Sorento",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Soul",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Soul EV",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Kia",
+ "model": "Sportage",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lamborghini",
+ "model": "Aventador",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lamborghini",
+ "model": "Huracan",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Discovery Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "LR4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Range Rover",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Range Rover Evoque",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Land Rover",
+ "model": "Range Rover Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "CT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "ES",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "GS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "GX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "IS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "LS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "LX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "NX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "RC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lexus",
+ "model": "RX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKT",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "MKZ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "Navigator",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Lincoln",
+ "model": "Navigator L",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Maserati",
+ "model": "Ghibli",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Maserati",
+ "model": "GranTurismo",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Maserati",
+ "model": "Quattroporte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "CX-3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "CX-5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "CX-9",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "MAZDA3",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "MAZDA6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MAZDA",
+ "model": "MX-5 Miata",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "McLaren",
+ "model": "570S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "McLaren",
+ "model": "650S",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "McLaren",
+ "model": "675LT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "B-Class",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "C-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "CLS-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "E-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe",
+ "Wagon",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GL-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "GLE Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG CLA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLA",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GLE Coupe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG GT",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-AMG SLK",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Mercedes-Maybach S 600",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Metris Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Metris Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "S-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "SL",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "SLK",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Clubman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Convertible",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Countryman",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Hardtop 2 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Hardtop 4 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "MINI",
+ "model": "Paceman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "i-MiEV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "Lancer",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "Outlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Mitsubishi",
+ "model": "Outlander Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "370Z",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Altima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Frontier Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Frontier King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "GT-R",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "JUKE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "LEAF",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Maxima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Murano",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV1500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV200",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV200 Taxi",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV2500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV3500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "NV3500 HD Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Pathfinder",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Quest",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Rogue",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Sentra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "TITAN XD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Versa",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Nissan",
+ "model": "Versa Note",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": 911,
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Boxster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Cayenne",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Cayman",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Macan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Porsche",
+ "model": "Panamera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "1500 Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "2500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "2500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "2500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "3500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "3500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "3500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "ProMaster Cargo Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "ProMaster City",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Ram",
+ "model": "ProMaster Window Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Dawn",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Ghost",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Phantom",
+ "body_styles": [
+ "Sedan",
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Rolls-Royce",
+ "model": "Wraith",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "FR-S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "iA",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "iM",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Scion",
+ "model": "tC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "smart",
+ "model": "fortwo",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "smart",
+ "model": "fortwo electric drive",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "BRZ",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Crosstrek",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Forester",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Impreza",
+ "body_styles": [
+ "Wagon",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Legacy",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "Outback",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Subaru",
+ "model": "WRX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Tesla",
+ "model": "Model S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Tesla",
+ "model": "Model X",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "4Runner",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Avalon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Camry",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Corolla",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Highlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Land Cruiser",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Mirai",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Prius",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Prius c",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Prius v",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "RAV4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Sequoia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Sienna",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tacoma Access Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tacoma Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tundra CrewMax",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tundra Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Tundra Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Toyota",
+ "model": "Yaris",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Beetle",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "CC",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "e-Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Eos",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf GTI",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Golf SportWagen",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Jetta",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Passat",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Tiguan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volkswagen",
+ "model": "Touareg",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "S60",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "S80",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "V60",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "XC60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "XC70",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2016,
+ "make": "Volvo",
+ "model": "XC90",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Acura",
+ "model": "ILX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Acura",
+ "model": "MDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Acura",
+ "model": "RDX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Acura",
+ "model": "RLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Acura",
+ "model": "TLX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Alfa Romeo",
+ "model": "4C",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Alfa Romeo",
+ "model": "4C Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Aston Martin",
+ "model": "DB9",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Aston Martin",
+ "model": "Rapide S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Aston Martin",
+ "model": "Vanquish",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Aston Martin",
+ "model": "Vantage",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "A3",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "A4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "A5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "A6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "A7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "A8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "allroad",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "Q3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "Q5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "Q7",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "R8",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "RS 5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "RS 7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "S3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "S4",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "S5",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "S6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "S7",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "S8",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "SQ5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Audi",
+ "model": "TT",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Bentley",
+ "model": "Continental",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Bentley",
+ "model": "Flying Spur",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Bentley",
+ "model": "Mulsanne",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "2 Series",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "3 Series",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "4 Series",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "5 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "6 Series",
+ "body_styles": [
+ "Coupe",
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "7 Series",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "i3",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "i8",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "M3",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "M4",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "M5",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "M6",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X1",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X3",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X5 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X6",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "X6 M",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "BMW",
+ "model": "Z4",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Buick",
+ "model": "Enclave",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Buick",
+ "model": "Encore",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Buick",
+ "model": "LaCrosse",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Buick",
+ "model": "Regal",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Buick",
+ "model": "Verano",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Cadillac",
+ "model": "ATS",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Cadillac",
+ "model": "CTS",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Cadillac",
+ "model": "Escalade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Cadillac",
+ "model": "Escalade ESV",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Cadillac",
+ "model": "SRX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Cadillac",
+ "model": "XTS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Camaro",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Captiva Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "City Express",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Colorado Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Colorado Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Corvette",
+ "body_styles": [
+ "Convertible",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Cruze",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Equinox",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Express 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Express 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Express 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Express 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Impala",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Impala Limited",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Malibu",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Silverado 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Sonic",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Spark",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Spark EV",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "SS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Suburban",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Tahoe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Traverse",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Trax",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chevrolet",
+ "model": "Volt",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chrysler",
+ "model": 200,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chrysler",
+ "model": 300,
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Chrysler",
+ "model": "Town & Country",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Challenger",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Charger",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Dart",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Durango",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Grand Caravan Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Journey",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Dodge",
+ "model": "Viper",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ferrari",
+ "model": "458 Italia",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ferrari",
+ "model": "458 Speciale",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ferrari",
+ "model": "458 Spider",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ferrari",
+ "model": "California",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ferrari",
+ "model": "F12berlinetta",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ferrari",
+ "model": "FF",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "FIAT",
+ "model": 500,
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "FIAT",
+ "model": "500 Abarth",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "FIAT",
+ "model": "500c",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "FIAT",
+ "model": "500e",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "FIAT",
+ "model": "500L",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "C-MAX Energi",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "C-MAX Hybrid",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Edge",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Escape",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Expedition",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Expedition EL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Explorer",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F150 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F150 Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F150 SuperCrew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F250 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F250 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F250 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F350 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F350 Super Duty Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F350 Super Duty Super Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "F450 Super Duty Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Fiesta",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Flex",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Focus",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Focus ST",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Fusion",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Fusion Energi",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Mustang",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Taurus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit 150 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit 150 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit 250 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit 350 HD Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit 350 Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit 350 Wagon",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit Connect Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ford",
+ "model": "Transit Connect Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Freightliner",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Freightliner",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Acadia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Canyon Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Canyon Extended Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Savana 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Savana 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Savana 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Savana 3500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 1500 Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 2500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Sierra 3500 HD Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Terrain",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Yukon",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "GMC",
+ "model": "Yukon XL",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Accord",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Accord Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Civic",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Crosstour",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "CR-V",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "CR-Z",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Fit",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Odyssey",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Honda",
+ "model": "Pilot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Accent",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Azera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Elantra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Elantra GT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Equus",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Genesis",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Genesis Coupe",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Santa Fe",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Santa Fe Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Sonata",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Tucson",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Tucson Fuel Cell",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Hyundai",
+ "model": "Veloster",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "Q40",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "Q50",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "Q60",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "Q70",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "QX50",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "QX60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "QX70",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "INFINITI",
+ "model": "QX80",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jaguar",
+ "model": "F-TYPE",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jaguar",
+ "model": "XF",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jaguar",
+ "model": "XJ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jaguar",
+ "model": "XK",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jeep",
+ "model": "Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jeep",
+ "model": "Compass",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jeep",
+ "model": "Grand Cherokee",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jeep",
+ "model": "Patriot",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jeep",
+ "model": "Renegade",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Jeep",
+ "model": "Wrangler",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Cadenza",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Forte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Forte Koup",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Forte5",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "K900",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Optima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Optima Hybrid",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Rio",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Sedona",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Sorento",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Soul",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Soul EV",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Kia",
+ "model": "Sportage",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lamborghini",
+ "model": "Aventador",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lamborghini",
+ "model": "Huracan",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Land Rover",
+ "model": "Discovery Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Land Rover",
+ "model": "LR2",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Land Rover",
+ "model": "LR4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Land Rover",
+ "model": "Range Rover",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Land Rover",
+ "model": "Range Rover Evoque",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Land Rover",
+ "model": "Range Rover Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "CT",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "ES",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "GS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "GX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "IS",
+ "body_styles": [
+ "Sedan",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "LS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "LX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "NX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "RC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lexus",
+ "model": "RX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "MKC",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "MKS",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "MKT",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "MKX",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "MKZ",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "Navigator",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Lincoln",
+ "model": "Navigator L",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Maserati",
+ "model": "Ghibli",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Maserati",
+ "model": "GranTurismo",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Maserati",
+ "model": "Quattroporte",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MAZDA",
+ "model": "CX-5",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MAZDA",
+ "model": "CX-9",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MAZDA",
+ "model": "MAZDA3",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MAZDA",
+ "model": "MAZDA5",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MAZDA",
+ "model": "MAZDA6",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MAZDA",
+ "model": "MX-5 Miata",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "McLaren",
+ "model": "650S",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "B-Class",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "C-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "CLA-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "CLS-Class",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "E-Class",
+ "body_styles": [
+ "Convertible",
+ "Wagon",
+ "Coupe",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "G-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "GLA-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "GL-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "GLK-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "M-Class",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "S-Class",
+ "body_styles": [
+ "Sedan",
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "SL-Class",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "SLK-Class",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "SLS-Class",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Crew",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 2500 Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mercedes-Benz",
+ "model": "Sprinter 3500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Convertible",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Countryman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Coupe",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Hardtop 2 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Hardtop 4 Door",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Paceman",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "MINI",
+ "model": "Roadster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mitsubishi",
+ "model": "Lancer",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mitsubishi",
+ "model": "Lancer Evolution",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mitsubishi",
+ "model": "Mirage",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mitsubishi",
+ "model": "Outlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Mitsubishi",
+ "model": "Outlander Sport",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "370Z",
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Altima",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Armada",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Frontier Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Frontier King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "GT-R",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "JUKE",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "LEAF",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Murano",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "NV1500 Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "NV200",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "NV200 Taxi",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "NV2500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "NV3500 HD Cargo",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "NV3500 HD Passenger",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Pathfinder",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Quest",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Rogue",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Rogue Select",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Sentra",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Titan Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Titan King Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Versa",
+ "body_styles": [
+ "Sedan",
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Nissan",
+ "model": "Xterra",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Porsche",
+ "model": 911,
+ "body_styles": [
+ "Coupe",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Porsche",
+ "model": "Boxster",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Porsche",
+ "model": "Cayenne",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Porsche",
+ "model": "Cayman",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Porsche",
+ "model": "Macan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Porsche",
+ "model": "Panamera",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "1500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "1500 Quad Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "1500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "2500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "2500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "2500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "3500 Crew Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "3500 Mega Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "3500 Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "C/V Tradesman",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "ProMaster Cargo Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "ProMaster City",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Ram",
+ "model": "ProMaster Window Van",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Rolls-Royce",
+ "model": "Ghost",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Rolls-Royce",
+ "model": "Phantom",
+ "body_styles": [
+ "Coupe",
+ "Convertible",
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Rolls-Royce",
+ "model": "Wraith",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Scion",
+ "model": "FR-S",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Scion",
+ "model": "iQ",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Scion",
+ "model": "tC",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Scion",
+ "model": "xB",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "smart",
+ "model": "fortwo",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "smart",
+ "model": "fortwo electric drive",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "BRZ",
+ "body_styles": [
+ "Coupe"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "Forester",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "Impreza",
+ "body_styles": [
+ "Sedan",
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "Legacy",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "Outback",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "WRX",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Subaru",
+ "model": "XV Crosstrek",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Tesla",
+ "model": "Model S",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "4Runner",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Avalon",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Camry",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Corolla",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Highlander",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Land Cruiser",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Prius",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Prius c",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Prius Plug-in Hybrid",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Prius v",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "RAV4",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Sequoia",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Sienna",
+ "body_styles": [
+ "Van/Minivan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Tacoma Access Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Tacoma Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Tundra CrewMax",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Tundra Double Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Tundra Regular Cab",
+ "body_styles": [
+ "Pickup"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Venza",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Toyota",
+ "model": "Yaris",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Beetle",
+ "body_styles": [
+ "Hatchback",
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "CC",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "e-Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Eos",
+ "body_styles": [
+ "Convertible"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Golf",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Golf GTI",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Golf R",
+ "body_styles": [
+ "Hatchback"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Golf SportWagen",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Jetta",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Passat",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Tiguan",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volkswagen",
+ "model": "Touareg",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volvo",
+ "model": "S60",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volvo",
+ "model": "S80",
+ "body_styles": [
+ "Sedan"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volvo",
+ "model": "V60",
+ "body_styles": [
+ "Wagon"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volvo",
+ "model": "XC60",
+ "body_styles": [
+ "SUV"
+ ]
+ },
+ {
+ "year": 2015,
+ "make": "Volvo",
+ "model": "XC70",
+ "body_styles": [
+ "Wagon"
+ ]
+ }
+]
\ No newline at end of file
diff --git a/services/node/model/subscription.js b/services/node/model/subscription.js
new file mode 100644
index 0000000..777b10c
--- /dev/null
+++ b/services/node/model/subscription.js
@@ -0,0 +1,10 @@
+const mongoose = require("mongoose");
+
+let SubscriptionsSchema = mongoose.Schema({
+ token: Object,
+ user: Object
+});
+
+const Subscription = mongoose.model('subscriptions', SubscriptionsSchema);
+
+module.exports = Subscription;
diff --git a/services/node/model/userVehicle.js b/services/node/model/userVehicle.js
new file mode 100644
index 0000000..f2e2f98
--- /dev/null
+++ b/services/node/model/userVehicle.js
@@ -0,0 +1,10 @@
+const mongoose = require("mongoose");
+
+let UserVehicleSchema = mongoose.Schema({
+ user: String,
+ vehicles: Array
+});
+
+const UserVehicle = mongoose.model('userVehicles', UserVehicleSchema);
+
+module.exports = UserVehicle;
diff --git a/services/node/model/vehicle.js b/services/node/model/vehicle.js
new file mode 100644
index 0000000..d588344
--- /dev/null
+++ b/services/node/model/vehicle.js
@@ -0,0 +1,18 @@
+const mongoose = require("mongoose");
+
+let vehiclesSchema = mongoose.Schema({
+ vehicle: String,
+ Vehicle_Reg_No: String,
+ make_and_model: String,
+ model_year: String,
+ body_type: String,
+ License_No: Number,
+ License_Issued_Date: String,
+ License_Expiry_Date: String,
+ License_No: Number,
+ fines: Number
+});
+
+const Vehicles = mongoose.model('vehicles', vehiclesSchema);
+
+module.exports = Vehicles;
diff --git a/services/node/models/fines.js b/services/node/models/fines.js
new file mode 100644
index 0000000..945e8b3
--- /dev/null
+++ b/services/node/models/fines.js
@@ -0,0 +1,17 @@
+const mongoose = require("mongoose");
+
+let finesSchema = mongoose.Schema({
+ lno: String,
+ ref: Number,
+ vehicleNumber: String,
+ finedDate: String,
+ finedPlace: String,
+ fineDueDate: String,
+ reason: String,
+ status: String,
+ amount: Number
+});
+
+const Fines = mongoose.model('Fines', finesSchema);
+
+module.exports = Fines;
\ No newline at end of file
diff --git a/services/node/models/slvehicles.js b/services/node/models/slvehicles.js
new file mode 100644
index 0000000..30ac5f2
--- /dev/null
+++ b/services/node/models/slvehicles.js
@@ -0,0 +1,15 @@
+const mongoose = require("mongoose");
+
+let slvehiclesSchema = mongoose.Schema({
+ vehicleNumber: String,
+ vehicleOwner: String,
+ engineNumber: String,
+ class: String,
+ manufacture: String,
+ model: String,
+ year:Number
+});
+
+const SLVehicles = mongoose.model('SLVehicles', slvehiclesSchema);
+
+module.exports = SLVehicles;
\ No newline at end of file
diff --git a/services/node/package.json b/services/node/package.json
index f4ce7d4..29988b6 100644
--- a/services/node/package.json
+++ b/services/node/package.json
@@ -11,6 +11,7 @@
"license": "ISC",
"dependencies": {
"express": "^4.16.4",
+ "mongoose": "^5.6.13",
"node-fetch": "^2.6.0"
}
}
diff --git a/services/node/routers/fine_details.js b/services/node/routers/fine_details.js
new file mode 100644
index 0000000..4ef02e6
--- /dev/null
+++ b/services/node/routers/fine_details.js
@@ -0,0 +1,26 @@
+const express = require('express')
+const router = express.Router()
+const fetch = require("node-fetch")
+const Fines = require("../models/fines")
+
+
+router.get("/", (req, res) => {
+
+ const query = {}
+ try {
+ Fines.find(query, (err, fine) => {
+ if (err) {
+ console.log(err);
+ res.status(500).json(err);
+ } else {
+ res.status(200).json(fine);
+ }
+ });
+
+ } catch (err) {
+ res.status(500).json(err)
+ }
+});
+
+
+module.exports = router;
\ No newline at end of file
diff --git a/services/node/routers/revenue_license.js b/services/node/routers/revenue_license.js
index 1ad47c8..0e566f2 100644
--- a/services/node/routers/revenue_license.js
+++ b/services/node/routers/revenue_license.js
@@ -1,34 +1,64 @@
const express = require('express')
const router = express.Router()
+const cars = require('../model/cars.json')
+const Vehicles = require('../model/vehicle')
router.get('/:vehicleNo', async (req, res) => {
try {
const vehicle = req.params.vehicleNo
+ var vehicleObj = await Vehicles.findOne({ vehicle }).exec()
- var expDateObj = randomDate(new Date(2019, 0, 1), new Date())
- var issueDateObj = new Date(expDateObj)
- issueDateObj.setDate(issueDateObj.getDate() - 1)
-
- var month = ((issueDateObj.getMonth() + 1) < 10 ? '0' : '') + (issueDateObj.getMonth() + 1)
- var date = ((issueDateObj.getDate()) < 10 ? '0' : '') + (issueDateObj.getDate())
+ if (vehicleObj) {
+ const license = {
+ vehicle: vehicleObj.vehicle,
+ Vehicle_Reg_No: vehicleObj.Vehicle_Reg_No,
+ License_Issued_Date: vehicleObj.License_Issued_Date,
+ License_Expiry_Date: vehicleObj.License_Expiry_Date,
+ License_No: vehicleObj.License_No
+ }
+ res.status(200).json(license)
- const issue = (issueDateObj.getFullYear() - 1) + "-" + month + "-" + date;
+ } else {
+ var expDateObj = randomDate(new Date(2019, 0, 1), new Date())
+ var issueDateObj = new Date(expDateObj)
+ issueDateObj.setDate(issueDateObj.getDate() - 1)
- month = ((expDateObj.getMonth() + 1) < 10 ? '0' : '') + (expDateObj.getMonth() + 1)
- date = (expDateObj.getDate() < 10 ? '0' : '') + (expDateObj.getDate())
+ var month = ((issueDateObj.getMonth() + 1) < 10 ? '0' : '') + (issueDateObj.getMonth() + 1)
+ var date = ((issueDateObj.getDate()) < 10 ? '0' : '') + (issueDateObj.getDate())
- const exp = expDateObj.getFullYear() + "-" + month + "-" + date;
+ const issue = (issueDateObj.getFullYear() - 1) + "-" + month + "-" + date;
- license = {
- vehicle:vehicle,
- License_Issued_Date: issue,
- Vehicle_Reg_No: vehicle,
- License_Expiry_Date: exp,
- License_No: Math.floor(Math.random()*9000000) + 1000000
- }
+ month = ((expDateObj.getMonth() + 1) < 10 ? '0' : '') + (expDateObj.getMonth() + 1)
+ date = (expDateObj.getDate() < 10 ? '0' : '') + (expDateObj.getDate())
+
+ const exp = expDateObj.getFullYear() + "-" + month + "-" + date;
- res.status(200).json(license)
+ const indx = Math.floor(Math.random() * cars.length)
+ var make_and_model = cars[indx].make + " " + cars[indx].model
+ var vehicleMod = new Vehicles({
+ vehicle,
+ License_Issued_Date: issue,
+ Vehicle_Reg_No: vehicle,
+ License_Expiry_Date: exp,
+ License_No: Math.floor(Math.random() * 9000000) + 1000000,
+ make_and_model,
+ model_year: cars[indx].year,
+ body_type: cars[indx].body_styles[0],
+ fines: getRandomInt(4)
+ })
+
+ await vehicleMod.save()
+
+ const license = {
+ vehicle: vehicleMod.vehicle,
+ Vehicle_Reg_No: vehicleMod.Vehicle_Reg_No,
+ License_Issued_Date: vehicleMod.License_Issued_Date,
+ License_Expiry_Date: vehicleMod.License_Expiry_Date,
+ License_No: vehicleMod.License_No
+ }
+ res.status(200).json(license)
+ }
} catch (err) {
res.status(500).json(err)
@@ -36,7 +66,11 @@ router.get('/:vehicleNo', async (req, res) => {
});
function randomDate(start, end) {
- return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
+ return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
+}
+
+function getRandomInt(max) {
+ return Math.floor(Math.random() * Math.floor(max));
}
module.exports = router
\ No newline at end of file
diff --git a/services/node/routers/slvehicle_details.js b/services/node/routers/slvehicle_details.js
new file mode 100644
index 0000000..941d40d
--- /dev/null
+++ b/services/node/routers/slvehicle_details.js
@@ -0,0 +1,26 @@
+const express = require('express')
+const router = express.Router()
+const fetch = require("node-fetch")
+const SlVehicles = require("../models/slvehicles")
+
+
+router.get("/:vehicleNo", (req, res) => {
+
+ const query = {vehicleNumber: req.params.vehicleNo}
+ try {
+ SlVehicles.find(query, (err, vehicle) => {
+ if (err) {
+ console.log(err);
+ res.status(500).json(err);
+ } else {
+ res.status(200).json(vehicle);
+ }
+ });
+
+ } catch (err) {
+ res.status(500).json(err)
+ }
+});
+
+
+module.exports = router;
\ No newline at end of file
diff --git a/services/node/routers/user_vehicles.js b/services/node/routers/user_vehicles.js
index 80ce102..4c67cda 100644
--- a/services/node/routers/user_vehicles.js
+++ b/services/node/routers/user_vehicles.js
@@ -1,42 +1,65 @@
const express = require('express')
const router = express.Router()
const fetch = require("node-fetch")
+const cars = require('../model/cars.json')
+const Vehicles = require('../model/vehicle')
+const UserVehicle = require('../model/userVehicle')
+const Subscription = require('../model/subscription')
-var userVehicles=[
- {id:"1",vehicles:["64-8693", "CAA 4902", "KK-3439"]},
- {id:"2",vehicles:["12-8693", "AAA 4359", "KL-1039"]},
- {id:"3",vehicles:["300-8693", "CAE 4430", "LL-1459"]}
-]
+router.get('/:user/vehicles', async (req, res) => {
-var subscriptions = []
+ try {
+ const user = req.params.user
+ var vehicles = await UserVehicle.findOne({ user }).exec()
+ if (vehicles) {
+ res.status(200).json(vehicles.vehicles)
+ } else {
+ res.status(200).json([])
+ }
+ } catch (err) {
+ res.status(500).json(err)
+ }
+});
-router.get('/:uid/vehicles', async (req, res) => {
+router.get('/:vehicleNo', async (req, res) => {
try {
- const userId = req.params.uid
- var vehicles = userVehicles.find(item => item.id == userId).vehicles
- res.status(200).json(vehicles)
+
+ const vehicle = req.params.vehicleNo
+ var vehicleObj = await Vehicles.findOne({ vehicle }).exec()
+
+ if (vehicleObj) {
+ res.status(200).json(vehicleObj)
+ } else {
+
+ const vehicleMod = await createVehicle(vehicle, cars).save()
+
+ res.status(200).json(vehicleMod)
+ }
} catch (err) {
res.status(500).json(err)
}
});
-router.delete('/:uid/vehicles/:vno', async (req, res) => {
+router.delete('/:user/vehicles/:vno', async (req, res) => {
try {
- const userId = req.params.uid
+ const user = req.params.user
const vno = req.params.vno
- for (var i in userVehicles) {
- if(userVehicles[i].id == userId){
- var index = userVehicles[i].vehicles.indexOf(vno)
- if (index > -1) {
- userVehicles[i].vehicles.splice(index, 1);
- }
- }
- }
- res.status(200).json({success:true})
+ const vehicles = await UserVehicle.findOne({ user }).exec()
+
+ if (vehicles) {
+ var index = vehicles.vehicles.indexOf(vno)
+ if (index > -1) {
+ vehicles.vehicles.splice(index, 1);
+ }
+
+ await vehicles.save()
+ }
+
+ res.status(200).json({ success: true })
} catch (err) {
res.status(500).json(err)
@@ -46,15 +69,24 @@ router.delete('/:uid/vehicles/:vno', async (req, res) => {
router.post('/:uid/vehicles/', async (req, res) => {
try {
- const userId = req.params.uid
+ const user = req.params.uid
+
+ const vehicles = await UserVehicle.findOne({ user }).exec()
- for (var i in userVehicles) {
- if(userVehicles[i].id == userId){
- userVehicles[i].vehicles = [...userVehicles[i].vehicles, req.body.vehicle]
- }
- }
+ if (vehicles) {
+ var index = vehicles.vehicles.indexOf(req.body.vehicle)
+ if (!(index > -1)) {
+ vehicles.vehicles = [...vehicles.vehicles, req.body.vehicle]
+ await vehicles.save()
+ }
+ } else {
+ await new UserVehicle({
+ user,
+ vehicles: [req.body.vehicle]
+ }).save()
+ }
- res.status(200).json({success:true})
+ res.status(200).json({ success: true })
} catch (err) {
res.status(500).json(err)
@@ -64,59 +96,98 @@ router.post('/:uid/vehicles/', async (req, res) => {
//Notification service
router.post('/push-token', async (req, res) => {
-
try {
- subscriptions.push(req.body)
- res.status(200).json({success:true})
+ var subscriptions = await Subscription.findOne({ "user.id": req.body.user.id }).exec()
+ if (subscriptions) {
+ subscriptions.token = { ...subscriptions.token, ...req.body.token }
+ subscriptions.user = { ...subscriptions.user, ...req.body.user }
+ await subscriptions.save()
+ res.status(200).json({ success: true })
+ } else {
+ await new Subscription({ ...req.body }).save()
+ res.status(200).json({ success: true })
+ }
} catch (err) {
res.status(500).json(err)
}
});
+router.get('/notifications/push-token', async (req, res) => {
+ try {
+ var subscriptions = await Subscription.find().exec()
+ res.status(200).json(subscriptions)
+
+ } catch (err) {
+ res.status(500).json(err)
+ }
+})
+
router.post('/:id/notify', async (req, res) => {
try {
- const userId = req.params.id
- var vehicles = []
- var token = ""
-
- for (var i in userVehicles) {
- if(userVehicles[i].id == userId){
- vehicles = userVehicles[i].vehicles
- }
- }
-
-
- for (var j in subscriptions) {
- if(subscriptions[j].user.id == userId){
- token = subscriptions[j].token.value
- console.log(token)
- }
- }
-
-
- if(token && (vehicles.length > 0)){
- return fetch("https://exp.host/--/api/v2/push/send",{
- method: 'POST',
- body: JSON.stringify({
- to: token,
- sound: "default",
- body: "Your revenue licence of vehicle " + vehicles[0] + " is ending soon. Click here to see more details."
- }),
- headers: { "Content-Type": "application/json" }
- })
- .then(response =>
- res.status(200).json({success:true})
- ).catch(err => {
- console.log(err)
- res.status(500).json(err)
- })
- }else{
- res.status(404).json({success:false})
- }
-
-
+ const userId = req.params.id
+ const vehicles = await UserVehicle.findOne({ user: userId }).exec()
+ var subscriptions = await Subscription.findOne({ "user.id": userId }).exec()
+
+ var token = subscriptions.token.value
+
+
+ if (token && (vehicles.vehicles.length > 0)) {
+ return fetch("https://exp.host/--/api/v2/push/send", {
+ method: 'POST',
+ body: JSON.stringify({
+ to: token,
+ sound: "default",
+ body: "Your revenue licence of vehicle " + vehicles.vehicles[0] + " is ending soon. Click here to see more details."
+ }),
+ headers: { "Content-Type": "application/json" }
+ })
+ .then(response =>
+ res.status(200).json({ success: true })
+ ).catch(err => {
+ console.log(err)
+ res.status(500).json(err)
+ })
+ } else {
+ res.status(404).json({ success: false })
+ }
+
+ } catch (err) {
+ res.status(500).json(err)
+ }
+});
+
+router.post('/:id/notify/:vno', async (req, res) => {
+
+ try {
+ const userId = req.params.id
+ const vno = String(req.params.vno)
+ const vehicles = await UserVehicle.findOne({ user: userId }).exec()
+ var subscriptions = await Subscription.findOne({ "user.id": userId }).exec()
+
+ var token = subscriptions.token.value
+ var index = vehicles.vehicles.indexOf(vno)
+
+ if (token && (vehicles.vehicles.length > 0) && index > -1) {
+ return fetch("https://exp.host/--/api/v2/push/send", {
+ method: 'POST',
+ body: JSON.stringify({
+ to: token,
+ sound: "default",
+ body: "Your revenue licence of vehicle " + vno + " is ending soon. Click here to see more details."
+ }),
+ headers: { "Content-Type": "application/json" }
+ })
+ .then(response =>
+ res.status(200).json({ success: true })
+ ).catch(err => {
+ console.log(err)
+ res.status(500).json(err)
+ })
+ } else {
+ res.status(404).json({ success: false })
+ }
} catch (err) {
res.status(500).json(err)
@@ -130,4 +201,43 @@ handleErrors = response => {
return response
}
+function randomDate(start, end) {
+ return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
+}
+
+function getRandomInt(max) {
+ return Math.floor(Math.random() * Math.floor(max));
+}
+
+function createVehicle(vehicle, cars) {
+ var expDateObj = randomDate(new Date(2019, 0, 1), new Date())
+ var issueDateObj = new Date(expDateObj)
+ issueDateObj.setDate(issueDateObj.getDate() - 1)
+
+ var month = ((issueDateObj.getMonth() + 1) < 10 ? '0' : '') + (issueDateObj.getMonth() + 1)
+ var date = ((issueDateObj.getDate()) < 10 ? '0' : '') + (issueDateObj.getDate())
+
+ const issue = (issueDateObj.getFullYear() - 1) + "-" + month + "-" + date;
+
+ month = ((expDateObj.getMonth() + 1) < 10 ? '0' : '') + (expDateObj.getMonth() + 1)
+ date = (expDateObj.getDate() < 10 ? '0' : '') + (expDateObj.getDate())
+
+ const exp = expDateObj.getFullYear() + "-" + month + "-" + date;
+
+ const indx = Math.floor(Math.random() * cars.length)
+ var make_and_model = cars[indx].make + " " + cars[indx].model
+ var vehicleMod = new Vehicles({
+ vehicle,
+ License_Issued_Date: issue,
+ Vehicle_Reg_No: vehicle,
+ License_Expiry_Date: exp,
+ License_No: Math.floor(Math.random() * 9000000) + 1000000,
+ make_and_model,
+ model_year: cars[indx].year,
+ body_type: cars[indx].body_styles[0],
+ fines: getRandomInt(4)
+ })
+ return vehicleMod
+}
+
module.exports = router
\ No newline at end of file
diff --git a/services/spring/uee-user-backend/.gitignore b/services/spring/uee-user-backend/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/services/spring/uee-user-backend/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/services/spring/uee-user-backend/.mvn/wrapper/MavenWrapperDownloader.java b/services/spring/uee-user-backend/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..72308aa
--- /dev/null
+++ b/services/spring/uee-user-backend/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,114 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL =
+ "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if(mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if(mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: : " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if(!outputFile.getParentFile().exists()) {
+ if(!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/services/spring/uee-user-backend/.mvn/wrapper/maven-wrapper.jar b/services/spring/uee-user-backend/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..01e6799
Binary files /dev/null and b/services/spring/uee-user-backend/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/services/spring/uee-user-backend/.mvn/wrapper/maven-wrapper.properties b/services/spring/uee-user-backend/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..cd0d451
--- /dev/null
+++ b/services/spring/uee-user-backend/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
diff --git a/services/spring/uee-user-backend/mvnw b/services/spring/uee-user-backend/mvnw
new file mode 100644
index 0000000..8b9da3b
--- /dev/null
+++ b/services/spring/uee-user-backend/mvnw
@@ -0,0 +1,286 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+ # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ wget "$jarUrl" -O "$wrapperJarPath"
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ curl -o "$wrapperJarPath" "$jarUrl"
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/services/spring/uee-user-backend/mvnw.cmd b/services/spring/uee-user-backend/mvnw.cmd
new file mode 100644
index 0000000..fef5a8f
--- /dev/null
+++ b/services/spring/uee-user-backend/mvnw.cmd
@@ -0,0 +1,161 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ echo Found %WRAPPER_JAR%
+) else (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+ echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/services/spring/uee-user-backend/pom.xml b/services/spring/uee-user-backend/pom.xml
new file mode 100644
index 0000000..bafa0e0
--- /dev/null
+++ b/services/spring/uee-user-backend/pom.xml
@@ -0,0 +1,60 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.8.RELEASE
+
+
+ lk.sliit.uee
+ uee-user-backend
+ 0.0.1-SNAPSHOT
+ uee-user-backend
+ Demo project for Spring Boot
+
+
+ 1.8
+ 3.1.1
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ commons-io
+ commons-io
+ 2.6
+
+
+
+ org.springframework
+ spring-aspects
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/UeeUserBackendApplication.java b/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/UeeUserBackendApplication.java
new file mode 100644
index 0000000..ceefa68
--- /dev/null
+++ b/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/UeeUserBackendApplication.java
@@ -0,0 +1,13 @@
+package lk.sliit.uee;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UeeUserBackendApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(UeeUserBackendApplication.class, args);
+ }
+
+}
diff --git a/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/aspect/LoggingAspect.java b/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/aspect/LoggingAspect.java
new file mode 100644
index 0000000..6bd0f3c
--- /dev/null
+++ b/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/aspect/LoggingAspect.java
@@ -0,0 +1,41 @@
+/**
+ *
+ */
+package lk.sliit.uee.aspect;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Vimukthi Rajapaksha
+ * @date Aug 26, 2019
+ */
+@Aspect
+@Configuration
+public class LoggingAspect {
+ public static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
+
+ @Before("execution(* lk.sliit.uee.controller.*.*(..))")
+ public void loggingBeforeServices(JoinPoint joinPoint) {
+ // advice
+ logger.info("BEGIN : executing {} with parameters {}", joinPoint, joinPoint.getArgs());
+ }
+
+ @AfterReturning(value = "execution(* lk.sliit.uee.controller.*.*(..))", returning = "result")
+ public void loggingAfterReturningServices(JoinPoint joinPoint, Object result) {
+ // advice
+ logger.info("AFTER : {} returned with value {}", joinPoint, result);
+ }
+
+ @After(value = "execution(* lk.sliit.uee.controller.*.*(..))")
+ public void loggingAfterServices(JoinPoint joinPoint) {
+ // advice
+ logger.info("AFTER : execution of {}", joinPoint);
+ }
+}
diff --git a/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/controller/UserController.java b/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/controller/UserController.java
new file mode 100644
index 0000000..34a26d4
--- /dev/null
+++ b/services/spring/uee-user-backend/src/main/java/lk/sliit/uee/controller/UserController.java
@@ -0,0 +1,123 @@
+/**
+ *
+ */
+package lk.sliit.uee.controller;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import lk.sliit.uee.domain.UserDTO;
+import lk.sliit.uee.exception.MyFileNotFoundException;
+import lk.sliit.uee.model.User;
+import lk.sliit.uee.service.FileService;
+import lk.sliit.uee.service.UserService;
+
+/**
+ * @author Vimukthi Rajapaksha
+ * @date Aug 28, 2019
+ */
+@RestController
+@RequestMapping("/users")
+@CrossOrigin(origins = "*", allowedHeaders = "*")
+public class UserController {
+
+ @Autowired
+ UserService userService;
+ @Autowired
+ private FileService fileService;
+
+ @GetMapping("")
+ public ResponseEntity> getUsers() {
+ ResponseEntity> responseEntity = null;
+ try {
+ responseEntity = new ResponseEntity<>(userService.getAll(), HttpStatus.OK);
+ } catch (Exception e) {
+ responseEntity = new ResponseEntity<>(HttpStatus.BAD_GATEWAY);
+ }
+ return responseEntity;
+ }
+
+ /**
+ * This method will save a new user in the database
+ */
+ @PostMapping("")
+ public ResponseEntity> register(@Valid @RequestBody User user) {
+ ResponseEntity> responseEntity = null;
+ try {
+ responseEntity = new ResponseEntity<>(userService.save(user), HttpStatus.OK);
+ } catch (Exception e) {
+ responseEntity = new ResponseEntity<>(HttpStatus.BAD_GATEWAY);
+ }
+ return responseEntity;
+ }
+
+ /**
+ * This method will return user by its email and pwd
+ */
+ @PostMapping("/login")
+ public ResponseEntity> loginUser(@RequestBody UserDTO userDTO) {
+ ResponseEntity> responseEntity = null;
+ try {
+ responseEntity = new ResponseEntity<>(userService.getByEmailAndPassword(userDTO), HttpStatus.OK);
+ } catch (Exception e) {
+ responseEntity = new ResponseEntity<>(HttpStatus.BAD_GATEWAY);
+ }
+ return responseEntity;
+ }
+
+ /**
+ * This method will return user by its email
+ */
+ @GetMapping("/{email}")
+ public ResponseEntity> getUser(@PathVariable("email") String email) {
+ ResponseEntity> responseEntity = null;
+ try {
+ responseEntity = new ResponseEntity<>(userService.getByEmail(email), HttpStatus.OK);
+ } catch (Exception e) {
+ responseEntity = new ResponseEntity<>(HttpStatus.BAD_GATEWAY);
+ }
+ return responseEntity;
+ }
+
+ @GetMapping("/img/{fileName:.+}")
+ public ResponseEntity