├── LICENSE ├── README.md ├── assets ├── .DS_Store ├── Preloader_2.gif ├── css │ ├── bootstrap-theme.css │ ├── bootstrap-theme.min.css │ ├── bootstrap.css │ ├── bootstrap.min.css │ ├── djbug.css │ └── highlight.default.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 └── js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── highlight.pack.js │ └── jquery.min.js ├── background.html ├── background.js ├── devtools.html ├── devtools.js ├── dist ├── .DS_Store └── djdevpanel-0.1.zip ├── icon128.png ├── icon16.png ├── icon256.png ├── icon48.png ├── inserted-script.js ├── manifest.json ├── messageback-script.js ├── messaging.js ├── panel.html └── panel.js /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2017, Lofty Labs 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | * Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Django Developer Panel for Chrome 2 | === 3 | 4 | This extension is based on the boilerplate code at [https://github.com/thingsinjars/devtools-extension](https://github.com/thingsinjars/devtools-extension) 5 | 6 | Development Installation 7 | === 8 | 9 | * Open [chrome://extensions](chrome://extensions) 10 | * Enable 'Developer Mode' checkbox 11 | * Click 'Load unpacked extensions...' 12 | * Select the `djdevpanel-devtools` folder 13 | 14 | Usage 15 | === 16 | 17 | Install the chrome extension and follow the instructions at [https://github.com/loftylabs/django-developer-panel](https://github.com/loftylabs/django-developer-panel) to add the required middleware to your Django application. 18 | -------------------------------------------------------------------------------- /assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/assets/.DS_Store -------------------------------------------------------------------------------- /assets/Preloader_2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/assets/Preloader_2.gif -------------------------------------------------------------------------------- /assets/css/bootstrap-theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2017 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=d54a43febee21689b4ca77f6ccba6a21) 9 | * Config saved to config.json and https://gist.github.com/d54a43febee21689b4ca77f6ccba6a21 10 | */ 11 | /*! 12 | * Bootstrap v3.3.7 (http://getbootstrap.com) 13 | * Copyright 2011-2016 Twitter, Inc. 14 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 15 | */ 16 | .btn-default, 17 | .btn-primary, 18 | .btn-success, 19 | .btn-info, 20 | .btn-warning, 21 | .btn-danger { 22 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); 23 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); 24 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); 25 | } 26 | .btn-default:active, 27 | .btn-primary:active, 28 | .btn-success:active, 29 | .btn-info:active, 30 | .btn-warning:active, 31 | .btn-danger:active, 32 | .btn-default.active, 33 | .btn-primary.active, 34 | .btn-success.active, 35 | .btn-info.active, 36 | .btn-warning.active, 37 | .btn-danger.active { 38 | -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 39 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 40 | } 41 | .btn-default.disabled, 42 | .btn-primary.disabled, 43 | .btn-success.disabled, 44 | .btn-info.disabled, 45 | .btn-warning.disabled, 46 | .btn-danger.disabled, 47 | .btn-default[disabled], 48 | .btn-primary[disabled], 49 | .btn-success[disabled], 50 | .btn-info[disabled], 51 | .btn-warning[disabled], 52 | .btn-danger[disabled], 53 | fieldset[disabled] .btn-default, 54 | fieldset[disabled] .btn-primary, 55 | fieldset[disabled] .btn-success, 56 | fieldset[disabled] .btn-info, 57 | fieldset[disabled] .btn-warning, 58 | fieldset[disabled] .btn-danger { 59 | -webkit-box-shadow: none; 60 | box-shadow: none; 61 | } 62 | .btn-default .badge, 63 | .btn-primary .badge, 64 | .btn-success .badge, 65 | .btn-info .badge, 66 | .btn-warning .badge, 67 | .btn-danger .badge { 68 | text-shadow: none; 69 | } 70 | .btn:active, 71 | .btn.active { 72 | background-image: none; 73 | } 74 | .btn-default { 75 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); 76 | background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); 77 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0)); 78 | background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); 79 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); 80 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 81 | background-repeat: repeat-x; 82 | border-color: #dbdbdb; 83 | text-shadow: 0 1px 0 #fff; 84 | border-color: #ccc; 85 | } 86 | .btn-default:hover, 87 | .btn-default:focus { 88 | background-color: #e0e0e0; 89 | background-position: 0 -15px; 90 | } 91 | .btn-default:active, 92 | .btn-default.active { 93 | background-color: #e0e0e0; 94 | border-color: #dbdbdb; 95 | } 96 | .btn-default.disabled, 97 | .btn-default[disabled], 98 | fieldset[disabled] .btn-default, 99 | .btn-default.disabled:hover, 100 | .btn-default[disabled]:hover, 101 | fieldset[disabled] .btn-default:hover, 102 | .btn-default.disabled:focus, 103 | .btn-default[disabled]:focus, 104 | fieldset[disabled] .btn-default:focus, 105 | .btn-default.disabled.focus, 106 | .btn-default[disabled].focus, 107 | fieldset[disabled] .btn-default.focus, 108 | .btn-default.disabled:active, 109 | .btn-default[disabled]:active, 110 | fieldset[disabled] .btn-default:active, 111 | .btn-default.disabled.active, 112 | .btn-default[disabled].active, 113 | fieldset[disabled] .btn-default.active { 114 | background-color: #e0e0e0; 115 | background-image: none; 116 | } 117 | .btn-primary { 118 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); 119 | background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); 120 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); 121 | background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); 122 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); 123 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 124 | background-repeat: repeat-x; 125 | border-color: #245580; 126 | } 127 | .btn-primary:hover, 128 | .btn-primary:focus { 129 | background-color: #265a88; 130 | background-position: 0 -15px; 131 | } 132 | .btn-primary:active, 133 | .btn-primary.active { 134 | background-color: #265a88; 135 | border-color: #245580; 136 | } 137 | .btn-primary.disabled, 138 | .btn-primary[disabled], 139 | fieldset[disabled] .btn-primary, 140 | .btn-primary.disabled:hover, 141 | .btn-primary[disabled]:hover, 142 | fieldset[disabled] .btn-primary:hover, 143 | .btn-primary.disabled:focus, 144 | .btn-primary[disabled]:focus, 145 | fieldset[disabled] .btn-primary:focus, 146 | .btn-primary.disabled.focus, 147 | .btn-primary[disabled].focus, 148 | fieldset[disabled] .btn-primary.focus, 149 | .btn-primary.disabled:active, 150 | .btn-primary[disabled]:active, 151 | fieldset[disabled] .btn-primary:active, 152 | .btn-primary.disabled.active, 153 | .btn-primary[disabled].active, 154 | fieldset[disabled] .btn-primary.active { 155 | background-color: #265a88; 156 | background-image: none; 157 | } 158 | .btn-success { 159 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); 160 | background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); 161 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); 162 | background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); 163 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); 164 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 165 | background-repeat: repeat-x; 166 | border-color: #3e8f3e; 167 | } 168 | .btn-success:hover, 169 | .btn-success:focus { 170 | background-color: #419641; 171 | background-position: 0 -15px; 172 | } 173 | .btn-success:active, 174 | .btn-success.active { 175 | background-color: #419641; 176 | border-color: #3e8f3e; 177 | } 178 | .btn-success.disabled, 179 | .btn-success[disabled], 180 | fieldset[disabled] .btn-success, 181 | .btn-success.disabled:hover, 182 | .btn-success[disabled]:hover, 183 | fieldset[disabled] .btn-success:hover, 184 | .btn-success.disabled:focus, 185 | .btn-success[disabled]:focus, 186 | fieldset[disabled] .btn-success:focus, 187 | .btn-success.disabled.focus, 188 | .btn-success[disabled].focus, 189 | fieldset[disabled] .btn-success.focus, 190 | .btn-success.disabled:active, 191 | .btn-success[disabled]:active, 192 | fieldset[disabled] .btn-success:active, 193 | .btn-success.disabled.active, 194 | .btn-success[disabled].active, 195 | fieldset[disabled] .btn-success.active { 196 | background-color: #419641; 197 | background-image: none; 198 | } 199 | .btn-info { 200 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 201 | background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); 202 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); 203 | background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); 204 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); 205 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 206 | background-repeat: repeat-x; 207 | border-color: #28a4c9; 208 | } 209 | .btn-info:hover, 210 | .btn-info:focus { 211 | background-color: #2aabd2; 212 | background-position: 0 -15px; 213 | } 214 | .btn-info:active, 215 | .btn-info.active { 216 | background-color: #2aabd2; 217 | border-color: #28a4c9; 218 | } 219 | .btn-info.disabled, 220 | .btn-info[disabled], 221 | fieldset[disabled] .btn-info, 222 | .btn-info.disabled:hover, 223 | .btn-info[disabled]:hover, 224 | fieldset[disabled] .btn-info:hover, 225 | .btn-info.disabled:focus, 226 | .btn-info[disabled]:focus, 227 | fieldset[disabled] .btn-info:focus, 228 | .btn-info.disabled.focus, 229 | .btn-info[disabled].focus, 230 | fieldset[disabled] .btn-info.focus, 231 | .btn-info.disabled:active, 232 | .btn-info[disabled]:active, 233 | fieldset[disabled] .btn-info:active, 234 | .btn-info.disabled.active, 235 | .btn-info[disabled].active, 236 | fieldset[disabled] .btn-info.active { 237 | background-color: #2aabd2; 238 | background-image: none; 239 | } 240 | .btn-warning { 241 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 242 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); 243 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); 244 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); 245 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); 246 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 247 | background-repeat: repeat-x; 248 | border-color: #e38d13; 249 | } 250 | .btn-warning:hover, 251 | .btn-warning:focus { 252 | background-color: #eb9316; 253 | background-position: 0 -15px; 254 | } 255 | .btn-warning:active, 256 | .btn-warning.active { 257 | background-color: #eb9316; 258 | border-color: #e38d13; 259 | } 260 | .btn-warning.disabled, 261 | .btn-warning[disabled], 262 | fieldset[disabled] .btn-warning, 263 | .btn-warning.disabled:hover, 264 | .btn-warning[disabled]:hover, 265 | fieldset[disabled] .btn-warning:hover, 266 | .btn-warning.disabled:focus, 267 | .btn-warning[disabled]:focus, 268 | fieldset[disabled] .btn-warning:focus, 269 | .btn-warning.disabled.focus, 270 | .btn-warning[disabled].focus, 271 | fieldset[disabled] .btn-warning.focus, 272 | .btn-warning.disabled:active, 273 | .btn-warning[disabled]:active, 274 | fieldset[disabled] .btn-warning:active, 275 | .btn-warning.disabled.active, 276 | .btn-warning[disabled].active, 277 | fieldset[disabled] .btn-warning.active { 278 | background-color: #eb9316; 279 | background-image: none; 280 | } 281 | .btn-danger { 282 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 283 | background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); 284 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); 285 | background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); 286 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); 287 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 288 | background-repeat: repeat-x; 289 | border-color: #b92c28; 290 | } 291 | .btn-danger:hover, 292 | .btn-danger:focus { 293 | background-color: #c12e2a; 294 | background-position: 0 -15px; 295 | } 296 | .btn-danger:active, 297 | .btn-danger.active { 298 | background-color: #c12e2a; 299 | border-color: #b92c28; 300 | } 301 | .btn-danger.disabled, 302 | .btn-danger[disabled], 303 | fieldset[disabled] .btn-danger, 304 | .btn-danger.disabled:hover, 305 | .btn-danger[disabled]:hover, 306 | fieldset[disabled] .btn-danger:hover, 307 | .btn-danger.disabled:focus, 308 | .btn-danger[disabled]:focus, 309 | fieldset[disabled] .btn-danger:focus, 310 | .btn-danger.disabled.focus, 311 | .btn-danger[disabled].focus, 312 | fieldset[disabled] .btn-danger.focus, 313 | .btn-danger.disabled:active, 314 | .btn-danger[disabled]:active, 315 | fieldset[disabled] .btn-danger:active, 316 | .btn-danger.disabled.active, 317 | .btn-danger[disabled].active, 318 | fieldset[disabled] .btn-danger.active { 319 | background-color: #c12e2a; 320 | background-image: none; 321 | } 322 | .thumbnail, 323 | .img-thumbnail { 324 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 325 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 326 | } 327 | .dropdown-menu > li > a:hover, 328 | .dropdown-menu > li > a:focus { 329 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 330 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 331 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 332 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 333 | background-repeat: repeat-x; 334 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 335 | background-color: #e8e8e8; 336 | } 337 | .dropdown-menu > .active > a, 338 | .dropdown-menu > .active > a:hover, 339 | .dropdown-menu > .active > a:focus { 340 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 341 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 342 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 343 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 344 | background-repeat: repeat-x; 345 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 346 | background-color: #2e6da4; 347 | } 348 | .navbar-default { 349 | background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); 350 | background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); 351 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8)); 352 | background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); 353 | background-repeat: repeat-x; 354 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); 355 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 356 | border-radius: 4px; 357 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); 358 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); 359 | } 360 | .navbar-default .navbar-nav > .open > a, 361 | .navbar-default .navbar-nav > .active > a { 362 | background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 363 | background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); 364 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); 365 | background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); 366 | background-repeat: repeat-x; 367 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); 368 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); 369 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); 370 | } 371 | .navbar-brand, 372 | .navbar-nav > li > a { 373 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); 374 | } 375 | .navbar-inverse { 376 | background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); 377 | background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%); 378 | background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222222)); 379 | background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); 380 | background-repeat: repeat-x; 381 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); 382 | filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); 383 | border-radius: 4px; 384 | } 385 | .navbar-inverse .navbar-nav > .open > a, 386 | .navbar-inverse .navbar-nav > .active > a { 387 | background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); 388 | background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); 389 | background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); 390 | background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); 391 | background-repeat: repeat-x; 392 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); 393 | -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); 394 | box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); 395 | } 396 | .navbar-inverse .navbar-brand, 397 | .navbar-inverse .navbar-nav > li > a { 398 | text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); 399 | } 400 | .navbar-static-top, 401 | .navbar-fixed-top, 402 | .navbar-fixed-bottom { 403 | border-radius: 0; 404 | } 405 | @media (max-width: 767px) { 406 | .navbar .navbar-nav .open .dropdown-menu > .active > a, 407 | .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, 408 | .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { 409 | color: #fff; 410 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 411 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 412 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 413 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 414 | background-repeat: repeat-x; 415 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 416 | } 417 | } 418 | .alert { 419 | text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); 420 | -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 421 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); 422 | } 423 | .alert-success { 424 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 425 | background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); 426 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); 427 | background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); 428 | background-repeat: repeat-x; 429 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); 430 | border-color: #b2dba1; 431 | } 432 | .alert-info { 433 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 434 | background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); 435 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); 436 | background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); 437 | background-repeat: repeat-x; 438 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); 439 | border-color: #9acfea; 440 | } 441 | .alert-warning { 442 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 443 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); 444 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); 445 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); 446 | background-repeat: repeat-x; 447 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); 448 | border-color: #f5e79e; 449 | } 450 | .alert-danger { 451 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 452 | background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); 453 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); 454 | background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); 455 | background-repeat: repeat-x; 456 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); 457 | border-color: #dca7a7; 458 | } 459 | .progress { 460 | background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 461 | background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); 462 | background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); 463 | background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); 464 | background-repeat: repeat-x; 465 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); 466 | } 467 | .progress-bar { 468 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); 469 | background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); 470 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); 471 | background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); 472 | background-repeat: repeat-x; 473 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); 474 | } 475 | .progress-bar-success { 476 | background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); 477 | background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); 478 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); 479 | background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); 480 | background-repeat: repeat-x; 481 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); 482 | } 483 | .progress-bar-info { 484 | background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 485 | background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); 486 | background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); 487 | background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); 488 | background-repeat: repeat-x; 489 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); 490 | } 491 | .progress-bar-warning { 492 | background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 493 | background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); 494 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); 495 | background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); 496 | background-repeat: repeat-x; 497 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); 498 | } 499 | .progress-bar-danger { 500 | background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); 501 | background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); 502 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); 503 | background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); 504 | background-repeat: repeat-x; 505 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); 506 | } 507 | .progress-bar-striped { 508 | background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 509 | background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 510 | background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); 511 | } 512 | .list-group { 513 | border-radius: 4px; 514 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 515 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); 516 | } 517 | .list-group-item.active, 518 | .list-group-item.active:hover, 519 | .list-group-item.active:focus { 520 | text-shadow: 0 -1px 0 #286090; 521 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); 522 | background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); 523 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); 524 | background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); 525 | background-repeat: repeat-x; 526 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); 527 | border-color: #2b669a; 528 | } 529 | .list-group-item.active .badge, 530 | .list-group-item.active:hover .badge, 531 | .list-group-item.active:focus .badge { 532 | text-shadow: none; 533 | } 534 | .panel { 535 | -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 536 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 537 | } 538 | .panel-default > .panel-heading { 539 | background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 540 | background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); 541 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); 542 | background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); 543 | background-repeat: repeat-x; 544 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); 545 | } 546 | .panel-primary > .panel-heading { 547 | background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 548 | background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); 549 | background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); 550 | background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); 551 | background-repeat: repeat-x; 552 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); 553 | } 554 | .panel-success > .panel-heading { 555 | background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 556 | background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); 557 | background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); 558 | background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); 559 | background-repeat: repeat-x; 560 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); 561 | } 562 | .panel-info > .panel-heading { 563 | background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 564 | background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); 565 | background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); 566 | background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); 567 | background-repeat: repeat-x; 568 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); 569 | } 570 | .panel-warning > .panel-heading { 571 | background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 572 | background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); 573 | background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); 574 | background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); 575 | background-repeat: repeat-x; 576 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); 577 | } 578 | .panel-danger > .panel-heading { 579 | background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 580 | background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); 581 | background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); 582 | background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); 583 | background-repeat: repeat-x; 584 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); 585 | } 586 | .well { 587 | background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 588 | background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); 589 | background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); 590 | background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); 591 | background-repeat: repeat-x; 592 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); 593 | border-color: #dcdcdc; 594 | -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); 595 | box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); 596 | } 597 | -------------------------------------------------------------------------------- /assets/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2017 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=d54a43febee21689b4ca77f6ccba6a21) 9 | * Config saved to config.json and https://gist.github.com/d54a43febee21689b4ca77f6ccba6a21 10 | *//*! 11 | * Bootstrap v3.3.7 (http://getbootstrap.com) 12 | * Copyright 2011-2016 Twitter, Inc. 13 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 14 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-default.disabled,.btn-primary.disabled,.btn-success.disabled,.btn-info.disabled,.btn-warning.disabled,.btn-danger.disabled,.btn-default[disabled],.btn-primary[disabled],.btn-success[disabled],.btn-info[disabled],.btn-warning[disabled],.btn-danger[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-info,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-danger{-webkit-box-shadow:none;box-shadow:none}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-o-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#e0e0e0));background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-o-linear-gradient(top, #337ab7 0, #265a88 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#265a88));background-image:linear-gradient(to bottom, #337ab7 0, #265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#245580}.btn-primary:hover,.btn-primary:focus{background-color:#265a88;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#419641));background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#2aabd2));background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#eb9316));background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c12e2a));background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-o-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), to(#f8f8f8));background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-o-linear-gradient(top, #dbdbdb 0, #e2e2e2 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dbdbdb), to(#e2e2e2));background-image:linear-gradient(to bottom, #dbdbdb 0, #e2e2e2 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-o-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3c3c3c), to(#222));background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border-radius:4px}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-o-linear-gradient(top, #080808 0, #0f0f0f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #080808), to(#0f0f0f));background-image:linear-gradient(to bottom, #080808 0, #0f0f0f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#c8e5bc));background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#b9def0));background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#f8efc0));background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-o-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#e7c3c3));background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ebebeb), to(#f5f5f5));background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-o-linear-gradient(top, #337ab7 0, #286090 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#286090));background-image:linear-gradient(to bottom, #337ab7 0, #286090 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-o-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5cb85c), to(#449d44));background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-o-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #5bc0de), to(#31b0d5));background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-o-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f0ad4e), to(#ec971f));background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-o-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9534f), to(#c9302c));background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2b669a 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2b669a));background-image:linear-gradient(to bottom, #337ab7 0, #2b669a 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-o-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f5f5f5), to(#e8e8e8));background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-o-linear-gradient(top, #337ab7 0, #2e6da4 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #337ab7), to(#2e6da4));background-image:linear-gradient(to bottom, #337ab7 0, #2e6da4 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-o-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dff0d8), to(#d0e9c6));background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-o-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #d9edf7), to(#c4e3f3));background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-o-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fcf8e3), to(#faf2cc));background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-o-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2dede), to(#ebcccc));background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-o-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e8e8e8), to(#f5f5f5));background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} -------------------------------------------------------------------------------- /assets/css/djbug.css: -------------------------------------------------------------------------------- 1 | pre { 2 | padding: 0; 3 | border: 0; 4 | } 5 | 6 | 7 | .current-user code, .session-data code { 8 | white-space: pre; 9 | } 10 | 11 | .no-js #loader { display: none; } 12 | .js #loader { display: block; position: absolute; left: 100px; top: 0; } 13 | .se-pre-con { 14 | position: fixed; 15 | left: 0px; 16 | top: 0px; 17 | width: 100%; 18 | height: 100%; 19 | z-index: 9999; 20 | background: url(../Preloader_2.gif) center no-repeat #fff; 21 | } 22 | 23 | .se-pre-con span { 24 | font-size: 3em; 25 | display: block; 26 | font-weight: bold; 27 | color: #00a0c8; 28 | position: relative; 29 | top: calc(50% - 33px); 30 | left: calc(50% - 300px); 31 | } 32 | 33 | .borderless { 34 | border: 0 !important; 35 | } 36 | -------------------------------------------------------------------------------- /assets/css/highlight.default.css: -------------------------------------------------------------------------------- 1 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 2 | 3 | /* Tomorrow Comment */ 4 | .hljs-comment, 5 | .hljs-quote { 6 | color: #8e908c; 7 | } 8 | 9 | /* Tomorrow Red */ 10 | .hljs-variable, 11 | .hljs-template-variable, 12 | .hljs-tag, 13 | .hljs-name, 14 | .hljs-selector-id, 15 | .hljs-selector-class, 16 | .hljs-regexp, 17 | .hljs-deletion { 18 | color: #c82829; 19 | } 20 | 21 | /* Tomorrow Orange */ 22 | .hljs-number, 23 | .hljs-built_in, 24 | .hljs-builtin-name, 25 | .hljs-literal, 26 | .hljs-type, 27 | .hljs-params, 28 | .hljs-meta, 29 | .hljs-link { 30 | color: #f5871f; 31 | } 32 | 33 | /* Tomorrow Yellow */ 34 | .hljs-attribute { 35 | color: #eab700; 36 | } 37 | 38 | /* Tomorrow Green */ 39 | .hljs-string, 40 | .hljs-symbol, 41 | .hljs-bullet, 42 | .hljs-addition { 43 | color: #718c00; 44 | } 45 | 46 | /* Tomorrow Blue */ 47 | .hljs-title, 48 | .hljs-section { 49 | color: #4271ae; 50 | } 51 | 52 | /* Tomorrow Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #8959a8; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: white; 62 | color: #4d4d4c; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/assets/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/assets/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/assets/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /assets/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/assets/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2017 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=d54a43febee21689b4ca77f6ccba6a21) 9 | * Config saved to config.json and https://gist.github.com/d54a43febee21689b4ca77f6ccba6a21 10 | */ 11 | if (typeof jQuery === 'undefined') { 12 | throw new Error('Bootstrap\'s JavaScript requires jQuery') 13 | } 14 | +function ($) { 15 | 'use strict'; 16 | var version = $.fn.jquery.split(' ')[0].split('.') 17 | if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { 18 | throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') 19 | } 20 | }(jQuery); 21 | 22 | /* ======================================================================== 23 | * Bootstrap: alert.js v3.3.7 24 | * http://getbootstrap.com/javascript/#alerts 25 | * ======================================================================== 26 | * Copyright 2011-2016 Twitter, Inc. 27 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 28 | * ======================================================================== */ 29 | 30 | 31 | +function ($) { 32 | 'use strict'; 33 | 34 | // ALERT CLASS DEFINITION 35 | // ====================== 36 | 37 | var dismiss = '[data-dismiss="alert"]' 38 | var Alert = function (el) { 39 | $(el).on('click', dismiss, this.close) 40 | } 41 | 42 | Alert.VERSION = '3.3.7' 43 | 44 | Alert.TRANSITION_DURATION = 150 45 | 46 | Alert.prototype.close = function (e) { 47 | var $this = $(this) 48 | var selector = $this.attr('data-target') 49 | 50 | if (!selector) { 51 | selector = $this.attr('href') 52 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 53 | } 54 | 55 | var $parent = $(selector === '#' ? [] : selector) 56 | 57 | if (e) e.preventDefault() 58 | 59 | if (!$parent.length) { 60 | $parent = $this.closest('.alert') 61 | } 62 | 63 | $parent.trigger(e = $.Event('close.bs.alert')) 64 | 65 | if (e.isDefaultPrevented()) return 66 | 67 | $parent.removeClass('in') 68 | 69 | function removeElement() { 70 | // detach from parent, fire event then clean up data 71 | $parent.detach().trigger('closed.bs.alert').remove() 72 | } 73 | 74 | $.support.transition && $parent.hasClass('fade') ? 75 | $parent 76 | .one('bsTransitionEnd', removeElement) 77 | .emulateTransitionEnd(Alert.TRANSITION_DURATION) : 78 | removeElement() 79 | } 80 | 81 | 82 | // ALERT PLUGIN DEFINITION 83 | // ======================= 84 | 85 | function Plugin(option) { 86 | return this.each(function () { 87 | var $this = $(this) 88 | var data = $this.data('bs.alert') 89 | 90 | if (!data) $this.data('bs.alert', (data = new Alert(this))) 91 | if (typeof option == 'string') data[option].call($this) 92 | }) 93 | } 94 | 95 | var old = $.fn.alert 96 | 97 | $.fn.alert = Plugin 98 | $.fn.alert.Constructor = Alert 99 | 100 | 101 | // ALERT NO CONFLICT 102 | // ================= 103 | 104 | $.fn.alert.noConflict = function () { 105 | $.fn.alert = old 106 | return this 107 | } 108 | 109 | 110 | // ALERT DATA-API 111 | // ============== 112 | 113 | $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) 114 | 115 | }(jQuery); 116 | 117 | /* ======================================================================== 118 | * Bootstrap: button.js v3.3.7 119 | * http://getbootstrap.com/javascript/#buttons 120 | * ======================================================================== 121 | * Copyright 2011-2016 Twitter, Inc. 122 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 123 | * ======================================================================== */ 124 | 125 | 126 | +function ($) { 127 | 'use strict'; 128 | 129 | // BUTTON PUBLIC CLASS DEFINITION 130 | // ============================== 131 | 132 | var Button = function (element, options) { 133 | this.$element = $(element) 134 | this.options = $.extend({}, Button.DEFAULTS, options) 135 | this.isLoading = false 136 | } 137 | 138 | Button.VERSION = '3.3.7' 139 | 140 | Button.DEFAULTS = { 141 | loadingText: 'loading...' 142 | } 143 | 144 | Button.prototype.setState = function (state) { 145 | var d = 'disabled' 146 | var $el = this.$element 147 | var val = $el.is('input') ? 'val' : 'html' 148 | var data = $el.data() 149 | 150 | state += 'Text' 151 | 152 | if (data.resetText == null) $el.data('resetText', $el[val]()) 153 | 154 | // push to event loop to allow forms to submit 155 | setTimeout($.proxy(function () { 156 | $el[val](data[state] == null ? this.options[state] : data[state]) 157 | 158 | if (state == 'loadingText') { 159 | this.isLoading = true 160 | $el.addClass(d).attr(d, d).prop(d, true) 161 | } else if (this.isLoading) { 162 | this.isLoading = false 163 | $el.removeClass(d).removeAttr(d).prop(d, false) 164 | } 165 | }, this), 0) 166 | } 167 | 168 | Button.prototype.toggle = function () { 169 | var changed = true 170 | var $parent = this.$element.closest('[data-toggle="buttons"]') 171 | 172 | if ($parent.length) { 173 | var $input = this.$element.find('input') 174 | if ($input.prop('type') == 'radio') { 175 | if ($input.prop('checked')) changed = false 176 | $parent.find('.active').removeClass('active') 177 | this.$element.addClass('active') 178 | } else if ($input.prop('type') == 'checkbox') { 179 | if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false 180 | this.$element.toggleClass('active') 181 | } 182 | $input.prop('checked', this.$element.hasClass('active')) 183 | if (changed) $input.trigger('change') 184 | } else { 185 | this.$element.attr('aria-pressed', !this.$element.hasClass('active')) 186 | this.$element.toggleClass('active') 187 | } 188 | } 189 | 190 | 191 | // BUTTON PLUGIN DEFINITION 192 | // ======================== 193 | 194 | function Plugin(option) { 195 | return this.each(function () { 196 | var $this = $(this) 197 | var data = $this.data('bs.button') 198 | var options = typeof option == 'object' && option 199 | 200 | if (!data) $this.data('bs.button', (data = new Button(this, options))) 201 | 202 | if (option == 'toggle') data.toggle() 203 | else if (option) data.setState(option) 204 | }) 205 | } 206 | 207 | var old = $.fn.button 208 | 209 | $.fn.button = Plugin 210 | $.fn.button.Constructor = Button 211 | 212 | 213 | // BUTTON NO CONFLICT 214 | // ================== 215 | 216 | $.fn.button.noConflict = function () { 217 | $.fn.button = old 218 | return this 219 | } 220 | 221 | 222 | // BUTTON DATA-API 223 | // =============== 224 | 225 | $(document) 226 | .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { 227 | var $btn = $(e.target).closest('.btn') 228 | Plugin.call($btn, 'toggle') 229 | if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { 230 | // Prevent double click on radios, and the double selections (so cancellation) on checkboxes 231 | e.preventDefault() 232 | // The target component still receive the focus 233 | if ($btn.is('input,button')) $btn.trigger('focus') 234 | else $btn.find('input:visible,button:visible').first().trigger('focus') 235 | } 236 | }) 237 | .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { 238 | $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) 239 | }) 240 | 241 | }(jQuery); 242 | 243 | /* ======================================================================== 244 | * Bootstrap: carousel.js v3.3.7 245 | * http://getbootstrap.com/javascript/#carousel 246 | * ======================================================================== 247 | * Copyright 2011-2016 Twitter, Inc. 248 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 249 | * ======================================================================== */ 250 | 251 | 252 | +function ($) { 253 | 'use strict'; 254 | 255 | // CAROUSEL CLASS DEFINITION 256 | // ========================= 257 | 258 | var Carousel = function (element, options) { 259 | this.$element = $(element) 260 | this.$indicators = this.$element.find('.carousel-indicators') 261 | this.options = options 262 | this.paused = null 263 | this.sliding = null 264 | this.interval = null 265 | this.$active = null 266 | this.$items = null 267 | 268 | this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) 269 | 270 | this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element 271 | .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) 272 | .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) 273 | } 274 | 275 | Carousel.VERSION = '3.3.7' 276 | 277 | Carousel.TRANSITION_DURATION = 600 278 | 279 | Carousel.DEFAULTS = { 280 | interval: 5000, 281 | pause: 'hover', 282 | wrap: true, 283 | keyboard: true 284 | } 285 | 286 | Carousel.prototype.keydown = function (e) { 287 | if (/input|textarea/i.test(e.target.tagName)) return 288 | switch (e.which) { 289 | case 37: this.prev(); break 290 | case 39: this.next(); break 291 | default: return 292 | } 293 | 294 | e.preventDefault() 295 | } 296 | 297 | Carousel.prototype.cycle = function (e) { 298 | e || (this.paused = false) 299 | 300 | this.interval && clearInterval(this.interval) 301 | 302 | this.options.interval 303 | && !this.paused 304 | && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) 305 | 306 | return this 307 | } 308 | 309 | Carousel.prototype.getItemIndex = function (item) { 310 | this.$items = item.parent().children('.item') 311 | return this.$items.index(item || this.$active) 312 | } 313 | 314 | Carousel.prototype.getItemForDirection = function (direction, active) { 315 | var activeIndex = this.getItemIndex(active) 316 | var willWrap = (direction == 'prev' && activeIndex === 0) 317 | || (direction == 'next' && activeIndex == (this.$items.length - 1)) 318 | if (willWrap && !this.options.wrap) return active 319 | var delta = direction == 'prev' ? -1 : 1 320 | var itemIndex = (activeIndex + delta) % this.$items.length 321 | return this.$items.eq(itemIndex) 322 | } 323 | 324 | Carousel.prototype.to = function (pos) { 325 | var that = this 326 | var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) 327 | 328 | if (pos > (this.$items.length - 1) || pos < 0) return 329 | 330 | if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" 331 | if (activeIndex == pos) return this.pause().cycle() 332 | 333 | return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) 334 | } 335 | 336 | Carousel.prototype.pause = function (e) { 337 | e || (this.paused = true) 338 | 339 | if (this.$element.find('.next, .prev').length && $.support.transition) { 340 | this.$element.trigger($.support.transition.end) 341 | this.cycle(true) 342 | } 343 | 344 | this.interval = clearInterval(this.interval) 345 | 346 | return this 347 | } 348 | 349 | Carousel.prototype.next = function () { 350 | if (this.sliding) return 351 | return this.slide('next') 352 | } 353 | 354 | Carousel.prototype.prev = function () { 355 | if (this.sliding) return 356 | return this.slide('prev') 357 | } 358 | 359 | Carousel.prototype.slide = function (type, next) { 360 | var $active = this.$element.find('.item.active') 361 | var $next = next || this.getItemForDirection(type, $active) 362 | var isCycling = this.interval 363 | var direction = type == 'next' ? 'left' : 'right' 364 | var that = this 365 | 366 | if ($next.hasClass('active')) return (this.sliding = false) 367 | 368 | var relatedTarget = $next[0] 369 | var slideEvent = $.Event('slide.bs.carousel', { 370 | relatedTarget: relatedTarget, 371 | direction: direction 372 | }) 373 | this.$element.trigger(slideEvent) 374 | if (slideEvent.isDefaultPrevented()) return 375 | 376 | this.sliding = true 377 | 378 | isCycling && this.pause() 379 | 380 | if (this.$indicators.length) { 381 | this.$indicators.find('.active').removeClass('active') 382 | var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) 383 | $nextIndicator && $nextIndicator.addClass('active') 384 | } 385 | 386 | var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" 387 | if ($.support.transition && this.$element.hasClass('slide')) { 388 | $next.addClass(type) 389 | $next[0].offsetWidth // force reflow 390 | $active.addClass(direction) 391 | $next.addClass(direction) 392 | $active 393 | .one('bsTransitionEnd', function () { 394 | $next.removeClass([type, direction].join(' ')).addClass('active') 395 | $active.removeClass(['active', direction].join(' ')) 396 | that.sliding = false 397 | setTimeout(function () { 398 | that.$element.trigger(slidEvent) 399 | }, 0) 400 | }) 401 | .emulateTransitionEnd(Carousel.TRANSITION_DURATION) 402 | } else { 403 | $active.removeClass('active') 404 | $next.addClass('active') 405 | this.sliding = false 406 | this.$element.trigger(slidEvent) 407 | } 408 | 409 | isCycling && this.cycle() 410 | 411 | return this 412 | } 413 | 414 | 415 | // CAROUSEL PLUGIN DEFINITION 416 | // ========================== 417 | 418 | function Plugin(option) { 419 | return this.each(function () { 420 | var $this = $(this) 421 | var data = $this.data('bs.carousel') 422 | var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) 423 | var action = typeof option == 'string' ? option : options.slide 424 | 425 | if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) 426 | if (typeof option == 'number') data.to(option) 427 | else if (action) data[action]() 428 | else if (options.interval) data.pause().cycle() 429 | }) 430 | } 431 | 432 | var old = $.fn.carousel 433 | 434 | $.fn.carousel = Plugin 435 | $.fn.carousel.Constructor = Carousel 436 | 437 | 438 | // CAROUSEL NO CONFLICT 439 | // ==================== 440 | 441 | $.fn.carousel.noConflict = function () { 442 | $.fn.carousel = old 443 | return this 444 | } 445 | 446 | 447 | // CAROUSEL DATA-API 448 | // ================= 449 | 450 | var clickHandler = function (e) { 451 | var href 452 | var $this = $(this) 453 | var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 454 | if (!$target.hasClass('carousel')) return 455 | var options = $.extend({}, $target.data(), $this.data()) 456 | var slideIndex = $this.attr('data-slide-to') 457 | if (slideIndex) options.interval = false 458 | 459 | Plugin.call($target, options) 460 | 461 | if (slideIndex) { 462 | $target.data('bs.carousel').to(slideIndex) 463 | } 464 | 465 | e.preventDefault() 466 | } 467 | 468 | $(document) 469 | .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) 470 | .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) 471 | 472 | $(window).on('load', function () { 473 | $('[data-ride="carousel"]').each(function () { 474 | var $carousel = $(this) 475 | Plugin.call($carousel, $carousel.data()) 476 | }) 477 | }) 478 | 479 | }(jQuery); 480 | 481 | /* ======================================================================== 482 | * Bootstrap: dropdown.js v3.3.7 483 | * http://getbootstrap.com/javascript/#dropdowns 484 | * ======================================================================== 485 | * Copyright 2011-2016 Twitter, Inc. 486 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 487 | * ======================================================================== */ 488 | 489 | 490 | +function ($) { 491 | 'use strict'; 492 | 493 | // DROPDOWN CLASS DEFINITION 494 | // ========================= 495 | 496 | var backdrop = '.dropdown-backdrop' 497 | var toggle = '[data-toggle="dropdown"]' 498 | var Dropdown = function (element) { 499 | $(element).on('click.bs.dropdown', this.toggle) 500 | } 501 | 502 | Dropdown.VERSION = '3.3.7' 503 | 504 | function getParent($this) { 505 | var selector = $this.attr('data-target') 506 | 507 | if (!selector) { 508 | selector = $this.attr('href') 509 | selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 510 | } 511 | 512 | var $parent = selector && $(selector) 513 | 514 | return $parent && $parent.length ? $parent : $this.parent() 515 | } 516 | 517 | function clearMenus(e) { 518 | if (e && e.which === 3) return 519 | $(backdrop).remove() 520 | $(toggle).each(function () { 521 | var $this = $(this) 522 | var $parent = getParent($this) 523 | var relatedTarget = { relatedTarget: this } 524 | 525 | if (!$parent.hasClass('open')) return 526 | 527 | if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return 528 | 529 | $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) 530 | 531 | if (e.isDefaultPrevented()) return 532 | 533 | $this.attr('aria-expanded', 'false') 534 | $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) 535 | }) 536 | } 537 | 538 | Dropdown.prototype.toggle = function (e) { 539 | var $this = $(this) 540 | 541 | if ($this.is('.disabled, :disabled')) return 542 | 543 | var $parent = getParent($this) 544 | var isActive = $parent.hasClass('open') 545 | 546 | clearMenus() 547 | 548 | if (!isActive) { 549 | if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { 550 | // if mobile we use a backdrop because click events don't delegate 551 | $(document.createElement('div')) 552 | .addClass('dropdown-backdrop') 553 | .insertAfter($(this)) 554 | .on('click', clearMenus) 555 | } 556 | 557 | var relatedTarget = { relatedTarget: this } 558 | $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) 559 | 560 | if (e.isDefaultPrevented()) return 561 | 562 | $this 563 | .trigger('focus') 564 | .attr('aria-expanded', 'true') 565 | 566 | $parent 567 | .toggleClass('open') 568 | .trigger($.Event('shown.bs.dropdown', relatedTarget)) 569 | } 570 | 571 | return false 572 | } 573 | 574 | Dropdown.prototype.keydown = function (e) { 575 | if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return 576 | 577 | var $this = $(this) 578 | 579 | e.preventDefault() 580 | e.stopPropagation() 581 | 582 | if ($this.is('.disabled, :disabled')) return 583 | 584 | var $parent = getParent($this) 585 | var isActive = $parent.hasClass('open') 586 | 587 | if (!isActive && e.which != 27 || isActive && e.which == 27) { 588 | if (e.which == 27) $parent.find(toggle).trigger('focus') 589 | return $this.trigger('click') 590 | } 591 | 592 | var desc = ' li:not(.disabled):visible a' 593 | var $items = $parent.find('.dropdown-menu' + desc) 594 | 595 | if (!$items.length) return 596 | 597 | var index = $items.index(e.target) 598 | 599 | if (e.which == 38 && index > 0) index-- // up 600 | if (e.which == 40 && index < $items.length - 1) index++ // down 601 | if (!~index) index = 0 602 | 603 | $items.eq(index).trigger('focus') 604 | } 605 | 606 | 607 | // DROPDOWN PLUGIN DEFINITION 608 | // ========================== 609 | 610 | function Plugin(option) { 611 | return this.each(function () { 612 | var $this = $(this) 613 | var data = $this.data('bs.dropdown') 614 | 615 | if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) 616 | if (typeof option == 'string') data[option].call($this) 617 | }) 618 | } 619 | 620 | var old = $.fn.dropdown 621 | 622 | $.fn.dropdown = Plugin 623 | $.fn.dropdown.Constructor = Dropdown 624 | 625 | 626 | // DROPDOWN NO CONFLICT 627 | // ==================== 628 | 629 | $.fn.dropdown.noConflict = function () { 630 | $.fn.dropdown = old 631 | return this 632 | } 633 | 634 | 635 | // APPLY TO STANDARD DROPDOWN ELEMENTS 636 | // =================================== 637 | 638 | $(document) 639 | .on('click.bs.dropdown.data-api', clearMenus) 640 | .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) 641 | .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) 642 | .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) 643 | .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) 644 | 645 | }(jQuery); 646 | 647 | /* ======================================================================== 648 | * Bootstrap: modal.js v3.3.7 649 | * http://getbootstrap.com/javascript/#modals 650 | * ======================================================================== 651 | * Copyright 2011-2016 Twitter, Inc. 652 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 653 | * ======================================================================== */ 654 | 655 | 656 | +function ($) { 657 | 'use strict'; 658 | 659 | // MODAL CLASS DEFINITION 660 | // ====================== 661 | 662 | var Modal = function (element, options) { 663 | this.options = options 664 | this.$body = $(document.body) 665 | this.$element = $(element) 666 | this.$dialog = this.$element.find('.modal-dialog') 667 | this.$backdrop = null 668 | this.isShown = null 669 | this.originalBodyPad = null 670 | this.scrollbarWidth = 0 671 | this.ignoreBackdropClick = false 672 | 673 | if (this.options.remote) { 674 | this.$element 675 | .find('.modal-content') 676 | .load(this.options.remote, $.proxy(function () { 677 | this.$element.trigger('loaded.bs.modal') 678 | }, this)) 679 | } 680 | } 681 | 682 | Modal.VERSION = '3.3.7' 683 | 684 | Modal.TRANSITION_DURATION = 300 685 | Modal.BACKDROP_TRANSITION_DURATION = 150 686 | 687 | Modal.DEFAULTS = { 688 | backdrop: true, 689 | keyboard: true, 690 | show: true 691 | } 692 | 693 | Modal.prototype.toggle = function (_relatedTarget) { 694 | return this.isShown ? this.hide() : this.show(_relatedTarget) 695 | } 696 | 697 | Modal.prototype.show = function (_relatedTarget) { 698 | var that = this 699 | var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) 700 | 701 | this.$element.trigger(e) 702 | 703 | if (this.isShown || e.isDefaultPrevented()) return 704 | 705 | this.isShown = true 706 | 707 | this.checkScrollbar() 708 | this.setScrollbar() 709 | this.$body.addClass('modal-open') 710 | 711 | this.escape() 712 | this.resize() 713 | 714 | this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) 715 | 716 | this.$dialog.on('mousedown.dismiss.bs.modal', function () { 717 | that.$element.one('mouseup.dismiss.bs.modal', function (e) { 718 | if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true 719 | }) 720 | }) 721 | 722 | this.backdrop(function () { 723 | var transition = $.support.transition && that.$element.hasClass('fade') 724 | 725 | if (!that.$element.parent().length) { 726 | that.$element.appendTo(that.$body) // don't move modals dom position 727 | } 728 | 729 | that.$element 730 | .show() 731 | .scrollTop(0) 732 | 733 | that.adjustDialog() 734 | 735 | if (transition) { 736 | that.$element[0].offsetWidth // force reflow 737 | } 738 | 739 | that.$element.addClass('in') 740 | 741 | that.enforceFocus() 742 | 743 | var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) 744 | 745 | transition ? 746 | that.$dialog // wait for modal to slide in 747 | .one('bsTransitionEnd', function () { 748 | that.$element.trigger('focus').trigger(e) 749 | }) 750 | .emulateTransitionEnd(Modal.TRANSITION_DURATION) : 751 | that.$element.trigger('focus').trigger(e) 752 | }) 753 | } 754 | 755 | Modal.prototype.hide = function (e) { 756 | if (e) e.preventDefault() 757 | 758 | e = $.Event('hide.bs.modal') 759 | 760 | this.$element.trigger(e) 761 | 762 | if (!this.isShown || e.isDefaultPrevented()) return 763 | 764 | this.isShown = false 765 | 766 | this.escape() 767 | this.resize() 768 | 769 | $(document).off('focusin.bs.modal') 770 | 771 | this.$element 772 | .removeClass('in') 773 | .off('click.dismiss.bs.modal') 774 | .off('mouseup.dismiss.bs.modal') 775 | 776 | this.$dialog.off('mousedown.dismiss.bs.modal') 777 | 778 | $.support.transition && this.$element.hasClass('fade') ? 779 | this.$element 780 | .one('bsTransitionEnd', $.proxy(this.hideModal, this)) 781 | .emulateTransitionEnd(Modal.TRANSITION_DURATION) : 782 | this.hideModal() 783 | } 784 | 785 | Modal.prototype.enforceFocus = function () { 786 | $(document) 787 | .off('focusin.bs.modal') // guard against infinite focus loop 788 | .on('focusin.bs.modal', $.proxy(function (e) { 789 | if (document !== e.target && 790 | this.$element[0] !== e.target && 791 | !this.$element.has(e.target).length) { 792 | this.$element.trigger('focus') 793 | } 794 | }, this)) 795 | } 796 | 797 | Modal.prototype.escape = function () { 798 | if (this.isShown && this.options.keyboard) { 799 | this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { 800 | e.which == 27 && this.hide() 801 | }, this)) 802 | } else if (!this.isShown) { 803 | this.$element.off('keydown.dismiss.bs.modal') 804 | } 805 | } 806 | 807 | Modal.prototype.resize = function () { 808 | if (this.isShown) { 809 | $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) 810 | } else { 811 | $(window).off('resize.bs.modal') 812 | } 813 | } 814 | 815 | Modal.prototype.hideModal = function () { 816 | var that = this 817 | this.$element.hide() 818 | this.backdrop(function () { 819 | that.$body.removeClass('modal-open') 820 | that.resetAdjustments() 821 | that.resetScrollbar() 822 | that.$element.trigger('hidden.bs.modal') 823 | }) 824 | } 825 | 826 | Modal.prototype.removeBackdrop = function () { 827 | this.$backdrop && this.$backdrop.remove() 828 | this.$backdrop = null 829 | } 830 | 831 | Modal.prototype.backdrop = function (callback) { 832 | var that = this 833 | var animate = this.$element.hasClass('fade') ? 'fade' : '' 834 | 835 | if (this.isShown && this.options.backdrop) { 836 | var doAnimate = $.support.transition && animate 837 | 838 | this.$backdrop = $(document.createElement('div')) 839 | .addClass('modal-backdrop ' + animate) 840 | .appendTo(this.$body) 841 | 842 | this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { 843 | if (this.ignoreBackdropClick) { 844 | this.ignoreBackdropClick = false 845 | return 846 | } 847 | if (e.target !== e.currentTarget) return 848 | this.options.backdrop == 'static' 849 | ? this.$element[0].focus() 850 | : this.hide() 851 | }, this)) 852 | 853 | if (doAnimate) this.$backdrop[0].offsetWidth // force reflow 854 | 855 | this.$backdrop.addClass('in') 856 | 857 | if (!callback) return 858 | 859 | doAnimate ? 860 | this.$backdrop 861 | .one('bsTransitionEnd', callback) 862 | .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : 863 | callback() 864 | 865 | } else if (!this.isShown && this.$backdrop) { 866 | this.$backdrop.removeClass('in') 867 | 868 | var callbackRemove = function () { 869 | that.removeBackdrop() 870 | callback && callback() 871 | } 872 | $.support.transition && this.$element.hasClass('fade') ? 873 | this.$backdrop 874 | .one('bsTransitionEnd', callbackRemove) 875 | .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : 876 | callbackRemove() 877 | 878 | } else if (callback) { 879 | callback() 880 | } 881 | } 882 | 883 | // these following methods are used to handle overflowing modals 884 | 885 | Modal.prototype.handleUpdate = function () { 886 | this.adjustDialog() 887 | } 888 | 889 | Modal.prototype.adjustDialog = function () { 890 | var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight 891 | 892 | this.$element.css({ 893 | paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', 894 | paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' 895 | }) 896 | } 897 | 898 | Modal.prototype.resetAdjustments = function () { 899 | this.$element.css({ 900 | paddingLeft: '', 901 | paddingRight: '' 902 | }) 903 | } 904 | 905 | Modal.prototype.checkScrollbar = function () { 906 | var fullWindowWidth = window.innerWidth 907 | if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 908 | var documentElementRect = document.documentElement.getBoundingClientRect() 909 | fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) 910 | } 911 | this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth 912 | this.scrollbarWidth = this.measureScrollbar() 913 | } 914 | 915 | Modal.prototype.setScrollbar = function () { 916 | var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) 917 | this.originalBodyPad = document.body.style.paddingRight || '' 918 | if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) 919 | } 920 | 921 | Modal.prototype.resetScrollbar = function () { 922 | this.$body.css('padding-right', this.originalBodyPad) 923 | } 924 | 925 | Modal.prototype.measureScrollbar = function () { // thx walsh 926 | var scrollDiv = document.createElement('div') 927 | scrollDiv.className = 'modal-scrollbar-measure' 928 | this.$body.append(scrollDiv) 929 | var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth 930 | this.$body[0].removeChild(scrollDiv) 931 | return scrollbarWidth 932 | } 933 | 934 | 935 | // MODAL PLUGIN DEFINITION 936 | // ======================= 937 | 938 | function Plugin(option, _relatedTarget) { 939 | return this.each(function () { 940 | var $this = $(this) 941 | var data = $this.data('bs.modal') 942 | var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) 943 | 944 | if (!data) $this.data('bs.modal', (data = new Modal(this, options))) 945 | if (typeof option == 'string') data[option](_relatedTarget) 946 | else if (options.show) data.show(_relatedTarget) 947 | }) 948 | } 949 | 950 | var old = $.fn.modal 951 | 952 | $.fn.modal = Plugin 953 | $.fn.modal.Constructor = Modal 954 | 955 | 956 | // MODAL NO CONFLICT 957 | // ================= 958 | 959 | $.fn.modal.noConflict = function () { 960 | $.fn.modal = old 961 | return this 962 | } 963 | 964 | 965 | // MODAL DATA-API 966 | // ============== 967 | 968 | $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { 969 | var $this = $(this) 970 | var href = $this.attr('href') 971 | var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 972 | var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) 973 | 974 | if ($this.is('a')) e.preventDefault() 975 | 976 | $target.one('show.bs.modal', function (showEvent) { 977 | if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown 978 | $target.one('hidden.bs.modal', function () { 979 | $this.is(':visible') && $this.trigger('focus') 980 | }) 981 | }) 982 | Plugin.call($target, option, this) 983 | }) 984 | 985 | }(jQuery); 986 | 987 | /* ======================================================================== 988 | * Bootstrap: tooltip.js v3.3.7 989 | * http://getbootstrap.com/javascript/#tooltip 990 | * Inspired by the original jQuery.tipsy by Jason Frame 991 | * ======================================================================== 992 | * Copyright 2011-2016 Twitter, Inc. 993 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 994 | * ======================================================================== */ 995 | 996 | 997 | +function ($) { 998 | 'use strict'; 999 | 1000 | // TOOLTIP PUBLIC CLASS DEFINITION 1001 | // =============================== 1002 | 1003 | var Tooltip = function (element, options) { 1004 | this.type = null 1005 | this.options = null 1006 | this.enabled = null 1007 | this.timeout = null 1008 | this.hoverState = null 1009 | this.$element = null 1010 | this.inState = null 1011 | 1012 | this.init('tooltip', element, options) 1013 | } 1014 | 1015 | Tooltip.VERSION = '3.3.7' 1016 | 1017 | Tooltip.TRANSITION_DURATION = 150 1018 | 1019 | Tooltip.DEFAULTS = { 1020 | animation: true, 1021 | placement: 'top', 1022 | selector: false, 1023 | template: '', 1024 | trigger: 'hover focus', 1025 | title: '', 1026 | delay: 0, 1027 | html: false, 1028 | container: false, 1029 | viewport: { 1030 | selector: 'body', 1031 | padding: 0 1032 | } 1033 | } 1034 | 1035 | Tooltip.prototype.init = function (type, element, options) { 1036 | this.enabled = true 1037 | this.type = type 1038 | this.$element = $(element) 1039 | this.options = this.getOptions(options) 1040 | this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) 1041 | this.inState = { click: false, hover: false, focus: false } 1042 | 1043 | if (this.$element[0] instanceof document.constructor && !this.options.selector) { 1044 | throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') 1045 | } 1046 | 1047 | var triggers = this.options.trigger.split(' ') 1048 | 1049 | for (var i = triggers.length; i--;) { 1050 | var trigger = triggers[i] 1051 | 1052 | if (trigger == 'click') { 1053 | this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) 1054 | } else if (trigger != 'manual') { 1055 | var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' 1056 | var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' 1057 | 1058 | this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) 1059 | this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) 1060 | } 1061 | } 1062 | 1063 | this.options.selector ? 1064 | (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : 1065 | this.fixTitle() 1066 | } 1067 | 1068 | Tooltip.prototype.getDefaults = function () { 1069 | return Tooltip.DEFAULTS 1070 | } 1071 | 1072 | Tooltip.prototype.getOptions = function (options) { 1073 | options = $.extend({}, this.getDefaults(), this.$element.data(), options) 1074 | 1075 | if (options.delay && typeof options.delay == 'number') { 1076 | options.delay = { 1077 | show: options.delay, 1078 | hide: options.delay 1079 | } 1080 | } 1081 | 1082 | return options 1083 | } 1084 | 1085 | Tooltip.prototype.getDelegateOptions = function () { 1086 | var options = {} 1087 | var defaults = this.getDefaults() 1088 | 1089 | this._options && $.each(this._options, function (key, value) { 1090 | if (defaults[key] != value) options[key] = value 1091 | }) 1092 | 1093 | return options 1094 | } 1095 | 1096 | Tooltip.prototype.enter = function (obj) { 1097 | var self = obj instanceof this.constructor ? 1098 | obj : $(obj.currentTarget).data('bs.' + this.type) 1099 | 1100 | if (!self) { 1101 | self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) 1102 | $(obj.currentTarget).data('bs.' + this.type, self) 1103 | } 1104 | 1105 | if (obj instanceof $.Event) { 1106 | self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true 1107 | } 1108 | 1109 | if (self.tip().hasClass('in') || self.hoverState == 'in') { 1110 | self.hoverState = 'in' 1111 | return 1112 | } 1113 | 1114 | clearTimeout(self.timeout) 1115 | 1116 | self.hoverState = 'in' 1117 | 1118 | if (!self.options.delay || !self.options.delay.show) return self.show() 1119 | 1120 | self.timeout = setTimeout(function () { 1121 | if (self.hoverState == 'in') self.show() 1122 | }, self.options.delay.show) 1123 | } 1124 | 1125 | Tooltip.prototype.isInStateTrue = function () { 1126 | for (var key in this.inState) { 1127 | if (this.inState[key]) return true 1128 | } 1129 | 1130 | return false 1131 | } 1132 | 1133 | Tooltip.prototype.leave = function (obj) { 1134 | var self = obj instanceof this.constructor ? 1135 | obj : $(obj.currentTarget).data('bs.' + this.type) 1136 | 1137 | if (!self) { 1138 | self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) 1139 | $(obj.currentTarget).data('bs.' + this.type, self) 1140 | } 1141 | 1142 | if (obj instanceof $.Event) { 1143 | self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false 1144 | } 1145 | 1146 | if (self.isInStateTrue()) return 1147 | 1148 | clearTimeout(self.timeout) 1149 | 1150 | self.hoverState = 'out' 1151 | 1152 | if (!self.options.delay || !self.options.delay.hide) return self.hide() 1153 | 1154 | self.timeout = setTimeout(function () { 1155 | if (self.hoverState == 'out') self.hide() 1156 | }, self.options.delay.hide) 1157 | } 1158 | 1159 | Tooltip.prototype.show = function () { 1160 | var e = $.Event('show.bs.' + this.type) 1161 | 1162 | if (this.hasContent() && this.enabled) { 1163 | this.$element.trigger(e) 1164 | 1165 | var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) 1166 | if (e.isDefaultPrevented() || !inDom) return 1167 | var that = this 1168 | 1169 | var $tip = this.tip() 1170 | 1171 | var tipId = this.getUID(this.type) 1172 | 1173 | this.setContent() 1174 | $tip.attr('id', tipId) 1175 | this.$element.attr('aria-describedby', tipId) 1176 | 1177 | if (this.options.animation) $tip.addClass('fade') 1178 | 1179 | var placement = typeof this.options.placement == 'function' ? 1180 | this.options.placement.call(this, $tip[0], this.$element[0]) : 1181 | this.options.placement 1182 | 1183 | var autoToken = /\s?auto?\s?/i 1184 | var autoPlace = autoToken.test(placement) 1185 | if (autoPlace) placement = placement.replace(autoToken, '') || 'top' 1186 | 1187 | $tip 1188 | .detach() 1189 | .css({ top: 0, left: 0, display: 'block' }) 1190 | .addClass(placement) 1191 | .data('bs.' + this.type, this) 1192 | 1193 | this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) 1194 | this.$element.trigger('inserted.bs.' + this.type) 1195 | 1196 | var pos = this.getPosition() 1197 | var actualWidth = $tip[0].offsetWidth 1198 | var actualHeight = $tip[0].offsetHeight 1199 | 1200 | if (autoPlace) { 1201 | var orgPlacement = placement 1202 | var viewportDim = this.getPosition(this.$viewport) 1203 | 1204 | placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : 1205 | placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : 1206 | placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : 1207 | placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : 1208 | placement 1209 | 1210 | $tip 1211 | .removeClass(orgPlacement) 1212 | .addClass(placement) 1213 | } 1214 | 1215 | var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) 1216 | 1217 | this.applyPlacement(calculatedOffset, placement) 1218 | 1219 | var complete = function () { 1220 | var prevHoverState = that.hoverState 1221 | that.$element.trigger('shown.bs.' + that.type) 1222 | that.hoverState = null 1223 | 1224 | if (prevHoverState == 'out') that.leave(that) 1225 | } 1226 | 1227 | $.support.transition && this.$tip.hasClass('fade') ? 1228 | $tip 1229 | .one('bsTransitionEnd', complete) 1230 | .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : 1231 | complete() 1232 | } 1233 | } 1234 | 1235 | Tooltip.prototype.applyPlacement = function (offset, placement) { 1236 | var $tip = this.tip() 1237 | var width = $tip[0].offsetWidth 1238 | var height = $tip[0].offsetHeight 1239 | 1240 | // manually read margins because getBoundingClientRect includes difference 1241 | var marginTop = parseInt($tip.css('margin-top'), 10) 1242 | var marginLeft = parseInt($tip.css('margin-left'), 10) 1243 | 1244 | // we must check for NaN for ie 8/9 1245 | if (isNaN(marginTop)) marginTop = 0 1246 | if (isNaN(marginLeft)) marginLeft = 0 1247 | 1248 | offset.top += marginTop 1249 | offset.left += marginLeft 1250 | 1251 | // $.fn.offset doesn't round pixel values 1252 | // so we use setOffset directly with our own function B-0 1253 | $.offset.setOffset($tip[0], $.extend({ 1254 | using: function (props) { 1255 | $tip.css({ 1256 | top: Math.round(props.top), 1257 | left: Math.round(props.left) 1258 | }) 1259 | } 1260 | }, offset), 0) 1261 | 1262 | $tip.addClass('in') 1263 | 1264 | // check to see if placing tip in new offset caused the tip to resize itself 1265 | var actualWidth = $tip[0].offsetWidth 1266 | var actualHeight = $tip[0].offsetHeight 1267 | 1268 | if (placement == 'top' && actualHeight != height) { 1269 | offset.top = offset.top + height - actualHeight 1270 | } 1271 | 1272 | var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) 1273 | 1274 | if (delta.left) offset.left += delta.left 1275 | else offset.top += delta.top 1276 | 1277 | var isVertical = /top|bottom/.test(placement) 1278 | var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight 1279 | var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' 1280 | 1281 | $tip.offset(offset) 1282 | this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) 1283 | } 1284 | 1285 | Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { 1286 | this.arrow() 1287 | .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') 1288 | .css(isVertical ? 'top' : 'left', '') 1289 | } 1290 | 1291 | Tooltip.prototype.setContent = function () { 1292 | var $tip = this.tip() 1293 | var title = this.getTitle() 1294 | 1295 | $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) 1296 | $tip.removeClass('fade in top bottom left right') 1297 | } 1298 | 1299 | Tooltip.prototype.hide = function (callback) { 1300 | var that = this 1301 | var $tip = $(this.$tip) 1302 | var e = $.Event('hide.bs.' + this.type) 1303 | 1304 | function complete() { 1305 | if (that.hoverState != 'in') $tip.detach() 1306 | if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. 1307 | that.$element 1308 | .removeAttr('aria-describedby') 1309 | .trigger('hidden.bs.' + that.type) 1310 | } 1311 | callback && callback() 1312 | } 1313 | 1314 | this.$element.trigger(e) 1315 | 1316 | if (e.isDefaultPrevented()) return 1317 | 1318 | $tip.removeClass('in') 1319 | 1320 | $.support.transition && $tip.hasClass('fade') ? 1321 | $tip 1322 | .one('bsTransitionEnd', complete) 1323 | .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : 1324 | complete() 1325 | 1326 | this.hoverState = null 1327 | 1328 | return this 1329 | } 1330 | 1331 | Tooltip.prototype.fixTitle = function () { 1332 | var $e = this.$element 1333 | if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { 1334 | $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') 1335 | } 1336 | } 1337 | 1338 | Tooltip.prototype.hasContent = function () { 1339 | return this.getTitle() 1340 | } 1341 | 1342 | Tooltip.prototype.getPosition = function ($element) { 1343 | $element = $element || this.$element 1344 | 1345 | var el = $element[0] 1346 | var isBody = el.tagName == 'BODY' 1347 | 1348 | var elRect = el.getBoundingClientRect() 1349 | if (elRect.width == null) { 1350 | // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 1351 | elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) 1352 | } 1353 | var isSvg = window.SVGElement && el instanceof window.SVGElement 1354 | // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. 1355 | // See https://github.com/twbs/bootstrap/issues/20280 1356 | var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) 1357 | var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } 1358 | var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null 1359 | 1360 | return $.extend({}, elRect, scroll, outerDims, elOffset) 1361 | } 1362 | 1363 | Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { 1364 | return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : 1365 | placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : 1366 | placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : 1367 | /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } 1368 | 1369 | } 1370 | 1371 | Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { 1372 | var delta = { top: 0, left: 0 } 1373 | if (!this.$viewport) return delta 1374 | 1375 | var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 1376 | var viewportDimensions = this.getPosition(this.$viewport) 1377 | 1378 | if (/right|left/.test(placement)) { 1379 | var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll 1380 | var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight 1381 | if (topEdgeOffset < viewportDimensions.top) { // top overflow 1382 | delta.top = viewportDimensions.top - topEdgeOffset 1383 | } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow 1384 | delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset 1385 | } 1386 | } else { 1387 | var leftEdgeOffset = pos.left - viewportPadding 1388 | var rightEdgeOffset = pos.left + viewportPadding + actualWidth 1389 | if (leftEdgeOffset < viewportDimensions.left) { // left overflow 1390 | delta.left = viewportDimensions.left - leftEdgeOffset 1391 | } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow 1392 | delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset 1393 | } 1394 | } 1395 | 1396 | return delta 1397 | } 1398 | 1399 | Tooltip.prototype.getTitle = function () { 1400 | var title 1401 | var $e = this.$element 1402 | var o = this.options 1403 | 1404 | title = $e.attr('data-original-title') 1405 | || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) 1406 | 1407 | return title 1408 | } 1409 | 1410 | Tooltip.prototype.getUID = function (prefix) { 1411 | do prefix += ~~(Math.random() * 1000000) 1412 | while (document.getElementById(prefix)) 1413 | return prefix 1414 | } 1415 | 1416 | Tooltip.prototype.tip = function () { 1417 | if (!this.$tip) { 1418 | this.$tip = $(this.options.template) 1419 | if (this.$tip.length != 1) { 1420 | throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') 1421 | } 1422 | } 1423 | return this.$tip 1424 | } 1425 | 1426 | Tooltip.prototype.arrow = function () { 1427 | return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) 1428 | } 1429 | 1430 | Tooltip.prototype.enable = function () { 1431 | this.enabled = true 1432 | } 1433 | 1434 | Tooltip.prototype.disable = function () { 1435 | this.enabled = false 1436 | } 1437 | 1438 | Tooltip.prototype.toggleEnabled = function () { 1439 | this.enabled = !this.enabled 1440 | } 1441 | 1442 | Tooltip.prototype.toggle = function (e) { 1443 | var self = this 1444 | if (e) { 1445 | self = $(e.currentTarget).data('bs.' + this.type) 1446 | if (!self) { 1447 | self = new this.constructor(e.currentTarget, this.getDelegateOptions()) 1448 | $(e.currentTarget).data('bs.' + this.type, self) 1449 | } 1450 | } 1451 | 1452 | if (e) { 1453 | self.inState.click = !self.inState.click 1454 | if (self.isInStateTrue()) self.enter(self) 1455 | else self.leave(self) 1456 | } else { 1457 | self.tip().hasClass('in') ? self.leave(self) : self.enter(self) 1458 | } 1459 | } 1460 | 1461 | Tooltip.prototype.destroy = function () { 1462 | var that = this 1463 | clearTimeout(this.timeout) 1464 | this.hide(function () { 1465 | that.$element.off('.' + that.type).removeData('bs.' + that.type) 1466 | if (that.$tip) { 1467 | that.$tip.detach() 1468 | } 1469 | that.$tip = null 1470 | that.$arrow = null 1471 | that.$viewport = null 1472 | that.$element = null 1473 | }) 1474 | } 1475 | 1476 | 1477 | // TOOLTIP PLUGIN DEFINITION 1478 | // ========================= 1479 | 1480 | function Plugin(option) { 1481 | return this.each(function () { 1482 | var $this = $(this) 1483 | var data = $this.data('bs.tooltip') 1484 | var options = typeof option == 'object' && option 1485 | 1486 | if (!data && /destroy|hide/.test(option)) return 1487 | if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) 1488 | if (typeof option == 'string') data[option]() 1489 | }) 1490 | } 1491 | 1492 | var old = $.fn.tooltip 1493 | 1494 | $.fn.tooltip = Plugin 1495 | $.fn.tooltip.Constructor = Tooltip 1496 | 1497 | 1498 | // TOOLTIP NO CONFLICT 1499 | // =================== 1500 | 1501 | $.fn.tooltip.noConflict = function () { 1502 | $.fn.tooltip = old 1503 | return this 1504 | } 1505 | 1506 | }(jQuery); 1507 | 1508 | /* ======================================================================== 1509 | * Bootstrap: popover.js v3.3.7 1510 | * http://getbootstrap.com/javascript/#popovers 1511 | * ======================================================================== 1512 | * Copyright 2011-2016 Twitter, Inc. 1513 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1514 | * ======================================================================== */ 1515 | 1516 | 1517 | +function ($) { 1518 | 'use strict'; 1519 | 1520 | // POPOVER PUBLIC CLASS DEFINITION 1521 | // =============================== 1522 | 1523 | var Popover = function (element, options) { 1524 | this.init('popover', element, options) 1525 | } 1526 | 1527 | if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') 1528 | 1529 | Popover.VERSION = '3.3.7' 1530 | 1531 | Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { 1532 | placement: 'right', 1533 | trigger: 'click', 1534 | content: '', 1535 | template: '' 1536 | }) 1537 | 1538 | 1539 | // NOTE: POPOVER EXTENDS tooltip.js 1540 | // ================================ 1541 | 1542 | Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) 1543 | 1544 | Popover.prototype.constructor = Popover 1545 | 1546 | Popover.prototype.getDefaults = function () { 1547 | return Popover.DEFAULTS 1548 | } 1549 | 1550 | Popover.prototype.setContent = function () { 1551 | var $tip = this.tip() 1552 | var title = this.getTitle() 1553 | var content = this.getContent() 1554 | 1555 | $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) 1556 | $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events 1557 | this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' 1558 | ](content) 1559 | 1560 | $tip.removeClass('fade top bottom left right in') 1561 | 1562 | // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do 1563 | // this manually by checking the contents. 1564 | if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() 1565 | } 1566 | 1567 | Popover.prototype.hasContent = function () { 1568 | return this.getTitle() || this.getContent() 1569 | } 1570 | 1571 | Popover.prototype.getContent = function () { 1572 | var $e = this.$element 1573 | var o = this.options 1574 | 1575 | return $e.attr('data-content') 1576 | || (typeof o.content == 'function' ? 1577 | o.content.call($e[0]) : 1578 | o.content) 1579 | } 1580 | 1581 | Popover.prototype.arrow = function () { 1582 | return (this.$arrow = this.$arrow || this.tip().find('.arrow')) 1583 | } 1584 | 1585 | 1586 | // POPOVER PLUGIN DEFINITION 1587 | // ========================= 1588 | 1589 | function Plugin(option) { 1590 | return this.each(function () { 1591 | var $this = $(this) 1592 | var data = $this.data('bs.popover') 1593 | var options = typeof option == 'object' && option 1594 | 1595 | if (!data && /destroy|hide/.test(option)) return 1596 | if (!data) $this.data('bs.popover', (data = new Popover(this, options))) 1597 | if (typeof option == 'string') data[option]() 1598 | }) 1599 | } 1600 | 1601 | var old = $.fn.popover 1602 | 1603 | $.fn.popover = Plugin 1604 | $.fn.popover.Constructor = Popover 1605 | 1606 | 1607 | // POPOVER NO CONFLICT 1608 | // =================== 1609 | 1610 | $.fn.popover.noConflict = function () { 1611 | $.fn.popover = old 1612 | return this 1613 | } 1614 | 1615 | }(jQuery); 1616 | 1617 | /* ======================================================================== 1618 | * Bootstrap: tab.js v3.3.7 1619 | * http://getbootstrap.com/javascript/#tabs 1620 | * ======================================================================== 1621 | * Copyright 2011-2016 Twitter, Inc. 1622 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1623 | * ======================================================================== */ 1624 | 1625 | 1626 | +function ($) { 1627 | 'use strict'; 1628 | 1629 | // TAB CLASS DEFINITION 1630 | // ==================== 1631 | 1632 | var Tab = function (element) { 1633 | // jscs:disable requireDollarBeforejQueryAssignment 1634 | this.element = $(element) 1635 | // jscs:enable requireDollarBeforejQueryAssignment 1636 | } 1637 | 1638 | Tab.VERSION = '3.3.7' 1639 | 1640 | Tab.TRANSITION_DURATION = 150 1641 | 1642 | Tab.prototype.show = function () { 1643 | var $this = this.element 1644 | var $ul = $this.closest('ul:not(.dropdown-menu)') 1645 | var selector = $this.data('target') 1646 | 1647 | if (!selector) { 1648 | selector = $this.attr('href') 1649 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 1650 | } 1651 | 1652 | if ($this.parent('li').hasClass('active')) return 1653 | 1654 | var $previous = $ul.find('.active:last a') 1655 | var hideEvent = $.Event('hide.bs.tab', { 1656 | relatedTarget: $this[0] 1657 | }) 1658 | var showEvent = $.Event('show.bs.tab', { 1659 | relatedTarget: $previous[0] 1660 | }) 1661 | 1662 | $previous.trigger(hideEvent) 1663 | $this.trigger(showEvent) 1664 | 1665 | if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return 1666 | 1667 | var $target = $(selector) 1668 | 1669 | this.activate($this.closest('li'), $ul) 1670 | this.activate($target, $target.parent(), function () { 1671 | $previous.trigger({ 1672 | type: 'hidden.bs.tab', 1673 | relatedTarget: $this[0] 1674 | }) 1675 | $this.trigger({ 1676 | type: 'shown.bs.tab', 1677 | relatedTarget: $previous[0] 1678 | }) 1679 | }) 1680 | } 1681 | 1682 | Tab.prototype.activate = function (element, container, callback) { 1683 | var $active = container.find('> .active') 1684 | var transition = callback 1685 | && $.support.transition 1686 | && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) 1687 | 1688 | function next() { 1689 | $active 1690 | .removeClass('active') 1691 | .find('> .dropdown-menu > .active') 1692 | .removeClass('active') 1693 | .end() 1694 | .find('[data-toggle="tab"]') 1695 | .attr('aria-expanded', false) 1696 | 1697 | element 1698 | .addClass('active') 1699 | .find('[data-toggle="tab"]') 1700 | .attr('aria-expanded', true) 1701 | 1702 | if (transition) { 1703 | element[0].offsetWidth // reflow for transition 1704 | element.addClass('in') 1705 | } else { 1706 | element.removeClass('fade') 1707 | } 1708 | 1709 | if (element.parent('.dropdown-menu').length) { 1710 | element 1711 | .closest('li.dropdown') 1712 | .addClass('active') 1713 | .end() 1714 | .find('[data-toggle="tab"]') 1715 | .attr('aria-expanded', true) 1716 | } 1717 | 1718 | callback && callback() 1719 | } 1720 | 1721 | $active.length && transition ? 1722 | $active 1723 | .one('bsTransitionEnd', next) 1724 | .emulateTransitionEnd(Tab.TRANSITION_DURATION) : 1725 | next() 1726 | 1727 | $active.removeClass('in') 1728 | } 1729 | 1730 | 1731 | // TAB PLUGIN DEFINITION 1732 | // ===================== 1733 | 1734 | function Plugin(option) { 1735 | return this.each(function () { 1736 | var $this = $(this) 1737 | var data = $this.data('bs.tab') 1738 | 1739 | if (!data) $this.data('bs.tab', (data = new Tab(this))) 1740 | if (typeof option == 'string') data[option]() 1741 | }) 1742 | } 1743 | 1744 | var old = $.fn.tab 1745 | 1746 | $.fn.tab = Plugin 1747 | $.fn.tab.Constructor = Tab 1748 | 1749 | 1750 | // TAB NO CONFLICT 1751 | // =============== 1752 | 1753 | $.fn.tab.noConflict = function () { 1754 | $.fn.tab = old 1755 | return this 1756 | } 1757 | 1758 | 1759 | // TAB DATA-API 1760 | // ============ 1761 | 1762 | var clickHandler = function (e) { 1763 | e.preventDefault() 1764 | Plugin.call($(this), 'show') 1765 | } 1766 | 1767 | $(document) 1768 | .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) 1769 | .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) 1770 | 1771 | }(jQuery); 1772 | 1773 | /* ======================================================================== 1774 | * Bootstrap: affix.js v3.3.7 1775 | * http://getbootstrap.com/javascript/#affix 1776 | * ======================================================================== 1777 | * Copyright 2011-2016 Twitter, Inc. 1778 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1779 | * ======================================================================== */ 1780 | 1781 | 1782 | +function ($) { 1783 | 'use strict'; 1784 | 1785 | // AFFIX CLASS DEFINITION 1786 | // ====================== 1787 | 1788 | var Affix = function (element, options) { 1789 | this.options = $.extend({}, Affix.DEFAULTS, options) 1790 | 1791 | this.$target = $(this.options.target) 1792 | .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) 1793 | .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) 1794 | 1795 | this.$element = $(element) 1796 | this.affixed = null 1797 | this.unpin = null 1798 | this.pinnedOffset = null 1799 | 1800 | this.checkPosition() 1801 | } 1802 | 1803 | Affix.VERSION = '3.3.7' 1804 | 1805 | Affix.RESET = 'affix affix-top affix-bottom' 1806 | 1807 | Affix.DEFAULTS = { 1808 | offset: 0, 1809 | target: window 1810 | } 1811 | 1812 | Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { 1813 | var scrollTop = this.$target.scrollTop() 1814 | var position = this.$element.offset() 1815 | var targetHeight = this.$target.height() 1816 | 1817 | if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false 1818 | 1819 | if (this.affixed == 'bottom') { 1820 | if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' 1821 | return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' 1822 | } 1823 | 1824 | var initializing = this.affixed == null 1825 | var colliderTop = initializing ? scrollTop : position.top 1826 | var colliderHeight = initializing ? targetHeight : height 1827 | 1828 | if (offsetTop != null && scrollTop <= offsetTop) return 'top' 1829 | if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' 1830 | 1831 | return false 1832 | } 1833 | 1834 | Affix.prototype.getPinnedOffset = function () { 1835 | if (this.pinnedOffset) return this.pinnedOffset 1836 | this.$element.removeClass(Affix.RESET).addClass('affix') 1837 | var scrollTop = this.$target.scrollTop() 1838 | var position = this.$element.offset() 1839 | return (this.pinnedOffset = position.top - scrollTop) 1840 | } 1841 | 1842 | Affix.prototype.checkPositionWithEventLoop = function () { 1843 | setTimeout($.proxy(this.checkPosition, this), 1) 1844 | } 1845 | 1846 | Affix.prototype.checkPosition = function () { 1847 | if (!this.$element.is(':visible')) return 1848 | 1849 | var height = this.$element.height() 1850 | var offset = this.options.offset 1851 | var offsetTop = offset.top 1852 | var offsetBottom = offset.bottom 1853 | var scrollHeight = Math.max($(document).height(), $(document.body).height()) 1854 | 1855 | if (typeof offset != 'object') offsetBottom = offsetTop = offset 1856 | if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) 1857 | if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) 1858 | 1859 | var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) 1860 | 1861 | if (this.affixed != affix) { 1862 | if (this.unpin != null) this.$element.css('top', '') 1863 | 1864 | var affixType = 'affix' + (affix ? '-' + affix : '') 1865 | var e = $.Event(affixType + '.bs.affix') 1866 | 1867 | this.$element.trigger(e) 1868 | 1869 | if (e.isDefaultPrevented()) return 1870 | 1871 | this.affixed = affix 1872 | this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null 1873 | 1874 | this.$element 1875 | .removeClass(Affix.RESET) 1876 | .addClass(affixType) 1877 | .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') 1878 | } 1879 | 1880 | if (affix == 'bottom') { 1881 | this.$element.offset({ 1882 | top: scrollHeight - height - offsetBottom 1883 | }) 1884 | } 1885 | } 1886 | 1887 | 1888 | // AFFIX PLUGIN DEFINITION 1889 | // ======================= 1890 | 1891 | function Plugin(option) { 1892 | return this.each(function () { 1893 | var $this = $(this) 1894 | var data = $this.data('bs.affix') 1895 | var options = typeof option == 'object' && option 1896 | 1897 | if (!data) $this.data('bs.affix', (data = new Affix(this, options))) 1898 | if (typeof option == 'string') data[option]() 1899 | }) 1900 | } 1901 | 1902 | var old = $.fn.affix 1903 | 1904 | $.fn.affix = Plugin 1905 | $.fn.affix.Constructor = Affix 1906 | 1907 | 1908 | // AFFIX NO CONFLICT 1909 | // ================= 1910 | 1911 | $.fn.affix.noConflict = function () { 1912 | $.fn.affix = old 1913 | return this 1914 | } 1915 | 1916 | 1917 | // AFFIX DATA-API 1918 | // ============== 1919 | 1920 | $(window).on('load', function () { 1921 | $('[data-spy="affix"]').each(function () { 1922 | var $spy = $(this) 1923 | var data = $spy.data() 1924 | 1925 | data.offset = data.offset || {} 1926 | 1927 | if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom 1928 | if (data.offsetTop != null) data.offset.top = data.offsetTop 1929 | 1930 | Plugin.call($spy, data) 1931 | }) 1932 | }) 1933 | 1934 | }(jQuery); 1935 | 1936 | /* ======================================================================== 1937 | * Bootstrap: collapse.js v3.3.7 1938 | * http://getbootstrap.com/javascript/#collapse 1939 | * ======================================================================== 1940 | * Copyright 2011-2016 Twitter, Inc. 1941 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 1942 | * ======================================================================== */ 1943 | 1944 | /* jshint latedef: false */ 1945 | 1946 | +function ($) { 1947 | 'use strict'; 1948 | 1949 | // COLLAPSE PUBLIC CLASS DEFINITION 1950 | // ================================ 1951 | 1952 | var Collapse = function (element, options) { 1953 | this.$element = $(element) 1954 | this.options = $.extend({}, Collapse.DEFAULTS, options) 1955 | this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + 1956 | '[data-toggle="collapse"][data-target="#' + element.id + '"]') 1957 | this.transitioning = null 1958 | 1959 | if (this.options.parent) { 1960 | this.$parent = this.getParent() 1961 | } else { 1962 | this.addAriaAndCollapsedClass(this.$element, this.$trigger) 1963 | } 1964 | 1965 | if (this.options.toggle) this.toggle() 1966 | } 1967 | 1968 | Collapse.VERSION = '3.3.7' 1969 | 1970 | Collapse.TRANSITION_DURATION = 350 1971 | 1972 | Collapse.DEFAULTS = { 1973 | toggle: true 1974 | } 1975 | 1976 | Collapse.prototype.dimension = function () { 1977 | var hasWidth = this.$element.hasClass('width') 1978 | return hasWidth ? 'width' : 'height' 1979 | } 1980 | 1981 | Collapse.prototype.show = function () { 1982 | if (this.transitioning || this.$element.hasClass('in')) return 1983 | 1984 | var activesData 1985 | var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') 1986 | 1987 | if (actives && actives.length) { 1988 | activesData = actives.data('bs.collapse') 1989 | if (activesData && activesData.transitioning) return 1990 | } 1991 | 1992 | var startEvent = $.Event('show.bs.collapse') 1993 | this.$element.trigger(startEvent) 1994 | if (startEvent.isDefaultPrevented()) return 1995 | 1996 | if (actives && actives.length) { 1997 | Plugin.call(actives, 'hide') 1998 | activesData || actives.data('bs.collapse', null) 1999 | } 2000 | 2001 | var dimension = this.dimension() 2002 | 2003 | this.$element 2004 | .removeClass('collapse') 2005 | .addClass('collapsing')[dimension](0) 2006 | .attr('aria-expanded', true) 2007 | 2008 | this.$trigger 2009 | .removeClass('collapsed') 2010 | .attr('aria-expanded', true) 2011 | 2012 | this.transitioning = 1 2013 | 2014 | var complete = function () { 2015 | this.$element 2016 | .removeClass('collapsing') 2017 | .addClass('collapse in')[dimension]('') 2018 | this.transitioning = 0 2019 | this.$element 2020 | .trigger('shown.bs.collapse') 2021 | } 2022 | 2023 | if (!$.support.transition) return complete.call(this) 2024 | 2025 | var scrollSize = $.camelCase(['scroll', dimension].join('-')) 2026 | 2027 | this.$element 2028 | .one('bsTransitionEnd', $.proxy(complete, this)) 2029 | .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) 2030 | } 2031 | 2032 | Collapse.prototype.hide = function () { 2033 | if (this.transitioning || !this.$element.hasClass('in')) return 2034 | 2035 | var startEvent = $.Event('hide.bs.collapse') 2036 | this.$element.trigger(startEvent) 2037 | if (startEvent.isDefaultPrevented()) return 2038 | 2039 | var dimension = this.dimension() 2040 | 2041 | this.$element[dimension](this.$element[dimension]())[0].offsetHeight 2042 | 2043 | this.$element 2044 | .addClass('collapsing') 2045 | .removeClass('collapse in') 2046 | .attr('aria-expanded', false) 2047 | 2048 | this.$trigger 2049 | .addClass('collapsed') 2050 | .attr('aria-expanded', false) 2051 | 2052 | this.transitioning = 1 2053 | 2054 | var complete = function () { 2055 | this.transitioning = 0 2056 | this.$element 2057 | .removeClass('collapsing') 2058 | .addClass('collapse') 2059 | .trigger('hidden.bs.collapse') 2060 | } 2061 | 2062 | if (!$.support.transition) return complete.call(this) 2063 | 2064 | this.$element 2065 | [dimension](0) 2066 | .one('bsTransitionEnd', $.proxy(complete, this)) 2067 | .emulateTransitionEnd(Collapse.TRANSITION_DURATION) 2068 | } 2069 | 2070 | Collapse.prototype.toggle = function () { 2071 | this[this.$element.hasClass('in') ? 'hide' : 'show']() 2072 | } 2073 | 2074 | Collapse.prototype.getParent = function () { 2075 | return $(this.options.parent) 2076 | .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') 2077 | .each($.proxy(function (i, element) { 2078 | var $element = $(element) 2079 | this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) 2080 | }, this)) 2081 | .end() 2082 | } 2083 | 2084 | Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { 2085 | var isOpen = $element.hasClass('in') 2086 | 2087 | $element.attr('aria-expanded', isOpen) 2088 | $trigger 2089 | .toggleClass('collapsed', !isOpen) 2090 | .attr('aria-expanded', isOpen) 2091 | } 2092 | 2093 | function getTargetFromTrigger($trigger) { 2094 | var href 2095 | var target = $trigger.attr('data-target') 2096 | || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 2097 | 2098 | return $(target) 2099 | } 2100 | 2101 | 2102 | // COLLAPSE PLUGIN DEFINITION 2103 | // ========================== 2104 | 2105 | function Plugin(option) { 2106 | return this.each(function () { 2107 | var $this = $(this) 2108 | var data = $this.data('bs.collapse') 2109 | var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) 2110 | 2111 | if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false 2112 | if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) 2113 | if (typeof option == 'string') data[option]() 2114 | }) 2115 | } 2116 | 2117 | var old = $.fn.collapse 2118 | 2119 | $.fn.collapse = Plugin 2120 | $.fn.collapse.Constructor = Collapse 2121 | 2122 | 2123 | // COLLAPSE NO CONFLICT 2124 | // ==================== 2125 | 2126 | $.fn.collapse.noConflict = function () { 2127 | $.fn.collapse = old 2128 | return this 2129 | } 2130 | 2131 | 2132 | // COLLAPSE DATA-API 2133 | // ================= 2134 | 2135 | $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { 2136 | var $this = $(this) 2137 | 2138 | if (!$this.attr('data-target')) e.preventDefault() 2139 | 2140 | var $target = getTargetFromTrigger($this) 2141 | var data = $target.data('bs.collapse') 2142 | var option = data ? 'toggle' : $this.data() 2143 | 2144 | Plugin.call($target, option) 2145 | }) 2146 | 2147 | }(jQuery); 2148 | 2149 | /* ======================================================================== 2150 | * Bootstrap: scrollspy.js v3.3.7 2151 | * http://getbootstrap.com/javascript/#scrollspy 2152 | * ======================================================================== 2153 | * Copyright 2011-2016 Twitter, Inc. 2154 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 2155 | * ======================================================================== */ 2156 | 2157 | 2158 | +function ($) { 2159 | 'use strict'; 2160 | 2161 | // SCROLLSPY CLASS DEFINITION 2162 | // ========================== 2163 | 2164 | function ScrollSpy(element, options) { 2165 | this.$body = $(document.body) 2166 | this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) 2167 | this.options = $.extend({}, ScrollSpy.DEFAULTS, options) 2168 | this.selector = (this.options.target || '') + ' .nav li > a' 2169 | this.offsets = [] 2170 | this.targets = [] 2171 | this.activeTarget = null 2172 | this.scrollHeight = 0 2173 | 2174 | this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) 2175 | this.refresh() 2176 | this.process() 2177 | } 2178 | 2179 | ScrollSpy.VERSION = '3.3.7' 2180 | 2181 | ScrollSpy.DEFAULTS = { 2182 | offset: 10 2183 | } 2184 | 2185 | ScrollSpy.prototype.getScrollHeight = function () { 2186 | return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) 2187 | } 2188 | 2189 | ScrollSpy.prototype.refresh = function () { 2190 | var that = this 2191 | var offsetMethod = 'offset' 2192 | var offsetBase = 0 2193 | 2194 | this.offsets = [] 2195 | this.targets = [] 2196 | this.scrollHeight = this.getScrollHeight() 2197 | 2198 | if (!$.isWindow(this.$scrollElement[0])) { 2199 | offsetMethod = 'position' 2200 | offsetBase = this.$scrollElement.scrollTop() 2201 | } 2202 | 2203 | this.$body 2204 | .find(this.selector) 2205 | .map(function () { 2206 | var $el = $(this) 2207 | var href = $el.data('target') || $el.attr('href') 2208 | var $href = /^#./.test(href) && $(href) 2209 | 2210 | return ($href 2211 | && $href.length 2212 | && $href.is(':visible') 2213 | && [[$href[offsetMethod]().top + offsetBase, href]]) || null 2214 | }) 2215 | .sort(function (a, b) { return a[0] - b[0] }) 2216 | .each(function () { 2217 | that.offsets.push(this[0]) 2218 | that.targets.push(this[1]) 2219 | }) 2220 | } 2221 | 2222 | ScrollSpy.prototype.process = function () { 2223 | var scrollTop = this.$scrollElement.scrollTop() + this.options.offset 2224 | var scrollHeight = this.getScrollHeight() 2225 | var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() 2226 | var offsets = this.offsets 2227 | var targets = this.targets 2228 | var activeTarget = this.activeTarget 2229 | var i 2230 | 2231 | if (this.scrollHeight != scrollHeight) { 2232 | this.refresh() 2233 | } 2234 | 2235 | if (scrollTop >= maxScroll) { 2236 | return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) 2237 | } 2238 | 2239 | if (activeTarget && scrollTop < offsets[0]) { 2240 | this.activeTarget = null 2241 | return this.clear() 2242 | } 2243 | 2244 | for (i = offsets.length; i--;) { 2245 | activeTarget != targets[i] 2246 | && scrollTop >= offsets[i] 2247 | && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) 2248 | && this.activate(targets[i]) 2249 | } 2250 | } 2251 | 2252 | ScrollSpy.prototype.activate = function (target) { 2253 | this.activeTarget = target 2254 | 2255 | this.clear() 2256 | 2257 | var selector = this.selector + 2258 | '[data-target="' + target + '"],' + 2259 | this.selector + '[href="' + target + '"]' 2260 | 2261 | var active = $(selector) 2262 | .parents('li') 2263 | .addClass('active') 2264 | 2265 | if (active.parent('.dropdown-menu').length) { 2266 | active = active 2267 | .closest('li.dropdown') 2268 | .addClass('active') 2269 | } 2270 | 2271 | active.trigger('activate.bs.scrollspy') 2272 | } 2273 | 2274 | ScrollSpy.prototype.clear = function () { 2275 | $(this.selector) 2276 | .parentsUntil(this.options.target, '.active') 2277 | .removeClass('active') 2278 | } 2279 | 2280 | 2281 | // SCROLLSPY PLUGIN DEFINITION 2282 | // =========================== 2283 | 2284 | function Plugin(option) { 2285 | return this.each(function () { 2286 | var $this = $(this) 2287 | var data = $this.data('bs.scrollspy') 2288 | var options = typeof option == 'object' && option 2289 | 2290 | if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) 2291 | if (typeof option == 'string') data[option]() 2292 | }) 2293 | } 2294 | 2295 | var old = $.fn.scrollspy 2296 | 2297 | $.fn.scrollspy = Plugin 2298 | $.fn.scrollspy.Constructor = ScrollSpy 2299 | 2300 | 2301 | // SCROLLSPY NO CONFLICT 2302 | // ===================== 2303 | 2304 | $.fn.scrollspy.noConflict = function () { 2305 | $.fn.scrollspy = old 2306 | return this 2307 | } 2308 | 2309 | 2310 | // SCROLLSPY DATA-API 2311 | // ================== 2312 | 2313 | $(window).on('load.bs.scrollspy.data-api', function () { 2314 | $('[data-spy="scroll"]').each(function () { 2315 | var $spy = $(this) 2316 | Plugin.call($spy, $spy.data()) 2317 | }) 2318 | }) 2319 | 2320 | }(jQuery); 2321 | 2322 | /* ======================================================================== 2323 | * Bootstrap: transition.js v3.3.7 2324 | * http://getbootstrap.com/javascript/#transitions 2325 | * ======================================================================== 2326 | * Copyright 2011-2016 Twitter, Inc. 2327 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 2328 | * ======================================================================== */ 2329 | 2330 | 2331 | +function ($) { 2332 | 'use strict'; 2333 | 2334 | // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) 2335 | // ============================================================ 2336 | 2337 | function transitionEnd() { 2338 | var el = document.createElement('bootstrap') 2339 | 2340 | var transEndEventNames = { 2341 | WebkitTransition : 'webkitTransitionEnd', 2342 | MozTransition : 'transitionend', 2343 | OTransition : 'oTransitionEnd otransitionend', 2344 | transition : 'transitionend' 2345 | } 2346 | 2347 | for (var name in transEndEventNames) { 2348 | if (el.style[name] !== undefined) { 2349 | return { end: transEndEventNames[name] } 2350 | } 2351 | } 2352 | 2353 | return false // explicit for ie8 ( ._.) 2354 | } 2355 | 2356 | // http://blog.alexmaccaw.com/css-transitions 2357 | $.fn.emulateTransitionEnd = function (duration) { 2358 | var called = false 2359 | var $el = this 2360 | $(this).one('bsTransitionEnd', function () { called = true }) 2361 | var callback = function () { if (!called) $($el).trigger($.support.transition.end) } 2362 | setTimeout(callback, duration) 2363 | return this 2364 | } 2365 | 2366 | $(function () { 2367 | $.support.transition = transitionEnd() 2368 | 2369 | if (!$.support.transition) return 2370 | 2371 | $.event.special.bsTransitionEnd = { 2372 | bindType: $.support.transition.end, 2373 | delegateType: $.support.transition.end, 2374 | handle: function (e) { 2375 | if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) 2376 | } 2377 | } 2378 | }) 2379 | 2380 | }(jQuery); 2381 | -------------------------------------------------------------------------------- /assets/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2017 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | /*! 8 | * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=d54a43febee21689b4ca77f6ccba6a21) 9 | * Config saved to config.json and https://gist.github.com/d54a43febee21689b4ca77f6ccba6a21 10 | */ 11 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),n=i.data("bs.alert");n||i.data("bs.alert",n=new o(this)),"string"==typeof e&&n[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.3.7",o.TRANSITION_DURATION=150,o.prototype.close=function(e){function i(){a.detach().trigger("closed.bs.alert").remove()}var n=t(this),s=n.attr("data-target");s||(s=n.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var a=t("#"===s?[]:s);e&&e.preventDefault(),a.length||(a=n.closest(".alert")),a.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(a.removeClass("in"),t.support.transition&&a.hasClass("fade")?a.one("bsTransitionEnd",i).emulateTransitionEnd(o.TRANSITION_DURATION):i())};var n=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=n,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.button"),s="object"==typeof e&&e;n||o.data("bs.button",n=new i(this,s)),"toggle"==e?n.toggle():e&&n.setState(e)})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.3.7",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,n=o.is("input")?"val":"html",s=o.data();e+="Text",null==s.resetText&&o.data("resetText",o[n]()),setTimeout(t.proxy(function(){o[n](null==s[e]?this.options[e]:s[e]),"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i).prop(i,!0)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i).prop(i,!1))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target).closest(".btn");e.call(o,"toggle"),t(i.target).is('input[type="radio"], input[type="checkbox"]')||(i.preventDefault(),o.is("input,button")?o.trigger("focus"):o.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.carousel"),s=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),a="string"==typeof e?e:s.slide;n||o.data("bs.carousel",n=new i(this,s)),"number"==typeof e?n.to(e):a?n[a]():s.interval&&n.pause().cycle()})}var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.3.7",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e),o="prev"==t&&0===i||"next"==t&&i==this.$items.length-1;if(o&&!this.options.wrap)return e;var n="prev"==t?-1:1,s=(i+n)%this.$items.length;return this.$items.eq(s)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));return t>this.$items.length-1||0>t?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,o){var n=this.$element.find(".item.active"),s=o||this.getItemForDirection(e,n),a=this.interval,r="next"==e?"left":"right",l=this;if(s.hasClass("active"))return this.sliding=!1;var h=s[0],d=t.Event("slide.bs.carousel",{relatedTarget:h,direction:r});if(this.$element.trigger(d),!d.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var p=t(this.$indicators.children()[this.getItemIndex(s)]);p&&p.addClass("active")}var c=t.Event("slid.bs.carousel",{relatedTarget:h,direction:r});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,n.addClass(r),s.addClass(r),n.one("bsTransitionEnd",function(){s.removeClass([e,r].join(" ")).addClass("active"),n.removeClass(["active",r].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(c)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(n.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(c)),a&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this};var n=function(i){var o,n=t(this),s=t(n.attr("data-target")||(o=n.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(s.hasClass("carousel")){var a=t.extend({},s.data(),n.data()),r=n.attr("data-slide-to");r&&(a.interval=!1),e.call(s,a),r&&s.data("bs.carousel").to(r),i.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",n).on("click.bs.carousel.data-api","[data-slide-to]",n),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function i(i){i&&3===i.which||(t(n).remove(),t(s).each(function(){var o=t(this),n=e(o),s={relatedTarget:this};n.hasClass("open")&&(i&&"click"==i.type&&/input|textarea/i.test(i.target.tagName)&&t.contains(n[0],i.target)||(n.trigger(i=t.Event("hide.bs.dropdown",s)),i.isDefaultPrevented()||(o.attr("aria-expanded","false"),n.removeClass("open").trigger(t.Event("hidden.bs.dropdown",s)))))}))}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new a(this)),"string"==typeof e&&o[e].call(i)})}var n=".dropdown-backdrop",s='[data-toggle="dropdown"]',a=function(e){t(e).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.7",a.prototype.toggle=function(o){var n=t(this);if(!n.is(".disabled, :disabled")){var s=e(n),a=s.hasClass("open");if(i(),!a){"ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(t(this)).on("click",i);var r={relatedTarget:this};if(s.trigger(o=t.Event("show.bs.dropdown",r)),o.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),s.toggleClass("open").trigger(t.Event("shown.bs.dropdown",r))}return!1}},a.prototype.keydown=function(i){if(/(38|40|27|32)/.test(i.which)&&!/input|textarea/i.test(i.target.tagName)){var o=t(this);if(i.preventDefault(),i.stopPropagation(),!o.is(".disabled, :disabled")){var n=e(o),a=n.hasClass("open");if(!a&&27!=i.which||a&&27==i.which)return 27==i.which&&n.find(s).trigger("focus"),o.trigger("click");var r=" li:not(.disabled):visible a",l=n.find(".dropdown-menu"+r);if(l.length){var h=l.index(i.target);38==i.which&&h>0&&h--,40==i.which&&hdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(t.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var n=this.options.trigger.split(" "),s=n.length;s--;){var a=n[s];if("click"==a)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=a){var r="hover"==a?"mouseenter":"focusin",l="hover"==a?"mouseleave":"focusout";this.$element.on(r+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusin"==e.type?"focus":"hover"]=!0),i.tip().hasClass("in")||"in"==i.hoverState?void(i.hoverState="in"):(clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusout"==e.type?"focus":"hover"]=!1),i.isInStateTrue()?void 0:(clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide())},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,s=this.tip(),a=this.getUID(this.type);this.setContent(),s.attr("id",a),this.$element.attr("aria-describedby",a),this.options.animation&&s.addClass("fade");var r="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,h=l.test(r);h&&(r=r.replace(l,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(r).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var d=this.getPosition(),p=s[0].offsetWidth,c=s[0].offsetHeight;if(h){var f=r,u=this.getPosition(this.$viewport);r="bottom"==r&&d.bottom+c>u.bottom?"top":"top"==r&&d.top-cu.width?"left":"left"==r&&d.left-pa.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){if(!this.$tip&&(this.$tip=t(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),e?(i.inState.click=!i.inState.click,i.isInStateTrue()?i.enter(i):i.leave(i)):i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.popover"),s="object"==typeof e&&e;!n&&/destroy|hide/.test(e)||(n||o.data("bs.popover",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.7",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tab");n||o.data("bs.tab",n=new i(this)),"string"==typeof e&&n[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.3.7",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var n=i.find(".active:last a"),s=t.Event("hide.bs.tab",{relatedTarget:e[0]}),a=t.Event("show.bs.tab",{relatedTarget:n[0]});if(n.trigger(s),e.trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){var r=t(o);this.activate(e.closest("li"),i),this.activate(r,r.parent(),function(){n.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:n[0]})})}}},i.prototype.activate=function(e,o,n){function s(){a.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),r?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),n&&n()}var a=o.find("> .active"),r=n&&t.support.transition&&(a.length&&a.hasClass("fade")||!!o.find("> .fade").length);a.length&&r?a.one("bsTransitionEnd",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),a.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this};var n=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',n).on("click.bs.tab.data-api",'[data-toggle="pill"]',n)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.affix"),s="object"==typeof e&&e;n||o.data("bs.affix",n=new i(this,s)),"string"==typeof e&&n[e]()})}var i=function(e,o){this.options=t.extend({},i.DEFAULTS,o),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.3.7",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return i>n?"top":!1;if("bottom"==this.affixed)return null!=i?n+this.unpin<=s.top?!1:"bottom":t-o>=n+a?!1:"bottom";var r=null==this.affixed,l=r?n:s.top,h=r?a:e;return null!=i&&i>=n?"top":null!=o&&l+h>=t-o?"bottom":!1},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),o=this.options.offset,n=o.top,s=o.bottom,a=Math.max(t(document).height(),t(document.body).height());"object"!=typeof o&&(s=n=o),"function"==typeof n&&(n=o.top(this.$element)),"function"==typeof s&&(s=o.bottom(this.$element));var r=this.getState(a,e,n,s);if(this.affixed!=r){null!=this.unpin&&this.$element.css("top","");var l="affix"+(r?"-"+r:""),h=t.Event(l+".bs.affix");if(this.$element.trigger(h),h.isDefaultPrevented())return;this.affixed=r,this.unpin="bottom"==r?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==r&&this.$element.offset({top:a-e-s})}};var o=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=o,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),o=i.data();o.offset=o.offset||{},null!=o.offsetBottom&&(o.offset.bottom=o.offsetBottom),null!=o.offsetTop&&(o.offset.top=o.offsetTop),e.call(i,o)})})}(jQuery),+function(t){"use strict";function e(e){var i,o=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(o)}function i(e){return this.each(function(){var i=t(this),n=i.data("bs.collapse"),s=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);!n&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),n||i.data("bs.collapse",n=new o(this,s)),"string"==typeof e&&n[e]()})}var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};o.VERSION="3.3.7",o.TRANSITION_DURATION=350,o.DEFAULTS={toggle:!0},o.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},o.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var s=t.Event("show.bs.collapse");if(this.$element.trigger(s),!s.isDefaultPrevented()){n&&n.length&&(i.call(n,"hide"),e||n.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var r=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0, 12 | this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return r.call(this);var l=t.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(o.TRANSITION_DURATION)[a](this.$element[0][l])}}}},o.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[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 n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(o.TRANSITION_DURATION):n.call(this)}}},o.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},o.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,o){var n=t(o);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},o.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var n=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=o,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(o){var n=t(this);n.attr("data-target")||o.preventDefault();var s=e(n),a=s.data("bs.collapse"),r=a?"toggle":n.data();i.call(s,r)})}(jQuery),+function(t){"use strict";function e(i,o){this.$body=t(document.body),this.$scrollElement=t(t(i).is(document.body)?window:i),this.options=t.extend({},e.DEFAULTS,o),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function i(i){return this.each(function(){var o=t(this),n=o.data("bs.scrollspy"),s="object"==typeof i&&i;n||o.data("bs.scrollspy",n=new e(this,s)),"string"==typeof i&&n[i]()})}e.VERSION="3.3.7",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,i="offset",o=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(i="position",o=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),n=e.data("target")||e.attr("href"),s=/^#./.test(n)&&t(n);return s&&s.length&&s.is(":visible")&&[[s[i]().top+o,n]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=o)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(void 0===n[t+1]||e/g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[c]},{b:/(fr|rf|f)"/,e:/"/,c:[c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}}); -------------------------------------------------------------------------------- /background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /background.js: -------------------------------------------------------------------------------- 1 | // Chrome automatically creates a background.html page for this to execute. 2 | // This can access the inspected page via executeScript 3 | // 4 | // Can use: 5 | // chrome.tabs.* 6 | // chrome.extension.* 7 | 8 | // Standard Google Universal Analytics code 9 | 10 | (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 11 | (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 12 | m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 13 | })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); // Note: https protocol here 14 | 15 | ga('create', 'UA-98927264-1', 'auto'); 16 | ga('set', 'checkProtocolTask', function(){}); // Removes failing protocol check. @see: http://stackoverflow.com/a/22152353/1958200 17 | ga('require', 'displayfeatures'); 18 | 19 | 20 | chrome.extension.onConnect.addListener(function (port) { 21 | 22 | var extensionListener = function (message, sender, sendResponse) { 23 | 24 | if(message.tabId && message.action && message.content) { 25 | 26 | if (message.action === 'track-pageview') { 27 | ga('send', 'pageview', message.content); 28 | } 29 | 30 | // This accepts messages from the inspectedPage and 31 | // sends them to the panel 32 | } else { 33 | port.postMessage(message); 34 | } 35 | sendResponse(message); 36 | } 37 | 38 | // Listens to messages sent from the panel 39 | chrome.extension.onMessage.addListener(extensionListener); 40 | 41 | port.onDisconnect.addListener(function(port) { 42 | chrome.extension.onMessage.removeListener(extensionListener); 43 | }); 44 | 45 | // port.onMessage.addListener(function (message) { 46 | // port.postMessage(message); 47 | // }); 48 | 49 | }); 50 | chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 51 | return true; 52 | }); 53 | -------------------------------------------------------------------------------- /devtools.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /devtools.js: -------------------------------------------------------------------------------- 1 | // Can use 2 | // chrome.devtools.* 3 | // chrome.extension.* 4 | 5 | // Create a tab in the devtools area 6 | chrome.devtools.panels.create("Django", "icon16.png", "panel.html", function(panel) {}); 7 | -------------------------------------------------------------------------------- /dist/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/dist/.DS_Store -------------------------------------------------------------------------------- /dist/djdevpanel-0.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/dist/djdevpanel-0.1.zip -------------------------------------------------------------------------------- /icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/icon128.png -------------------------------------------------------------------------------- /icon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/icon16.png -------------------------------------------------------------------------------- /icon256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/icon256.png -------------------------------------------------------------------------------- /icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/loftylabs/djdevpanel-devtools/ff4dcadb9ff5521fed81db39ca99bb1762723290/icon48.png -------------------------------------------------------------------------------- /inserted-script.js: -------------------------------------------------------------------------------- 1 | // This is included and executed in the inspected page 2 | function inserted() { 3 | console.log('External script attached'); 4 | } 5 | inserted(); -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Django Developer Panel", 3 | "short_name": "djdevpanel", 4 | "version": "0.1", 5 | "author": "Lofty Labs", 6 | "homepage_url": "https://github.com/loftylabs/django-developer-panel", 7 | "description": "Debugging tools for Django applications.", 8 | "devtools_page": "devtools.html", 9 | "background": { 10 | "page": "background.html" 11 | }, 12 | "permissions": [ 13 | "tabs", 14 | "http://*/*", 15 | "https://*/*" 16 | ], 17 | "content_security_policy": "script-src 'self' https://www.google-analytics.com; object-src 'self'", 18 | "manifest_version": 2, 19 | "icons": { 20 | "128": "icon128.png"} 21 | } 22 | -------------------------------------------------------------------------------- /messageback-script.js: -------------------------------------------------------------------------------- 1 | // document.querySelector('button').addEventListener('click', function() { 2 | // chrome.extension.sendMessage({action: 'message', content:"Changed by page"}, function(message){}); 3 | // }); 4 | document.querySelector('button').addEventListener('click', function() { 5 | sendObjectToDevTools({content: "Changed by page"}); 6 | }); 7 | function sendObjectToDevTools(message) { 8 | // The callback here can be used to execute something on receipt 9 | chrome.extension.sendMessage(message, function(message){}); 10 | } -------------------------------------------------------------------------------- /messaging.js: -------------------------------------------------------------------------------- 1 | // This creates and maintains the communication channel between 2 | // the inspectedPage and the dev tools panel. 3 | // 4 | // In this example, messages are JSON objects 5 | // { 6 | // action: ['code'|'script'|'message'], // What action to perform on the inspected page 7 | // content: [String|Path to script|Object], // data to be passed through 8 | // tabId: [Automatically added] 9 | // } 10 | 11 | (function createChannel() { 12 | //Create a port with background page for continous message communication 13 | var port = chrome.extension.connect({ 14 | name: "Sample Communication" //Given a Name 15 | }); 16 | 17 | // Listen to messages from the background page 18 | port.onMessage.addListener(function (message) { 19 | document.querySelector('#insertmessagebutton').innerHTML = message.content; 20 | // port.postMessage(message); 21 | }); 22 | 23 | }()); 24 | 25 | // This sends an object to the background page 26 | // where it can be relayed to the inspected page 27 | function sendObjectToInspectedPage(message) { 28 | message.tabId = chrome.devtools.inspectedWindow.tabId; 29 | chrome.extension.sendMessage(message); 30 | } -------------------------------------------------------------------------------- /panel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
djDevPanel
14 | 15 |
16 | 17 |
18 | 19 |
20 | 21 | 22 | 28 | 29 | 30 |
31 |
32 |
33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
TimeQuery
43 |
44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |
SettingValue
57 |
58 |
59 |
60 |
61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 |
Check IDMessage
71 |
72 |
73 |
74 |
75 |
Method Resolution Order
76 |
    77 |
78 |
79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
CallResult
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | App State 98 |
99 |
100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 |
Django Version
View
URL ResolutionNamespaces: 112 | Name: 113 |
View *args
View **kwargs
Current User
Session Data
133 |
134 |
135 |
136 | 137 | 138 | 148 |
149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /panel.js: -------------------------------------------------------------------------------- 1 | // This one acts in the context of the panel in the Dev Tools 2 | // 3 | // Can use 4 | // chrome.devtools.* 5 | // chrome.extension.* 6 | 7 | window.djbug_data = {}; 8 | window.djbug_no_django = false; 9 | 10 | function render() { 11 | // Track a pageview for every render 12 | sendObjectToInspectedPage({action: "track-pageview", content: "/render"}); 13 | 14 | clear_panes(); 15 | 16 | chrome.devtools.inspectedWindow.eval( 17 | "dj_chrome", 18 | function (result, isException) { 19 | if (isException) { 20 | $('.no-django').modal({ backdrop: 'static', keyboard: false }); 21 | window.djbug_no_django = true; 22 | } else { 23 | var version = result.version; 24 | djangoVersion = version[0] + '.' + version[1] + '.' + version[2] + '-' + version[3]; 25 | 26 | // bind this to the global var 27 | window.djbug_data = result; 28 | 29 | $('.django-version').html(djangoVersion); 30 | 31 | if (window.djbug_no_django) { 32 | $('.no-django').modal('hide'); 33 | window.djbug_no_django = false; 34 | } 35 | 36 | build_panes(); 37 | } 38 | } 39 | ); 40 | 41 | $(".se-pre-con").fadeOut("slow"); 42 | 43 | } 44 | 45 | function clear_panes() { 46 | var query_table = $('.query-table tbody'); 47 | var settings_table = $('.settings-table tbody'); 48 | var warnings_pane = $('.warnings-table tbody'); 49 | var mro_pane = $('.bases-list'); 50 | var view_data_pane = $('.cbv-table tbody'); 51 | 52 | [query_table, settings_table, warnings_pane, mro_pane, view_data_pane].forEach(function(el) { 53 | el.html(""); 54 | }); 55 | 56 | } 57 | 58 | 59 | $().ready(function() { 60 | render(); 61 | 62 | // Capture tab changes and send them to GA 63 | $('a[data-toggle="tab"]').on('show.bs.tab', function (e) { 64 | sendObjectToInspectedPage({action: "track-pageview", content: "/tab/" + $(e.target).attr('href') }); 65 | }) 66 | }); 67 | 68 | 69 | chrome.devtools.network.onNavigated.addListener(function(){ 70 | $(".se-pre-con").fadeIn("fast"); 71 | window.setTimeout(render, 1000); 72 | }); 73 | 74 | function build_panes() { 75 | 76 | // Database queries 77 | var queries = window.djbug_data.db_queries 78 | var query_table = $('.query-table tbody') 79 | 80 | $('.query-count').html(queries.length); 81 | 82 | for (i in queries) { 83 | row = $(""); 84 | row.append($("").html(queries[i].time)); 85 | row.append($("").html($('
').html($('').addClass('sql').html(queries[i].sql))));
 86 |     query_table.append(row);
 87 |   }
 88 | 
 89 |   // Django Settings
 90 |   var settings = window.djbug_data.settings
 91 |   var settings_table = $('.settings-table tbody')
 92 |   Object.keys(settings).forEach(function(key) {
 93 |     row = $("");
 94 |     row.append($("").html(key));
 95 |     value = JSON.stringify(settings[key], null, 4);
 96 |     row.append($("").html($('').html(value)));
 97 |     settings_table.append(row);
 98 |   });
 99 | 
