├── Arms.py ├── Database Script.sql ├── README.md ├── __pycache__ ├── armsapi.cpython-38.pyc ├── database.cpython-310.pyc ├── database.cpython-38.pyc ├── person.cpython-310.pyc └── person.cpython-38.pyc ├── database.py ├── person.py ├── requirements.txt ├── static ├── JS │ ├── chart_data.js │ ├── main.js │ └── main.js.bak ├── css │ ├── main.css │ └── util.css ├── fonts │ ├── font-awesome-4.7.0 │ │ ├── HELP-US-OUT.txt │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── less │ │ │ ├── animated.less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── screen-reader.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ └── scss │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ ├── montserrat │ │ ├── Montserrat-Black.ttf │ │ ├── Montserrat-BlackItalic.ttf │ │ ├── Montserrat-Bold.ttf │ │ ├── Montserrat-BoldItalic.ttf │ │ ├── Montserrat-ExtraBold.ttf │ │ ├── Montserrat-ExtraBoldItalic.ttf │ │ ├── Montserrat-ExtraLight.ttf │ │ ├── Montserrat-ExtraLightItalic.ttf │ │ ├── Montserrat-Italic.ttf │ │ ├── Montserrat-Light.ttf │ │ ├── Montserrat-LightItalic.ttf │ │ ├── Montserrat-Medium.ttf │ │ ├── Montserrat-MediumItalic.ttf │ │ ├── Montserrat-Regular.ttf │ │ ├── Montserrat-SemiBold.ttf │ │ ├── Montserrat-SemiBoldItalic.ttf │ │ ├── Montserrat-Thin.ttf │ │ ├── Montserrat-ThinItalic.ttf │ │ └── OFL.txt │ └── poppins │ │ ├── Poppins-Black.ttf │ │ ├── Poppins-BlackItalic.ttf │ │ ├── Poppins-Bold.ttf │ │ ├── Poppins-BoldItalic.ttf │ │ ├── Poppins-ExtraBold.ttf │ │ ├── Poppins-ExtraBoldItalic.ttf │ │ ├── Poppins-ExtraLight.ttf │ │ ├── Poppins-ExtraLightItalic.ttf │ │ ├── Poppins-Italic.ttf │ │ ├── Poppins-Light.ttf │ │ ├── Poppins-LightItalic.ttf │ │ ├── Poppins-Medium.ttf │ │ ├── Poppins-MediumItalic.ttf │ │ ├── Poppins-Regular.ttf │ │ ├── Poppins-SemiBold.ttf │ │ ├── Poppins-SemiBoldItalic.ttf │ │ ├── Poppins-Thin.ttf │ │ └── Poppins-ThinItalic.ttf ├── images │ ├── amanSingh.jpg │ ├── bio-sensor.svg │ ├── ecology.svg │ ├── grass.svg │ ├── humidity.svg │ ├── icons │ │ └── favicon.ico │ ├── img-01.png │ ├── lander.jpg │ ├── mobile.jpg │ ├── temperature.svg │ ├── tree.svg │ └── trees.svg └── vendor │ ├── animate │ └── animate.css │ ├── bootstrap │ ├── css │ │ ├── bootstrap-grid.css │ │ ├── bootstrap-grid.css.map │ │ ├── bootstrap-grid.min.css │ │ ├── bootstrap-grid.min.css.map │ │ ├── bootstrap-reboot.css │ │ ├── bootstrap-reboot.css.map │ │ ├── bootstrap-reboot.min.css │ │ ├── bootstrap-reboot.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── popper.js │ │ ├── popper.min.js │ │ └── tooltip.js │ ├── css-hamburgers │ ├── hamburgers.css │ └── hamburgers.min.css │ ├── jquery │ └── jquery-3.2.1.min.js │ ├── select2 │ ├── select2.css │ ├── select2.js │ ├── select2.min.css │ └── select2.min.js │ └── tilt │ └── tilt.jquery.min.js ├── templates ├── Login.htm ├── api_settings.htm ├── device_dashboard.htm ├── home.htm ├── overview.htm └── profile.htm ├── test.py ├── test2.py └── update.py /Arms.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, render_template, jsonify, redirect, request 2 | import json, database, base64 3 | from random import choice 4 | from datetime import datetime 5 | import person 6 | import os, binascii 7 | 8 | app = Flask(__name__) 9 | 10 | logged_in = {} 11 | api_loggers = {} 12 | mydb = database.db('aman', '127.0.0.1', 'hacker123', 'ARMS') 13 | 14 | #test api key aGFja2luZ2lzYWNyaW1lYXNmc2FmZnNhZnNhZmZzYQ== 15 | 16 | 17 | @app.route("/login", methods=['GET', 'POST']) 18 | def login(): 19 | error = "" 20 | if request.method == 'POST': 21 | user = person.user(request.form['username'], request.form['password']) 22 | if user.authenticated: 23 | user.session_id = str(binascii.b2a_hex(os.urandom(15))) 24 | logged_in[user.username] = {"object": user} 25 | return redirect('/overview/{}/{}'.format(request.form['username'], user.session_id)) 26 | else: 27 | error = "invalid Username or Passowrd" 28 | 29 | return render_template('Login.htm', error=error) 30 | 31 | #this links is for device 1 32 | @app.route('/device1//', methods=["GET", "POST"]) 33 | def Dashoboard(): 34 | user = { 35 | "username" : "Aman Singh", 36 | "image":"static/images/amanSingh.jpg" 37 | } 38 | 39 | devices = [ 40 | {"Dashboard" : "device1", 41 | "deviceID": "Device1" 42 | } 43 | ] 44 | return render_template('device_dashboard.htm', title='Dashobard', user=user, devices=devices) 45 | 46 | 47 | #this link is for the main dashboard of the website 48 | @app.route('/', methods=['GET', 'POST']) 49 | def home(): 50 | return render_template('home.htm', title='HOME - Landing Page') 51 | 52 | @app.route('/overview//', methods=['GET', 'POST']) 53 | def overview(username, session): 54 | 55 | global logged_in 56 | 57 | if username in logged_in and (logged_in[username]['object'].session_id == session): 58 | user = { 59 | "username" : username, 60 | "image":"/static/images/amanSingh.jpg", 61 | "api": logged_in[username]["object"].api, 62 | "session" : session 63 | } 64 | 65 | devices = [ 66 | {"Dashboard" : "device1", 67 | "deviceID": "Device1" 68 | } 69 | ] 70 | return render_template('overview.htm', title='Overview', user=user, devices=devices) 71 | 72 | else: 73 | return redirect('/login') 74 | 75 | #this location will get to the api setting 76 | @app.route('/apisettings//', methods=['GET', 'POST']) 77 | def apisettings(username, session): 78 | 79 | global logged_in 80 | 81 | if username in logged_in and (logged_in[username]['object'].session_id == session): 82 | user = { 83 | "username" : username, 84 | "image":"/static/images/amanSingh.jpg", 85 | "api": logged_in[username]["object"].api, 86 | "session" : session 87 | } 88 | 89 | devices = [ 90 | {"Dashboard" : "device1", 91 | "deviceID": "Device1" 92 | } 93 | ] 94 | return render_template('api_settings.htm', title='API-Settings', user=user, devices=devices) 95 | 96 | else: 97 | return redirect('/login') 98 | 99 | 100 | #this part is for the profile view 101 | @app.route('/profile//', methods=['GET', 'POST']) 102 | def profile(username, session): 103 | 104 | global logged_in 105 | 106 | if username in logged_in and (logged_in[username]['object'].session_id == session): 107 | user = { 108 | "username" : username, 109 | "image":"/static/images/amanSingh.jpg", 110 | "api": logged_in[username]["object"].api, 111 | "session" : session, 112 | "firstname": logged_in[username]["object"].first, 113 | "lastname": logged_in[username]["object"].last, 114 | "email":logged_in[username]["object"].email, 115 | "phone":logged_in[username]["object"].phone, 116 | "lastlogin":logged_in[username]["object"].last_login, 117 | } 118 | 119 | devices = [ 120 | {"Dashboard" : "device1", 121 | "deviceID": "ARMS12012" 122 | } 123 | ] 124 | return render_template('profile.htm', title='API-Settings', user=user, devices=devices) 125 | 126 | else: 127 | return redirect('/login') 128 | 129 | 130 | @app.route('/logout//', methods=['GET', 'POST']) 131 | def logout(username, session): 132 | 133 | global logged_in 134 | 135 | if username in logged_in and (logged_in[username]['object'].session_id == session): 136 | logged_in.pop(username) 137 | # print("logged out") 138 | return redirect('/') 139 | else: 140 | return redirect('/login') 141 | 142 | 143 | 144 | #this is the testing for api 145 | @app.route("/api//test", methods=["GET", "POST"]) 146 | def apitest (apikey): 147 | return {"data":"working Fine Connected to the api server"} 148 | 149 | 150 | #get all the devices information from the user 151 | @app.route("/api//listdevices", methods=['GET', 'POST']) 152 | def listdevices(apikey): 153 | global api_loggers 154 | global mydb 155 | if not(apikey in api_loggers): 156 | try: 157 | query = "select username from users where api_key = '{}'".format(apikey) 158 | mydb.cursor.execute(query) 159 | username = mydb.cursor.fetchall() 160 | username = username[0][0] 161 | apiuser = person.user(username, "dummy") 162 | apiuser.authenticated = True 163 | devices_list = apiuser.get_devices() 164 | api_loggers[apikey] = {"object" : apiuser} 165 | return jsonify(devices_list) 166 | except Exception as e: 167 | print (e) 168 | return jsonify({"data":"Oops Looks like api is not correct"}) 169 | 170 | else: 171 | data = api_loggers[apikey]["object"].get_devices() 172 | return jsonify (data) 173 | 174 | randlist = [i for i in range(0, 100)] 175 | 176 | @app.route('/api//deviceinfo/', methods=['GET', 'POST']) 177 | def device_info (apikey, deviceID): 178 | global api_loggers 179 | global mydb 180 | if not(apikey in api_loggers): 181 | try: 182 | query = "select username from users where api_key = '{}'".format(apikey) 183 | mydb.cursor.execute(query) 184 | username = mydb.cursor.fetchall() 185 | username = username[0][0] 186 | apiuser = person.user(username, "dummy") 187 | apiuser.authenticated = True 188 | data = apiuser.dev_info(deviceID) 189 | api_loggers[apikey] = {"object" : apiuser} 190 | #this part is hard coded so remove after fixing the issue 191 | data = list(data) 192 | data[2] = "Rosegarden" 193 | return jsonify(data) 194 | except Exception as e: 195 | print (e) 196 | return jsonify({"data":"Oops Looks like api is not correct"}) 197 | 198 | else: 199 | data = api_loggers[apikey]["object"].dev_info(deviceID) 200 | 201 | #this part is hard coded so remove after fixing the issue 202 | data = list(data) 203 | data[2] = "Rosegarden" 204 | return jsonify (data) 205 | 206 | @app.route('/api//fieldstat/', methods=['GET', 'POST']) 207 | def fieldstat (apikey, fieldname): 208 | 209 | global api_loggers 210 | global mydb 211 | if not(apikey in api_loggers): 212 | try: 213 | query = "select username from users where api_key = '{}'".format(apikey) 214 | mydb.cursor.execute(query) 215 | username = mydb.cursor.fetchall() 216 | username = username[0][0] 217 | apiuser = person.user(username, "dummy") 218 | apiuser.authenticated = True 219 | data = apiuser.field_values(fieldname) 220 | api_loggers[apikey] = {"object" : apiuser} 221 | return jsonify(data) 222 | except Exception as e: 223 | print (e) 224 | return jsonify({"data":"Oops Looks like api is not correct"}) 225 | 226 | else: 227 | data = api_loggers[apikey]["object"].field_values(fieldname) 228 | return jsonify (data) 229 | 230 | 231 | @app.route('/api//devicestat//', methods=['GET', 'POST']) 232 | def devicestat (apikey, fieldname, deviceID): 233 | 234 | global api_loggers 235 | global mydb 236 | if not(apikey in api_loggers): 237 | try: 238 | query = "select username from users where api_key = '{}'".format(apikey) 239 | mydb.cursor.execute(query) 240 | username = mydb.cursor.fetchall() 241 | username = username[0][0] 242 | apiuser = person.user(username, "dummy") 243 | apiuser.authenticated = True 244 | data = apiuser.device_values(fieldname, deviceID) 245 | api_loggers[apikey] = {"object" : apiuser} 246 | return jsonify(data) 247 | except Exception as e: 248 | print (e) 249 | return jsonify({"data":"Oops Looks like api is not correct"}) 250 | 251 | else: 252 | data = api_loggers[apikey]["object"].device_values(fieldname, deviceID) 253 | return jsonify (data) 254 | 255 | @app.route('/api//update/', methods=['GET','POST']) 256 | def update_values(apikey, data): 257 | global mydb 258 | try: 259 | data = decode(data) 260 | output = mydb.get_apikeys() 261 | if apikey in output: 262 | if (len(data) == 6) and (type(data) is list): 263 | fieldname = data[0] 264 | deviceID = data[1] 265 | temp = data[2] 266 | humidity = data[3] 267 | moisture = data[4] 268 | light = data[5] 269 | mydb.update_values(apikey, fieldname, deviceID, temp, humidity, moisture, light) 270 | return ("Values Updated") 271 | else: 272 | return "Data Decoding Error!" 273 | else: 274 | return "Api key invalid" 275 | 276 | except Exception as e: 277 | print (e) 278 | return jsonify({"data":"Oops Looks like api is not correct"}) 279 | 280 | 281 | @app.route("/api//temperature", methods=["GET", "POST"]) 282 | def get_temperature(apikey): 283 | 284 | randData = choice(randlist) 285 | time = datetime.now() 286 | time = time.strftime("%H:%M:%S") 287 | response = [time, randData] 288 | return jsonify(response) 289 | 290 | @app.route("/api//moisture", methods=["GET", "POST"]) 291 | def get_moisture(apikey): 292 | 293 | randData = choice(randlist) 294 | time = datetime.now() 295 | time = time.strftime("%H:%M:%S") 296 | response = [time, randData] 297 | return jsonify(response) 298 | 299 | @app.route("/api//humidity", methods=["GET", "POST"]) 300 | def get_humidity(apikey): 301 | 302 | randData = choice(randlist) 303 | time = datetime.now() 304 | time = time.strftime("%H:%M:%S") 305 | response = [time, randData] 306 | return jsonify(response) 307 | 308 | @app.route("/api//light", methods=["GET", "POST"]) 309 | def get_light(apikey): 310 | 311 | randData = choice(randlist) 312 | time = datetime.now() 313 | time = time.strftime("%H:%M:%S") 314 | response = [time, randData] 315 | return jsonify(response) 316 | 317 | 318 | def encode(data): 319 | data = json.dumps(data) 320 | message_bytes = data.encode('ascii') 321 | base64_bytes = base64.b64encode(message_bytes) 322 | base64_message = base64_bytes.decode('ascii') 323 | return base64_message 324 | 325 | def decode(base64_message): 326 | base64_bytes = base64_message.encode('ascii') 327 | message_bytes = base64.b64decode(base64_bytes) 328 | message = message_bytes.decode('ascii') 329 | return json.loads(message) 330 | 331 | 332 | if __name__ == "__main__": 333 | app.run(host="0.0.0.0", port = "80", debug=True) 334 | -------------------------------------------------------------------------------- /Database Script.sql: -------------------------------------------------------------------------------- 1 | drop database ARMS; 2 | create database ARMS; 3 | use ARMS; 4 | create table users (username varchar(255), password varchar(255), first_name varchar(255), Last_name varchar(255), email varchar(255), phone_number varchar(255), last_login datetime, api_key varchar(255)); 5 | show tables; 6 | select * from users; 7 | alter table users add unique (username, api_key); 8 | alter table users add primary key (username, api_key); 9 | truncate users; 10 | 11 | insert into users (username, password, first_name, last_name, email, phone_number, last_login, api_key) 12 | values ('amansingh', md5('password here'), 'Aman', 'Singh', 'singhaman11415@gmail.com', '8770262013', now(), 'abhikuchnhihai'); 13 | 14 | create table Node (deviceID varchar(255), username varchar(255), field_name varchar(255), temperature int, humidity int, moisture int, light int, 15 | foreign key (username) references users(username), primary key (deviceID)); 16 | select * from Node; 17 | select field_name, temperature, humidity, moisture, light from Node where username="amansingh"; 18 | 19 | insert into Node (deviceID, username, field_name, temperature, humidity, moisture, light) 20 | values('ARMS12012', 'amansingh', 'Rose Garden', 45, 54, 100, 600); 21 | insert into Node (deviceID, username, field_name, temperature, humidity, moisture, light) 22 | values('ARMS22212', 'hellboy', 'Samy Garden', 45, 54, 100, 600); 23 | 24 | select * from Node; 25 | 26 | create table Rosegarden (deviceID varchar(255), temperature int, humidity int, moisture int, light int, date_time datetime, 27 | foreign key (deviceID) references Node(deviceID)); 28 | 29 | insert into Rosegarden (deviceID, temperature, humidity, moisture, light, date_time) 30 | values('ARMS12012', 45, 54, 100, 600, now()); 31 | 32 | select * from users where username = "hellboy"; 33 | update users set last_login = now() where username = "hellboy"; 34 | 35 | select * from Rosegarden; 36 | select * from (select * from Rosegarden order by date_time desc limit 10) dummy order by date_time asc; 37 | select * from (select * from Rosegarden order by date_time desc limit 10) dummy order by date_time asc; 38 | 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flask IoT Dashboard 2 | 3 | Script is provided for the database (sorry for the mess that i have made in script i know you are smart and you can figure out) 4 | If you want to know more about this project watch this video: - https://youtu.be/XqR6oifgDZI -------------------------------------------------------------------------------- /__pycache__/armsapi.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/__pycache__/armsapi.cpython-38.pyc -------------------------------------------------------------------------------- /__pycache__/database.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/__pycache__/database.cpython-310.pyc -------------------------------------------------------------------------------- /__pycache__/database.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/__pycache__/database.cpython-38.pyc -------------------------------------------------------------------------------- /__pycache__/person.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/__pycache__/person.cpython-310.pyc -------------------------------------------------------------------------------- /__pycache__/person.cpython-38.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/__pycache__/person.cpython-38.pyc -------------------------------------------------------------------------------- /database.py: -------------------------------------------------------------------------------- 1 | import mysql.connector 2 | 3 | class db: 4 | 5 | def __init__(self, user, host, password, database): 6 | try: 7 | self.db = mysql.connector.connect(user=user, host=host, password=password, database=database, auth_plugin='mysql_native_password') 8 | self.cursor = self.db.cursor() 9 | print ('[result] Database connected!') 10 | 11 | except Exception as e: 12 | print ('[error] error connecting database!') 13 | print(e) 14 | 15 | def user(self, username, api): 16 | try: 17 | query = "select * from users where username='{}' and api_key='{}'".format(username, api) 18 | self.cursor.execute(query) 19 | output = self.cursor.fetchall() 20 | return output[0] 21 | except Exception as e: 22 | print('[error] ' + e) 23 | 24 | def get_apikeys(self): 25 | query = 'select api_key from users' 26 | self.cursor.execute(query) 27 | output = self.cursor.fetchall() 28 | dummy = [] 29 | for api in output: 30 | dummy.append(api[0]) 31 | return dummy 32 | 33 | def add_user(self, username, password, first_name, last_name, email, phone_number, api_key): 34 | 35 | try: 36 | query = "insert into users (username, password, first_name, last_name, email, phone_number, last_login, api_key) values ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', now(), '{6}');".format(username, password, first_name, last_name, email, phone_number, api_key) 37 | # print(query) 38 | self.cursor.execute(query) 39 | self.db.commit() 40 | return "success" 41 | except Exception as e: 42 | print( e) 43 | 44 | def update_values(self, apikey, fieldname, deviceID, temp, humidity, moisture, light): 45 | try: 46 | self.cursor.execute("select api_key from users;") 47 | output = self.cursor.fetchall() 48 | dummy = [] 49 | for i in output: 50 | dummy.append(i[0]) 51 | if apikey in dummy: 52 | 53 | query = 'insert into {0} (deviceID, temperature, humidity, moisture, light, date_time) values("{1}", {2}, {3}, {4}, {5}, now());'.format(fieldname, deviceID, temp, humidity, moisture, light) 54 | self.cursor.execute(query) 55 | self.db.commit() 56 | 57 | query = 'update Node set temperature={0}, humidity={1}, moisture = {2}, light={3} where deviceID="{4}";'.format(temp, humidity, moisture, light, deviceID) 58 | self.cursor.execute(query) 59 | self.db.commit() 60 | 61 | return True 62 | 63 | else: 64 | print("not available") 65 | 66 | except Exception as e: 67 | print("[ERROR!]") 68 | print(e) 69 | #test side 70 | # mydb = db('aman', '192.168.56.102', 'hacker123', 'ARMS') 71 | 72 | # mydb.update_values("nahidegi", "Rosegarden", "ARMS12012", 10, 10 ,10, 10) -------------------------------------------------------------------------------- /person.py: -------------------------------------------------------------------------------- 1 | from database import db 2 | import hashlib 3 | from passlib.hash import sha512_crypt as sha 4 | from datetime import datetime 5 | 6 | class user: 7 | 8 | def __init__(self, username, password): 9 | self.db = db('aman', '127.0.0.1', 'hacker123', 'ARMS') 10 | self.username = username 11 | self.secret = password 12 | self.authenticated = False 13 | self.auth() 14 | self.get_details() 15 | self.get_devices() 16 | 17 | def auth (self): 18 | #this is the place where user will get authenticated 19 | try: 20 | query = 'select password from users where username = "{0}"'.format(self.username) 21 | self.db.cursor.execute(query) 22 | output = self.db.cursor.fetchall() 23 | if sha.verify(self.secret, output[0][0]): 24 | self.authenticated = True 25 | 26 | query = 'update users set last_login = now() where username = "{0}";'.format(self.username) 27 | self.db.cursor.execute(query) 28 | self.db.db.commit() 29 | 30 | return True 31 | else: 32 | self.authenticated = False 33 | return False 34 | 35 | except Exception as e: 36 | print("[ERROR!]") 37 | print(e) 38 | 39 | def get_details (self): 40 | 41 | try: 42 | if self.authenticated: 43 | query = 'select * from users where username = "{0}"'.format(self.username) 44 | self.db.cursor.execute(query) 45 | output = self.db.cursor.fetchall() 46 | output = output[0] 47 | self.first = output[2] 48 | self.last = output[3] 49 | self.email = output[4] 50 | self.phone = output[5] 51 | self.last_login = output[6].strftime("%d-%b-%Y (%H:%M:%S.%f)") 52 | self.api = output[7] 53 | return True 54 | 55 | else: 56 | print("User not logged in!") 57 | return False 58 | 59 | except Exception as e: 60 | print("ERROR!") 61 | print(e) 62 | 63 | def get_devices(self): 64 | 65 | try: 66 | if self.authenticated: 67 | query = 'select deviceID from Node where username = "{0}"'.format(self.username) 68 | self.db.cursor.execute(query) 69 | output = self.db.cursor.fetchall() 70 | dummy = [] 71 | for dev in output: 72 | dummy.append(dev[0]) 73 | self.device_list = dummy 74 | return dummy 75 | else: 76 | return False 77 | 78 | except Exception as e: 79 | print("[Error!]") 80 | print (e) 81 | 82 | def dev_info(self, deviceID): 83 | try: 84 | 85 | if self.authenticated: 86 | self.db.db.commit() 87 | query = 'select * from Node where deviceID="{0}";'.format(deviceID) 88 | self.db.cursor.execute(query) 89 | output = self.db.cursor.fetchall() 90 | print(output) 91 | return output[0] 92 | else: 93 | return False 94 | 95 | except Exception as e: 96 | print('[ERROR!]') 97 | print(e) 98 | 99 | def field_values(self, fieldname): 100 | #here we will access all the values of devices according to time 101 | try: 102 | if self.authenticated: 103 | query = 'select * from (select * from {0} order by date_time desc limit 10) dummy order by date_time asc;'.format(fieldname) 104 | self.db.cursor.execute(query) 105 | output = self.db.cursor.fetchall() 106 | return output 107 | else: 108 | return False 109 | except Exception as e: 110 | print('[ERROR!]') 111 | print(e) 112 | 113 | def device_values(self, fieldname, deviceID): 114 | try: 115 | if self.authenticated: 116 | query = 'select * from (select * from (select * from {0} where deviceID = "{1}") var1 order by date_time desc limit 10) dummy order by date_time asc;'.format(fieldname, deviceID) 117 | self.db.cursor.execute(query) 118 | output = self.db.cursor.fetchall() 119 | # print(output) 120 | return output 121 | else: 122 | return False 123 | 124 | except Exception as e: 125 | print('[ERROR!]') 126 | print(e) 127 | 128 | #testing side for the class 129 | # test = user("hellboy", "hello world") 130 | # test.get_details() 131 | # print(test.get_devices()) 132 | # print(test.dev_info("ARMS1112")) 133 | # print(test.field_values('Rosegarden')) 134 | # print(test.device_values("Rosegarden", "ARMS12012")) -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/requirements.txt -------------------------------------------------------------------------------- /static/JS/chart_data.js: -------------------------------------------------------------------------------- 1 | var temperature = document.getElementById('temperature'); 2 | var apikey = document.getElementById('apikey').value ; 3 | var devicename = "ARMS12012"; 4 | 5 | function getdevice(){ 6 | var requests = $.get('/api/' + apikey + '/deviceinfo/' + devicename); 7 | 8 | var tm = requests.done(function (result){ 9 | var today = new Date(); 10 | var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds(); 11 | addData(temp_chart, time, result[3]); 12 | addData(humid_chart, time, result[4]); 13 | addData(moist_chart, time, result[5]); 14 | addData(light_chart, time, result[6]); 15 | document.getElementById("card-temp").innerHTML = result[3]; 16 | document.getElementById("card-moisture").innerHTML = result[4]; 17 | document.getElementById("card-humidity").innerHTML = result[5]; 18 | document.getElementById("card-light").innerHTML = result[6]; 19 | if (couter >= 10 ){ 20 | removeData(temp_chart); 21 | removeData(humid_chart); 22 | removeData(moist_chart); 23 | removeData(light_chart); 24 | } 25 | couter++; 26 | 27 | setTimeout(getdevice, 2000); 28 | 29 | 30 | }); 31 | 32 | } 33 | 34 | //temperature chart object created 35 | var temp_chart = new Chart(temperature, { 36 | type: 'line', 37 | data: { 38 | labels: [], 39 | datasets: [{ 40 | label: 'Temperature W.R.T. Time', 41 | data: [], 42 | fill:true, 43 | backgroundColor: 'rgba(244, 67, 54, 0.1)', 44 | borderColor:'rgba(244, 67, 54, 1)', 45 | borderWidth: 3 46 | }] 47 | }, 48 | options: { 49 | scales: { 50 | yAxes: [{ 51 | ticks: { 52 | beginAtZero: true 53 | } 54 | }] 55 | } 56 | } 57 | }); 58 | 59 | 60 | var humidity = document.getElementById('humidity'); 61 | var humid_chart = new Chart(humidity, { 62 | type: 'line', 63 | data: { 64 | labels: [], 65 | datasets: [{ 66 | label: 'Humidity W.R.T. Time', 67 | data: [], 68 | fill:true, 69 | backgroundColor: 'rgba(33, 150, 243, 0.1)', 70 | borderColor:'rgba(33, 150, 243, 1)', 71 | borderWidth: 3 72 | }] 73 | }, 74 | options: { 75 | scales: { 76 | yAxes: [{ 77 | ticks: { 78 | beginAtZero: true 79 | } 80 | }] 81 | } 82 | } 83 | }); 84 | 85 | var moisture = document.getElementById('moisture'); 86 | var moist_chart = new Chart(moisture, { 87 | type: 'line', 88 | data: { 89 | labels: [], 90 | datasets: [{ 91 | label: 'Moisture W.R.T. Time', 92 | data: [], 93 | fill:true, 94 | backgroundColor: 'rgba(0, 150, 136, 0.1)', 95 | borderColor:'rgba(0, 150, 136, 1)', 96 | borderWidth: 3 97 | }] 98 | }, 99 | options: { 100 | scales: { 101 | yAxes: [{ 102 | ticks: { 103 | beginAtZero: true 104 | } 105 | }] 106 | } 107 | } 108 | }); 109 | 110 | 111 | var light = document.getElementById('light'); 112 | var light_chart = new Chart(light, { 113 | type: 'line', 114 | data: { 115 | labels: [], 116 | datasets: [{ 117 | label: 'Light W.R.T. Time', 118 | data: [], 119 | fill:true, 120 | backgroundColor: 'rgba(255, 152, 0, 0.1)', 121 | borderColor:'rgba(255, 152, 0, 1)', 122 | borderWidth: 3 123 | }] 124 | }, 125 | options: { 126 | scales: { 127 | yAxes: [{ 128 | ticks: { 129 | beginAtZero: true 130 | } 131 | }] 132 | } 133 | } 134 | }); 135 | 136 | 137 | function addData(chart, label, data) { 138 | chart.data.labels.push(label); 139 | chart.data.datasets.forEach((dataset) => { 140 | dataset.data.push(data); 141 | }); 142 | chart.update(); 143 | } 144 | 145 | function removeData(chart) { 146 | chart.data.labels.shift(); 147 | chart.data.datasets.forEach((dataset) => { 148 | dataset.data.shift(); 149 | }); 150 | chart.update(); 151 | } 152 | 153 | var couter = 0; 154 | 155 | getdevice(); 156 | -------------------------------------------------------------------------------- /static/JS/main.js: -------------------------------------------------------------------------------- 1 | 2 | (function ($) { 3 | "use strict"; 4 | 5 | 6 | /*================================================================== 7 | [ Validate ]*/ 8 | var input = $('.validate-input .input100'); 9 | 10 | $('.validate-form').on('submit',function(){ 11 | var check = true; 12 | 13 | for(var i=0; i= 10) { 60 | Xdata_temp.shift() 61 | Ydata_temp.shift() 62 | } 63 | 64 | var obj = new MyCharts(Xdata_temp, Ydata_temp, '.ct-chart'); 65 | obj.createGraph(); 66 | document.getElementById("card-temp").innerHTML = result[1]; 67 | 68 | setTimeout(requestTemp, 2000); 69 | setTimeout(requestHumidity, 2000); 70 | setTimeout(requestMoisture, 2000); 71 | setTimeout(requestLight, 2000); 72 | }); 73 | } 74 | 75 | function requestHumidity() { 76 | var requests = $.get('/api/kuchnhi/moisture'); 77 | var tm = requests.done(function (result){ 78 | 79 | Xdata_moist.push(result[0]); 80 | Ydata_moist.push(result[1]); 81 | 82 | if (Xdata_moist.length >= 10) { 83 | Xdata_moist.shift() 84 | Ydata_moist.shift() 85 | } 86 | 87 | var obj1 = new MyCharts(Xdata_moist, Ydata_moist, '.ct2-chart'); 88 | obj1.createGraph(); 89 | document.getElementById("card-moisture").innerHTML = result[1]; 90 | 91 | }); 92 | } 93 | 94 | 95 | function requestMoisture() { 96 | var requests = $.get('/api/kuchnhi/humidity'); 97 | var tm = requests.done(function (result){ 98 | 99 | Xdata_humid.push(result[0]); 100 | Ydata_humid.push(result[1]); 101 | 102 | if (Xdata_humid.length >= 10) { 103 | Xdata_humid.shift() 104 | Ydata_humid.shift() 105 | } 106 | 107 | var obj1 = new MyCharts(Xdata_humid, Ydata_humid, '.ct3-chart'); 108 | obj1.createGraph(); 109 | document.getElementById("card-humidity").innerHTML = result[1]; 110 | 111 | }); 112 | } 113 | 114 | 115 | function requestLight() { 116 | var requests = $.get('/api/kuchnhi/light'); 117 | var tm = requests.done(function (result){ 118 | 119 | Xdata_light.push(result[0]); 120 | Ydata_light.push(result[1]); 121 | 122 | if (Xdata_light.length >= 10) { 123 | Xdata_light.shift() 124 | Ydata_light.shift() 125 | } 126 | 127 | var obj1 = new MyCharts(Xdata_light, Ydata_light, '.ct4-chart'); 128 | obj1.createGraph(); 129 | document.getElementById("card-light").innerHTML = result[1]; 130 | 131 | }); 132 | } 133 | 134 | requestTemp(); -------------------------------------------------------------------------------- /static/css/main.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | /*////////////////////////////////////////////////////////////////// 6 | [ FONT ]*/ 7 | 8 | @font-face { 9 | font-family: Poppins-Regular; 10 | src: url('../fonts/poppins/Poppins-Regular.ttf'); 11 | } 12 | 13 | @font-face { 14 | font-family: Poppins-Bold; 15 | src: url('../fonts/poppins/Poppins-Bold.ttf'); 16 | } 17 | 18 | @font-face { 19 | font-family: Poppins-Medium; 20 | src: url('../fonts/poppins/Poppins-Medium.ttf'); 21 | } 22 | 23 | @font-face { 24 | font-family: Montserrat-Bold; 25 | src: url('../fonts/montserrat/Montserrat-Bold.ttf'); 26 | } 27 | 28 | /*////////////////////////////////////////////////////////////////// 29 | [ RESTYLE TAG ]*/ 30 | 31 | * { 32 | margin: 0px; 33 | padding: 0px; 34 | box-sizing: border-box; 35 | } 36 | 37 | body, html { 38 | height: 100%; 39 | font-family: Poppins-Regular, sans-serif; 40 | } 41 | 42 | /*---------------------------------------------*/ 43 | a { 44 | font-family: Poppins-Regular; 45 | font-size: 14px; 46 | line-height: 1.7; 47 | color: #666666; 48 | margin: 0px; 49 | transition: all 0.4s; 50 | -webkit-transition: all 0.4s; 51 | -o-transition: all 0.4s; 52 | -moz-transition: all 0.4s; 53 | } 54 | 55 | a:focus { 56 | outline: none !important; 57 | } 58 | 59 | a:hover { 60 | text-decoration: none; 61 | color: #57b846; 62 | } 63 | 64 | /*---------------------------------------------*/ 65 | h1,h2,h3,h4,h5,h6 { 66 | margin: 0px; 67 | } 68 | 69 | p { 70 | font-family: Poppins-Regular; 71 | font-size: 14px; 72 | line-height: 1.7; 73 | color: #666666; 74 | margin: 0px; 75 | } 76 | 77 | ul, li { 78 | margin: 0px; 79 | list-style-type: none; 80 | } 81 | 82 | 83 | /*---------------------------------------------*/ 84 | input { 85 | outline: none; 86 | border: none; 87 | } 88 | 89 | textarea { 90 | outline: none; 91 | border: none; 92 | } 93 | 94 | textarea:focus, input:focus { 95 | border-color: transparent !important; 96 | } 97 | 98 | input:focus::-webkit-input-placeholder { color:transparent; } 99 | input:focus:-moz-placeholder { color:transparent; } 100 | input:focus::-moz-placeholder { color:transparent; } 101 | input:focus:-ms-input-placeholder { color:transparent; } 102 | 103 | textarea:focus::-webkit-input-placeholder { color:transparent; } 104 | textarea:focus:-moz-placeholder { color:transparent; } 105 | textarea:focus::-moz-placeholder { color:transparent; } 106 | textarea:focus:-ms-input-placeholder { color:transparent; } 107 | 108 | input::-webkit-input-placeholder { color: #999999; } 109 | input:-moz-placeholder { color: #999999; } 110 | input::-moz-placeholder { color: #999999; } 111 | input:-ms-input-placeholder { color: #999999; } 112 | 113 | textarea::-webkit-input-placeholder { color: #999999; } 114 | textarea:-moz-placeholder { color: #999999; } 115 | textarea::-moz-placeholder { color: #999999; } 116 | textarea:-ms-input-placeholder { color: #999999; } 117 | 118 | /*---------------------------------------------*/ 119 | button { 120 | outline: none !important; 121 | border: none; 122 | background: transparent; 123 | } 124 | 125 | button:hover { 126 | cursor: pointer; 127 | } 128 | 129 | iframe { 130 | border: none !important; 131 | } 132 | 133 | 134 | /*////////////////////////////////////////////////////////////////// 135 | [ Utility ]*/ 136 | .txt1 { 137 | font-family: Poppins-Regular; 138 | font-size: 13px; 139 | line-height: 1.5; 140 | color: #999999; 141 | } 142 | 143 | .txt2 { 144 | font-family: Poppins-Regular; 145 | font-size: 13px; 146 | line-height: 1.5; 147 | color: #666666; 148 | } 149 | 150 | 151 | /*////////////////////////////////////////////////////////////////// 152 | [ login ]*/ 153 | 154 | .limiter { 155 | width: 100%; 156 | margin: 0 auto; 157 | } 158 | 159 | .container-login100 { 160 | width: 100%; 161 | min-height: 100vh; 162 | display: -webkit-box; 163 | display: -webkit-flex; 164 | display: -moz-box; 165 | display: -ms-flexbox; 166 | display: flex; 167 | flex-wrap: wrap; 168 | justify-content: center; 169 | align-items: center; 170 | padding: 15px; 171 | background: #9053c7; 172 | background: -webkit-linear-gradient(-135deg, #c850c0, #4158d0); 173 | background: -o-linear-gradient(-135deg, #c850c0, #4158d0); 174 | background: -moz-linear-gradient(-135deg, #c850c0, #4158d0); 175 | background: linear-gradient(-135deg, #c850c0, #4158d0); 176 | } 177 | 178 | .wrap-login100 { 179 | width: 960px; 180 | background: #fff; 181 | border-radius: 10px; 182 | overflow: hidden; 183 | 184 | display: -webkit-box; 185 | display: -webkit-flex; 186 | display: -moz-box; 187 | display: -ms-flexbox; 188 | display: flex; 189 | flex-wrap: wrap; 190 | justify-content: space-between; 191 | padding: 177px 130px 33px 95px; 192 | } 193 | 194 | /*------------------------------------------------------------------ 195 | [ ]*/ 196 | .login100-pic { 197 | width: 316px; 198 | } 199 | 200 | .login100-pic img { 201 | max-width: 100%; 202 | } 203 | 204 | 205 | /*------------------------------------------------------------------ 206 | [ ]*/ 207 | .login100-form { 208 | width: 290px; 209 | } 210 | 211 | .login100-form-title { 212 | font-family: Poppins-Bold; 213 | font-size: 24px; 214 | color: #333333; 215 | line-height: 1.2; 216 | text-align: center; 217 | 218 | width: 100%; 219 | display: block; 220 | padding-bottom: 54px; 221 | } 222 | 223 | 224 | /*---------------------------------------------*/ 225 | .wrap-input100 { 226 | position: relative; 227 | width: 100%; 228 | z-index: 1; 229 | margin-bottom: 10px; 230 | } 231 | 232 | .input100 { 233 | font-family: Poppins-Medium; 234 | font-size: 15px; 235 | line-height: 1.5; 236 | color: #666666; 237 | 238 | display: block; 239 | width: 100%; 240 | background: #e6e6e6; 241 | height: 50px; 242 | border-radius: 25px; 243 | padding: 0 30px 0 68px; 244 | } 245 | 246 | 247 | /*------------------------------------------------------------------ 248 | [ Focus ]*/ 249 | .focus-input100 { 250 | display: block; 251 | position: absolute; 252 | border-radius: 25px; 253 | bottom: 0; 254 | left: 0; 255 | z-index: -1; 256 | width: 100%; 257 | height: 100%; 258 | box-shadow: 0px 0px 0px 0px; 259 | color: rgba(87,184,70, 0.8); 260 | } 261 | 262 | .input100:focus + .focus-input100 { 263 | -webkit-animation: anim-shadow 0.5s ease-in-out forwards; 264 | animation: anim-shadow 0.5s ease-in-out forwards; 265 | } 266 | 267 | @-webkit-keyframes anim-shadow { 268 | to { 269 | box-shadow: 0px 0px 70px 25px; 270 | opacity: 0; 271 | } 272 | } 273 | 274 | @keyframes anim-shadow { 275 | to { 276 | box-shadow: 0px 0px 70px 25px; 277 | opacity: 0; 278 | } 279 | } 280 | 281 | .symbol-input100 { 282 | font-size: 15px; 283 | 284 | display: -webkit-box; 285 | display: -webkit-flex; 286 | display: -moz-box; 287 | display: -ms-flexbox; 288 | display: flex; 289 | align-items: center; 290 | position: absolute; 291 | border-radius: 25px; 292 | bottom: 0; 293 | left: 0; 294 | width: 100%; 295 | height: 100%; 296 | padding-left: 35px; 297 | pointer-events: none; 298 | color: #666666; 299 | 300 | -webkit-transition: all 0.4s; 301 | -o-transition: all 0.4s; 302 | -moz-transition: all 0.4s; 303 | transition: all 0.4s; 304 | } 305 | 306 | .input100:focus + .focus-input100 + .symbol-input100 { 307 | color: #57b846; 308 | padding-left: 28px; 309 | } 310 | 311 | /*------------------------------------------------------------------ 312 | [ Button ]*/ 313 | .container-login100-form-btn { 314 | width: 100%; 315 | display: -webkit-box; 316 | display: -webkit-flex; 317 | display: -moz-box; 318 | display: -ms-flexbox; 319 | display: flex; 320 | flex-wrap: wrap; 321 | justify-content: center; 322 | padding-top: 20px; 323 | } 324 | 325 | .login100-form-btn { 326 | font-family: Montserrat-Bold; 327 | font-size: 15px; 328 | line-height: 1.5; 329 | color: #fff; 330 | text-transform: uppercase; 331 | 332 | width: 100%; 333 | height: 50px; 334 | border-radius: 25px; 335 | background: #57b846; 336 | display: -webkit-box; 337 | display: -webkit-flex; 338 | display: -moz-box; 339 | display: -ms-flexbox; 340 | display: flex; 341 | justify-content: center; 342 | align-items: center; 343 | padding: 0 25px; 344 | 345 | -webkit-transition: all 0.4s; 346 | -o-transition: all 0.4s; 347 | -moz-transition: all 0.4s; 348 | transition: all 0.4s; 349 | } 350 | 351 | .login100-form-btn:hover { 352 | background: #333333; 353 | } 354 | 355 | 356 | 357 | /*------------------------------------------------------------------ 358 | [ Responsive ]*/ 359 | 360 | 361 | 362 | @media (max-width: 992px) { 363 | .wrap-login100 { 364 | padding: 177px 90px 33px 85px; 365 | } 366 | 367 | .login100-pic { 368 | width: 35%; 369 | } 370 | 371 | .login100-form { 372 | width: 50%; 373 | } 374 | } 375 | 376 | @media (max-width: 768px) { 377 | .wrap-login100 { 378 | padding: 100px 80px 33px 80px; 379 | } 380 | 381 | .login100-pic { 382 | display: none; 383 | } 384 | 385 | .login100-form { 386 | width: 100%; 387 | } 388 | } 389 | 390 | @media (max-width: 576px) { 391 | .wrap-login100 { 392 | padding: 100px 15px 33px 15px; 393 | } 394 | } 395 | 396 | 397 | /*------------------------------------------------------------------ 398 | [ Alert validate ]*/ 399 | 400 | .validate-input { 401 | position: relative; 402 | } 403 | 404 | .alert-validate::before { 405 | content: attr(data-validate); 406 | position: absolute; 407 | max-width: 70%; 408 | background-color: white; 409 | border: 1px solid #c80000; 410 | border-radius: 13px; 411 | padding: 4px 25px 4px 10px; 412 | top: 50%; 413 | -webkit-transform: translateY(-50%); 414 | -moz-transform: translateY(-50%); 415 | -ms-transform: translateY(-50%); 416 | -o-transform: translateY(-50%); 417 | transform: translateY(-50%); 418 | right: 8px; 419 | pointer-events: none; 420 | 421 | font-family: Poppins-Medium; 422 | color: #c80000; 423 | font-size: 13px; 424 | line-height: 1.4; 425 | text-align: left; 426 | 427 | visibility: hidden; 428 | opacity: 0; 429 | 430 | -webkit-transition: opacity 0.4s; 431 | -o-transition: opacity 0.4s; 432 | -moz-transition: opacity 0.4s; 433 | transition: opacity 0.4s; 434 | } 435 | 436 | .alert-validate::after { 437 | content: "\f06a"; 438 | font-family: FontAwesome; 439 | display: block; 440 | position: absolute; 441 | color: #c80000; 442 | font-size: 15px; 443 | top: 50%; 444 | -webkit-transform: translateY(-50%); 445 | -moz-transform: translateY(-50%); 446 | -ms-transform: translateY(-50%); 447 | -o-transform: translateY(-50%); 448 | transform: translateY(-50%); 449 | right: 13px; 450 | } 451 | 452 | .alert-validate:hover:before { 453 | visibility: visible; 454 | opacity: 1; 455 | } 456 | 457 | @media (max-width: 992px) { 458 | .alert-validate::before { 459 | visibility: visible; 460 | opacity: 1; 461 | } 462 | } -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/font-awesome-4.7.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /static/fonts/font-awesome-4.7.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Black.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-BlackItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Bold.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-BoldItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-ExtraBold.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-ExtraLight.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Italic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Light.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-LightItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Medium.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-MediumItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-SemiBold.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-Thin.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/Montserrat-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/montserrat/Montserrat-ThinItalic.ttf -------------------------------------------------------------------------------- /static/fonts/montserrat/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat) 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Black.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-BlackItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Bold.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-BoldItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-ExtraBold.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-ExtraLight.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Italic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Light.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-LightItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Medium.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-MediumItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Regular.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-SemiBold.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-Thin.ttf -------------------------------------------------------------------------------- /static/fonts/poppins/Poppins-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/fonts/poppins/Poppins-ThinItalic.ttf -------------------------------------------------------------------------------- /static/images/amanSingh.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/images/amanSingh.jpg -------------------------------------------------------------------------------- /static/images/bio-sensor.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/images/ecology.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/images/grass.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/images/humidity.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 13 | 14 | 21 | 28 | 31 | 37 | 42 | 48 | 49 | 50 | 51 | 52 | 53 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /static/images/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/images/icons/favicon.ico -------------------------------------------------------------------------------- /static/images/img-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/images/img-01.png -------------------------------------------------------------------------------- /static/images/lander.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/images/lander.jpg -------------------------------------------------------------------------------- /static/images/mobile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Amansinghtech/Flask-IoT-Dashboard/f94cbe7261b9992a9ca209d1542f07fa05586e72/static/images/mobile.jpg -------------------------------------------------------------------------------- /static/images/temperature.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/images/tree.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 17 | 19 | 21 | 22 | 23 | 27 | 31 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /static/images/trees.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 19 | 20 | 21 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 38 | 39 | 42 | 43 | 44 | 47 | 48 | 49 | 50 | 51 | 52 | 54 | 55 | 56 | 59 | 60 | 61 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 185 | 186 | 187 | 188 | 189 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 202 | 203 | 204 | 205 | 208 | 209 | 210 | 213 | 214 | 215 | 216 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 241 | 242 | 243 | 244 | 245 | 249 | 250 | 251 | 252 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 278 | 279 | 280 | 281 | 282 | 287 | 288 | 289 | 290 | 291 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 314 | 315 | 316 | 318 | 319 | 320 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | -------------------------------------------------------------------------------- /static/vendor/bootstrap/css/bootstrap-reboot.css: -------------------------------------------------------------------------------- 1 | html { 2 | box-sizing: border-box; 3 | font-family: sans-serif; 4 | line-height: 1.15; 5 | -webkit-text-size-adjust: 100%; 6 | -ms-text-size-adjust: 100%; 7 | -ms-overflow-style: scrollbar; 8 | -webkit-tap-highlight-color: transparent; 9 | } 10 | 11 | *, 12 | *::before, 13 | *::after { 14 | box-sizing: inherit; 15 | } 16 | 17 | @-ms-viewport { 18 | width: device-width; 19 | } 20 | 21 | article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { 22 | display: block; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 28 | font-size: 1rem; 29 | font-weight: normal; 30 | line-height: 1.5; 31 | color: #212529; 32 | background-color: #fff; 33 | } 34 | 35 | [tabindex="-1"]:focus { 36 | outline: none !important; 37 | } 38 | 39 | hr { 40 | box-sizing: content-box; 41 | height: 0; 42 | overflow: visible; 43 | } 44 | 45 | h1, h2, h3, h4, h5, h6 { 46 | margin-top: 0; 47 | margin-bottom: .5rem; 48 | } 49 | 50 | p { 51 | margin-top: 0; 52 | margin-bottom: 1rem; 53 | } 54 | 55 | abbr[title], 56 | abbr[data-original-title] { 57 | text-decoration: underline; 58 | -webkit-text-decoration: underline dotted; 59 | text-decoration: underline dotted; 60 | cursor: help; 61 | border-bottom: 0; 62 | } 63 | 64 | address { 65 | margin-bottom: 1rem; 66 | font-style: normal; 67 | line-height: inherit; 68 | } 69 | 70 | ol, 71 | ul, 72 | dl { 73 | margin-top: 0; 74 | margin-bottom: 1rem; 75 | } 76 | 77 | ol ol, 78 | ul ul, 79 | ol ul, 80 | ul ol { 81 | margin-bottom: 0; 82 | } 83 | 84 | dt { 85 | font-weight: bold; 86 | } 87 | 88 | dd { 89 | margin-bottom: .5rem; 90 | margin-left: 0; 91 | } 92 | 93 | blockquote { 94 | margin: 0 0 1rem; 95 | } 96 | 97 | dfn { 98 | font-style: italic; 99 | } 100 | 101 | b, 102 | strong { 103 | font-weight: bolder; 104 | } 105 | 106 | small { 107 | font-size: 80%; 108 | } 109 | 110 | sub, 111 | sup { 112 | position: relative; 113 | font-size: 75%; 114 | line-height: 0; 115 | vertical-align: baseline; 116 | } 117 | 118 | sub { 119 | bottom: -.25em; 120 | } 121 | 122 | sup { 123 | top: -.5em; 124 | } 125 | 126 | a { 127 | color: #007bff; 128 | text-decoration: none; 129 | background-color: transparent; 130 | -webkit-text-decoration-skip: objects; 131 | } 132 | 133 | a:hover { 134 | color: #0056b3; 135 | text-decoration: underline; 136 | } 137 | 138 | a:not([href]):not([tabindex]) { 139 | color: inherit; 140 | text-decoration: none; 141 | } 142 | 143 | a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { 144 | color: inherit; 145 | text-decoration: none; 146 | } 147 | 148 | a:not([href]):not([tabindex]):focus { 149 | outline: 0; 150 | } 151 | 152 | pre, 153 | code, 154 | kbd, 155 | samp { 156 | font-family: monospace, monospace; 157 | font-size: 1em; 158 | } 159 | 160 | pre { 161 | margin-top: 0; 162 | margin-bottom: 1rem; 163 | overflow: auto; 164 | } 165 | 166 | figure { 167 | margin: 0 0 1rem; 168 | } 169 | 170 | img { 171 | vertical-align: middle; 172 | border-style: none; 173 | } 174 | 175 | svg:not(:root) { 176 | overflow: hidden; 177 | } 178 | 179 | a, 180 | area, 181 | button, 182 | [role="button"], 183 | input, 184 | label, 185 | select, 186 | summary, 187 | textarea { 188 | -ms-touch-action: manipulation; 189 | touch-action: manipulation; 190 | } 191 | 192 | table { 193 | border-collapse: collapse; 194 | } 195 | 196 | caption { 197 | padding-top: 0.75rem; 198 | padding-bottom: 0.75rem; 199 | color: #868e96; 200 | text-align: left; 201 | caption-side: bottom; 202 | } 203 | 204 | th { 205 | text-align: left; 206 | } 207 | 208 | label { 209 | display: inline-block; 210 | margin-bottom: .5rem; 211 | } 212 | 213 | button:focus { 214 | outline: 1px dotted; 215 | outline: 5px auto -webkit-focus-ring-color; 216 | } 217 | 218 | input, 219 | button, 220 | select, 221 | optgroup, 222 | textarea { 223 | margin: 0; 224 | font-family: inherit; 225 | font-size: inherit; 226 | line-height: inherit; 227 | } 228 | 229 | button, 230 | input { 231 | overflow: visible; 232 | } 233 | 234 | button, 235 | select { 236 | text-transform: none; 237 | } 238 | 239 | button, 240 | html [type="button"], 241 | [type="reset"], 242 | [type="submit"] { 243 | -webkit-appearance: button; 244 | } 245 | 246 | button::-moz-focus-inner, 247 | [type="button"]::-moz-focus-inner, 248 | [type="reset"]::-moz-focus-inner, 249 | [type="submit"]::-moz-focus-inner { 250 | padding: 0; 251 | border-style: none; 252 | } 253 | 254 | input[type="radio"], 255 | input[type="checkbox"] { 256 | box-sizing: border-box; 257 | padding: 0; 258 | } 259 | 260 | input[type="date"], 261 | input[type="time"], 262 | input[type="datetime-local"], 263 | input[type="month"] { 264 | -webkit-appearance: listbox; 265 | } 266 | 267 | textarea { 268 | overflow: auto; 269 | resize: vertical; 270 | } 271 | 272 | fieldset { 273 | min-width: 0; 274 | padding: 0; 275 | margin: 0; 276 | border: 0; 277 | } 278 | 279 | legend { 280 | display: block; 281 | width: 100%; 282 | max-width: 100%; 283 | padding: 0; 284 | margin-bottom: .5rem; 285 | font-size: 1.5rem; 286 | line-height: inherit; 287 | color: inherit; 288 | white-space: normal; 289 | } 290 | 291 | progress { 292 | vertical-align: baseline; 293 | } 294 | 295 | [type="number"]::-webkit-inner-spin-button, 296 | [type="number"]::-webkit-outer-spin-button { 297 | height: auto; 298 | } 299 | 300 | [type="search"] { 301 | outline-offset: -2px; 302 | -webkit-appearance: none; 303 | } 304 | 305 | [type="search"]::-webkit-search-cancel-button, 306 | [type="search"]::-webkit-search-decoration { 307 | -webkit-appearance: none; 308 | } 309 | 310 | ::-webkit-file-upload-button { 311 | font: inherit; 312 | -webkit-appearance: button; 313 | } 314 | 315 | output { 316 | display: inline-block; 317 | } 318 | 319 | summary { 320 | display: list-item; 321 | } 322 | 323 | template { 324 | display: none; 325 | } 326 | 327 | [hidden] { 328 | display: none !important; 329 | } 330 | /*# sourceMappingURL=bootstrap-reboot.css.map */ -------------------------------------------------------------------------------- /static/vendor/bootstrap/css/bootstrap-reboot.min.css: -------------------------------------------------------------------------------- 1 | html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important} 2 | /*# sourceMappingURL=bootstrap-reboot.min.css.map */ -------------------------------------------------------------------------------- /static/vendor/bootstrap/js/popper.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (C) Federico Zivolo 2017 3 | Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). 4 | */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=window.getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e||-1!==['HTML','BODY','#document'].indexOf(e.nodeName))return window.document.body;var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:window.document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return window.document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var f=a.commonAncestorContainer;if(e!==f&&t!==f||i.contains(n))return p(f)?f:r(f);var l=s(e);return l.host?d(l.host,t):d(e,s(t).host)}function a(e){var t=1=o.clientWidth&&i>=o.clientHeight}),f=0i[e]&&!t.escapeWithReference&&(n=z(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=V,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var o=t.element;if('string'==typeof o){if(o=e.instance.popper.querySelector(o),!o)return e;}else if(!e.instance.popper.contains(o))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var i=e.placement.split('-')[0],n=e.offsets,r=n.popper,p=n.reference,s=-1!==['left','right'].indexOf(i),d=s?'height':'width',a=s?'top':'left',f=s?'left':'top',l=s?'bottom':'right',m=O(o)[d];p[l]-mr[l]&&(e.offsets.popper[a]+=p[a]+m-r[l]);var h=p[a]+p[d]/2-m/2,g=h-c(e.offsets.popper)[a];return g=_(z(r[d]-m,g),0),e.arrowElement=o,e.offsets.arrow={},e.offsets.arrow[a]=Math.round(g),e.offsets.arrow[f]='',e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=w(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=L(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case fe.FLIP:p=[i,n];break;case fe.CLOCKWISE:p=K(i);break;case fe.COUNTERCLOCKWISE:p=K(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=L(i);var a=e.offsets.popper,f=e.offsets.reference,l=V,m='left'===i&&l(a.right)>l(f.left)||'right'===i&&l(a.left)l(f.top)||'bottom'===i&&l(a.top)l(o.right),g=l(a.top)l(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,y=-1!==['top','bottom'].indexOf(i),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),w&&(r=j(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[t]-(s?n[p?'width':'height']:0),e.placement=L(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} 2 | -------------------------------------------------------------------------------- /static/vendor/tilt/tilt.jquery.min.js: -------------------------------------------------------------------------------- 1 | "use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"===("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=function(i,s){return void 0===s&&(s="undefined"!=typeof window?require("jquery"):require("jquery")(i)),t(s),s}:t(jQuery)}(function(t){return t.fn.tilt=function(i){var s=function(){this.ticking||(requestAnimationFrame(g.bind(this)),this.ticking=!0)},e=function(){var i=this;t(this).on("mousemove",o),t(this).on("mouseenter",a),this.settings.reset&&t(this).on("mouseleave",l),this.settings.glare&&t(window).on("resize",d.bind(i))},n=function(){var i=this;void 0!==this.timeout&&clearTimeout(this.timeout),t(this).css({transition:this.settings.speed+"ms "+this.settings.easing}),this.settings.glare&&this.glareElement.css({transition:"opacity "+this.settings.speed+"ms "+this.settings.easing}),this.timeout=setTimeout(function(){t(i).css({transition:""}),i.settings.glare&&i.glareElement.css({transition:""})},this.settings.speed)},a=function(i){this.ticking=!1,t(this).css({"will-change":"transform"}),n.call(this),t(this).trigger("tilt.mouseEnter")},r=function(i){return"undefined"==typeof i&&(i={pageX:t(this).offset().left+t(this).outerWidth()/2,pageY:t(this).offset().top+t(this).outerHeight()/2}),{x:i.pageX,y:i.pageY}},o=function(t){this.mousePositions=r(t),s.call(this)},l=function(){n.call(this),this.reset=!0,s.call(this),t(this).trigger("tilt.mouseLeave")},h=function(){var i=t(this).outerWidth(),s=t(this).outerHeight(),e=t(this).offset().left,n=t(this).offset().top,a=(this.mousePositions.x-e)/i,r=(this.mousePositions.y-n)/s,o=(this.settings.maxTilt/2-a*this.settings.maxTilt).toFixed(2),l=(r*this.settings.maxTilt-this.settings.maxTilt/2).toFixed(2),h=Math.atan2(this.mousePositions.x-(e+i/2),-(this.mousePositions.y-(n+s/2)))*(180/Math.PI);return{tiltX:o,tiltY:l,percentageX:100*a,percentageY:100*r,angle:h}},g=function(){return this.transforms=h.call(this),this.reset?(this.reset=!1,t(this).css("transform","perspective("+this.settings.perspective+"px) rotateX(0deg) rotateY(0deg)"),void(this.settings.glare&&(this.glareElement.css("transform","rotate(180deg) translate(-50%, -50%)"),this.glareElement.css("opacity","0")))):(t(this).css("transform","perspective("+this.settings.perspective+"px) rotateX("+("x"===this.settings.disableAxis?0:this.transforms.tiltY)+"deg) rotateY("+("y"===this.settings.disableAxis?0:this.transforms.tiltX)+"deg) scale3d("+this.settings.scale+","+this.settings.scale+","+this.settings.scale+")"),this.settings.glare&&(this.glareElement.css("transform","rotate("+this.transforms.angle+"deg) translate(-50%, -50%)"),this.glareElement.css("opacity",""+this.transforms.percentageY*this.settings.maxGlare/100)),t(this).trigger("change",[this.transforms]),void(this.ticking=!1))},c=function(){var i=this.settings.glarePrerender;if(i||t(this).append('
'),this.glareElementWrapper=t(this).find(".js-tilt-glare"),this.glareElement=t(this).find(".js-tilt-glare-inner"),!i){var s={position:"absolute",top:"0",left:"0",width:"100%",height:"100%"};this.glareElementWrapper.css(s).css({overflow:"hidden","pointer-events":"none"}),this.glareElement.css({position:"absolute",top:"50%",left:"50%","background-image":"linear-gradient(0deg, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%)",width:""+2*t(this).outerWidth(),height:""+2*t(this).outerWidth(),transform:"rotate(180deg) translate(-50%, -50%)","transform-origin":"0% 0%",opacity:"0"})}},d=function(){this.glareElement.css({width:""+2*t(this).outerWidth(),height:""+2*t(this).outerWidth()})};return t.fn.tilt.destroy=function(){t(this).each(function(){t(this).find(".js-tilt-glare").remove(),t(this).css({"will-change":"",transform:""}),t(this).off("mousemove mouseenter mouseleave")})},t.fn.tilt.getValues=function(){var i=[];return t(this).each(function(){this.mousePositions=r.call(this),i.push(h.call(this))}),i},t.fn.tilt.reset=function(){t(this).each(function(){var i=this;this.mousePositions=r.call(this),this.settings=t(this).data("settings"),l.call(this),setTimeout(function(){i.reset=!1},this.settings.transition)})},this.each(function(){var s=this;this.settings=t.extend({maxTilt:t(this).is("[data-tilt-max]")?t(this).data("tilt-max"):20,perspective:t(this).is("[data-tilt-perspective]")?t(this).data("tilt-perspective"):300,easing:t(this).is("[data-tilt-easing]")?t(this).data("tilt-easing"):"cubic-bezier(.03,.98,.52,.99)",scale:t(this).is("[data-tilt-scale]")?t(this).data("tilt-scale"):"1",speed:t(this).is("[data-tilt-speed]")?t(this).data("tilt-speed"):"400",transition:!t(this).is("[data-tilt-transition]")||t(this).data("tilt-transition"),disableAxis:t(this).is("[data-tilt-disable-axis]")?t(this).data("tilt-disable-axis"):null,axis:t(this).is("[data-tilt-axis]")?t(this).data("tilt-axis"):null,reset:!t(this).is("[data-tilt-reset]")||t(this).data("tilt-reset"),glare:!!t(this).is("[data-tilt-glare]")&&t(this).data("tilt-glare"),maxGlare:t(this).is("[data-tilt-maxglare]")?t(this).data("tilt-maxglare"):1},i),null!==this.settings.axis&&(console.warn("Tilt.js: the axis setting has been renamed to disableAxis. See https://github.com/gijsroge/tilt.js/pull/26 for more information"),this.settings.disableAxis=this.settings.axis),this.init=function(){t(s).data("settings",s.settings),s.settings.glare&&c.call(s),e.call(s)},this.init()})},t("[data-tilt]").tilt(),!0}); -------------------------------------------------------------------------------- /templates/Login.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Login V1 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 |
28 |
29 |
30 | IMG 31 |
32 | 33 |
34 | 35 | Member Login 36 | 37 | {{ error }} 38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 |
48 | 49 | 50 | 51 | 52 | 53 |
54 | 55 |
56 | 59 |
60 | 61 |
62 | 63 | Forgot 64 | 65 | 66 | Username / Password? 67 | 68 |
69 | 70 | 76 |
77 |
78 |
79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 98 | 99 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /templates/api_settings.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% if title %} 4 | {{ title }} - ARMS 5 | {% else %} 6 | Welcome to ARMS 7 | {% endif %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 |
27 | 28 | ARMS 29 | 30 |
31 | 32 | 33 | 65 | 66 | 67 | 68 |
69 | 70 | 71 |
72 | 73 | 74 |
75 |
API Settings
76 |
77 | 78 |
79 |
80 | 81 | 82 | 83 | 86 | 90 | 91 |
84 |

XXXX XXXX XXXX XXXX XXXX

85 |
87 | 88 | 89 |
92 | 93 |
94 |
95 |
96 |
97 |
98 |
Contributers
99 |
Aman Singh
100 |
Rica Ghosh
101 |
Deepak Yadu
102 |
Khyati banjare
103 |
Arwind
104 |
105 |
106 |
Guides
107 |
All faculties Of BIT Raipur
108 |
109 |
110 |
References
111 |
Google.com
112 |
113 |
114 |
115 | 116 |
117 | 118 | 156 | 157 | 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /templates/device_dashboard.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% if title %} 4 | {{ title }} - ARMS 5 | {% else %} 6 | Welcome to ARMS 7 | {% endif %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 |
27 | 28 | ARMS 29 |
30 | 31 | 32 | 64 | 65 | 66 | 67 |
68 | 69 | 70 |
71 | 72 | 73 |
74 |
My Dashboard
75 |
76 | 77 |
78 |
79 |
80 |
81 |
82 |

52

83 |
84 |
85 |

Temperature

86 |
87 |
88 |
89 |
90 |
91 |
92 |

99

93 |
94 |
95 |

Moisture

96 |
97 |
98 |
99 |
100 |
101 |
102 |

23

103 |
104 |
105 |

Humidity

106 |
107 |
108 |
109 |
110 |
111 |
112 |

50

113 |
114 |
115 |

Light Intensity

116 |
117 |
118 |
119 | 120 |
121 |
122 |

123 | Temperature 124 |

125 |
126 |
127 | 128 | 129 |
130 |

131 | Humidity 132 |

133 |
134 |
135 | 136 |
137 |

138 | Moisture 139 |

140 |
141 |
142 | 143 |
144 |

145 | Light Intensity 146 |

147 |
148 |
149 | 150 |
151 | 152 | 153 |
154 |
155 |
156 |
Field Description
157 | 158 |
159 |
160 |
SunFlower Garden
161 | 162 |

163 | Something is going to be in here 164 |

165 | 166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
Contributers
174 |

Aman Singh

175 |

Rica Ghosh

176 |

Deepak Yadu

177 |

Khyati banjare

178 |

Arwind

179 |
180 |
181 |
Guides
182 |

All faculties Of BIT Raipur

183 |
184 |
185 |
References
186 |

Google.com

187 |
188 |
189 |
190 | 191 |
192 | 193 | 217 | 218 | 219 | 220 | 221 | 222 | -------------------------------------------------------------------------------- /templates/home.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | ARMS Landing Page 4 | 5 | 6 | 7 | 8 | 9 | 29 | 30 | 31 | 32 |
33 |
34 | ARMS 35 | 36 | 37 | 38 | 39 | 40 | 41 |
42 |
43 | 44 | 45 |
46 |
47 | Autonomous Remote Monitoring System
For Polyhouse

48 |

Getting Started Login to Dashboard

49 |
50 |
51 | 52 | 53 |
54 |

ABOUT THE PROJECT

55 |

Smart farmingwith IoT will allow farmers to increase productivity, reduce wastage and reduce the work load.
56 | This project is mainly focused on Polyhouses. 57 |

58 | 59 |
60 | 61 |
62 | 63 | 64 |
65 | To the top 66 | 67 | 68 |

Developed By team TECHNOMON

69 |
70 |
71 |
72 |
73 |
74 | 75 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /templates/overview.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% if title %} 4 | {{ title }} - ARMS 5 | {% else %} 6 | Welcome to ARMS 7 | {% endif %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 |
27 | 28 | ARMS 29 | 30 |
31 | 32 | 33 | 65 | 66 | 67 | 68 |
69 | 70 | 71 |
72 | 73 | 74 |
75 |
My Dashboard
76 |
77 | 78 |
79 |
80 |
81 |
82 |
83 |

52

84 |
85 |
86 |

Temperature

87 |
88 |
89 |
90 |
91 |
92 |
93 |

99

94 |
95 |
96 |

Moisture

97 |
98 |
99 |
100 |
101 |
102 |
103 |

23

104 |
105 |
106 |

Humidity

107 |
108 |
109 |
110 |
111 |
112 |
113 |

50

114 |
115 |
116 |

Light Intensity

117 |
118 |
119 |
120 | 121 |
122 |
123 |

124 | Temperature 125 |

126 | 127 |
128 | 129 | 130 |
131 |

132 | Humidity 133 |

134 | 135 |
136 | 137 |
138 |

139 | Moisture 140 |

141 | 142 |
143 | 144 |
145 |

146 | Light Intensity 147 |

148 | 149 |
150 | 151 |
152 | 153 | 154 |
155 |
156 |
157 |
Field Description
158 | 159 |
160 |
161 |
SunFlower Garden
162 | 163 |

164 | Something is going to be in here 165 |

166 | 167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
Contributers
175 |
Aman Singh
176 |
Rica Ghosh
177 |
Deepak Yadu
178 |
Khyati banjare
179 |
Arwind
180 |
181 |
182 |
Guides
183 |
All faculties Of BIT Raipur
184 |
185 |
186 |
References
187 |
Google.com
188 |
189 |
190 |
191 | 192 |
193 | 194 | 218 | 219 | 220 | 221 | 222 | 223 | -------------------------------------------------------------------------------- /templates/profile.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% if title %} 4 | {{ title }} - ARMS 5 | {% else %} 6 | Welcome to ARMS 7 | {% endif %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 |
27 | 28 | ARMS 29 | 30 |
31 | 32 | 33 | 65 | 66 | 67 | 68 |
69 | 70 | 71 |
72 | 73 |

.

74 | 75 |
76 |
77 | 78 |
79 |

User Profile

80 |
81 |
82 |
83 | 84 |
85 | 86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 |
USERNAME{{ user.username }}
FIRST NAME{{ user.firstname }}
LAST NAME{{ user.lastname }}
EMAIL{{ user.email }}
PHONE{{ user.phone }}
LAST LOGIN{{ user.lastlogin }}
117 |
118 | 119 |
120 |
121 |
122 |
123 |
124 |
Contributers
125 |
Aman Singh
126 |
Rica Ghosh
127 |
Deepak Yadu
128 |
Khyati banjare
129 |
Arwind
130 |
131 |
132 |
Guides
133 |
All faculties Of BIT Raipur
134 |
135 |
136 |
References
137 |
Google.com
138 |
139 |
140 |
141 | 142 |
143 | 144 | 182 | 183 | 184 | 185 | 186 | 187 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | from passlib.hash import sha512_crypt as sha 2 | password = sha.hash("password123") 3 | print(password) 4 | from database import db 5 | 6 | mydb = db('aman', '127.0.0.1', 'hacker123', 'ARMS') 7 | query = "update users set password = '{}' where username = 'amansingh'".format(password) 8 | 9 | mydb.cursor.execute(query) 10 | mydb.db.commit() -------------------------------------------------------------------------------- /test2.py: -------------------------------------------------------------------------------- 1 | import json 2 | import base64 3 | #decoding and encoding data is possible via base64 library so we are going to use this method to update values 4 | def convert(data): 5 | return json.dumps(data) 6 | 7 | def deconvert(data): 8 | return json.loads(data) 9 | 10 | mydict = {"name": "Aman Singh", "Age":18} 11 | # mydict = ["Aman", "singh", 18] 12 | 13 | def base_encode(message): 14 | message_bytes = message.encode('ascii') 15 | base64_bytes = base64.b64encode(message_bytes) 16 | base64_message = base64_bytes.decode('ascii') 17 | return base64_message 18 | 19 | def base_decode(base64_message): 20 | base64_bytes = base64_message.encode('ascii') 21 | message_bytes = base64.b64decode(base64_bytes) 22 | message = message_bytes.decode('ascii') 23 | return message 24 | 25 | data = convert(mydict) 26 | 27 | print(data) 28 | 29 | encoded_data = base_encode(data) 30 | 31 | print(encoded_data) 32 | 33 | new_data = base_decode(encoded_data) 34 | 35 | print(new_data) 36 | 37 | new_dict = deconvert(new_data) 38 | 39 | print(new_dict["name"]) 40 | 41 | print(type(mydict) is dict) -------------------------------------------------------------------------------- /update.py: -------------------------------------------------------------------------------- 1 | import json, base64 2 | import urllib.request 3 | from random import choice 4 | import time 5 | 6 | def encode(data): 7 | data = json.dumps(data) 8 | message_bytes = data.encode('ascii') 9 | base64_bytes = base64.b64encode(message_bytes) 10 | base64_message = base64_bytes.decode('ascii') 11 | return base64_message 12 | 13 | def decode(base64_message): 14 | base64_bytes = base64_message.encode('ascii') 15 | message_bytes = base64.b64decode(base64_bytes) 16 | message = message_bytes.decode('ascii') 17 | return json.loads(message) 18 | 19 | 20 | randlist = [i for i in range(0, 100)] 21 | devlist = ['ARMS1112','ARMS12012','ARMS22212'] 22 | 23 | while 1: 24 | try: 25 | mydata = ['Rosegarden', 'ARMS12012', choice(randlist), choice(randlist), choice(randlist), choice(randlist)] 26 | a = encode(mydata) 27 | url = 'http://127.0.0.1/api/aGFja2luZ2lzYWNyaW1lYXNmc2FmZnNhZnNhZmZzYQ==/update/{}'.format(a) 28 | response = urllib.request.urlopen(url) 29 | print("[data]: "+ str(mydata)) 30 | print("[Encoded Value]: "+ a) 31 | print("[url]: "+ url) 32 | html = response.read() 33 | print("[output]: " + str(html)) 34 | time.sleep(2) 35 | except: 36 | print("Website Not online") 37 | time.sleep(2) 38 | # mydict = {"name": "Aman Singh", "Age":18} 39 | # a = encode(mydict) 40 | # print(a) 41 | # print(type(a)) 42 | # b = decode(a) 43 | # print(b["name"]) 44 | 45 | # def upload_data(): 46 | # pass --------------------------------------------------------------------------------