├── runtime.txt ├── Procfile ├── static ├── images │ ├── favicon.ico │ ├── sort_asc.png │ ├── sort_both.png │ ├── sort_desc.png │ ├── Sorting icons.psd │ ├── sort_asc_disabled.png │ └── sort_desc_disabled.png ├── stylesheets │ ├── jquery.dataTables.css │ └── font-awesome.min.css └── javascripts │ ├── bootstrap.min.js │ └── jquery.min.js ├── requirements.txt ├── dbModel.py ├── app_run.py ├── .gitignore ├── templates └── index.html └── README.md /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.6.8 -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web gunicorn app_run:app -------------------------------------------------------------------------------- /static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/favicon.ico -------------------------------------------------------------------------------- /static/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/sort_asc.png -------------------------------------------------------------------------------- /static/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/sort_both.png -------------------------------------------------------------------------------- /static/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/sort_desc.png -------------------------------------------------------------------------------- /static/images/Sorting icons.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/Sorting icons.psd -------------------------------------------------------------------------------- /static/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /static/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/twtrubiks/Deploying-Flask-To-Heroku/HEAD/static/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | click==6.7 2 | Flask==1.0.2 3 | Flask-SQLAlchemy==2.1 4 | Flask-Migrate==2.0.3 5 | gunicorn==19.6.0 6 | itsdangerous==0.24 7 | Jinja2==2.9.5 8 | MarkupSafe==0.23 9 | Werkzeug==0.15.5 10 | psycopg2==2.7.3.1 -------------------------------------------------------------------------------- /dbModel.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask_sqlalchemy import SQLAlchemy 3 | from flask_script import Manager 4 | from flask_migrate import Migrate, MigrateCommand 5 | 6 | app = Flask(__name__) 7 | app.config[ 8 | 'SQLALCHEMY_DATABASE_URI'] = 'postgres://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 9 | 10 | db = SQLAlchemy(app) 11 | migrate = Migrate(app, db) 12 | 13 | manager = Manager(app) 14 | manager.add_command('db', MigrateCommand) 15 | 16 | 17 | class UserData(db.Model): 18 | __tablename__ = 'UserData' 19 | 20 | Id = db.Column(db.Integer, primary_key=True) 21 | Name = db.Column(db.String(64)) 22 | Description = db.Column(db.String(256)) 23 | CreateDate = db.Column(db.DateTime) 24 | 25 | def __init__(self 26 | , Name 27 | , Description 28 | , CreateDate 29 | ): 30 | self.Name = Name 31 | self.Description = Description 32 | self.CreateDate = CreateDate 33 | 34 | 35 | if __name__ == '__main__': 36 | manager.run() 37 | -------------------------------------------------------------------------------- /app_run.py: -------------------------------------------------------------------------------- 1 | from flask import * 2 | from datetime import datetime 3 | from dbModel import * 4 | 5 | app = Flask(__name__) 6 | 7 | 8 | @app.route('/') 9 | @app.route('/index') 10 | def index(): 11 | data = "Deploying a Flask App To Heroku" 12 | data_UserData = UserData.query.all() 13 | history_dic = {} 14 | history_list = [] 15 | for _data in data_UserData: 16 | history_dic['Name'] = _data.Name 17 | history_dic['Id'] = _data.Id 18 | history_dic['Description'] = _data.Description 19 | history_dic['CreateDate'] = _data.CreateDate.strftime('%Y/%m/%d %H:%M:%S') 20 | history_list.append(history_dic) 21 | history_dic = {} 22 | return render_template('index.html', **locals()) 23 | 24 | 25 | @app.route('/API/add_data', methods=['POST']) 26 | def add_data(): 27 | name = request.form['name'] 28 | description = request.form['description'] 29 | if name != "" and description != "": 30 | add_data = UserData( 31 | Name=name, 32 | Description=description, 33 | CreateDate=datetime.now() 34 | ) 35 | db.session.add(add_data) 36 | db.session.commit() 37 | return redirect(url_for('index')) 38 | 39 | 40 | if __name__ == '__main__': 41 | app.run(debug=True) 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | .idea/ 12 | env/ 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *,cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # IPython Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # dotenv 80 | .env 81 | 82 | # virtualenv 83 | venv/ 84 | ENV/ 85 | 86 | # Spyder project settings 87 | .spyderproject 88 | 89 | # Rope project settings 90 | .ropeproject 91 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | This is example 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