100 |   // Warnings
101 |   var checks = window.djbug_data.checks
102 |   var warnings_table = $('.warnings-table tbody');
103 |   Object.keys(checks).forEach(function(key) {
104 |     var check_level = 'text-warning'
105 | 
106 |     // check level
107 |     if (checks[key].level < 30)
108 |       check_level = 'text-info';
109 |     else if (checks[key].level > 30)
110 |       check_level = 'text-danger';
111 | 
112 |     row = $("");
113 |     row.append($("").html(key));
114 |     value = JSON.stringify(checks[key], null, 4);
115 |     row.append($("").html($('').addClass(check_level).html(value)));
116 |     warnings_table.append(row);
117 |   });
118 | 
119 |   var warning_count = Object.keys(checks).length;
120 | 
121 |   // Some custom warnings that aren't worth the installation overhead of building
122 |   // into a Django app config
123 |   if (settings.APPEND_SLASH) {
124 |     row = $("");
125 |     row.append($("").html('djdev.I001'));
126 |     row.append($("").html($('').addClass('text-info').html(
127 |       '"Django is automatically appending trailing slashes to URLs.  Check the APPEND_SLASH setting to change."')));
128 |     warnings_table.append(row);
129 |     warning_count++;
130 |   }
131 | 
132 | 
133 | 
134 |   $('.warning-count').html(warning_count);
135 | 
136 |   // CBV Introspection
137 | 
138 |   $('.cbv-tab').hide();
139 |   if (window.djbug_data.view_data.cbv){
140 |     cbv_data = window.djbug_data.view_data;
141 |     $('.cbv-tab').show();
142 |     $('.cbv-name').html(cbv_data.view_name);
143 | 
144 |     // Populate MRO
145 |     cbv_data.bases.forEach(function(key) {
146 |       var base = $('
  • ').addClass('list-group-item').text(key); 147 | $('.bases-list').append(base); 148 | }); 149 | 150 | // Populate Method Calls 151 | Object.keys(cbv_data.view_methods).forEach(function(key) { 152 | var row = $('').append( 153 | $('').html( 154 | $('').text(key))); 155 | row.append($('').html($('').text(cbv_data.view_methods[key].return))); 156 | $('.cbv-table tbody').append(row); 157 | }); 158 | } 159 | 160 | 161 | // Other Info 162 | $('.current-user').html($('
    ').html($('').addClass('json').html(JSON.stringify(window.djbug_data.current_user, null, 4))));
    163 |   $('.session-data').html($('
    ').html($('').html(JSON.stringify(window.djbug_data.session, null, 4))));
    164 |   $('.current-view').html($('').html(window.djbug_data.view_data.view_name));
    165 |   $('.current-view-args').html($('').html(JSON.stringify(window.djbug_data.view_data.view_args)));
    166 |   $('.current-view-kwargs').html($('').html(JSON.stringify(window.djbug_data.view_data.view_kwargs)));
    167 |   $('.url-namespaces').html($('').html(JSON.stringify(window.djbug_data.url_namespaces)));
    168 |   $('.url-name').html($('').html(window.djbug_data.url_name));
    169 | 
    170 |   $('pre > code').each(function() {
    171 |     hljs.highlightBlock(this);
    172 |   });
    173 | 
    174 | 
    175 | }
    176 | 
    
    
    --------------------------------------------------------------------------------