This is example

18 |

{{data}} Demo

19 |
20 |

Please enter the information

21 |
22 |
23 | 24 |
25 |
26 | 27 |
28 | 29 |
30 |

database information

31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | {% for history in history_list %} 42 | 43 | 44 | 45 | 46 | 47 | 48 | {% endfor%} 49 | 50 |
IDNameDescriptionCreateDate
{{ history.Id }}{{ history.Name }}{{ history.Description }}{{ history.CreateDate }}
51 |
52 | 53 | 56 | 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Deploying-Flask-To-Heroku 2 | 3 | Deploying a Flask App To Heroku Tutorial 📝 4 | 5 | * [Youtube Demo](https://youtu.be/fidKOYWWfkM) 6 | * [How to use Heroku Postgres deploying](https://youtu.be/OvQetdMN88E) 7 | 8 | 今天教大家如何佈署 Flask App 到 [Heroku](https://dashboard.heroku.com/) 9 | 10 | [Heroku](https://dashboard.heroku.com/) 免費版本 11 | 12 | * 可以創造 5個 app。 13 | * 24小時一定要休息6小時的規定。 14 | * 支援很多種程式語言。 15 | * 有SSL(https)。 16 | 17 | 更多說明請參考 [Heroku](https://dashboard.heroku.com/) 18 | 19 | ## 教學 20 | 21 | ### 步驟一 22 | 23 | 先註冊 Heroku 帳號,請到 [Heroku](https://dashboard.heroku.com/) 註冊 24 | 25 | ### 步驟二 26 | 27 | 請安裝 [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli#download-and-install) (請選擇符合自己得作業系統,這裡用 Windows 介紹) 28 | 29 | 安裝過程,如果已經有安裝過 [Git](https://git-scm.com/) ,可以把勾勾拿掉, 30 | 31 | ![alt tag](http://i.imgur.com/A3QLRpA.jpg) 32 | 33 | 安裝完後,請使用你的 cmd (命令提示字元) 輸入以下指令 34 | 35 | ```cmd 36 | heroku --version 37 | ``` 38 | 39 | 如果安裝正確,會跳出你安裝的 Heroku CLI 版本 40 | 41 | ![alt tag](http://i.imgur.com/UuWGUk1.jpg) 42 | 43 | 接著再請你使用你的 cmd (命令提示字元) 輸入你的 [Heroku](https://dashboard.heroku.com/) 帳號 和 密碼 44 | 45 | ```cmd 46 | heroku login 47 | ``` 48 | 49 | ![alt tag](http://i.imgur.com/6vtoORM.jpg) 50 | 51 | ### 步驟三 52 | 53 | 請先 clone 我的簡單 flask 範例 54 | 55 | ```cmd 56 | git clone https://github.com/twtrubiks/Deploying-Flask-To-Heroku.git 57 | ``` 58 | 59 | 在資料夾裡,有幾個比較重要的檔案,分別為 60 | 61 | * requirements.txt 62 | * Procfile 63 | * runtime.txt 64 | 65 | #### requirements.txt 66 | 67 | 這個檔案是要告訴 [Heroku](https://dashboard.heroku.com/) 你的環境需要那些其他的套件 68 | 69 | 你可以使用 cmd (命令提示字元) 輸入以下指令查看目前電腦所安裝的套件 70 | 71 | p.s 請安裝你需要的套件即可 72 | 73 | ```cmd 74 | pip freeze 75 | ``` 76 | 77 | ![alt tag](http://i.imgur.com/WxuORWB.jpg) 78 | 79 | 然後可以使用以下指令匯出文字檔 requirements.txt 80 | 81 | ```cmd 82 | pip freeze > requirements.txt 83 | ``` 84 | 85 | ![alt tag](http://i.imgur.com/mlhGXOk.jpg) 86 | 87 | 該目錄底下會多出 requirements.txt 88 | 89 | p.s 可以把不需要安裝的套件從 requirements.txt 裡移除 90 | 91 | #### Procfile 92 | 93 | Procfile 這個檔案是要告訴 [Heroku](https://dashboard.heroku.com/) 要如何啟動這個 web app 94 | 95 | 在 [Heroku](https://dashboard.heroku.com/) 裡,官方使用 [Gunicorn](http://gunicorn.org/) 來啟動 web server,請參考 96 | 97 | [python-gunicorn Heroku](https://devcenter.heroku.com/articles/python-gunicorn) 98 | 99 | 所以在 **requirements.txt** 裡,請記得要輸入 [gunicorn](http://gunicorn.org/) 100 | 101 | Procfile 檔案,基本使用方法如下 102 | 103 | ```text 104 | web gunicorn app_run:app 105 | ``` 106 | 107 | app_run 就是你的 app_run.py,請依照自己設定的名稱自行修改 108 | 109 | #### runtime.txt 110 | 111 | runtime.txt 檔案裡,只需要簡單的填入你想要指定的 python 版本 112 | 113 | ```text 114 | python-3.4.3 115 | ``` 116 | 117 | 可參考 [Heroku python-runtimes](https://devcenter.heroku.com/articles/python-runtimes) 118 | 119 | 如果你不想指定 python 的版本,這個檔案可以忽略。 120 | 121 | ### 步驟四 122 | 123 | #### 先創造 Heroku application 124 | 125 | 方法一 : 126 | 127 | 使用你的 cmd (命令提示字元) 輸入以下指令 128 | 129 | ```cmd 130 | heroku create 131 | ``` 132 | 133 | ![alt tag](http://i.imgur.com/OJS8K3N.jpg) 134 | 135 | p.s 你看到的網址會和我看到的不一樣,請輸入你看到的 136 | 137 | 方法二 : 138 | 139 | 到網頁上新增一個 [Heroku application](https://dashboard.heroku.com/new?org=personal-apps) 140 | ![alt tag](http://i.imgur.com/8KVzbfD.jpg) 141 | 142 | #### 初始化 143 | 144 | 使用你的 cmd (命令提示字元) 切換到目錄底下,先著初始化 145 | 146 | ```cmd 147 | git init 148 | ``` 149 | 150 | #### 佈署 151 | 152 | 指定 remote 153 | 154 | ```cmd 155 | heroku git:remote -a tranquil-earth-29753 156 | ``` 157 | 158 | tranquil-earth-29753 這是我自己的,請輸入你的 159 | 160 | 這些指令你可以在 web app 裡的 deploy 看到 161 | 162 | ![alt tag](http://i.imgur.com/hQ5FN7A.jpg) 163 | 164 | 基本上就是 git 的操作,如不清楚什麼是 [Git](https://git-scm.com/) 165 | 166 | 可以參考我之前寫的 [Git-Tutorials](https://github.com/twtrubiks/Git-Tutorials) 167 | 168 | ```cmd 169 | git add . 170 | git commit -am "make it better" 171 | git push heroku master 172 | ``` 173 | 174 | ![alt tag](http://i.imgur.com/pRC4WGW.jpg) 175 | 176 | ![alt tag](http://i.imgur.com/gPaK7kd.jpg) 177 | 178 | 佈署完畢,網址的格式為,如上面這張圖 179 | 180 | ```url 181 | https://[ 你的 app 名稱 ].herokuapp.com/ 182 | ``` 183 | 184 | 例如我的網址格式為 185 | 186 | ```url 187 | https://tranquil-earth-29753.herokuapp.com/ 188 | ``` 189 | 190 | commit ID [4a42e26aee2bff1b10247d7e8a75d4d86b0c83b8](https://github.com/twtrubiks/Deploying-Flask-To-Heroku/tree/4a42e26aee2bff1b10247d7e8a75d4d86b0c83b8) 191 | 192 | ## 畫面 193 | 194 | 如果使用我的範例佈署成功,畫面應該如下 195 | 196 | 我的網址為 [https://tranquil-earth-29753.herokuapp.com/](https://tranquil-earth-29753.herokuapp.com/) 197 | 198 | ![alt tag](http://i.imgur.com/WGjBKEJ.jpg) 199 | 200 | ## LOG 資訊 201 | 202 | **log 的資訊非常重要** ,因為有時候本機端可以正常運行,但佈署上去就無法運行, 203 | 204 | 所以這時候就要看 log 資訊。 205 | 206 | 可以使用以下指令查看你在 heroku上 的 web app 的 log 207 | 208 | ```cmd 209 | heroku logs 210 | ``` 211 | 212 | ![alt tag](http://i.imgur.com/1Oe5rER.jpg) 213 | 214 | 或是可以從網頁端查看 215 | 216 | ![alt tag](http://i.imgur.com/NmyRvxs.jpg) 217 | 218 | 網址格式為 219 | 220 | ```url 221 | https://dashboard.heroku.com/apps/[ 你的 app 名稱 ]/logs 222 | ``` 223 | 224 | ## 如何在 heroku 上使用 database 225 | 226 | 請先到下列網址建立 database 227 | [heroku addons](https://elements.heroku.com/addons) 228 | 229 | 你會看到很多 db ,這裡用 Heroku Postgres 當作範例 230 | 231 | ![alt tag](http://i.imgur.com/AxoKeka.jpg) 232 | 233 | 接著安裝就行了,如果你還沒有登入,他會請你先登入 234 | 235 | ![alt tag](http://i.imgur.com/FCaqoPB.jpg) 236 | 237 | 選擇你的 db 是要給哪個專案用的 238 | 239 | ![alt tag](http://i.imgur.com/BQZVgjc.jpg) 240 | 241 | 接著選擇方案,這裡選擇 FREE 方案 242 | 243 | ![alt tag](http://i.imgur.com/jleHgxw.jpg) 244 | 245 | 接下來你就會看到 DB 已經被建立了 246 | 247 | ![alt tag](http://i.imgur.com/aa1kX6o.jpg) 248 | 249 | 點擊他,就可以跳到下面的畫面 250 | 251 | ![alt tag](http://i.imgur.com/eGQKDg1.jpg) 252 | 253 | 接著按 View Credentials 254 | 255 | ![alt tag](http://i.imgur.com/HuHQUvm.jpg) 256 | 257 | 可以看到自己 db 的一些資料,包含 帳號、密碼 資訊 258 | 259 | ![alt tag](http://i.imgur.com/roGcz1i.jpg) 260 | 261 | 現在我們來建立 DB 的 TABLE 262 | 263 | 先將 URI 這個很長的連接字串,貼到 [dbModel.py](https://github.com/twtrubiks/Deploying-Flask-To-Heroku/blob/master/dbModel.py) 裡面 264 | 265 | ```python 266 | app.config[ 267 | 'SQLALCHEMY_DATABASE_URI'] = 'postgres://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 268 | ``` 269 | 270 | 請貼自己的連接字串!!! 271 | 272 | 之後,我們使用 [Flask-Migrate-Tutorial](https://github.com/twtrubiks/Flask-Migrate-Tutorial) 來建立 DB 的 TABLE, 273 | 274 | 如果不懂,請參考 [Flask-Migrate-Tutorial](https://github.com/twtrubiks/Flask-Migrate-Tutorial) 範例。 275 | 276 | P.S 假如你和我一樣是使用 PostgreSQL , 需要額外安裝套件 [psycopg2](http://initd.org/psycopg/) 277 | 278 | ```cmd 279 | pip install psycopg2 280 | ``` 281 | 282 | 一切處理完畢之後,再進行部屬就完成了。 283 | 284 | 下圖為簡單的範例 [Demo](https://flask-demo-test.herokuapp.com/index) 285 | 286 | commit ID [ce4c8ee68f58c861a5a8072793912b204c186906](https://github.com/twtrubiks/Deploying-Flask-To-Heroku/tree/ce4c8ee68f58c861a5a8072793912b204c186906) 287 | 288 | ![alt tag](http://i.imgur.com/j1JAKS4.jpg) 289 | 290 | database information 就是將 db 的資料全部顯示出來 291 | 292 | ![alt tag](http://i.imgur.com/a6F14Aw.jpg) 293 | 294 | ## Heroku 注意事項 295 | 296 | 因為 heroku 的關係,有些人可能會遇到佈署失敗的問題,可以試著將 [runtime.txt](https://github.com/twtrubiks/Deploying-Flask-To-Heroku/blob/master/runtime.txt) 修改為 3.6.2 297 | 298 | ## 執行環境 299 | 300 | * Windows 10 301 | 302 | ## Reference 303 | 304 | * [Heroku](https://dashboard.heroku.com/) 305 | 306 | ## Donation 307 | 308 | 文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing: 309 | 310 | ![alt tag](https://i.imgur.com/LRct9xa.png) 311 | 312 | [贊助者付款](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8) 313 | 314 | ## License 315 | 316 | MIT license 317 | -------------------------------------------------------------------------------- /static/stylesheets/jquery.dataTables.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Table styles 3 | */ 4 | table.dataTable { 5 | width: 100%; 6 | margin: 0 auto; 7 | clear: both; 8 | border-collapse: separate; 9 | border-spacing: 0; 10 | /* 11 | * Header and footer styles 12 | */ 13 | /* 14 | * Body styles 15 | */ 16 | } 17 | table.dataTable thead th, 18 | table.dataTable tfoot th { 19 | font-weight: bold; 20 | } 21 | table.dataTable thead th, 22 | table.dataTable thead td { 23 | padding: 10px 18px; 24 | border-bottom: 1px solid #111; 25 | } 26 | table.dataTable thead th:active, 27 | table.dataTable thead td:active { 28 | outline: none; 29 | } 30 | table.dataTable tfoot th, 31 | table.dataTable tfoot td { 32 | padding: 10px 18px 6px 18px; 33 | border-top: 1px solid #111; 34 | } 35 | table.dataTable thead .sorting, 36 | table.dataTable thead .sorting_asc, 37 | table.dataTable thead .sorting_desc { 38 | cursor: pointer; 39 | *cursor: hand; 40 | } 41 | table.dataTable thead .sorting, 42 | table.dataTable thead .sorting_asc, 43 | table.dataTable thead .sorting_desc, 44 | table.dataTable thead .sorting_asc_disabled, 45 | table.dataTable thead .sorting_desc_disabled { 46 | background-repeat: no-repeat; 47 | background-position: center right; 48 | } 49 | table.dataTable thead .sorting { 50 | background-image: url("../images/sort_both.png"); 51 | } 52 | table.dataTable thead .sorting_asc { 53 | background-image: url("../images/sort_asc.png"); 54 | } 55 | table.dataTable thead .sorting_desc { 56 | background-image: url("../images/sort_desc.png"); 57 | } 58 | table.dataTable thead .sorting_asc_disabled { 59 | background-image: url("../images/sort_asc_disabled.png"); 60 | } 61 | table.dataTable thead .sorting_desc_disabled { 62 | background-image: url("../images/sort_desc_disabled.png"); 63 | } 64 | table.dataTable tbody tr { 65 | background-color: #ffffff; 66 | } 67 | table.dataTable tbody tr.selected { 68 | background-color: #B0BED9; 69 | } 70 | table.dataTable tbody th, 71 | table.dataTable tbody td { 72 | padding: 8px 10px; 73 | } 74 | table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { 75 | border-top: 1px solid #ddd; 76 | } 77 | table.dataTable.row-border tbody tr:first-child th, 78 | table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, 79 | table.dataTable.display tbody tr:first-child td { 80 | border-top: none; 81 | } 82 | table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { 83 | border-top: 1px solid #ddd; 84 | border-right: 1px solid #ddd; 85 | } 86 | table.dataTable.cell-border tbody tr th:first-child, 87 | table.dataTable.cell-border tbody tr td:first-child { 88 | border-left: 1px solid #ddd; 89 | } 90 | table.dataTable.cell-border tbody tr:first-child th, 91 | table.dataTable.cell-border tbody tr:first-child td { 92 | border-top: none; 93 | } 94 | table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { 95 | background-color: #f9f9f9; 96 | } 97 | table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { 98 | background-color: #acbad4; 99 | } 100 | table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { 101 | background-color: #f6f6f6; 102 | } 103 | table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { 104 | background-color: #aab7d1; 105 | } 106 | table.dataTable.order-column tbody tr > .sorting_1, 107 | table.dataTable.order-column tbody tr > .sorting_2, 108 | table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, 109 | table.dataTable.display tbody tr > .sorting_2, 110 | table.dataTable.display tbody tr > .sorting_3 { 111 | background-color: #fafafa; 112 | } 113 | table.dataTable.order-column tbody tr.selected > .sorting_1, 114 | table.dataTable.order-column tbody tr.selected > .sorting_2, 115 | table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, 116 | table.dataTable.display tbody tr.selected > .sorting_2, 117 | table.dataTable.display tbody tr.selected > .sorting_3 { 118 | background-color: #acbad5; 119 | } 120 | table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { 121 | background-color: #f1f1f1; 122 | } 123 | table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { 124 | background-color: #f3f3f3; 125 | } 126 | table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { 127 | background-color: whitesmoke; 128 | } 129 | table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { 130 | background-color: #a6b4cd; 131 | } 132 | table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { 133 | background-color: #a8b5cf; 134 | } 135 | table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { 136 | background-color: #a9b7d1; 137 | } 138 | table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { 139 | background-color: #fafafa; 140 | } 141 | table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { 142 | background-color: #fcfcfc; 143 | } 144 | table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { 145 | background-color: #fefefe; 146 | } 147 | table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { 148 | background-color: #acbad5; 149 | } 150 | table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { 151 | background-color: #aebcd6; 152 | } 153 | table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { 154 | background-color: #afbdd8; 155 | } 156 | table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { 157 | background-color: #eaeaea; 158 | } 159 | table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { 160 | background-color: #ececec; 161 | } 162 | table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { 163 | background-color: #efefef; 164 | } 165 | table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { 166 | background-color: #a2aec7; 167 | } 168 | table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { 169 | background-color: #a3b0c9; 170 | } 171 | table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { 172 | background-color: #a5b2cb; 173 | } 174 | table.dataTable.no-footer { 175 | border-bottom: 1px solid #111; 176 | } 177 | table.dataTable.nowrap th, table.dataTable.nowrap td { 178 | white-space: nowrap; 179 | } 180 | table.dataTable.compact thead th, 181 | table.dataTable.compact thead td { 182 | padding: 4px 17px 4px 4px; 183 | } 184 | table.dataTable.compact tfoot th, 185 | table.dataTable.compact tfoot td { 186 | padding: 4px; 187 | } 188 | table.dataTable.compact tbody th, 189 | table.dataTable.compact tbody td { 190 | padding: 4px; 191 | } 192 | table.dataTable th.dt-left, 193 | table.dataTable td.dt-left { 194 | text-align: left; 195 | } 196 | table.dataTable th.dt-center, 197 | table.dataTable td.dt-center, 198 | table.dataTable td.dataTables_empty { 199 | text-align: center; 200 | } 201 | table.dataTable th.dt-right, 202 | table.dataTable td.dt-right { 203 | text-align: right; 204 | } 205 | table.dataTable th.dt-justify, 206 | table.dataTable td.dt-justify { 207 | text-align: justify; 208 | } 209 | table.dataTable th.dt-nowrap, 210 | table.dataTable td.dt-nowrap { 211 | white-space: nowrap; 212 | } 213 | table.dataTable thead th.dt-head-left, 214 | table.dataTable thead td.dt-head-left, 215 | table.dataTable tfoot th.dt-head-left, 216 | table.dataTable tfoot td.dt-head-left { 217 | text-align: left; 218 | } 219 | table.dataTable thead th.dt-head-center, 220 | table.dataTable thead td.dt-head-center, 221 | table.dataTable tfoot th.dt-head-center, 222 | table.dataTable tfoot td.dt-head-center { 223 | text-align: center; 224 | } 225 | table.dataTable thead th.dt-head-right, 226 | table.dataTable thead td.dt-head-right, 227 | table.dataTable tfoot th.dt-head-right, 228 | table.dataTable tfoot td.dt-head-right { 229 | text-align: right; 230 | } 231 | table.dataTable thead th.dt-head-justify, 232 | table.dataTable thead td.dt-head-justify, 233 | table.dataTable tfoot th.dt-head-justify, 234 | table.dataTable tfoot td.dt-head-justify { 235 | text-align: justify; 236 | } 237 | table.dataTable thead th.dt-head-nowrap, 238 | table.dataTable thead td.dt-head-nowrap, 239 | table.dataTable tfoot th.dt-head-nowrap, 240 | table.dataTable tfoot td.dt-head-nowrap { 241 | white-space: nowrap; 242 | } 243 | table.dataTable tbody th.dt-body-left, 244 | table.dataTable tbody td.dt-body-left { 245 | text-align: left; 246 | } 247 | table.dataTable tbody th.dt-body-center, 248 | table.dataTable tbody td.dt-body-center { 249 | text-align: center; 250 | } 251 | table.dataTable tbody th.dt-body-right, 252 | table.dataTable tbody td.dt-body-right { 253 | text-align: right; 254 | } 255 | table.dataTable tbody th.dt-body-justify, 256 | table.dataTable tbody td.dt-body-justify { 257 | text-align: justify; 258 | } 259 | table.dataTable tbody th.dt-body-nowrap, 260 | table.dataTable tbody td.dt-body-nowrap { 261 | white-space: nowrap; 262 | } 263 | 264 | table.dataTable, 265 | table.dataTable th, 266 | table.dataTable td { 267 | -webkit-box-sizing: content-box; 268 | box-sizing: content-box; 269 | } 270 | 271 | /* 272 | * Control feature layout 273 | */ 274 | .dataTables_wrapper { 275 | position: relative; 276 | clear: both; 277 | *zoom: 1; 278 | zoom: 1; 279 | } 280 | .dataTables_wrapper .dataTables_length { 281 | float: left; 282 | } 283 | .dataTables_wrapper .dataTables_filter { 284 | float: right; 285 | text-align: right; 286 | } 287 | .dataTables_wrapper .dataTables_filter input { 288 | margin-left: 0.5em; 289 | } 290 | .dataTables_wrapper .dataTables_info { 291 | clear: both; 292 | float: left; 293 | padding-top: 0.755em; 294 | } 295 | .dataTables_wrapper .dataTables_paginate { 296 | float: right; 297 | text-align: right; 298 | padding-top: 0.25em; 299 | } 300 | .dataTables_wrapper .dataTables_paginate .paginate_button { 301 | box-sizing: border-box; 302 | display: inline-block; 303 | min-width: 1.5em; 304 | padding: 0.5em 1em; 305 | margin-left: 2px; 306 | text-align: center; 307 | text-decoration: none !important; 308 | cursor: pointer; 309 | *cursor: hand; 310 | color: #333 !important; 311 | border: 1px solid transparent; 312 | border-radius: 2px; 313 | } 314 | .dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { 315 | color: #333 !important; 316 | border: 1px solid #979797; 317 | background-color: white; 318 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); 319 | /* Chrome,Safari4+ */ 320 | background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); 321 | /* Chrome10+,Safari5.1+ */ 322 | background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); 323 | /* FF3.6+ */ 324 | background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); 325 | /* IE10+ */ 326 | background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); 327 | /* Opera 11.10+ */ 328 | background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); 329 | /* W3C */ 330 | } 331 | .dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { 332 | cursor: default; 333 | color: #666 !important; 334 | border: 1px solid transparent; 335 | background: transparent; 336 | box-shadow: none; 337 | } 338 | .dataTables_wrapper .dataTables_paginate .paginate_button:hover { 339 | color: white !important; 340 | border: 1px solid #111; 341 | background-color: #585858; 342 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); 343 | /* Chrome,Safari4+ */ 344 | background: -webkit-linear-gradient(top, #585858 0%, #111 100%); 345 | /* Chrome10+,Safari5.1+ */ 346 | background: -moz-linear-gradient(top, #585858 0%, #111 100%); 347 | /* FF3.6+ */ 348 | background: -ms-linear-gradient(top, #585858 0%, #111 100%); 349 | /* IE10+ */ 350 | background: -o-linear-gradient(top, #585858 0%, #111 100%); 351 | /* Opera 11.10+ */ 352 | background: linear-gradient(to bottom, #585858 0%, #111 100%); 353 | /* W3C */ 354 | } 355 | .dataTables_wrapper .dataTables_paginate .paginate_button:active { 356 | outline: none; 357 | background-color: #2b2b2b; 358 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); 359 | /* Chrome,Safari4+ */ 360 | background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 361 | /* Chrome10+,Safari5.1+ */ 362 | background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 363 | /* FF3.6+ */ 364 | background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 365 | /* IE10+ */ 366 | background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); 367 | /* Opera 11.10+ */ 368 | background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); 369 | /* W3C */ 370 | box-shadow: inset 0 0 3px #111; 371 | } 372 | .dataTables_wrapper .dataTables_paginate .ellipsis { 373 | padding: 0 1em; 374 | } 375 | .dataTables_wrapper .dataTables_processing { 376 | position: absolute; 377 | top: 50%; 378 | left: 50%; 379 | width: 100%; 380 | height: 40px; 381 | margin-left: -50%; 382 | margin-top: -25px; 383 | padding-top: 20px; 384 | text-align: center; 385 | font-size: 1.2em; 386 | background-color: white; 387 | background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); 388 | background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 389 | background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 390 | background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 391 | background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 392 | background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); 393 | } 394 | .dataTables_wrapper .dataTables_length, 395 | .dataTables_wrapper .dataTables_filter, 396 | .dataTables_wrapper .dataTables_info, 397 | .dataTables_wrapper .dataTables_processing, 398 | .dataTables_wrapper .dataTables_paginate { 399 | color: #333; 400 | } 401 | .dataTables_wrapper .dataTables_scroll { 402 | clear: both; 403 | } 404 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { 405 | *margin-top: -1px; 406 | -webkit-overflow-scrolling: touch; 407 | } 408 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td { 409 | vertical-align: middle; 410 | } 411 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, 412 | .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { 413 | height: 0; 414 | overflow: hidden; 415 | margin: 0 !important; 416 | padding: 0 !important; 417 | } 418 | .dataTables_wrapper.no-footer .dataTables_scrollBody { 419 | border-bottom: 1px solid #111; 420 | } 421 | .dataTables_wrapper.no-footer div.dataTables_scrollHead table, 422 | .dataTables_wrapper.no-footer div.dataTables_scrollBody table { 423 | border-bottom: none; 424 | } 425 | .dataTables_wrapper:after { 426 | visibility: hidden; 427 | display: block; 428 | content: ""; 429 | clear: both; 430 | height: 0; 431 | } 432 | 433 | @media screen and (max-width: 767px) { 434 | .dataTables_wrapper .dataTables_info, 435 | .dataTables_wrapper .dataTables_paginate { 436 | float: none; 437 | text-align: center; 438 | } 439 | .dataTables_wrapper .dataTables_paginate { 440 | margin-top: 0.5em; 441 | } 442 | } 443 | @media screen and (max-width: 640px) { 444 | .dataTables_wrapper .dataTables_length, 445 | .dataTables_wrapper .dataTables_filter { 446 | float: none; 447 | text-align: center; 448 | } 449 | .dataTables_wrapper .dataTables_filter { 450 | margin-top: 0.5em; 451 | } 452 | } 453 | -------------------------------------------------------------------------------- /static/stylesheets/font-awesome.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.6.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.6.3') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.6.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.6.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} 5 | -------------------------------------------------------------------------------- /static/javascripts/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.1 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.1",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.1",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.1",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.1",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('